diff --git a/ring-android/app/build.gradle b/ring-android/app/build.gradle
index e66d9b40a42f052b6ffe0fc6674eb09de8be5d4a..86ef27d9f761d3cdb3694c5661d5b8eab661b683 100644
--- a/ring-android/app/build.gradle
+++ b/ring-android/app/build.gradle
@@ -119,7 +119,7 @@ dependencies {
     annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
 
     // RxAndroid
-    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
+    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
 
     implementation 'com.jsibbold:zoomage:1.2.0'
     implementation 'com.googlecode.ez-vcard:ez-vcard:0.11.2'
diff --git a/ring-android/app/src/main/java/cx/ring/account/AccountCreationModelImpl.java b/ring-android/app/src/main/java/cx/ring/account/AccountCreationModelImpl.java
index 1217a0056639b6e23c2892aec796441a30285989..aa4173dd1f6887e984d2526f94d94cd24a4a7915 100644
--- a/ring-android/app/src/main/java/cx/ring/account/AccountCreationModelImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/account/AccountCreationModelImpl.java
@@ -30,7 +30,7 @@ import ezvcard.property.FormattedName;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class AccountCreationModelImpl extends AccountCreationModel implements Serializable {
 
diff --git a/ring-android/app/src/main/java/cx/ring/account/AccountEditionPresenter.java b/ring-android/app/src/main/java/cx/ring/account/AccountEditionPresenter.java
index 41eab5b621dc418a17acb945c6483c6b829c4eca..13b0d722b6026d6b540afd0735a0f882da68a729 100644
--- a/ring-android/app/src/main/java/cx/ring/account/AccountEditionPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/account/AccountEditionPresenter.java
@@ -25,7 +25,8 @@ import javax.inject.Named;
 import net.jami.model.Account;
 import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class AccountEditionPresenter extends RootPresenter<AccountEditionView> {
     private final AccountService mAccountService;
diff --git a/ring-android/app/src/main/java/cx/ring/account/AccountWizardActivity.java b/ring-android/app/src/main/java/cx/ring/account/AccountWizardActivity.java
index a46f7c0e8c38fa083f7a1c15df1deb3632969102..7a695a0f7a4eb150e63fbd53645b297d0382f9ba 100644
--- a/ring-android/app/src/main/java/cx/ring/account/AccountWizardActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/account/AccountWizardActivity.java
@@ -54,8 +54,8 @@ import cx.ring.mvp.BaseActivity;
 import net.jami.mvp.AccountCreationModel;
 import net.jami.utils.VCardUtils;
 import ezvcard.VCard;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class AccountWizardActivity extends BaseActivity<AccountWizardPresenter> implements AccountWizardView {
     static final String TAG = AccountWizardActivity.class.getName();
diff --git a/ring-android/app/src/main/java/cx/ring/account/HomeAccountCreationFragment.java b/ring-android/app/src/main/java/cx/ring/account/HomeAccountCreationFragment.java
index 0136a9846c2db7693a19ac1dcc46da76f1b1a641..a5352ba5a6f9d6f887ada67c18379b454fc03814 100644
--- a/ring-android/app/src/main/java/cx/ring/account/HomeAccountCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/HomeAccountCreationFragment.java
@@ -41,7 +41,7 @@ import cx.ring.application.JamiApplication;
 import cx.ring.databinding.FragAccHomeCreateBinding;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.utils.AndroidFileUtils;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
 
 public class HomeAccountCreationFragment extends BaseSupportFragment<HomeAccountCreationPresenter> implements HomeAccountCreationView {
     private static final int ARCHIVE_REQUEST_CODE = 42;
diff --git a/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java b/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java
index 162fbcb08f557f04aeeae4294826950b3e99f2a9..7e9043ee06b4c133b6cf76589e1add81904745b3 100644
--- a/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/JamiAccountSummaryFragment.java
@@ -82,10 +82,10 @@ import cx.ring.utils.BitmapUtils;
 import cx.ring.utils.ContentUriHandler;
 import cx.ring.views.AvatarDrawable;
 import cx.ring.views.SwitchButton;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class JamiAccountSummaryFragment extends BaseSupportFragment<JamiAccountSummaryPresenter> implements
         RegisterNameDialog.RegisterNameDialogListener,
diff --git a/ring-android/app/src/main/java/cx/ring/account/ProfileCreationFragment.java b/ring-android/app/src/main/java/cx/ring/account/ProfileCreationFragment.java
index 79225f3e8d4e6e3c21877bb6dda8d941daa09ad9..764ee026a16cbb160decb41ddc1d234a4df5b47c 100644
--- a/ring-android/app/src/main/java/cx/ring/account/ProfileCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/ProfileCreationFragment.java
@@ -56,7 +56,7 @@ import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.ContentUriHandler;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class ProfileCreationFragment extends BaseSupportFragment<ProfileCreationPresenter> implements ProfileCreationView {
     public static final String TAG = ProfileCreationFragment.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/account/RegisterNameDialog.java b/ring-android/app/src/main/java/cx/ring/account/RegisterNameDialog.java
index 872e08a3f9ba819b8117d474a5fdba284c01756a..f192b82e419249c7cc894e8d7605d00f51fb7979 100644
--- a/ring-android/app/src/main/java/cx/ring/account/RegisterNameDialog.java
+++ b/ring-android/app/src/main/java/cx/ring/account/RegisterNameDialog.java
@@ -42,8 +42,8 @@ import cx.ring.databinding.FragRegisterNameBinding;
 import net.jami.services.AccountService;
 import cx.ring.utils.RegisteredNameFilter;
 import cx.ring.utils.RegisteredNameTextWatcher;
-import io.reactivex.Scheduler;
-import io.reactivex.disposables.Disposable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.disposables.Disposable;
 
 public class RegisterNameDialog extends DialogFragment {
     static final String TAG = RegisterNameDialog.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java b/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java
index 9c516366e116de3b9e983c18be116f3f0f76e277..f0400896a9f2bd638189e3e2d67d53ffdb28d88b 100644
--- a/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java
@@ -93,8 +93,8 @@ import cx.ring.utils.GlideApp;
 import cx.ring.utils.GlideOptions;
 import cx.ring.utils.ResourceMapper;
 import cx.ring.views.ConversationViewHolder;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
 
 public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHolder> {
     private final static String TAG = ConversationAdapter.class.getSimpleName();
@@ -144,7 +144,7 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHo
                 .override(mPictureMaxSize)
                 .transform(new RoundedCorners(corner));
         timestampUpdateTimer = Observable.interval(10, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
-                .startWith(0L);
+                .startWithItem(0L);
     }
 
     /**
@@ -513,7 +513,7 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHo
                     ((ImageView) viewHolder.btnAccept).setImageResource(R.drawable.baseline_play_arrow_24);
                 });
                 viewHolder.compositeDisposable.add(Observable.interval(1L, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
-                        .startWith(0L)
+                        .startWithItem(0L)
                         .subscribe(t -> {
                             int pS = player.getCurrentPosition() / 1000;
                             int dS = player.getDuration() / 1000;
diff --git a/ring-android/app/src/main/java/cx/ring/adapters/RingtoneAdapter.java b/ring-android/app/src/main/java/cx/ring/adapters/RingtoneAdapter.java
index 7b6b9d75e157a401935ba78b714c61cad2cb7211..a22acb9c60462e0a30079a3b943661ac3e8a591c 100644
--- a/ring-android/app/src/main/java/cx/ring/adapters/RingtoneAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/adapters/RingtoneAdapter.java
@@ -37,24 +37,24 @@ import java.io.IOException;
 import java.util.List;
 
 import cx.ring.R;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
+
 import net.jami.model.Ringtone;
 import net.jami.utils.Log;
-import io.reactivex.Observable;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
 
 public class RingtoneAdapter extends RecyclerView.Adapter<RingtoneAdapter.RingtoneViewHolder> {
 
     private final String TAG = RingtoneAdapter.class.getSimpleName();
-    private List<Ringtone> ringtoneList;
+    private final List<Ringtone> ringtoneList;
     private int currentlySelectedPosition = 1; // default item
-    private MediaPlayer mp = new MediaPlayer();
-    private Subject<Ringtone> ringtoneSubject = PublishSubject.create();
-
-    class RingtoneViewHolder extends RecyclerView.ViewHolder {
-        private TextView name;
-        private ImageView isSelected, isPlaying, ringtoneIcon;
+    private final MediaPlayer mp = new MediaPlayer();
+    private final Subject<Ringtone> ringtoneSubject = PublishSubject.create();
 
+    static class RingtoneViewHolder extends RecyclerView.ViewHolder {
+        private final TextView name;
+        private final ImageView isSelected, isPlaying, ringtoneIcon;
 
         RingtoneViewHolder(View view) {
             super(view);
diff --git a/ring-android/app/src/main/java/cx/ring/adapters/SmartListAdapter.java b/ring-android/app/src/main/java/cx/ring/adapters/SmartListAdapter.java
index 2ed8a07ee1ac214c4a40114a020cb679a9e753be..c83d8a9fecf61d5fd928defb0fc421dee6a2de89 100644
--- a/ring-android/app/src/main/java/cx/ring/adapters/SmartListAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/adapters/SmartListAdapter.java
@@ -24,7 +24,7 @@ import cx.ring.databinding.ItemSmartlistBinding;
 import cx.ring.databinding.ItemSmartlistHeaderBinding;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 import android.os.Parcelable;
 import android.view.LayoutInflater;
diff --git a/ring-android/app/src/main/java/cx/ring/application/JamiApplication.java b/ring-android/app/src/main/java/cx/ring/application/JamiApplication.java
index a8e2035c7c93b4efa26291d368a98c9337a48311..5161c3344f1242330330c31a25c5082de0270a3b 100644
--- a/ring-android/app/src/main/java/cx/ring/application/JamiApplication.java
+++ b/ring-android/app/src/main/java/cx/ring/application/JamiApplication.java
@@ -72,8 +72,8 @@ import cx.ring.dependencyinjection.ServiceInjectionModule;
 import cx.ring.service.DRingService;
 import cx.ring.service.JamiJobService;
 import cx.ring.utils.AndroidFileUtils;
-import io.reactivex.Completable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public abstract class JamiApplication extends Application {
     private static final String TAG = JamiApplication.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java b/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java
index 3d397063c7e843dad4f439d378c419383305948f..99f8ff951cfc4a92e5df64dfcc355c40a216ec6f 100644
--- a/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/client/AccountSpinnerAdapter.java
@@ -37,9 +37,9 @@ import cx.ring.R;
 import cx.ring.databinding.ItemToolbarSelectedBinding;
 import cx.ring.databinding.ItemToolbarSpinnerBinding;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class AccountSpinnerAdapter extends ArrayAdapter<Account> {
     private static final String TAG = AccountSpinnerAdapter.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/ContactDetailsActivity.java b/ring-android/app/src/main/java/cx/ring/client/ContactDetailsActivity.java
index 3e1a9f1abd4285505c18afeff3805c7b094bdb46..e3d37ffb016329f6014a089db13b040be457fc16 100644
--- a/ring-android/app/src/main/java/cx/ring/client/ContactDetailsActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/ContactDetailsActivity.java
@@ -71,8 +71,8 @@ import cx.ring.fragments.ConversationFragment;
 import cx.ring.services.SharedPreferencesServiceImpl;
 import cx.ring.utils.ConversationPath;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ContactDetailsActivity extends AppCompatActivity {
     private static final String TAG = ContactDetailsActivity.class.getName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/ConversationSelectionActivity.java b/ring-android/app/src/main/java/cx/ring/client/ConversationSelectionActivity.java
index 5d0a7cc1138e1a22006c87aaa100a4af9c6d7313..77b60d7ca6ed4469fb04f8b75eaf8b1009d3cb89 100644
--- a/ring-android/app/src/main/java/cx/ring/client/ConversationSelectionActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/ConversationSelectionActivity.java
@@ -47,8 +47,8 @@ import net.jami.services.CallService;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.utils.ConversationPath;
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ConversationSelectionActivity extends AppCompatActivity {
     private final static String TAG = ConversationSelectionActivity.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
index f6ce8841e2d6ff43ddcbd89cb1a0db12daf2c1e8..12a722d7ffa4f5c86af816e305e10e6acc86eea0 100644
--- a/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/HomeActivity.java
@@ -92,10 +92,10 @@ import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.DeviceUtils;
 import cx.ring.views.SwitchButton;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class HomeActivity extends AppCompatActivity implements BottomNavigationView.OnNavigationItemSelectedListener,
         Spinner.OnItemSelectedListener, Colorable {
diff --git a/ring-android/app/src/main/java/cx/ring/client/LogsActivity.java b/ring-android/app/src/main/java/cx/ring/client/LogsActivity.java
index 07f7d2cd6b513e8ef11e378f4b0af56c307410cd..4cc27d633b467878f81b23b035dff54470578881 100644
--- a/ring-android/app/src/main/java/cx/ring/client/LogsActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/LogsActivity.java
@@ -50,11 +50,11 @@ import cx.ring.application.JamiApplication;
 import cx.ring.databinding.ActivityLogsBinding;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.ContentUriHandler;
-import io.reactivex.Maybe;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class LogsActivity extends AppCompatActivity {
     private static final String TAG = LogsActivity.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/client/RingtoneActivity.java b/ring-android/app/src/main/java/cx/ring/client/RingtoneActivity.java
index 1eb2f86281dcd57411bbe108a48a729f3a44e68b..069fbdaafccc9c0efdb9d2c8fa541fe657410c76 100644
--- a/ring-android/app/src/main/java/cx/ring/client/RingtoneActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/RingtoneActivity.java
@@ -59,9 +59,10 @@ import net.jami.model.ConfigKey;
 import net.jami.model.Ringtone;
 import net.jami.services.AccountService;
 import cx.ring.utils.AndroidFileUtils;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.Disposable;
+
 import net.jami.utils.Log;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.Disposable;
 
 public class RingtoneActivity extends AppCompatActivity {
 
@@ -366,7 +367,7 @@ public class RingtoneActivity extends AppCompatActivity {
                 cr.takePersistableUriPermission(uri, takeFlags);
                 AndroidFileUtils.getCacheFile(this, uri)
                         .observeOn(AndroidSchedulers.mainThread())
-                        .subscribe(file -> onFileFound(file),
+                        .subscribe(this::onFileFound,
                                 err -> Toast.makeText(this, "Can't load ringtone !", Toast.LENGTH_SHORT).show());
             }
         }
diff --git a/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java b/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java
index a8171d6b56c8f4c84bbedacce7eefddcc73d20ce..e43507f9de1140613e98755825b7f23ef96bb5f6 100644
--- a/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/contactrequests/ContactRequestsFragment.java
@@ -45,7 +45,7 @@ import cx.ring.mvp.BaseSupportFragment;
 import net.jami.smartlist.SmartListViewModel;
 
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ContactRequestsFragment extends BaseSupportFragment<ContactRequestsPresenter> implements ContactRequestsView,
         SmartListViewHolder.SmartListListeners {
diff --git a/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionModule.java b/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionModule.java
index a8e387cfcad34ddc138e5d72c195411af2f188fd..85878a2cf7d96033258f4bf34b43b4282cdb9f84 100755
--- a/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionModule.java
+++ b/ring-android/app/src/main/java/cx/ring/dependencyinjection/JamiInjectionModule.java
@@ -24,8 +24,8 @@ import android.content.Context;
 import cx.ring.application.JamiApplication;
 import dagger.Module;
 import dagger.Provides;
-import io.reactivex.Scheduler;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Scheduler;
 
 @Module
 public class JamiInjectionModule {
diff --git a/ring-android/app/src/main/java/cx/ring/dependencyinjection/ServiceInjectionModule.java b/ring-android/app/src/main/java/cx/ring/dependencyinjection/ServiceInjectionModule.java
index 5bf1bfb891dbe8bb12e402f0ef9fc9378161e5f6..35214e76406aae44410313e4da27257e7b912231 100755
--- a/ring-android/app/src/main/java/cx/ring/dependencyinjection/ServiceInjectionModule.java
+++ b/ring-android/app/src/main/java/cx/ring/dependencyinjection/ServiceInjectionModule.java
@@ -52,8 +52,8 @@ import cx.ring.services.SharedPreferencesServiceImpl;
 import cx.ring.services.VCardServiceImpl;
 import dagger.Module;
 import dagger.Provides;
-import io.reactivex.Scheduler;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Scheduler;
 
 @Module
 public class ServiceInjectionModule {
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/AccountMigrationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/AccountMigrationFragment.java
index 9f47d587bdb069a471f3c5fad33f1822eb52e545..99ec80a0f52a0cc70f495f84be34b5f19a95f4a7 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/AccountMigrationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/AccountMigrationFragment.java
@@ -45,12 +45,13 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
 import cx.ring.databinding.FragAccountMigrationBinding;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+
 import net.jami.model.Account;
 import net.jami.model.AccountConfig;
 import net.jami.model.ConfigKey;
 import net.jami.services.AccountService;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
 
 public class AccountMigrationFragment extends Fragment {
     public static final String ACCOUNT_ID = "ACCOUNT_ID";
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
index 05774ee7abe17c7383612ec6bd677d44fcd62105..3092a022038275981143377e2f1aaa12b42d357d 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/CallFragment.java
@@ -127,7 +127,7 @@ import cx.ring.utils.ConversationPath;
 import cx.ring.utils.DeviceUtils;
 import cx.ring.utils.MediaButtonsHelper;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class CallFragment extends BaseSupportFragment<CallPresenter> implements CallView, MediaButtonsHelper.MediaButtonsHelperCallback, RecyclerPickerLayoutManager.ItemSelectedListener {
 
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ContactPickerFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ContactPickerFragment.java
index e7b51b4c9bd367719cc83ef61fc40c31ada46651..0a3fa87fbe9bea6e0661f4d942c76cf7e5ccfba5 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ContactPickerFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ContactPickerFragment.java
@@ -31,8 +31,8 @@ import net.jami.model.Contact;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.viewholders.SmartListViewHolder;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ContactPickerFragment extends BottomSheetDialogFragment {
 
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
index 037ad09f0f6bb4dcfc2889ea2909ac776e4c7de2..ec1c548c871b61a0845c23b779b413359e2bb1b2 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ConversationFragment.java
@@ -33,8 +33,8 @@ import android.content.Intent;
 import android.content.ServiceConnection;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
-import android.graphics.Typeface;
 import android.content.res.Resources;
+import android.graphics.Typeface;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.IBinder;
@@ -56,8 +56,6 @@ import android.widget.Spinner;
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.google.android.material.snackbar.Snackbar;
-
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.view.menu.MenuBuilder;
@@ -71,6 +69,21 @@ import androidx.recyclerview.widget.DefaultItemAnimator;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import com.google.android.material.snackbar.Snackbar;
+
+import net.jami.conversation.ConversationPresenter;
+import net.jami.conversation.ConversationView;
+import net.jami.daemon.JamiService;
+import net.jami.model.Account;
+import net.jami.model.Contact;
+import net.jami.model.Conversation;
+import net.jami.model.DataTransfer;
+import net.jami.model.Error;
+import net.jami.model.Interaction;
+import net.jami.model.Phone;
+import net.jami.model.Uri;
+import net.jami.services.NotificationService;
+
 import java.io.File;
 import java.util.HashMap;
 import java.util.List;
@@ -83,39 +96,26 @@ import cx.ring.client.CallActivity;
 import cx.ring.client.ContactDetailsActivity;
 import cx.ring.client.ConversationActivity;
 import cx.ring.client.HomeActivity;
-import cx.ring.views.AvatarFactory;
-import net.jami.conversation.ConversationPresenter;
-import net.jami.conversation.ConversationView;
 import cx.ring.databinding.FragConversationBinding;
 import cx.ring.interfaces.Colorable;
-
-import net.jami.daemon.JamiService;
-import net.jami.model.Account;
-import net.jami.model.Contact;
-import net.jami.model.Conversation;
-import net.jami.model.Interaction;
-import net.jami.model.DataTransfer;
-import net.jami.model.Phone;
-import net.jami.model.Error;
-import net.jami.model.Uri;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.service.DRingService;
-import cx.ring.services.LocationSharingService;
-import net.jami.services.NotificationService;
+import cx.ring.service.LocationSharingService;
 import cx.ring.services.NotificationServiceImpl;
 import cx.ring.services.SharedPreferencesServiceImpl;
 import cx.ring.utils.ActionHelper;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.ContentUriHandler;
-import cx.ring.utils.DeviceUtils;
 import cx.ring.utils.ConversationPath;
+import cx.ring.utils.DeviceUtils;
 import cx.ring.utils.MediaButtonsHelper;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Completable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import cx.ring.views.AvatarFactory;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 import static android.app.Activity.RESULT_OK;
 
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountPresenter.java b/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountPresenter.java
index ff00edfe7a765688be044b27a8022cd96da6114b..32690a975aa3344dbe1d7ac5c899d373f5104ff2 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountPresenter.java
@@ -31,7 +31,8 @@ import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
 import net.jami.services.HardwareService;
 import net.jami.services.PreferencesService;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class GeneralAccountPresenter extends RootPresenter<GeneralAccountView> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java
index 05714a4e66e05c44d80b1f82dd93731a9e3e6267..0e5147747ee8b97bbfaa68e69184bde0baa5d8c4 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/LocationSharingFragment.java
@@ -82,12 +82,12 @@ import cx.ring.databinding.FragLocationSharingBinding;
 import cx.ring.services.LocationSharingService;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.TouchClickListener;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class LocationSharingFragment extends Fragment {
     private static final String TAG = LocationSharingFragment.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferencePresenter.java b/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferencePresenter.java
index ca58826315004c66cd43ba6e23e8189838dccf9f..15085da4d8e9e6f5a73e00a6766790d80f086798 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferencePresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferencePresenter.java
@@ -32,7 +32,8 @@ import net.jami.model.ConfigKey;
 import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
 import net.jami.services.DeviceRuntimeService;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class MediaPreferencePresenter extends RootPresenter<MediaPreferenceView>
 {
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java
index fd739b2ee5b637c6f9147511727c52fe978eeb38..3671a92890fd3c224d6fd5d068668e04358f7516 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/ShareWithFragment.java
@@ -50,8 +50,8 @@ import cx.ring.client.ConversationActivity;
 import cx.ring.databinding.FragSharewithBinding;
 import cx.ring.utils.ConversationPath;
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ShareWithFragment extends Fragment {
     private final static String TAG = ShareWithFragment.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
index 8984f90944ed74cb240af7ce8606e4b6b2d7494d..0e223106bb3b1137c5b8bc6f277136c1dd7b2fa5 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/SmartListFragment.java
@@ -74,7 +74,7 @@ import cx.ring.utils.ClipboardHelper;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.DeviceUtils;
 import cx.ring.viewholders.SmartListViewHolder;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class SmartListFragment extends BaseSupportFragment<SmartListPresenter> implements SearchView.OnQueryTextListener,
         SmartListViewHolder.SmartListListeners,
diff --git a/ring-android/app/src/main/java/cx/ring/service/DRingService.java b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
index 743ac70b260c00fc87ac42947294ebea3f3263fe..7961014f7422fcf9559b839083b63940d9798597 100644
--- a/ring-android/app/src/main/java/cx/ring/service/DRingService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/DRingService.java
@@ -74,7 +74,7 @@ import net.jami.services.PreferencesService;
 import cx.ring.tv.call.TVCallActivity;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.DeviceUtils;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class DRingService extends Service {
     private static final String TAG = DRingService.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/services/CameraService.java b/ring-android/app/src/main/java/cx/ring/services/CameraService.java
index 711390b920372d4f8d1008040befe6029ad524ba..5dbf140e4dae705b7f60f62472d5b453cb39b719 100644
--- a/ring-android/app/src/main/java/cx/ring/services/CameraService.java
+++ b/ring-android/app/src/main/java/cx/ring/services/CameraService.java
@@ -73,13 +73,13 @@ import net.jami.daemon.StringMap;
 import net.jami.daemon.UintVect;
 import net.jami.utils.Tuple;
 import cx.ring.views.AutoFitTextureView;
-import io.reactivex.Completable;
-import io.reactivex.Maybe;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class CameraService {
     private static final String TAG = CameraService.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java
index 91d412c9bb1340d22915d1a779bf9e42e2bddd8e..cf9cccf02fcd9ab045f0a311d42890a15bdf30b1 100644
--- a/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/ContactServiceImpl.java
@@ -47,9 +47,9 @@ import javax.inject.Inject;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.views.AvatarFactory;
 import ezvcard.VCard;
-import io.reactivex.Completable;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class ContactServiceImpl extends ContactService {
 
diff --git a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
index 5800dac5accd8616f20093efed050fea2c632448..e5ec578666b374d023091f69c7de26e261eaf22d 100644
--- a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java
@@ -56,9 +56,10 @@ import cx.ring.utils.BluetoothWrapper;
 import net.jami.services.HardwareService;
 import net.jami.utils.Log;
 import cx.ring.utils.Ringer;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+
 import net.jami.utils.Tuple;
-import io.reactivex.Completable;
-import io.reactivex.Observable;
 
 public class HardwareServiceImpl extends HardwareService implements AudioManager.OnAudioFocusChangeListener, BluetoothWrapper.BluetoothChangeListener {
 
diff --git a/ring-android/app/src/main/java/cx/ring/services/LocationSharingService.java b/ring-android/app/src/main/java/cx/ring/services/LocationSharingService.java
index def031e9f9880d9215443afedd7ac735f960dbb5..334b2da524f81641c472f733ba9bd6a1d2ce0b9c 100644
--- a/ring-android/app/src/main/java/cx/ring/services/LocationSharingService.java
+++ b/ring-android/app/src/main/java/cx/ring/services/LocationSharingService.java
@@ -71,15 +71,15 @@ import net.jami.services.AccountService;
 import net.jami.services.CallService;
 
 import cx.ring.utils.ConversationPath;
-import io.reactivex.Observable;
-import io.reactivex.ObservableSource;
-import io.reactivex.Observer;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.ObservableSource;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class LocationSharingService extends Service implements LocationListener {
     private static final String TAG = "LocationSharingService";
@@ -103,7 +103,7 @@ public class LocationSharingService extends Service implements LocationListener
     private boolean started = false;
 
     private LocationManager mLocationManager;
-    private NotificationManager mNoticationManager;
+    private NotificationManager mNotificationManager;
     private SharedPreferences mPreferences;
     private Handler mHandler;
 
@@ -126,10 +126,10 @@ public class LocationSharingService extends Service implements LocationListener
 
     public Observable<Long> getContactSharingExpiration(ConversationPath path) {
         return Observable.timer(1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
-                .startWith(0L)
+                .startWithItem(0L)
                 .repeat()
                 .map(i -> contactLocationShare.get(path).getTime() - SystemClock.elapsedRealtime())
-                .onErrorResumeNext((ObservableSource<Long>) Observer::onComplete);
+                .onErrorComplete();
     }
 
     @Override
@@ -137,7 +137,7 @@ public class LocationSharingService extends Service implements LocationListener
         ((JamiApplication) getApplication()).getInjectionComponent().inject(this);
 
         mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
-        mNoticationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
         mPreferences = getSharedPreferences(PREFERENCES_LOCATION, Context.MODE_PRIVATE);
         mHandler = new Handler(getMainLooper());
         String posLongitude = mPreferences.getString(PREFERENCES_KEY_POS_LONG, null);
@@ -220,7 +220,7 @@ public class LocationSharingService extends Service implements LocationListener
                         }));
             } else {
                 mDisposableBag.add(getNotification(now)
-                        .subscribe(notification -> mNoticationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
+                        .subscribe(notification -> mNotificationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
             }
         }
         else if (ACTION_STOP.equals(action)) {
@@ -253,7 +253,7 @@ public class LocationSharingService extends Service implements LocationListener
                 started = false;
             } else {
                 mDisposableBag.add(getNotification(now)
-                        .subscribe(notification -> mNoticationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
+                        .subscribe(notification -> mNotificationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
             }
         }
         return START_NOT_STICKY;
@@ -382,7 +382,7 @@ public class LocationSharingService extends Service implements LocationListener
             started = false;
         } else if (changed) {
             mDisposableBag.add(getNotification(now.getTime())
-                    .subscribe(notification -> mNoticationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
+                    .subscribe(notification -> mNotificationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
         }
     }
 
@@ -391,7 +391,7 @@ public class LocationSharingService extends Service implements LocationListener
             return;
         long now = SystemClock.uptimeMillis();
         mDisposableBag.add(getNotification(now)
-                .subscribe(notification -> mNoticationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
+                .subscribe(notification -> mNotificationManager.notify(NOTIF_SYNC_SERVICE_ID, notification)));
         mHandler.postAtTime(this::refreshNotificationTimer, now + (30 * 1000));
     }
 
diff --git a/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java
index 098259f9e8521a7c9d8b417ee6cb7f1e10c12679..f7e860f4d0cbcdc498706d0287317c9ef806840b 100644
--- a/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java
+++ b/ring-android/app/src/main/java/cx/ring/services/VCardServiceImpl.java
@@ -38,9 +38,9 @@ import ezvcard.VCard;
 import ezvcard.parameter.ImageType;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
-import io.reactivex.Maybe;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class VCardServiceImpl extends VCardService {
 
diff --git a/ring-android/app/src/main/java/cx/ring/settings/AccountFragment.java b/ring-android/app/src/main/java/cx/ring/settings/AccountFragment.java
index cb7f393d9ef855da1b64d4636aadad8b0cf2bd6f..b712255c6fdb4dbb20c282ece639260266039b5b 100644
--- a/ring-android/app/src/main/java/cx/ring/settings/AccountFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/settings/AccountFragment.java
@@ -40,8 +40,8 @@ import cx.ring.account.JamiAccountSummaryFragment;
 import cx.ring.application.JamiApplication;
 import cx.ring.client.HomeActivity;
 import cx.ring.databinding.FragAccountBinding;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 import net.jami.services.AccountService;
 
diff --git a/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginPathPreferenceFragment.java b/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginPathPreferenceFragment.java
index 2638f6c70467e4bf26b6e8ae5b5b1f1736723cdc..56c1d2574b172fee43c6c00a7f01318ce7b932b1 100644
--- a/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginPathPreferenceFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginPathPreferenceFragment.java
@@ -43,7 +43,7 @@ import cx.ring.R;
 import cx.ring.client.HomeActivity;
 import cx.ring.databinding.FragPluginsPathPreferenceBinding;
 import cx.ring.utils.AndroidFileUtils;
-import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
 
 public class PluginPathPreferenceFragment extends Fragment implements PathListAdapter.PathListItemListener {
 
diff --git a/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginsListSettingsFragment.java b/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginsListSettingsFragment.java
index 10eae2020f8fdea7d28139aee605649fff8600ca..0c503ca28695129898d935cf6201953b8c5aaaa6 100644
--- a/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginsListSettingsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/settings/pluginssettings/PluginsListSettingsFragment.java
@@ -30,8 +30,8 @@ import cx.ring.client.HomeActivity;
 import cx.ring.databinding.FragPluginsListSettingsBinding;
 import cx.ring.plugins.PluginUtils;
 import cx.ring.utils.AndroidFileUtils;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class PluginsListSettingsFragment extends Fragment implements PluginsListAdapter.PluginListItemListener {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountWizard.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountWizard.java
index 433b6700361261cccc61a79d758f6f1dbce282cc..72a3921489d6b32185547830cb043ded83491d49 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountWizard.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountWizard.java
@@ -42,8 +42,8 @@ import net.jami.mvp.AccountCreationModel;
 import cx.ring.mvp.BaseActivity;
 import net.jami.utils.VCardUtils;
 import ezvcard.VCard;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class TVAccountWizard
         extends BaseActivity<AccountWizardPresenter>
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileCreationFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileCreationFragment.java
index 1fa905d90af77e2e1f513da4b4494b434ff6893f..e844557cced5f5a5999e30bfbd02390da67082af 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileCreationFragment.java
@@ -53,7 +53,7 @@ import net.jami.mvp.AccountCreationModel;
 import cx.ring.tv.camera.CustomCameraActivity;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class TVProfileCreationFragment extends JamiGuidedStepFragment<ProfileCreationPresenter>
         implements ProfileCreationView {
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java
index 3300106f8490b35fe176a2bf7585740b15cebd4e..646aa46eb9f2b8df8509c4a9101d798592b0fba0 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVProfileEditingFragment.java
@@ -49,9 +49,9 @@ import cx.ring.tv.camera.CustomCameraActivity;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.BitmapUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class TVProfileEditingFragment extends JamiGuidedStepFragment<HomeNavigationPresenter>
         implements HomeNavigationView {
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
index 45d56eb9183db1dee7bf80b1cdeb9b4291ebbc2d..5dc6994b1d2901ca75352241848016ec48cc2f8d 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVShareFragment.java
@@ -40,8 +40,8 @@ import net.jami.share.ShareViewModel;
 import net.jami.utils.Log;
 import net.jami.utils.QRCodeUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class TVShareFragment extends BaseSupportFragment<SharePresenter> implements GenericView<ShareViewModel> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
index 6c411718f0f7b8eb6f8b99af0839201451c663fd..39b372e7fc49a3b18046c9f1e957a7a1d108df8a 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallFragment.java
@@ -94,7 +94,6 @@ import cx.ring.utils.ActionHelper;
 import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.ConversationPath;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.disposables.CompositeDisposable;
 
 public class TVCallFragment extends BaseSupportFragment<CallPresenter> implements CallView {
 
@@ -112,7 +111,6 @@ public class TVCallFragment extends BaseSupportFragment<CallPresenter> implement
 
     // Screen wake lock for incoming call
     private Runnable runnable;
-    private final CompositeDisposable mCompositeDisposable = new CompositeDisposable();
     private int mPreviewWidth = 720, mPreviewHeight = 1280;
     private int mPreviewWidthRot = 720, mPreviewHeightRot = 1280;
     private PowerManager.WakeLock mScreenWakeLock;
@@ -264,7 +262,6 @@ public class TVCallFragment extends BaseSupportFragment<CallPresenter> implement
     @Override
     public void onDestroyView() {
         super.onDestroyView();
-        mCompositeDisposable.clear();
         if (mScreenWakeLock != null && mScreenWakeLock.isHeld()) {
             mScreenWakeLock.release();
         }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/camera/CustomCameraActivity.java b/ring-android/app/src/main/java/cx/ring/tv/camera/CustomCameraActivity.java
index bb58ab5364ec081fca8cbce5a5234ef8f472e659..2c503874d315cc4d48a2d7cb970bf0ca986fd162 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/camera/CustomCameraActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/camera/CustomCameraActivity.java
@@ -45,10 +45,10 @@ import cx.ring.R;
 import cx.ring.databinding.CamerapickerBinding;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.ContentUriHandler;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 @SuppressWarnings("deprecation")
 public class CustomCameraActivity extends Activity {
diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java
index 527218aaea8174e377065b020a298935fb238ee8..410f956e02958e2cc82136795eace096a1cd2ff8 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java
@@ -34,8 +34,9 @@ import net.jami.services.AccountService;
 import net.jami.services.VCardService;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.utils.ConversationPath;
+import io.reactivex.rxjava3.core.Scheduler;
+
 import net.jami.utils.VCardUtils;
-import io.reactivex.Scheduler;
 
 public class TVContactPresenter extends RootPresenter<TVContactView> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java
index 0eb649d75176ebd718088621a22119b42fc83cfa..048f508ffd320562035b3662f0077d4caa7111a1 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationAdapter.java
@@ -84,9 +84,9 @@ import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.GlideApp;
 import cx.ring.utils.GlideOptions;
 import cx.ring.utils.ResourceMapper;
-import io.reactivex.Observable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class TvConversationAdapter extends RecyclerView.Adapter<TvConversationViewHolder> {
     private final static String TAG = TvConversationAdapter.class.getSimpleName();
@@ -134,7 +134,7 @@ public class TvConversationAdapter extends RecyclerView.Adapter<TvConversationVi
         timestampUpdateTimer = Observable.interval(10, TimeUnit.SECONDS)
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
-                .startWith(0L);
+                .startWithItem(0L);
     }
 
     /**
@@ -584,7 +584,7 @@ public class TvConversationAdapter extends RecyclerView.Adapter<TvConversationVi
                     viewHolder.compositeDisposable.add(Observable.interval(1L, TimeUnit.SECONDS)
                             .subscribeOn(Schedulers.io())
                             .observeOn(AndroidSchedulers.mainThread())
-                            .startWith(0L)
+                            .startWithItem(0L)
                             .subscribe(t -> {
                                 int pS = player.getCurrentPosition() / 1000;
                                 int dS = player.getDuration() / 1000;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
index 0e93ea0086bf5a22a46c5c337971415e036bcd82..23c5ff6c924f2494ab6041aa43ca76f52b9971af 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.java
@@ -81,10 +81,10 @@ import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.ConversationPath;
 import net.jami.utils.StringUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Completable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class TvConversationFragment extends BaseSupportFragment<ConversationPresenter> implements ConversationView {
     private static final String TAG = TvConversationFragment.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationViewHolder.java b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationViewHolder.java
index 1a038a7736e630a805f389f9ff58b55d1e1c42d9..de78c6acf8d85f2ba4e4f6dfaf7c2e85c1c933d5 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationViewHolder.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/conversation/TvConversationViewHolder.java
@@ -33,7 +33,7 @@ import android.widget.TextView;
 import androidx.recyclerview.widget.RecyclerView;
 
 import cx.ring.R;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class TvConversationViewHolder extends RecyclerView.ViewHolder {
     public TextView mMsgTxt;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java b/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java
index e24566ffe76e4ab52690373fb2ce8ffca3cb5ba4..d1b351edc7e306956b3ca690f9aadb0a61ea986e 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/HomeActivity.java
@@ -34,8 +34,8 @@ import javax.inject.Inject;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
 import cx.ring.tv.account.TVAccountWizard;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class HomeActivity extends FragmentActivity {
     private BackgroundManager mBackgroundManager;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
index 92d37c83f48721617b4baee89bd4ef3b0a619d13..93a909e581e0936bfe56dd48e62a846148780fdf 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainFragment.java
@@ -92,11 +92,11 @@ import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.ConversationPath;
 import net.jami.utils.QRCodeUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class MainFragment extends BaseBrowseFragment<MainPresenter> implements MainView {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
index e3df05af627bff00d19c76fbd29e0381ce78e6d4..c3515f2a8264fcc0b6680a3a4dda220e1c05f7a1 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/MainPresenter.java
@@ -34,8 +34,9 @@ import net.jami.mvp.RootPresenter;
 import net.jami.navigation.HomeNavigationViewModel;
 import net.jami.services.AccountService;
 import net.jami.smartlist.SmartListViewModel;
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class MainPresenter extends RootPresenter<MainView> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchPresenter.java
index 1c5edc46bd5dfb6e53fef746e8783bc44d91f630..ba0994e23399ff396d8c2d8e4eed896fdf781266 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchPresenter.java
@@ -33,8 +33,9 @@ import net.jami.services.AccountService;
 import net.jami.services.HardwareService;
 import net.jami.services.VCardService;
 import net.jami.smartlist.SmartListViewModel;
-import io.reactivex.Scheduler;
-import io.reactivex.subjects.PublishSubject;
+
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.subjects.PublishSubject;
 
 public class ContactSearchPresenter extends RootPresenter<ContactSearchView> {
 
diff --git a/ring-android/app/src/main/java/cx/ring/utils/AndroidFileUtils.java b/ring-android/app/src/main/java/cx/ring/utils/AndroidFileUtils.java
index 73455d21b64d7395b1fdaf3eacbaee591ac78574..8e0299a441ee099ac7f40d52fbf14113126a99dc 100644
--- a/ring-android/app/src/main/java/cx/ring/utils/AndroidFileUtils.java
+++ b/ring-android/app/src/main/java/cx/ring/utils/AndroidFileUtils.java
@@ -55,9 +55,9 @@ import androidx.annotation.NonNull;
 import net.jami.model.Conversation;
 import net.jami.utils.FileUtils;
 
-import io.reactivex.Completable;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class AndroidFileUtils {
 
@@ -310,7 +310,8 @@ public class AndroidFileUtils {
      * @param uri uri of the
      * @return Single<File> which points to the newly created copy in the cache
      */
-    public static @NonNull Single<File> getCacheFile(@NonNull Context context, @NonNull Uri uri) {
+    public static @NonNull
+    Single<File> getCacheFile(@NonNull Context context, @NonNull Uri uri) {
         ContentResolver contentResolver = context.getContentResolver();
         File cacheDir = context.getCacheDir();
         return Single.fromCallable(() -> {
diff --git a/ring-android/app/src/main/java/cx/ring/viewholders/SmartListViewHolder.java b/ring-android/app/src/main/java/cx/ring/viewholders/SmartListViewHolder.java
index 61e03b2d4ee396c608b6654d6fa1b5b80b94ab26..d3e6d16cd36c8888fd0b9af6c260b87757d02aa9 100644
--- a/ring-android/app/src/main/java/cx/ring/viewholders/SmartListViewHolder.java
+++ b/ring-android/app/src/main/java/cx/ring/viewholders/SmartListViewHolder.java
@@ -22,6 +22,7 @@ package cx.ring.viewholders;
 import android.content.Context;
 import android.graphics.Typeface;
 import android.text.format.DateUtils;
+import android.util.Log;
 import android.view.View;
 
 import androidx.annotation.NonNull;
@@ -32,15 +33,12 @@ import net.jami.model.ContactEvent;
 import net.jami.model.Interaction;
 import net.jami.smartlist.SmartListViewModel;
 
-import java.util.concurrent.TimeUnit;
-
 import cx.ring.R;
 import cx.ring.databinding.ItemSmartlistBinding;
 import cx.ring.databinding.ItemSmartlistHeaderBinding;
 import cx.ring.utils.ResourceMapper;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Observable;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class SmartListViewHolder extends RecyclerView.ViewHolder {
     public final ItemSmartlistBinding binding;
@@ -66,13 +64,11 @@ public class SmartListViewHolder extends RecyclerView.ViewHolder {
         compositeDisposable.clear();
 
         if (binding != null) {
-            compositeDisposable.add(Observable.create(e -> itemView.setOnClickListener(e::onNext))
-                    .throttleFirst(1000, TimeUnit.MILLISECONDS)
-                    .subscribe(v -> clickListener.onItemClick(smartListViewModel)));
-            Observable<Boolean> isSelected = smartListViewModel.getSelected();
-            if (isSelected != null) {
-                compositeDisposable.add(isSelected.subscribe(binding.itemLayout::setActivated));
-            }
+            itemView.setOnClickListener(v -> clickListener.onItemClick(smartListViewModel));
+            compositeDisposable.add(smartListViewModel.getSelected().subscribe(selected -> {
+                Log.w("SmartListViewHolder", "selected " + selected + " " + smartListViewModel.getContactName());
+                binding.itemLayout.setActivated(selected);
+            }));
             itemView.setOnLongClickListener(v -> {
                 clickListener.onItemLongClick(smartListViewModel);
                 return true;
diff --git a/ring-android/app/src/main/java/cx/ring/views/AvatarDrawable.java b/ring-android/app/src/main/java/cx/ring/views/AvatarDrawable.java
index 66987a724139ea64b3edfd8980958afa8bdeb48f..b8ec20818c1050a3337a0aea2ff0f72067571a16 100644
--- a/ring-android/app/src/main/java/cx/ring/views/AvatarDrawable.java
+++ b/ring-android/app/src/main/java/cx/ring/views/AvatarDrawable.java
@@ -35,7 +35,6 @@ import android.graphics.Typeface;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.VectorDrawable;
 import android.text.TextUtils;
-import android.util.Log;
 import android.util.TypedValue;
 
 import androidx.annotation.NonNull;
@@ -55,7 +54,7 @@ import java.util.List;
 import cx.ring.R;
 import cx.ring.services.VCardServiceImpl;
 import cx.ring.utils.DeviceUtils;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class AvatarDrawable extends Drawable {
     private static final String TAG = AvatarDrawable.class.getSimpleName();
diff --git a/ring-android/app/src/main/java/cx/ring/views/AvatarFactory.java b/ring-android/app/src/main/java/cx/ring/views/AvatarFactory.java
index dcb979b08c20f1893c6a0fdf647ac48a1dc6c248..59a0e59dca9868a0e0349e0bb654f0b449264bab 100644
--- a/ring-android/app/src/main/java/cx/ring/views/AvatarFactory.java
+++ b/ring-android/app/src/main/java/cx/ring/views/AvatarFactory.java
@@ -38,7 +38,7 @@ import net.jami.model.Conversation;
 import net.jami.smartlist.SmartListViewModel;
 import cx.ring.utils.BitmapUtils;
 import cx.ring.views.AvatarDrawable;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public class AvatarFactory {
 
diff --git a/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java b/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java
index 10b4c2152089b879999aa377ae8e1ff8a524920e..12eaa44282625546acc535a7574a1364b220970b 100644
--- a/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java
+++ b/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java
@@ -35,7 +35,7 @@ import android.widget.TextView;
 
 import cx.ring.R;
 import cx.ring.adapters.ConversationAdapter;
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public class ConversationViewHolder extends RecyclerView.ViewHolder {
     public ConversationAdapter.MessageType type;
diff --git a/ring-android/app/src/main/java/cx/ring/views/ParticipantView.java b/ring-android/app/src/main/java/cx/ring/views/ParticipantView.java
index 831aad32bb7079661d2181448d2c8f8345fbc292..057ba1c775f3a65acf1a1710397f5537a992864b 100644
--- a/ring-android/app/src/main/java/cx/ring/views/ParticipantView.java
+++ b/ring-android/app/src/main/java/cx/ring/views/ParticipantView.java
@@ -4,7 +4,7 @@ import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;
 
 import cx.ring.databinding.ItemConferenceParticipantBinding;
-import io.reactivex.disposables.Disposable;
+import io.reactivex.rxjava3.disposables.Disposable;
 
 public class ParticipantView extends RecyclerView.ViewHolder {
     public final ItemConferenceParticipantBinding binding;
diff --git a/ring-android/libringclient/build.gradle b/ring-android/libringclient/build.gradle
index 7ab42b7dce9c01e66b9f549f4efd3119ff674550..1c2cde6f87423b9110c01497580c719931f30293 100644
--- a/ring-android/libringclient/build.gradle
+++ b/ring-android/libringclient/build.gradle
@@ -20,7 +20,7 @@ dependencies {
     testImplementation 'junit:junit:4.13.2'
 
     // RxJava
-    implementation 'io.reactivex.rxjava2:rxjava:2.2.21'
+    implementation 'io.reactivex.rxjava3:rxjava:3.0.10'
 
     // gson
     implementation 'com.google.code.gson:gson:2.8.7'
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardPresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardPresenter.java
index fb55e4fd9684541672ce7dc54bcf66b3c1af6a38..0a8722aad1b808242c45a7246df1dd77102a4e86 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardPresenter.java
@@ -19,10 +19,6 @@
  */
 package net.jami.account;
 
-import net.jami.services.AccountService;
-import net.jami.services.DeviceRuntimeService;
-import net.jami.services.PreferencesService;
-
 import java.util.HashMap;
 import java.util.Map;
 
@@ -35,20 +31,24 @@ import net.jami.model.ConfigKey;
 import net.jami.model.Settings;
 import net.jami.mvp.AccountCreationModel;
 import net.jami.mvp.RootPresenter;
+import net.jami.services.AccountService;
+import net.jami.services.DeviceRuntimeService;
+import net.jami.services.PreferencesService;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.subjects.BehaviorSubject;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
 
 public class AccountWizardPresenter extends RootPresenter<net.jami.account.AccountWizardView> {
 
     public static final String TAG = AccountWizardPresenter.class.getSimpleName();
 
-    private final net.jami.services.AccountService mAccountService;
-    private final net.jami.services.PreferencesService mPreferences;
-    private final net.jami.services.DeviceRuntimeService mDeviceService;
+    private final AccountService mAccountService;
+    private final PreferencesService mPreferences;
+    private final DeviceRuntimeService mDeviceService;
     private final Scheduler mUiScheduler;
 
     //private boolean mCreationError = false;
@@ -56,7 +56,7 @@ public class AccountWizardPresenter extends RootPresenter<net.jami.account.Accou
     private String mAccountType;
     private AccountCreationModel mAccountCreationModel;
 
-    private Observable<net.jami.model.Account> newAccount;
+    private Observable<Account> newAccount;
 
     @Inject
     public AccountWizardPresenter(AccountService accountService,
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardView.java b/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardView.java
index 870113748c7e7a53e993d4e64cb2d224f01f3f8a..7d927c1a5b0b5b7e8639c9ae6fac51aa5b529dce 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardView.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/AccountWizardView.java
@@ -22,7 +22,7 @@ package net.jami.account;
 import net.jami.model.Account;
 import net.jami.mvp.AccountCreationModel;
 import ezvcard.VCard;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Single;
 
 public interface AccountWizardView {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountCreationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountCreationPresenter.java
index d8217fe8a5ba0ab2395df44eda1bedf3af052860..f09359c8dfd1506faa2f9d066f9d5faaaadd17a9 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountCreationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountCreationPresenter.java
@@ -30,8 +30,9 @@ import javax.inject.Named;
 import net.jami.mvp.AccountCreationModel;
 import net.jami.mvp.RootPresenter;
 import net.jami.utils.StringUtils;
-import io.reactivex.Scheduler;
-import io.reactivex.subjects.PublishSubject;
+
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.subjects.PublishSubject;
 
 public class JamiAccountCreationPresenter extends RootPresenter<net.jami.account.JamiAccountCreationView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountSummaryPresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountSummaryPresenter.java
index a0a1b5f9bcf8c368b73eba579fac7d5c05ab6204..88dd843b0a9de73386e555fe3ff560722069c815 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountSummaryPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/JamiAccountSummaryPresenter.java
@@ -38,9 +38,9 @@ import net.jami.utils.VCardUtils;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class JamiAccountSummaryPresenter extends RootPresenter<net.jami.account.JamiAccountSummaryView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/LinkDevicePresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/LinkDevicePresenter.java
index 510d4d697b878e087824bfe5ffc7e536480d5a24..9c914ad711ce84c28990e20fdc12afceef49640f 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/LinkDevicePresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/LinkDevicePresenter.java
@@ -30,7 +30,7 @@ import javax.inject.Named;
 import net.jami.model.Account;
 import net.jami.mvp.RootPresenter;
 
-import io.reactivex.Scheduler;
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class LinkDevicePresenter extends RootPresenter<LinkDeviceView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/account/ProfileCreationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/account/ProfileCreationPresenter.java
index e347c5393b348fb80a496ee271f71265d28239d2..ab2fb1e7d0d2ac1dcd7e36ee61933f80ceb8303c 100644
--- a/ring-android/libringclient/src/main/java/net/jami/account/ProfileCreationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/account/ProfileCreationPresenter.java
@@ -27,8 +27,9 @@ import javax.inject.Inject;
 
 import net.jami.mvp.RootPresenter;
 import net.jami.utils.Log;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
+
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
 
 public class ProfileCreationPresenter extends RootPresenter<net.jami.account.ProfileCreationView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/call/CallPresenter.java b/ring-android/libringclient/src/main/java/net/jami/call/CallPresenter.java
index a11fe3eac0074fb85be835ebf81ff2eb3581dbe8..ddb94f4d034db0457b9e4d8ec36ecfcce01cdf06 100644
--- a/ring-android/libringclient/src/main/java/net/jami/call/CallPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/call/CallPresenter.java
@@ -45,14 +45,14 @@ import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import io.reactivex.Maybe;
-import io.reactivex.Observable;
-import io.reactivex.Observer;
-import io.reactivex.Scheduler;
-import io.reactivex.annotations.NonNull;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class CallPresenter extends RootPresenter<CallView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/contactrequests/BlockListPresenter.java b/ring-android/libringclient/src/main/java/net/jami/contactrequests/BlockListPresenter.java
index 4fd93b32bf825684bffe0ac93b1dcfdd14dadf3c..ca74a14c6f8146f7680100d686852617b18d8a54 100644
--- a/ring-android/libringclient/src/main/java/net/jami/contactrequests/BlockListPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/contactrequests/BlockListPresenter.java
@@ -30,7 +30,8 @@ import net.jami.model.Contact;
 import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
 import net.jami.utils.Log;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class BlockListPresenter extends RootPresenter<BlockListView> {
     static private final String TAG = BlockListPresenter.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsPresenter.java b/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsPresenter.java
index 4c66792b5be28a8f39172e8cf9ae7f703d062255..03ff087a246bd567668ab93be1dfeefd0a4edd4d 100644
--- a/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsPresenter.java
@@ -32,9 +32,10 @@ import net.jami.mvp.RootPresenter;
 import net.jami.services.AccountService;
 import net.jami.smartlist.SmartListViewModel;
 import net.jami.utils.Log;
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
-import io.reactivex.subjects.BehaviorSubject;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
 
 public class ContactRequestsPresenter extends RootPresenter<net.jami.contactrequests.ContactRequestsView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsView.java b/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsView.java
index b94d7ad23488255e69df459d56a6a873c103a657..ca32ddac2f7a8f6663700109ce85f146d90b4350 100644
--- a/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsView.java
+++ b/ring-android/libringclient/src/main/java/net/jami/contactrequests/ContactRequestsView.java
@@ -24,7 +24,7 @@ import java.util.List;
 import net.jami.model.Uri;
 import net.jami.smartlist.SmartListViewModel;
 
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public interface ContactRequestsView {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/conversation/ConversationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/conversation/ConversationPresenter.java
index d106a517b89d4fa814f852ebc3bd87c46bb5892b..5463e3ca57602efe48eb2544288201c73d0551e5 100644
--- a/ring-android/libringclient/src/main/java/net/jami/conversation/ConversationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/conversation/ConversationPresenter.java
@@ -50,12 +50,12 @@ import java.io.File;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class ConversationPresenter extends RootPresenter<ConversationView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/facades/ConversationFacade.java b/ring-android/libringclient/src/main/java/net/jami/facades/ConversationFacade.java
index 01aef0be3c8d08727c9f7db742f38feb069bc76f..bf4812873b6032209ea28c28ff1428a372b955ef 100644
--- a/ring-android/libringclient/src/main/java/net/jami/facades/ConversationFacade.java
+++ b/ring-android/libringclient/src/main/java/net/jami/facades/ConversationFacade.java
@@ -52,13 +52,13 @@ import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
 
-import io.reactivex.Completable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class ConversationFacade {
 
@@ -370,7 +370,7 @@ public class ConversationFacade {
     private Observable<SmartListViewModel> observeConversation(Account account, Conversation conversation, boolean hasPresence) {
         return Observable.merge(account.getConversationSubject()
                         .filter(c -> c == conversation)
-                        .startWith(conversation),
+                        .startWithItem(conversation),
                 mContactService
                         .observeContact(conversation.getAccountId(), conversation.getContacts(), hasPresence))
                 .map(e -> new SmartListViewModel(conversation, hasPresence));
diff --git a/ring-android/libringclient/src/main/java/net/jami/model/Account.java b/ring-android/libringclient/src/main/java/net/jami/model/Account.java
index eaabc395ab289d211a49b58f33e7b056468ca79f..c41dfaf8ac756e340568f5239bd1c86c475d517e 100644
--- a/ring-android/libringclient/src/main/java/net/jami/model/Account.java
+++ b/ring-android/libringclient/src/main/java/net/jami/model/Account.java
@@ -37,12 +37,13 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import io.reactivex.Maybe;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
+import ezvcard.VCard;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class Account {
     private static final String TAG = Account.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/model/Conference.java b/ring-android/libringclient/src/main/java/net/jami/model/Conference.java
index cab4c89649d924853598652dfe275a99852e76f1..efc9b29d9c20e0a8a53d069d2dccbad0750c536c 100644
--- a/ring-android/libringclient/src/main/java/net/jami/model/Conference.java
+++ b/ring-android/libringclient/src/main/java/net/jami/model/Conference.java
@@ -28,9 +28,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import io.reactivex.Observable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class Conference {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/model/Contact.java b/ring-android/libringclient/src/main/java/net/jami/model/Contact.java
index 996a40607574f8de2f47b46baec0ae692465025c..4740a0438478fc16bf66c89dfaf4b93dba6a8f6a 100644
--- a/ring-android/libringclient/src/main/java/net/jami/model/Contact.java
+++ b/ring-android/libringclient/src/main/java/net/jami/model/Contact.java
@@ -25,10 +25,10 @@ import net.jami.utils.StringUtils;
 import java.util.ArrayList;
 import java.util.Date;
 
-import io.reactivex.Emitter;
-import io.reactivex.Observable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Emitter;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class Contact {
     protected static final String TAG = Contact.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/model/Conversation.java b/ring-android/libringclient/src/main/java/net/jami/model/Conversation.java
index db047ac2843b462a3d5fb94303fd2535ecefa1f4..44ff694a28c9c9a0e74232fe8e1cac1e4e3ed02e 100644
--- a/ring-android/libringclient/src/main/java/net/jami/model/Conversation.java
+++ b/ring-android/libringclient/src/main/java/net/jami/model/Conversation.java
@@ -36,13 +36,13 @@ import java.util.NavigableMap;
 import java.util.Set;
 import java.util.TreeMap;
 
-import io.reactivex.Completable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.SingleSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.SingleSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class Conversation extends ConversationHistory {
     private static final String TAG = Conversation.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/mvp/AccountCreationModel.java b/ring-android/libringclient/src/main/java/net/jami/mvp/AccountCreationModel.java
index 37f7343e00255c11f48155571d667d8f65190bdb..f5ec2f39937a96a2a849cfa005e278dcdef5e455 100644
--- a/ring-android/libringclient/src/main/java/net/jami/mvp/AccountCreationModel.java
+++ b/ring-android/libringclient/src/main/java/net/jami/mvp/AccountCreationModel.java
@@ -25,10 +25,10 @@ import java.io.File;
 import java.io.Serializable;
 
 import ezvcard.VCard;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public abstract class AccountCreationModel implements Serializable {
 
@@ -44,7 +44,7 @@ public abstract class AccountCreationModel implements Serializable {
     transient private net.jami.model.Account newAccount = null;
     transient private Object photo = null;
 
-    transient private Observable<net.jami.model.Account> account;
+    transient private Observable<Account> account;
     transient protected final Subject<AccountCreationModel> profile = BehaviorSubject.createDefault(this);
 
     public AccountCreationModel() {
diff --git a/ring-android/libringclient/src/main/java/net/jami/mvp/RootPresenter.java b/ring-android/libringclient/src/main/java/net/jami/mvp/RootPresenter.java
index 51885e717af5fe9b2ae990bcd7d0e4de4afed440..58b57c7b5dd561ad5910756ff493f18dfbd21b2c 100644
--- a/ring-android/libringclient/src/main/java/net/jami/mvp/RootPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/mvp/RootPresenter.java
@@ -21,7 +21,7 @@ package net.jami.mvp;
 
 import java.lang.ref.WeakReference;
 
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public abstract class RootPresenter<T> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/navigation/HomeNavigationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/navigation/HomeNavigationPresenter.java
index 45ecfb11f3e6d89b4a69d6aabf4c977e3f7853d3..8640f713a41ad488afebf869417459cbda7f6a2b 100644
--- a/ring-android/libringclient/src/main/java/net/jami/navigation/HomeNavigationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/navigation/HomeNavigationPresenter.java
@@ -38,9 +38,9 @@ import net.jami.utils.VCardUtils;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class HomeNavigationPresenter extends RootPresenter<HomeNavigationView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/AccountService.java b/ring-android/libringclient/src/main/java/net/jami/services/AccountService.java
index f732512be93a96a407c22c696624596c71c7481a..15bae636b9cf5f1ed75da16f36c0a8c848656b84 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/AccountService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/AccountService.java
@@ -74,15 +74,15 @@ import javax.inject.Named;
 
 import ezvcard.Ezvcard;
 import ezvcard.VCard;
-import io.reactivex.Completable;
-import io.reactivex.Maybe;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.SingleSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.SingleSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 /**
  * This service handles the accounts
@@ -500,7 +500,7 @@ public class AccountService {
         })
                 .flatMap(account -> accountSubject
                         .filter(acc -> acc.getAccountID().equals(account.getAccountID()))
-                        .startWith(account))
+                        .startWithItem(account))
                 .subscribeOn(Schedulers.from(mExecutor));
     }
 
@@ -1895,7 +1895,7 @@ public class AccountService {
     public Observable<DataTransfer> observeDataTransfer(DataTransfer transfer) {
         return dataTransferSubject
                 .filter(t -> t == transfer)
-                .startWith(transfer);
+                .startWithItem(transfer);
     }
 
     public void setProxyEnabled(boolean enabled) {
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/CallService.java b/ring-android/libringclient/src/main/java/net/jami/services/CallService.java
index d5904ea3b7b002b051a7929b8db964bf10a796d3..92dd5ac045a8c04cf7b18aeef5658c8c9f87c955 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/CallService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/CallService.java
@@ -45,11 +45,11 @@ import net.jami.model.Uri;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
 import ezvcard.VCard;
-import io.reactivex.Completable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.PublishSubject;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.PublishSubject;
 
 public class CallService {
 
@@ -93,12 +93,12 @@ public class CallService {
 
         return conferenceSubject
                 .filter(c -> c == conf)
-                .startWith(conf)
+                .startWithItem(conf)
                 .map(Conference::getParticipants)
                 .switchMap(list -> Observable.fromIterable(list)
                         .flatMap(call -> callSubject.filter(c -> c == call)))
                 .map(call -> conf)
-                .startWith(conf);
+                .startWithItem(conf);
     }
 
     public Observable<Conference> getConfUpdates(final String confId) {
@@ -213,7 +213,7 @@ public class CallService {
 
         ConferenceEntity conferenceEntity = new ConferenceEntity(conference);
         return conferenceSubject
-                .startWith(conference)
+                .startWithItem(conference)
                 .filter(conf -> {
                     Log.w(TAG, "getConfUpdates filter " + conf.getConfId() + " " + conf.getParticipants().size() + " (tracked " + conferenceEntity.conference.getConfId() + " " + conferenceEntity.conference.getParticipants().size() + ")");
                     if (conf == conferenceEntity.conference) {
@@ -242,7 +242,7 @@ public class CallService {
     }
     private Observable<Call> getCallUpdates(final Call call) {
         return callSubject.filter(c -> c == call)
-                .startWith(call)
+                .startWithItem(call)
                 .takeWhile(c -> c.getCallStatus() != Call.CallStatus.OVER);
     }
     /*public Observable<SipCall> getCallUpdates(final String callId) {
@@ -457,12 +457,10 @@ public class CallService {
     }
 
     public Completable cancelMessage(final String accountId, final long messageID) {
-        return Completable
-                .fromAction(() -> {
-                    Log.i(TAG, "CancelMessage() running...   Account ID:  " + accountId + " " + "Message ID " + " " + messageID);
-                    JamiService.cancelMessage(accountId, messageID);
-                })
-                .subscribeOn(Schedulers.from(mExecutor));
+        return Completable.fromAction(() -> {
+            Log.i(TAG, "CancelMessage() running...   Account ID:  " + accountId + " " + "Message ID " + " " + messageID);
+            JamiService.cancelMessage(accountId, messageID);
+        }).subscribeOn(Schedulers.from(mExecutor));
     }
 
     private Call getCurrentCallForId(String callId) {
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/ContactService.java b/ring-android/libringclient/src/main/java/net/jami/services/ContactService.java
index 382453eee902c23523a227c106975b72d0904618..5762b1496eb1f65487bf3334ee379abfd8f7554b 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/ContactService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/ContactService.java
@@ -36,9 +36,9 @@ import net.jami.model.Uri;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
 import ezvcard.VCard;
-import io.reactivex.Completable;
-import io.reactivex.Observable;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
 
 /**
  * This service handles the contacts
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/HardwareService.java b/ring-android/libringclient/src/main/java/net/jami/services/HardwareService.java
index 037fb623536bb2f522b457cdbbb918440ed712f3..80249df326fb3047256813c383e569d4ece71c00 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/HardwareService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/HardwareService.java
@@ -37,15 +37,16 @@ import net.jami.model.Call;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
 import net.jami.utils.Tuple;
-import io.reactivex.Completable;
-import io.reactivex.Emitter;
-import io.reactivex.Observable;
-import io.reactivex.ObservableOnSubscribe;
-import io.reactivex.Scheduler;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
+
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Emitter;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.ObservableOnSubscribe;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public abstract class HardwareService {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/HistoryService.java b/ring-android/libringclient/src/main/java/net/jami/services/HistoryService.java
index 02ba0257a70848772792934351d0223b3048b0b0..5e460b2dfe4427e71958e07e79b234309209d3ab 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/HistoryService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/HistoryService.java
@@ -35,10 +35,11 @@ import net.jami.model.TextMessage;
 import net.jami.model.Uri;
 import net.jami.utils.Log;
 import net.jami.utils.StringUtils;
-import io.reactivex.Completable;
-import io.reactivex.Scheduler;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+
+import io.reactivex.rxjava3.core.Completable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public abstract class HistoryService {
     private static final String TAG = HistoryService.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/PreferencesService.java b/ring-android/libringclient/src/main/java/net/jami/services/PreferencesService.java
index aaa6a3ce74ddcec9de77a8c8ee69eb68a583107f..f5b36bcb67dc5be4022ce3fcad0f676aa7a303fc 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/PreferencesService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/PreferencesService.java
@@ -25,9 +25,10 @@ import java.util.Set;
 import javax.inject.Inject;
 
 import net.jami.model.Settings;
-import io.reactivex.Observable;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.Subject;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public abstract class PreferencesService {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/services/VCardService.java b/ring-android/libringclient/src/main/java/net/jami/services/VCardService.java
index 25d77ba41324d0e1b8d2e44acccd53a954a3796e..899995d759b7eaf46cbcf33bf986ebe05f639578 100644
--- a/ring-android/libringclient/src/main/java/net/jami/services/VCardService.java
+++ b/ring-android/libringclient/src/main/java/net/jami/services/VCardService.java
@@ -24,8 +24,8 @@ import java.io.File;
 import net.jami.model.Account;
 import net.jami.utils.Tuple;
 import ezvcard.VCard;
-import io.reactivex.Maybe;
-import io.reactivex.Single;
+import io.reactivex.rxjava3.core.Maybe;
+import io.reactivex.rxjava3.core.Single;
 
 public abstract class VCardService {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/settings/SettingsPresenter.java b/ring-android/libringclient/src/main/java/net/jami/settings/SettingsPresenter.java
index 3fc7d85e709ee368394edabb2818e9fbe62b93c7..e710015479a7ab4c72ba9dec5a558440cb714cfb 100644
--- a/ring-android/libringclient/src/main/java/net/jami/settings/SettingsPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/settings/SettingsPresenter.java
@@ -29,7 +29,8 @@ import net.jami.mvp.GenericView;
 import net.jami.mvp.RootPresenter;
 import net.jami.services.PreferencesService;
 import net.jami.utils.Log;
-import io.reactivex.Scheduler;
+
+import io.reactivex.rxjava3.core.Scheduler;
 
 public class SettingsPresenter extends RootPresenter<GenericView<Settings>>  {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/share/SharePresenter.java b/ring-android/libringclient/src/main/java/net/jami/share/SharePresenter.java
index 61661b19f2d6afa5cc98f900713f9eddefbaf621..ec1ebb811f4cd8e21f89b029cd64853eebbae7c9 100644
--- a/ring-android/libringclient/src/main/java/net/jami/share/SharePresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/share/SharePresenter.java
@@ -27,8 +27,8 @@ import javax.inject.Inject;
 import net.jami.mvp.GenericView;
 import net.jami.mvp.RootPresenter;
 
-import io.reactivex.Scheduler;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public class SharePresenter extends RootPresenter<GenericView<ShareViewModel>> {
     private final net.jami.services.AccountService mAccountService;
diff --git a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListPresenter.java b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListPresenter.java
index da3d8043b5a23ef7bf9c8934e490f2de78352aa0..a51cd8facd53ecd3d57c853d71a209e8b4033770 100644
--- a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListPresenter.java
@@ -35,14 +35,14 @@ import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import io.reactivex.Observable;
-import io.reactivex.Scheduler;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.disposables.Disposable;
-import io.reactivex.schedulers.Schedulers;
-import io.reactivex.subjects.BehaviorSubject;
-import io.reactivex.subjects.PublishSubject;
-import io.reactivex.subjects.Subject;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+import io.reactivex.rxjava3.subjects.BehaviorSubject;
+import io.reactivex.rxjava3.subjects.PublishSubject;
+import io.reactivex.rxjava3.subjects.Subject;
 
 public class SmartListPresenter extends RootPresenter<SmartListView> {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListView.java b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListView.java
index 8664c5fb6adf25da8405973801636b604bf4f3a2..a043e9a5d7845b489ad38ad47780921ed61d96f1 100644
--- a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListView.java
+++ b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListView.java
@@ -24,7 +24,7 @@ import java.util.List;
 import net.jami.model.Uri;
 import net.jami.mvp.BaseView;
 
-import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
 
 public interface SmartListView extends BaseView {
 
diff --git a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListViewModel.java b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListViewModel.java
index 8ca3f792399b471f6cfb8d0e8c197a67e656bf3c..ff126999dc4a36fed0db4bc67075003f7efa6a95 100644
--- a/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListViewModel.java
+++ b/ring-android/libringclient/src/main/java/net/jami/smartlist/SmartListViewModel.java
@@ -28,8 +28,9 @@ import net.jami.model.Contact;
 import net.jami.model.Conversation;
 import net.jami.model.Interaction;
 import net.jami.model.Uri;
-import io.reactivex.Observable;
-import io.reactivex.Single;
+
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Single;
 
 public class SmartListViewModel
 {
diff --git a/ring-android/libringclient/src/main/java/net/jami/utils/VCardUtils.java b/ring-android/libringclient/src/main/java/net/jami/utils/VCardUtils.java
index b49650b318c701f01ed4e6ca0720fbd2cd9bce43..bb9c56335faf1d7d0dc126fc9b8f196ddf971f05 100644
--- a/ring-android/libringclient/src/main/java/net/jami/utils/VCardUtils.java
+++ b/ring-android/libringclient/src/main/java/net/jami/utils/VCardUtils.java
@@ -34,8 +34,8 @@ import ezvcard.property.FormattedName;
 import ezvcard.property.Photo;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Single;
-import io.reactivex.schedulers.Schedulers;
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 public final class VCardUtils {
     public static final String TAG = VCardUtils.class.getSimpleName();
diff --git a/ring-android/libringclient/src/main/java/net/jami/wizard/SIPCreationPresenter.java b/ring-android/libringclient/src/main/java/net/jami/wizard/SIPCreationPresenter.java
index 193d7e6e902ec5ee639d98276995be68fd20f999..bbf6da8046387ac267e7ed0680ed1e1cbe0246a1 100644
--- a/ring-android/libringclient/src/main/java/net/jami/wizard/SIPCreationPresenter.java
+++ b/ring-android/libringclient/src/main/java/net/jami/wizard/SIPCreationPresenter.java
@@ -40,8 +40,9 @@ import ezvcard.VCard;
 import ezvcard.property.FormattedName;
 import ezvcard.property.RawProperty;
 import ezvcard.property.Uid;
-import io.reactivex.Scheduler;
-import io.reactivex.observers.DisposableObserver;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Scheduler;
+import io.reactivex.rxjava3.observers.DisposableObserver;
 
 public class SIPCreationPresenter extends RootPresenter<SIPCreationView> {
 
@@ -78,7 +79,6 @@ public class SIPCreationPresenter extends RootPresenter<SIPCreationView> {
      * Attempts to register the account specified by the form. If there are form errors (invalid or missing fields, etc.), the
      * errors are presented and no actual creation attempt is made.
      *
-     * @param alias         Alias account value
      * @param hostname      hostname account value
      * @param username      username account value
      * @param password      password account value
@@ -137,7 +137,7 @@ public class SIPCreationPresenter extends RootPresenter<SIPCreationView> {
                 .observeOn(mUiScheduler)
                 .subscribeWith(new DisposableObserver<Account>() {
                     @Override
-                    public void onNext(Account account) {
+                    public void onNext(@NonNull Account account) {
                         mAccount = account;
                         switch (account.getRegistrationState()) {
                             case AccountConfig.STATE_REGISTERED:
@@ -162,7 +162,7 @@ public class SIPCreationPresenter extends RootPresenter<SIPCreationView> {
                     }
 
                     @Override
-                    public void onError(Throwable e) {
+                    public void onError(@NonNull Throwable e) {
                         getView().showRegistrationError();
                         dispose();
                     }