diff --git a/ring-android/app/build.gradle b/ring-android/app/build.gradle
index 2cb0be5..147589f 100644
--- a/ring-android/app/build.gradle
+++ b/ring-android/app/build.gradle
@@ -58,6 +58,9 @@
             universalApk true
         }
     }
+    viewBinding {
+        enabled true
+    }
     dataBinding {
         enabled true
     }
@@ -71,7 +74,6 @@
     def android_support_core_version = '1.1.0'
     def android_support_version = '1.0.0'
     def material_version = '1.1.0'
-    def butterknife_version = '10.2.1'
     def dagger_version = '2.27'
 
     implementation fileTree(include: '*.jar', dir: 'libs')
@@ -98,10 +100,6 @@
     implementation('com.journeyapps:zxing-android-embedded:4.0.2@aar') { transitive = false }
     implementation 'com.google.zxing:core:3.3.3'
 
-    // Butterknife
-    implementation "com.jakewharton:butterknife:$butterknife_version"
-    annotationProcessor "com.jakewharton:butterknife-compiler:${butterknife_version}"
-
     // RxBindings
     implementation 'com.jakewharton.rxbinding3:rxbinding:3.1.0'
 
diff --git a/ring-android/app/src/main/java/cx/ring/about/AboutFragment.java b/ring-android/app/src/main/java/cx/ring/about/AboutFragment.java
index 5a847bf..1a6d8b0 100644
--- a/ring-android/app/src/main/java/cx/ring/about/AboutFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/about/AboutFragment.java
@@ -36,43 +36,46 @@
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.widget.Toolbar;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 
-import butterknife.BindView;
-import butterknife.OnClick;
 import cx.ring.BuildConfig;
 import cx.ring.R;
 import cx.ring.client.HomeActivity;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.databinding.FragAboutBinding;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.mvp.RootPresenter;
 import cx.ring.utils.DeviceUtils;
 
 public class AboutFragment extends BaseSupportFragment<RootPresenter> {
 
-    @BindView(R.id.release)
-    TextView mTextViewRelease;
+    private FragAboutBinding binding;
 
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_about;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragAboutBinding.inflate(inflater, container, false);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-    }
-
-    @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
-        return super.onCreateView(inflater, parent, savedInstanceState);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     @Override
     public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
         setHasOptionsMenu(true);
-        mTextViewRelease.setText(getString(R.string.app_release, BuildConfig.VERSION_NAME));
+        binding.release.setText(getString(R.string.app_release, BuildConfig.VERSION_NAME));
+        binding.logo.setOnClickListener(v ->  startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.app_website)))));
+        binding.sflLogo.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.savoirfairelinux_website)))));
+        binding.contributeContainer.setOnClickListener(this::webSiteToView);
+        binding.licenseContainer.setOnClickListener(this::webSiteToView);
+        binding.emailReportContainer.setOnClickListener(v -> sendFeedbackEmail());
+        binding.credits.setOnClickListener(v -> creditsClicked());
     }
 
     @Override
@@ -104,7 +107,7 @@
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
         menu.clear();
     }
 
@@ -113,21 +116,8 @@
         menu.clear();
     }
 
-    @OnClick({R.id.logo})
-    public void onLogoClicked() {
-        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.app_website))));
-    }
-
-    @OnClick({R.id.sfl_logo})
-    public void onSflClicked() {
-        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.savoirfairelinux_website))));
-    }
-
-    @OnClick({R.id.contribute_container, R.id.license_container})
-    public void webSiteToView(View view) {
-
-        Uri uriToView = null;
-
+    private void webSiteToView(View view) {
+        Uri uriToView;
         switch (view.getId()) {
             case R.id.contribute_container:
                 uriToView = Uri.parse(getString(R.string.ring_contribute_website));
@@ -135,10 +125,8 @@
             case R.id.license_container:
                 uriToView = Uri.parse(getString(R.string.gnu_license_website));
                 break;
-        }
-
-        if (uriToView == null) {
-            return;
+            default:
+                return;
         }
 
         Intent webIntent = new Intent(Intent.ACTION_VIEW);
@@ -146,15 +134,13 @@
         launchSystemIntent(webIntent, getString(R.string.website_chooser_title), getString(R.string.no_browser_app_installed));
     }
 
-    @OnClick(R.id.email_report_container)
-    public void sendFeedbackEmail() {
+    private void sendFeedbackEmail() {
         Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + "ring@gnu.org"));
         emailIntent.putExtra(Intent.EXTRA_SUBJECT, "[" + getText(R.string.app_name) + " Android - " + BuildConfig.VERSION_NAME + "]");
         launchSystemIntent(emailIntent, getString(R.string.email_chooser_title), getString(R.string.no_email_app_installed));
     }
 
-    @OnClick(R.id.credits)
-    public void creditsClicked() {
+    private void creditsClicked() {
         BottomSheetDialogFragment dialog = new AboutBottomSheetDialogFragment();
         dialog.show(getActivity().getSupportFragmentManager(), dialog.getTag());
     }
diff --git a/ring-android/app/src/main/java/cx/ring/account/AccountEditionFragment.java b/ring-android/app/src/main/java/cx/ring/account/AccountEditionFragment.java
index 0c6c4b7..fae5be7 100644
--- a/ring-android/app/src/main/java/cx/ring/account/AccountEditionFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/AccountEditionFragment.java
@@ -28,10 +28,10 @@
 import android.graphics.Typeface;
 import android.os.Bundle;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.tabs.TabLayout;
 
 import androidx.appcompat.widget.Toolbar;
 import androidx.fragment.app.Fragment;
@@ -39,13 +39,14 @@
 import androidx.fragment.app.FragmentStatePagerAdapter;
 import androidx.fragment.app.FragmentTransaction;
 import androidx.recyclerview.widget.RecyclerView;
-import androidx.viewpager.widget.ViewPager;
 import androidx.appcompat.app.AlertDialog;
 
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
@@ -55,10 +56,11 @@
 
 import java.util.List;
 
-import butterknife.BindView;
 import cx.ring.R;
+import cx.ring.application.JamiApplication;
 import cx.ring.client.HomeActivity;
 import cx.ring.contactrequests.BlackListFragment;
+import cx.ring.databinding.FragAccountSettingsBinding;
 import cx.ring.dependencyinjection.JamiInjectionComponent;
 import cx.ring.fragments.AdvancedAccountFragment;
 import cx.ring.fragments.GeneralAccountFragment;
@@ -80,22 +82,30 @@
 
     private static final int SCROLL_DIRECTION_UP = -1;
 
+    private FragAccountSettingsBinding binding;
+
     private boolean mIsVisible;
 
-    @BindView(R.id.pager)
-    protected ViewPager mViewPager;
-
-    @BindView(R.id.sliding_tabs)
-    protected TabLayout mSlidingTabLayout;
-
-    @BindView(R.id.fragment_container)
-    protected FrameLayout frameLayout;
-
     private MenuItem mItemAdvanced;
     private MenuItem mItemBlacklist;
 
     private String mAccountId;
 
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragAccountSettingsBinding.inflate(inflater, container, false);
+        // dependency injection
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
+    }
+
     @Override
     public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
         setHasOptionsMenu(true);
@@ -122,7 +132,7 @@
             title.setLayoutParams(params);
         }
 
-        frameLayout.getViewTreeObserver().addOnScrollChangedListener(this);
+        binding.fragmentContainer.getViewTreeObserver().addOnScrollChangedListener(this);
     }
 
     @Override
@@ -152,9 +162,9 @@
 
     @Override
     public void initViewPager(String accountId, boolean isJami) {
-        mViewPager.setOffscreenPageLimit(4);
-        mSlidingTabLayout.setupWithViewPager(mViewPager);
-        mViewPager.setAdapter(new PreferencesPagerAdapter(getFragmentManager(), getActivity(), accountId, isJami));
+        binding.pager.setOffscreenPageLimit(4);
+        binding.slidingTabs.setupWithViewPager(binding.pager);
+        binding.pager.setAdapter(new PreferencesPagerAdapter(getFragmentManager(), getActivity(), accountId, isJami));
     }
 
     @Override
@@ -182,9 +192,9 @@
                 .addToBackStack(BlackListFragment.TAG)
                 .replace(R.id.fragment_container, blackListFragment, BlackListFragment.TAG)
                 .commit();
-        mSlidingTabLayout.setVisibility(View.GONE);
-        mViewPager.setVisibility(View.GONE);
-        frameLayout.setVisibility(View.VISIBLE);
+        binding.slidingTabs.setVisibility(View.GONE);
+        binding.pager.setVisibility(View.GONE);
+        binding.fragmentContainer.setVisibility(View.VISIBLE);
     }
 
     @Override
@@ -219,7 +229,7 @@
         mIsVisible = false;
         if (getActivity() instanceof HomeActivity)
             ((HomeActivity) getActivity()).setToolbarOutlineState(true);
-        if (frameLayout.getVisibility() != View.VISIBLE) {
+        if (binding.fragmentContainer.getVisibility() != View.VISIBLE) {
             toggleView(mAccountId);
             return  true;
         }
@@ -238,9 +248,9 @@
         mAccountId = accountId;
         boolean isRing = presenter.getAccount(mAccountId).isRing();
 
-        mSlidingTabLayout.setVisibility(isRing? View.GONE : View.VISIBLE);
-        mViewPager.setVisibility(isRing? View.GONE : View.VISIBLE);
-        frameLayout.setVisibility(isRing? View.VISIBLE : View.GONE);
+        binding.slidingTabs.setVisibility(isRing? View.GONE : View.VISIBLE);
+        binding.pager.setVisibility(isRing? View.GONE : View.VISIBLE);
+        binding.fragmentContainer.setVisibility(isRing? View.VISIBLE : View.GONE);
         presenter.prepareOptionsMenu();
         setBackListenerEnabled(isRing);
 
@@ -248,7 +258,7 @@
         JamiAccountSummaryFragment fragment = (JamiAccountSummaryFragment) fragmentManager.findFragmentByTag(JamiAccountSummaryFragment.TAG);
         if (fragment != null) {
             fragment.setFragmentVisibility(isRing);
-            fragment.onScrollChanged();
+            fragment.setAccount(accountId);
         }
     }
 
@@ -264,9 +274,9 @@
                 deleteDialog.show();
                 break;
             case R.id.menuitem_advanced:
-                mSlidingTabLayout.setVisibility(View.VISIBLE);
-                mViewPager.setVisibility(View.VISIBLE);
-                frameLayout.setVisibility(View.GONE);
+                binding.slidingTabs.setVisibility(View.VISIBLE);
+                binding.pager.setVisibility(View.VISIBLE);
+                binding.fragmentContainer.setVisibility(View.GONE);
                 JamiAccountSummaryFragment fragment = (JamiAccountSummaryFragment) requireFragmentManager().findFragmentByTag(JamiAccountSummaryFragment.TAG);
                 if (fragment != null)
                     fragment.setFragmentVisibility(false);
@@ -312,16 +322,6 @@
             activity.onBackPressed();
     }
 
-    @Override
-    public int getLayout() {
-        return R.layout.frag_account_settings;
-    }
-
-    @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
-    }
-
     private void setBackListenerEnabled(boolean enable) {
         if (!(getActivity() instanceof HomeActivity))
             return;
@@ -431,23 +431,23 @@
     }
 
     private void setupElevation() {
-        if (mViewPager == null || !mIsVisible) {
+        if (binding == null || !mIsVisible) {
             return;
         }
         Activity activity = getActivity();
         if (!(activity instanceof HomeActivity))
             return;
-        LinearLayout ll = (LinearLayout) mViewPager.getChildAt(mViewPager.getCurrentItem());
+        LinearLayout ll = (LinearLayout) binding.pager.getChildAt(binding.pager.getCurrentItem());
         if (ll == null) return;
         RecyclerView rv = (RecyclerView)((FrameLayout) ll.getChildAt(0)).getChildAt(0);
         if (rv == null) return;
         HomeActivity homeActivity = (HomeActivity) activity;
         if (rv.canScrollVertically(SCROLL_DIRECTION_UP)) {
-            mSlidingTabLayout.setElevation(mSlidingTabLayout.getResources().getDimension(R.dimen.toolbar_elevation));
+            binding.slidingTabs.setElevation(binding.slidingTabs.getResources().getDimension(R.dimen.toolbar_elevation));
             homeActivity.setToolbarElevation(true);
             homeActivity.setToolbarOutlineState(false);
         } else {
-            mSlidingTabLayout.setElevation(0);
+            binding.slidingTabs.setElevation(0);
             homeActivity.setToolbarElevation(false);
             homeActivity.setToolbarOutlineState(true);
         }
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 81260de..fee2779 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
@@ -40,7 +40,6 @@
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 
-import butterknife.ButterKnife;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
 import cx.ring.client.HomeActivity;
@@ -66,13 +65,11 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         // dependency injection
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         super.onCreate(savedInstanceState);
 
         JamiApplication.getInstance().startDaemon();
-
         setContentView(R.layout.activity_wizard);
-        ButterKnife.bind(this);
 
         String accountToMigrate = null;
         Intent intent = getIntent();
diff --git a/ring-android/app/src/main/java/cx/ring/account/BackupAccountDialog.java b/ring-android/app/src/main/java/cx/ring/account/BackupAccountDialog.java
index 621109c..9d80d6e 100644
--- a/ring-android/app/src/main/java/cx/ring/account/BackupAccountDialog.java
+++ b/ring-android/app/src/main/java/cx/ring/account/BackupAccountDialog.java
@@ -21,40 +21,25 @@
 
 import android.app.Dialog;
 import android.os.Bundle;
-import android.view.View;
 import android.view.WindowManager;
 import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.textfield.TextInputLayout;
 
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
-import butterknife.BindString;
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnEditorAction;
 import cx.ring.R;
+import cx.ring.databinding.DialogConfirmRevocationBinding;
 
 public class BackupAccountDialog extends DialogFragment {
     static final String TAG = BackupAccountDialog.class.getSimpleName();
 
-    @BindView(R.id.password_txt_box)
-    protected TextInputLayout mPasswordTxtBox;
-
-    @BindView(R.id.password_txt)
-    protected EditText mPasswordTxt;
-
-    @BindString(R.string.enter_password)
-    protected String mPromptPassword;
-
     private String mAccountId;
 
     private UnlockAccountListener mListener = null;
+    private DialogConfirmRevocationBinding binding;
 
     public void setListener(UnlockAccountListener listener) {
         mListener = listener;
@@ -63,18 +48,28 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        View view = requireActivity().getLayoutInflater().inflate(R.layout.dialog_confirm_revocation, null);
-        ButterKnife.bind(this, view);
+        binding = DialogConfirmRevocationBinding.inflate(getActivity().getLayoutInflater());
 
         Bundle args = getArguments();
         if (args != null) {
             mAccountId = args.getString(AccountEditionFragment.ACCOUNT_ID_KEY);
         }
 
+        binding.passwordTxt.setOnEditorActionListener((v, actionId, event) -> {
+            if (actionId == EditorInfo.IME_ACTION_DONE) {
+                boolean validationResult = validate();
+                if (validationResult) {
+                    getDialog().dismiss();
+                }
+                return validationResult;
+            }
+            return false;
+        });
+
         final AlertDialog result = new MaterialAlertDialogBuilder(requireContext())
                 .setTitle(R.string.account_enter_password)
                 .setMessage(R.string.account_new_device_password)
-                .setView(view)
+                .setView(binding.getRoot())
                 .setPositiveButton(android.R.string.ok, null) //Set to null. We override the onclick
                 .setNegativeButton(android.R.string.cancel,
                         (dialog, whichButton) -> dismiss()
@@ -94,27 +89,12 @@
 
     private boolean validate() {
         if (mListener != null) {
-            mListener.onUnlockAccount(mAccountId, mPasswordTxt.getText().toString());
+            mListener.onUnlockAccount(mAccountId, binding.passwordTxt.getText().toString());
             return true;
         }
         return false;
     }
 
-    @OnEditorAction({R.id.password_txt})
-    public boolean onEditorAction(TextView v, int actionId) {
-        if (v == mPasswordTxt) {
-            if (actionId == EditorInfo.IME_ACTION_DONE) {
-                boolean validationResult = validate();
-                if (validationResult) {
-                    getDialog().dismiss();
-                }
-
-                return validationResult;
-            }
-        }
-        return false;
-    }
-
     public interface UnlockAccountListener {
         void onUnlockAccount(String accountId, String password);
     }
diff --git a/ring-android/app/src/main/java/cx/ring/account/ChangePasswordDialog.java b/ring-android/app/src/main/java/cx/ring/account/ChangePasswordDialog.java
index 8d14874..89a43f6 100644
--- a/ring-android/app/src/main/java/cx/ring/account/ChangePasswordDialog.java
+++ b/ring-android/app/src/main/java/cx/ring/account/ChangePasswordDialog.java
@@ -20,50 +20,25 @@
 
 import android.app.Dialog;
 import android.os.Bundle;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.WindowManager;
 import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.textfield.TextInputLayout;
 
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
-import butterknife.BindString;
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnEditorAction;
 import cx.ring.R;
+import cx.ring.databinding.DialogSetPasswordBinding;
 
 public class ChangePasswordDialog extends DialogFragment {
     static final String TAG = ChangePasswordDialog.class.getSimpleName();
 
-    @BindView(R.id.old_password_txt_box)
-    protected TextInputLayout mPasswordTxtBox;
-
-    @BindView(R.id.old_password_txt)
-    protected EditText mPasswordTxt;
-
-    @BindView(R.id.new_password_txt_box)
-    protected TextInputLayout mNewPasswordTxtBox;
-
-    @BindView(R.id.new_password_txt)
-    protected EditText mNewPasswordTxt;
-
-    @BindView(R.id.new_password_repeat_txt_box)
-    protected TextInputLayout mNewPasswordRepeatsTxtBox;
-
-    @BindView(R.id.new_password_repeat_txt)
-    protected EditText mNewPasswordRepeatsTxt;
-
-    @BindString(R.string.enter_password)
-    protected String mPromptPassword;
-
     private PasswordChangedListener mListener = null;
+    private DialogSetPasswordBinding binding;
 
     public void setListener(PasswordChangedListener listener) {
         mListener = listener;
@@ -72,8 +47,7 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        View view = requireActivity().getLayoutInflater().inflate(R.layout.dialog_set_password, null);
-        ButterKnife.bind(this, view);
+        binding = DialogSetPasswordBinding.inflate(getActivity().getLayoutInflater());
 
         String accountId = "";
         boolean hasPassword = true;
@@ -83,10 +57,19 @@
             hasPassword = args.getBoolean(AccountEditionFragment.ACCOUNT_HAS_PASSWORD_KEY, true);
         }
         int passwordMessage = hasPassword ? R.string.account_password_change : R.string.account_password_set;
-        mPasswordTxtBox.setVisibility(hasPassword ? View.VISIBLE : View.GONE);
+        binding.oldPasswordTxtBox.setVisibility(hasPassword ? View.VISIBLE : View.GONE);
+        binding.newPasswordRepeatTxt.setOnEditorActionListener((v, actionId, event) -> {
+            if (actionId == EditorInfo.IME_ACTION_DONE) {
+                if (validate()) {
+                    getDialog().dismiss();
+                    return true;
+                }
+            }
+            return false;
+        });
 
         final AlertDialog result = new MaterialAlertDialogBuilder(requireContext())
-                .setView(view)
+                .setView(binding.getRoot())
                 .setMessage(R.string.help_password_choose)
                 .setTitle(passwordMessage)
                 .setPositiveButton(passwordMessage, null) //Set to null. We override the onclick
@@ -104,43 +87,32 @@
         return result;
     }
 
-    public boolean checkInput() {
-        if (!mNewPasswordTxt.getText().toString().contentEquals(mNewPasswordRepeatsTxt.getText())) {
-            mNewPasswordTxtBox.setErrorEnabled(true);
-            mNewPasswordTxtBox.setError(getText(R.string.error_passwords_not_equals));
-            mNewPasswordRepeatsTxtBox.setErrorEnabled(true);
-            mNewPasswordRepeatsTxtBox.setError(getText(R.string.error_passwords_not_equals));
+    private boolean checkInput() {
+        if (!binding.newPasswordTxt.getText().toString().contentEquals(binding.newPasswordRepeatTxt.getText())) {
+            binding.newPasswordTxtBox.setErrorEnabled(true);
+            binding.newPasswordTxtBox.setError(getText(R.string.error_passwords_not_equals));
+            binding.newPasswordRepeatTxtBox.setErrorEnabled(true);
+            binding.newPasswordRepeatTxtBox.setError(getText(R.string.error_passwords_not_equals));
             return false;
         } else {
-            mNewPasswordTxtBox.setErrorEnabled(false);
-            mNewPasswordTxtBox.setError(null);
-            mNewPasswordRepeatsTxtBox.setErrorEnabled(false);
-            mNewPasswordRepeatsTxtBox.setError(null);
+            binding.newPasswordTxtBox.setErrorEnabled(false);
+            binding.newPasswordTxtBox.setError(null);
+            binding.newPasswordRepeatTxtBox.setErrorEnabled(false);
+            binding.newPasswordRepeatTxtBox.setError(null);
         }
         return true;
     }
 
     private boolean validate() {
         if (checkInput() && mListener != null) {
-            final String oldPassword = mPasswordTxt.getText().toString();
-            final String newPassword = mNewPasswordTxt.getText().toString();
+            final String oldPassword = binding.oldPasswordTxt.getText().toString();
+            final String newPassword = binding.newPasswordTxt.getText().toString();
             mListener.onPasswordChanged(oldPassword, newPassword);
             return true;
         }
         return false;
     }
 
-    @OnEditorAction({R.id.new_password_repeat_txt})
-    public boolean onEditorAction(TextView v, int actionId) {
-        if (actionId == EditorInfo.IME_ACTION_DONE) {
-            if (validate()) {
-                getDialog().dismiss();
-                return true;
-            }
-        }
-        return false;
-    }
-
     public interface PasswordChangedListener {
         void onPasswordChanged(String oldPassword, String newPassword);
     }
diff --git a/ring-android/app/src/main/java/cx/ring/account/ConfirmRevocationDialog.java b/ring-android/app/src/main/java/cx/ring/account/ConfirmRevocationDialog.java
index 70e73e2..79c7a83 100644
--- a/ring-android/app/src/main/java/cx/ring/account/ConfirmRevocationDialog.java
+++ b/ring-android/app/src/main/java/cx/ring/account/ConfirmRevocationDialog.java
@@ -23,39 +23,27 @@
 import android.os.Bundle;
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.textfield.TextInputLayout;
 
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
+
 import android.view.View;
 import android.view.WindowManager;
 import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
 
 import androidx.fragment.app.DialogFragment;
-import butterknife.BindString;
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnEditorAction;
 import cx.ring.R;
+import cx.ring.databinding.DialogConfirmRevocationBinding;
 
 public class ConfirmRevocationDialog extends DialogFragment {
     public static final String DEVICEID_KEY = "deviceid_key";
     public static final String HAS_PASSWORD_KEY = "has_password_key";
     static final String TAG = ConfirmRevocationDialog.class.getSimpleName();
-    @BindView(R.id.password_txt_box)
-    protected TextInputLayout mPasswordTxtBox;
-    @BindView(R.id.password_txt)
-    protected EditText mPasswordTxt;
-    @BindString(R.string.enter_password)
-    protected String mPromptPassword;
-    @BindString(R.string.revoke_device_title)
-    protected String mRegisterTitle;
     private String mDeviceId;
     private Boolean mHasPassword = true;
     private ConfirmRevocationListener mListener = null;
+    private DialogConfirmRevocationBinding binding;
 
     public void setListener(ConfirmRevocationListener listener) {
         mListener = listener;
@@ -64,16 +52,15 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        View view = requireActivity().getLayoutInflater().inflate(R.layout.dialog_confirm_revocation, null);
-        ButterKnife.bind(this, view);
+        binding = DialogConfirmRevocationBinding.inflate(getActivity().getLayoutInflater());
 
         mDeviceId = requireArguments().getString(DEVICEID_KEY);
         mHasPassword = requireArguments().getBoolean(HAS_PASSWORD_KEY);
 
         final AlertDialog result = new MaterialAlertDialogBuilder(requireContext())
-                .setView(view)
+                .setView(binding.getRoot())
                 .setMessage(getString(R.string.revoke_device_message, mDeviceId))
-                .setTitle(mRegisterTitle)
+                .setTitle(getText(R.string.revoke_device_title))
                 .setPositiveButton(R.string.revoke_device_title, null) //Set to null. We override the onclick
                 .setNegativeButton(android.R.string.cancel,
                         (dialog, whichButton) -> dismiss()
@@ -89,50 +76,45 @@
         });
 
         if(mHasPassword) {
-            result.getWindow().setSoftInputMode(WindowManager.LayoutParams.
-                    SOFT_INPUT_STATE_VISIBLE);
+            result.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
         } else {
-            mPasswordTxtBox.setVisibility(View.GONE);
+            binding.passwordTxtBox.setVisibility(View.GONE);
         }
+
+        binding.passwordTxt.setOnEditorActionListener((v, actionId, event) -> {
+            if (actionId == EditorInfo.IME_ACTION_DONE) {
+                boolean validationResult = validate();
+                if (validationResult) {
+                    getDialog().dismiss();
+                }
+                return validationResult;
+            }
+            return false;
+        });
         return result;
     }
 
     private boolean checkInput() {
-        if (mHasPassword && mPasswordTxt.getText().toString().isEmpty()) {
-            mPasswordTxtBox.setErrorEnabled(true);
-            mPasswordTxtBox.setError(mPromptPassword);
+        if (mHasPassword && binding.passwordTxt.getText().toString().isEmpty()) {
+            binding.passwordTxtBox.setErrorEnabled(true);
+            binding.passwordTxtBox.setError(getText(R.string.enter_password));
             return false;
         } else {
-            mPasswordTxtBox.setErrorEnabled(false);
-            mPasswordTxtBox.setError(null);
+            binding.passwordTxtBox.setErrorEnabled(false);
+            binding.passwordTxtBox.setError(null);
         }
         return true;
     }
 
     private boolean validate() {
         if (checkInput() && mListener != null) {
-            final String password = mPasswordTxt.getText().toString();
+            final String password = binding.passwordTxt.getText().toString();
             mListener.onConfirmRevocation(mDeviceId, password);
             return true;
         }
         return false;
     }
 
-    @OnEditorAction({R.id.password_txt})
-    public boolean onEditorAction(TextView v, int actionId) {
-        if (v == mPasswordTxt) {
-            if (actionId == EditorInfo.IME_ACTION_DONE) {
-                boolean validationResult = validate();
-                if (validationResult) {
-                    getDialog().dismiss();
-                }
-
-                return validationResult;
-            }
-        }
-        return false;
-    }
-
     public interface ConfirmRevocationListener {
         void onConfirmRevocation(String deviceId, String password);
     }
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 c394ce9..293c17b 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
@@ -23,18 +23,19 @@
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
+import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.Button;
+import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 
 import com.google.android.material.snackbar.Snackbar;
 
-import butterknife.BindView;
-import butterknife.OnClick;
 import cx.ring.R;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+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;
@@ -44,41 +45,30 @@
 
     public static final String TAG = HomeAccountCreationFragment.class.getSimpleName();
 
-    @BindView(R.id.ring_add_account)
-    protected Button mLinkButton;
+    private FragAccHomeCreateBinding binding;
 
-    @BindView(R.id.ring_create_btn)
-    protected Button mCreateButton;
-
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_acc_home_create;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragAccHomeCreateBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     @Override
     public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         setRetainInstance(true);
-    }
-
-    @OnClick(R.id.ring_add_account)
-    public void linkAccountClicked() {
-        presenter.clickOnLinkAccount();
-    }
-
-    @OnClick(R.id.ring_create_btn)
-    public void createAccountClicked() {
-        presenter.clickOnCreateAccount();
-    }
-
-    @OnClick(R.id.account_connect_server)
-    public void connectAccountClicked() {
-        presenter.clickOnConnectAccount();
+        binding.ringAddAccount.setOnClickListener(v -> presenter.clickOnLinkAccount());
+        binding.ringCreateBtn.setOnClickListener(v -> presenter.clickOnCreateAccount());
+        binding.accountConnectServer.setOnClickListener(v -> presenter.clickOnConnectAccount());
+        binding.ringImportAccount.setOnClickListener(v -> performFileSearch());
     }
 
     @Override
@@ -104,8 +94,7 @@
         replaceFragmentWithSlide(fragment, R.id.wizard_container);
     }
 
-    @OnClick(R.id.ring_import_account)
-    public void performFileSearch() {
+    private void performFileSearch() {
         Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
         intent.addCategory(Intent.CATEGORY_OPENABLE);
         intent.setType("*/*");
diff --git a/ring-android/app/src/main/java/cx/ring/account/JamiAccountConnectFragment.java b/ring-android/app/src/main/java/cx/ring/account/JamiAccountConnectFragment.java
index 36a6b3b..2d9c37b 100644
--- a/ring-android/app/src/main/java/cx/ring/account/JamiAccountConnectFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/JamiAccountConnectFragment.java
@@ -20,37 +20,27 @@
 package cx.ring.account;
 
 import android.app.Activity;
+import android.os.Bundle;
 import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
-import android.widget.EditText;
 
-import butterknife.BindView;
-import butterknife.OnClick;
-import butterknife.OnEditorAction;
-import butterknife.OnTextChanged;
-import cx.ring.R;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import cx.ring.application.JamiApplication;
+import cx.ring.databinding.FragAccJamiConnectBinding;
 import cx.ring.mvp.AccountCreationModel;
 import cx.ring.mvp.BaseSupportFragment;
 
 public class JamiAccountConnectFragment extends BaseSupportFragment<JamiAccountConnectPresenter> implements JamiConnectAccountView {
-
     public static final String TAG = JamiAccountConnectFragment.class.getSimpleName();
 
-    @BindView(R.id.prompt_server)
-    protected EditText mServerTxt;
-
-    @BindView(R.id.username_txt)
-    protected EditText mUsernameTxt;
-
-    @BindView(R.id.password_txt)
-    protected EditText mPasswordTxt;
-
-    @BindView(R.id.connect_button)
-    protected Button mConnectAccountBtn;
-
     private AccountCreationModel model;
+    private FragAccJamiConnectBinding binding;
 
     public static JamiAccountConnectFragment newInstance(AccountCreationModelImpl ringAccountViewModel) {
         JamiAccountConnectFragment fragment = new JamiAccountConnectFragment();
@@ -58,14 +48,18 @@
         return fragment;
     }
 
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_acc_jami_connect;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragAccJamiConnectBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     @Override
@@ -73,37 +67,58 @@
         presenter.init(model);
     }
 
-    @OnClick(R.id.connect_button)
-    public void onConnectClick() {
-        presenter.connectClicked();
-    }
+    @Override
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        binding.connectButton.setOnClickListener(v -> presenter.connectClicked());
+        binding.usernameTxt.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
 
-    @OnTextChanged(value = R.id.username_txt, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
-    void afterUsernameChanged(Editable txt) {
-        presenter.usernameChanged(txt.toString());
-    }
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {}
 
-    @OnTextChanged(value = R.id.password_txt, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
-    void afterPasswordChanged(Editable txt) {
-        presenter.passwordChanged(txt.toString());
-    }
+            @Override
+            public void afterTextChanged(Editable s) {
+                presenter.usernameChanged(s.toString());
+            }
+        });
+        binding.passwordTxt.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
 
-    @OnTextChanged(value = R.id.prompt_server, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
-    void afterServerChanged(Editable txt) {
-        presenter.serverChanged(txt.toString());
-    }
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {}
 
-    @OnEditorAction(value = R.id.password_txt)
-    public boolean onPasswordConfirmDone(int keyCode) {
-        if (keyCode == EditorInfo.IME_ACTION_DONE) {
-            presenter.connectClicked();
-        }
-        return false;
+            @Override
+            public void afterTextChanged(Editable s) {
+                presenter.passwordChanged(s.toString());
+            }
+        });
+        binding.promptServer.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {}
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                presenter.serverChanged(s.toString());
+            }
+        });
+
+        binding.passwordTxt.setOnEditorActionListener((v, actionId, event) -> {
+            if (actionId == EditorInfo.IME_ACTION_DONE) {
+                presenter.connectClicked();
+            }
+            return false;
+        });
     }
 
     @Override
     public void enableConnectButton(boolean enable) {
-        mConnectAccountBtn.setEnabled(enable);
+        binding.connectButton.setEnabled(enable);
     }
 
     @Override
diff --git a/ring-android/app/src/main/java/cx/ring/account/JamiAccountCreationFragment.java b/ring-android/app/src/main/java/cx/ring/account/JamiAccountCreationFragment.java
index b9986b3..eba6b18 100644
--- a/ring-android/app/src/main/java/cx/ring/account/JamiAccountCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/JamiAccountCreationFragment.java
@@ -24,28 +24,19 @@
 import android.os.Bundle;
 import android.text.Editable;
 import android.text.InputFilter;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.ImageView;
-import android.widget.ProgressBar;
-import android.widget.Switch;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
-import com.google.android.material.textfield.TextInputLayout;
-
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnCheckedChanged;
-import butterknife.OnClick;
-import butterknife.OnEditorAction;
-import butterknife.OnTextChanged;
 import cx.ring.R;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.application.JamiApplication;
+import cx.ring.databinding.FragAccRingCreateBinding;
 import cx.ring.mvp.AccountCreationModel;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.utils.RegisteredNameFilter;
@@ -53,43 +44,8 @@
 public class JamiAccountCreationFragment extends BaseSupportFragment<JamiAccountCreationPresenter>
         implements JamiAccountCreationView {
 
-    @BindView(R.id.switch_ring_username)
-    protected Switch mUsernameSwitch;
-
-    @BindView(R.id.ring_username_txt_box)
-    protected TextInputLayout mUsernameTxtBox;
-
-    @BindView(R.id.ring_username)
-    protected EditText mUsernameTxt;
-
-    @BindView(R.id.ring_password_switch)
-    protected Switch mPasswordSwitch;
-
-    @BindView(R.id.ring_password_box)
-    protected ViewGroup mPasswordBox;
-
-    @BindView(R.id.password_txt_box)
-    protected TextInputLayout mPasswordTxtBox;
-
-    @BindView(R.id.ring_password_repeat_txt_box)
-    protected TextInputLayout mPasswordRepeatTxtBox;
-
-    @BindView(R.id.ring_username_box)
-    protected ViewGroup mUsernameBox;
-
-    @BindView(R.id.switch_ring_push)
-    protected Switch mPushSwitch;
-
-    @BindView(R.id.create_account)
-    protected Button mCreateAccountButton;
-
-    @BindView(R.id.ring_username_availability_image_view)
-    protected ImageView mUsernameAvailabilityImageView;
-
-    @BindView(R.id.ring_username_availability_spinner)
-    protected ProgressBar mUsernameAvailabilitySpinner;
-
     private AccountCreationModel model;
+    private FragAccRingCreateBinding binding;
 
     public static JamiAccountCreationFragment newInstance(AccountCreationModelImpl ringAccountViewModel) {
         JamiAccountCreationFragment fragment = new JamiAccountCreationFragment();
@@ -97,119 +53,126 @@
         return fragment;
     }
 
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_acc_ring_create;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragAccRingCreateBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     @Override
     public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         setRetainInstance(true);
-        ButterKnife.bind(this, view);
-        mUsernameTxt.setFilters(new InputFilter[]{new RegisteredNameFilter()});
+        binding.ringUsername.setFilters(new InputFilter[]{new RegisteredNameFilter()});
+        binding.ringPasswordSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> binding.ringPasswordBox.setVisibility(isChecked ? View.VISIBLE : View.GONE));
+        binding.switchRingPush.setOnCheckedChangeListener((buttonView, isChecked) -> presenter.setPush(isChecked));
+        binding.switchRingUsername.setOnCheckedChangeListener((buttonView, isChecked) -> presenter.registerUsernameChanged(isChecked));
+        binding.createAccount.setOnClickListener(v -> presenter.createAccount());
+        binding.ringPassword.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                presenter.passwordChanged(s.toString());
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {}
+        });
+        binding.ringPasswordRepeat.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                presenter.passwordConfirmChanged(s.toString());
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {}
+        });
+        binding.ringPasswordRepeat.setOnEditorActionListener((v, actionId, event) -> {
+            if (actionId == EditorInfo.IME_ACTION_DONE) {
+                presenter.createAccount();
+            }
+            return false;
+        });
+        binding.ringUsername.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {}
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                presenter.userNameChanged(s.toString());
+            }
+        });
+
         presenter.init(model);
-        presenter.setPush(mPushSwitch.isChecked());
+        presenter.setPush(binding.switchRingPush.isChecked());
     }
 
     @Override
     public void onResume() {
         super.onResume();
-        if (mUsernameBox.getVisibility() == View.VISIBLE) {
-            mUsernameTxt.requestFocus();
+        if (binding.ringUsernameBox.getVisibility() == View.VISIBLE) {
+            binding.ringUsername.requestFocus();
             InputMethodManager imm = (InputMethodManager) requireActivity().
                     getSystemService(Context.INPUT_METHOD_SERVICE);
-            imm.showSoftInput(mUsernameTxt, InputMethodManager.SHOW_IMPLICIT);
+            imm.showSoftInput(binding.ringUsername, InputMethodManager.SHOW_IMPLICIT);
         }
     }
 
-    @OnCheckedChanged(R.id.ring_password_switch)
-    public void onPasswordCheckedChanged(boolean isChecked) {
-        mPasswordBox.setVisibility(isChecked ? View.VISIBLE : View.GONE);
-    }
-
-    @OnCheckedChanged(R.id.switch_ring_push)
-    public void onPushCheckedChanged(boolean isChecked) {
-        presenter.setPush(isChecked);
-    }
-
-    @OnCheckedChanged(R.id.switch_ring_username)
-    public void onCheckedChanged(boolean isChecked) {
-        presenter.registerUsernameChanged(isChecked);
-    }
-
-    @OnClick(R.id.create_account)
-    public void onCreateAccountButtonClick() {
-        presenter.createAccount();
-    }
-
-    @OnTextChanged(value = R.id.ring_password, callback = OnTextChanged.Callback.TEXT_CHANGED)
-    public void afterPasswordChanged(Editable txt) {
-        presenter.passwordChanged(txt.toString());
-    }
-
-    @OnTextChanged(value = R.id.ring_password_repeat, callback = OnTextChanged.Callback.TEXT_CHANGED)
-    public void afterPasswordConfirmChanged(Editable txt) {
-        presenter.passwordConfirmChanged(txt.toString());
-    }
-
-    @OnEditorAction(value = R.id.ring_password_repeat)
-    public boolean onPasswordConfirmDone(int keyCode) {
-        if (keyCode == EditorInfo.IME_ACTION_DONE) {
-            presenter.createAccount();
-        }
-        return false;
-    }
-
-    @OnTextChanged(value = R.id.ring_username, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
-    public void afterUsernameChanged(Editable txt) {
-        presenter.userNameChanged(txt.toString());
-    }
-
     @Override
     public void updateUsernameAvailability(UsernameAvailabilityStatus status) {
-        mUsernameAvailabilitySpinner.setVisibility(View.GONE);
+        binding.ringUsernameAvailabilitySpinner.setVisibility(View.GONE);
         //mUsernameAvailabilityImageView.setVisibility(View.VISIBLE);
         switch (status){
             case ERROR:
-                mUsernameTxtBox.setErrorEnabled(true);
-                mUsernameTxtBox.setError(getString(R.string.unknown_error));
+                binding.ringUsernameTxtBox.setErrorEnabled(true);
+                binding.ringUsernameTxtBox.setError(getString(R.string.unknown_error));
                 //mUsernameAvailabilityImageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_error_red));
-                mUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
+                binding.ringUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
                 break;
             case ERROR_USERNAME_INVALID:
-                mUsernameTxtBox.setErrorEnabled(true);
-                mUsernameTxtBox.setError(getString(R.string.invalid_username));
+                binding.ringUsernameTxtBox.setErrorEnabled(true);
+                binding.ringUsernameTxtBox.setError(getString(R.string.invalid_username));
                 //mUsernameAvailabilityImageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_error_red));
-                mUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
+                binding.ringUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
                 break;
             case ERROR_USERNAME_TAKEN:
-                mUsernameTxtBox.setErrorEnabled(true);
-                mUsernameTxtBox.setError(getString(R.string.username_already_taken));
+                binding.ringUsernameTxtBox.setErrorEnabled(true);
+                binding.ringUsernameTxtBox.setError(getString(R.string.username_already_taken));
                 //mUsernameAvailabilityImageView.setImageDrawable(getResources().getDrawable(R.drawable.ic_error_red));
-                mUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
+                binding.ringUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
                 break;
             case LOADING:
-                mUsernameTxtBox.setErrorEnabled(false);
-                mUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
-                mUsernameAvailabilitySpinner.setVisibility(View.VISIBLE);
+                binding.ringUsernameTxtBox.setErrorEnabled(false);
+                binding.ringUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
+                binding.ringUsernameAvailabilitySpinner.setVisibility(View.VISIBLE);
                 break;
             case AVAILABLE:
-                mUsernameTxtBox.setErrorEnabled(false);
-                mUsernameAvailabilityImageView.setVisibility(View.VISIBLE);
-                mUsernameAvailabilityImageView.setImageDrawable(requireContext().getDrawable(R.drawable.ic_good_green));
+                binding.ringUsernameTxtBox.setErrorEnabled(false);
+                binding.ringUsernameAvailabilityImageView.setVisibility(View.VISIBLE);
+                binding.ringUsernameAvailabilityImageView.setImageDrawable(requireContext().getDrawable(R.drawable.ic_good_green));
                 break;
             case RESET:
-                mUsernameTxtBox.setErrorEnabled(false);
-                mUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
+                binding.ringUsernameTxtBox.setErrorEnabled(false);
+                binding.ringUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
                 enableNextButton(false);
             default:
-                mUsernameAvailabilityImageView.setVisibility(View.INVISIBLE);
+                binding.ringUsernameAvailabilitySpinner.setVisibility(View.INVISIBLE);
                 break;
         }
     }
@@ -217,29 +180,29 @@
     @Override
     public void showInvalidPasswordError(final boolean display) {
         if (display) {
-            mPasswordTxtBox.setError(getString(R.string.error_password_char_count));
+            binding.passwordTxtBox.setError(getString(R.string.error_password_char_count));
         } else {
-            mPasswordTxtBox.setError(null);
+            binding.passwordTxtBox.setError(null);
         }
     }
 
     @Override
     public void showNonMatchingPasswordError(final boolean display) {
         if (display) {
-            mPasswordRepeatTxtBox.setError(getString(R.string.error_passwords_not_equals));
+            binding.ringPasswordRepeatTxtBox.setError(getString(R.string.error_passwords_not_equals));
         } else {
-            mPasswordRepeatTxtBox.setError(null);
+            binding.ringPasswordRepeatTxtBox.setError(null);
         }
     }
 
     @Override
     public void displayUsernameBox(final boolean display) {
-        mUsernameBox.setVisibility(display ? View.VISIBLE : View.GONE);
+        binding.ringUsernameBox.setVisibility(display ? View.VISIBLE : View.GONE);
     }
 
     @Override
     public void enableNextButton(final boolean enabled) {
-        mCreateAccountButton.setEnabled(enabled);
+        binding.createAccount.setEnabled(enabled);
     }
 
     @Override
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 dbed761..9d0b796 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
@@ -32,14 +32,11 @@
 import android.os.Bundle;
 
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
-import com.google.android.material.card.MaterialCardView;
-import com.google.android.material.chip.Chip;
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 import com.google.android.material.snackbar.Snackbar;
-import com.google.android.material.textfield.TextInputLayout;
 
 import androidx.annotation.NonNull;
-import androidx.appcompat.widget.SwitchCompat;
+import androidx.annotation.Nullable;
 
 import android.provider.MediaStore;
 import android.text.Layout;
@@ -55,14 +52,10 @@
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
 import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
 import android.widget.EditText;
 import android.widget.ImageButton;
 import android.widget.ImageView;
-import android.widget.ListView;
-import android.widget.ScrollView;
 import android.widget.TextView;
-import android.widget.LinearLayout;
 import android.widget.Toast;
 
 import java.io.File;
@@ -73,12 +66,10 @@
 import androidx.core.content.FileProvider;
 import androidx.core.util.Pair;
 
-import butterknife.BindView;
-import butterknife.OnClick;
-import butterknife.OnEditorAction;
 import cx.ring.R;
+import cx.ring.application.JamiApplication;
 import cx.ring.client.HomeActivity;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.databinding.FragAccSummaryBinding;
 import cx.ring.model.Account;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.services.AccountService;
@@ -110,87 +101,9 @@
     private static final String FRAGMENT_DIALOG_PASSWORD = TAG + ".dialog.changePassword";
     private static final String FRAGMENT_DIALOG_BACKUP = TAG + ".dialog.backup";
     private static final int WRITE_REQUEST_CODE = 43;
-
     private static final int SCROLL_DIRECTION_UP = -1;
 
     private boolean mIsVisible = true;
-
-    /*
-    UI Bindings
-     */
-
-    @BindView(R.id.ring_password)
-    EditText mRingPassword;
-
-    @BindView(R.id.btn_end_export)
-    Button mEndBtn;
-
-    @BindView(R.id.user_photo)
-    ImageView mUserImage;
-
-    @BindView(R.id.username)
-    TextView mUsername;
-
-    @BindView(R.id.subtitle)
-    TextView mSubtitle;
-
-    @BindView(R.id.btn_start_export)
-    Button mStartBtn;
-
-    @BindView(R.id.account_link_info)
-    TextView mExportInfos;
-
-    @BindView(R.id.account_alias_txt)
-    TextView mAccountNameTxt;
-
-    @BindView(R.id.account_id_txt)
-    TextView mAccountIdTxt;
-
-    @BindView(R.id.layout_account_options)
-    LinearLayout mAccountOptionsLayout;
-
-    @BindView(R.id.change_password_btn)
-    Button mChangePasswordBtn;
-
-    @BindView(R.id.layout_add_device)
-    MaterialCardView mAddAccountLayout;
-
-    @BindView(R.id.export_account_btn)
-    Button mExportButton;
-
-    @BindView(R.id.registered_name_txt)
-    TextView mAccountUsernameTxt;
-
-    @BindView(R.id.register_name_btn)
-    Button mRegisterNameBtn;
-
-    @BindView(R.id.group_registering_name)
-    ViewGroup registeringNameGroup;
-
-    @BindView(R.id.group_register_name)
-    ViewGroup mRegisterNameGroup;
-
-    @BindView(R.id.group_registered_name)
-    ViewGroup mRegisteredNameGroup;
-
-    @BindView(R.id.device_list)
-    ListView mDeviceList;
-
-    @BindView(R.id.password_layout)
-    TextInputLayout mPasswordLayout;
-
-    @BindView(R.id.account_switch)
-    SwitchCompat mAccountSwitch;
-
-    @BindView(R.id.account_status)
-    Chip mAccountStatus;
-
-    @BindView(R.id.scrollview)
-    ScrollView mScrollView;
-
-    /*
-    Declarations
-    */
     private DeviceAdapter mDeviceAdapter;
     private ProgressDialog mWaitDialog;
     private boolean mAccountHasPassword = true;
@@ -205,14 +118,39 @@
     private Uri tmpProfilePhotoUri;
 
     private final CompositeDisposable mDisposableBag = new CompositeDisposable();
+    private final CompositeDisposable mProfileDisposable = new CompositeDisposable();
 
     @Inject
     AccountService mAccountService;
 
+    private FragAccSummaryBinding binding;
+
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragAccSummaryBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        mDisposableBag.add(mProfileDisposable);
+        return binding.getRoot();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        mDisposableBag.clear();
+        binding = null;
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mDisposableBag.dispose();
+    }
+
     @Override
     public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        mSheetBehavior = BottomSheetBehavior.from(mAddAccountLayout);
+        mSheetBehavior = BottomSheetBehavior.from(binding.layoutAddDevice);
 
         hidePopWizard();
         if (getArguments() != null) {
@@ -226,40 +164,49 @@
             @Override
             public void onStateChanged(@NonNull View view, int i) {
                 if (mSheetBehavior.getState() == BottomSheetBehavior.STATE_COLLAPSED){
-                    mPasswordLayout.setVisibility(mAccountHasPassword ? View.VISIBLE : View.GONE);
-                    mEndBtn.setVisibility(View.GONE);
-                    mStartBtn.setVisibility(View.VISIBLE);
-                    mExportInfos.setText(R.string.account_link_export_info);
+                    binding.passwordLayout.setVisibility(mAccountHasPassword ? View.VISIBLE : View.GONE);
+                    binding.btnEndExport.setVisibility(View.GONE);
+                    binding.btnStartExport.setVisibility(View.VISIBLE);
+                    binding.accountLinkInfo.setText(R.string.account_link_export_info);
                 }
             }
 
             @Override
-            public void onSlide(@NonNull View view, float v) {
-
-            }
+            public void onSlide(@NonNull View view, float v) {}
         });
 
-        updateUserView();
-        mScrollView.getViewTreeObserver().addOnScrollChangedListener(this);
+        updateUserView(mAccountService.getCurrentAccount());
+        binding.scrollview.getViewTreeObserver().addOnScrollChangedListener(this);
+        binding.btnAddDevice.setOnClickListener(v -> flipForm());
+        binding.btnStartExport.setOnClickListener(v -> onClickStart());
+        binding.btnEndExport.setOnClickListener(v -> hidePopWizard());
+        binding.exportAccountBtn.setOnClickListener(v -> onClickExport());
+        binding.profileContainer.setOnClickListener(v -> profileContainerClicked());
+        binding.userProfileEdit.setOnClickListener(v -> profileContainerClicked());
+        binding.accountSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> presenter.enableAccount(isChecked));
+        binding.changePasswordBtn.setOnClickListener(v -> onPasswordChangeAsked());
+        binding.registerNameBtn.setOnClickListener(v -> showUsernameRegistrationPopup());
+        binding.ringPassword.setOnEditorActionListener(this::onPasswordEditorAction);
+    }
+
+    public void setAccount(String accountId) {
+        presenter.setAccountId(accountId);
     }
 
     @Override
-    public void updateUserView() {
-        if (getActivity() == null || mAccountService.getCurrentAccount() == null) {
-            Log.e(TAG, "Not able to update navigation view");
+    public void updateUserView(Account account) {
+        Context context = getContext();
+        if (context == null || account == null)
             return;
-        }
 
-        mDisposableBag.add(mAccountService
-                .getCurrentAccountSubject()
-                .switchMapSingle(account -> AvatarDrawable.load(getActivity(), account)
-                        .map(avatar -> new Pair<>(account, avatar)))
+        mProfileDisposable.clear();
+        mProfileDisposable.add(AvatarDrawable.load(context, account)
+                .map(avatar -> new Pair<>(account, avatar))
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(d -> {
-                    mUsername.setText(getAccountAlias(d.first));
-                    mSubtitle.setText(getUri(d.first,  getActivity().getString(R.string.account_type_ip2ip)));
-                    mUserImage.setImageDrawable(d.second);
-                    accountChanged(d.first);
+                    binding.username.setText(getAccountAlias(d.first));
+                    binding.subtitle.setText(getUri(d.first,  getString(R.string.account_type_ip2ip)));
+                    binding.userPhoto.setImageDrawable(d.second);
                 }, e -> Log.e(TAG, "Error loading avatar", e)));
     }
 
@@ -305,33 +252,34 @@
 
     @Override
     public void accountChanged(@NonNull final Account account) {
+        updateUserView(account);
         if (mDeviceAdapter == null) {
             mDeviceAdapter = new DeviceAdapter(requireContext(), account.getDevices(), account.getDeviceId(),
                     JamiAccountSummaryFragment.this);
-            mDeviceList.setAdapter(mDeviceAdapter);
+            binding.deviceList.setAdapter(mDeviceAdapter);
         } else {
             mDeviceAdapter.setData(account.getDevices(), account.getDeviceId());
         }
 
         int totalHeight = 0;
         for (int i = 0; i < mDeviceAdapter.getCount(); i++) {
-            View listItem = mDeviceAdapter.getView(i, null, mDeviceList);
+            View listItem = mDeviceAdapter.getView(i, null, binding.deviceList);
             listItem.measure(0, 0);
             totalHeight += listItem.getMeasuredHeight();
         }
 
-        ViewGroup.LayoutParams par = mDeviceList.getLayoutParams();
-        par.height = totalHeight + (mDeviceList.getDividerHeight() * (mDeviceAdapter.getCount() - 1));
-        mDeviceList.setLayoutParams(par);
-        mDeviceList.requestLayout();
+        ViewGroup.LayoutParams par = binding.deviceList.getLayoutParams();
+        par.height = totalHeight + (binding.deviceList.getDividerHeight() * (mDeviceAdapter.getCount() - 1));
+        binding.deviceList.setLayoutParams(par);
+        binding.deviceList.requestLayout();
         mAccountHasPassword = account.hasPassword();
         mAccountHasManager = account.hasManager();
 
-        mChangePasswordBtn.setText(mAccountHasPassword ? R.string.account_password_change : R.string.account_password_set);
+        binding.changePasswordBtn.setText(mAccountHasPassword ? R.string.account_password_change : R.string.account_password_set);
 
-        mAccountSwitch.setChecked(account.isEnabled());
-        mAccountNameTxt.setText(getString(R.string.profile));
-        mAccountIdTxt.setText(account.getUsername());
+        binding.accountSwitch.setChecked(account.isEnabled());
+        binding.accountAliasTxt.setText(getString(R.string.profile));
+        binding.accountIdTxt.setText(account.getUsername());
         mAccountId = account.getAccountID();
         mBestName = account.getRegisteredName();
         if (mBestName.isEmpty()) {
@@ -344,11 +292,11 @@
         String username = account.getRegisteredName();
         boolean currentRegisteredName = account.registeringUsername;
         boolean hasRegisteredName = !currentRegisteredName && username != null && !username.isEmpty();
-        registeringNameGroup.setVisibility(currentRegisteredName ? View.VISIBLE : View.GONE);
-        mRegisterNameGroup.setVisibility((!hasRegisteredName && !currentRegisteredName) ? View.VISIBLE : View.GONE);
-        mRegisteredNameGroup.setVisibility(hasRegisteredName ? View.VISIBLE : View.GONE);
+        binding.groupRegisteringName.setVisibility(currentRegisteredName ? View.VISIBLE : View.GONE);
+        binding.groupRegisterName.setVisibility((!hasRegisteredName && !currentRegisteredName) ? View.VISIBLE : View.GONE);
+        binding.groupRegisteredName.setVisibility(hasRegisteredName ? View.VISIBLE : View.GONE);
         if (hasRegisteredName) {
-            mAccountUsernameTxt.setText(username);
+            binding.registeredNameTxt.setText(username);
         }
 
         int color = R.color.red_400;
@@ -376,12 +324,12 @@
             status = getString(R.string.account_status_offline);
         }
 
-        mAccountStatus.setText(status);
-        mAccountStatus.setChipBackgroundColorResource(color);
+        binding.accountStatus.setText(status);
+        binding.accountStatus.setChipBackgroundColorResource(color);
 
-        mPasswordLayout.setVisibility(mAccountHasPassword ? View.VISIBLE : View.GONE);
-        mAddAccountLayout.setVisibility(mAccountHasManager ? View.GONE : View.VISIBLE);
-        mAccountOptionsLayout.setVisibility(mAccountHasManager ? View.GONE : View.VISIBLE);
+        binding.passwordLayout.setVisibility(mAccountHasPassword ? View.VISIBLE : View.GONE);
+        binding.layoutAddDevice.setVisibility(mAccountHasManager ? View.GONE : View.VISIBLE);
+        binding.layoutAccountOptions.setVisibility(mAccountHasManager ? View.GONE : View.VISIBLE);
     }
 
     public boolean onBackPressed() {
@@ -396,9 +344,7 @@
     /*
     Add a new device UI management
      */
-    @OnClick({R.id.btn_add_device})
-    @SuppressWarnings("unused")
-    void flipForm() {
+    private void flipForm() {
         if (!isDisplayingWizard()) {
             showWizard();
         } else {
@@ -410,13 +356,11 @@
         mSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
     }
 
-    @OnClick(R.id.btn_end_export)
-    @SuppressWarnings("unused")
-    public void hidePopWizard() {
+    private void hidePopWizard() {
         mSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
     }
 
-    public void hideWizard() {
+    private void hideWizard() {
         mSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
         KeyboardVisibilityManager.hideKeyboard(getActivity(), 0);
     }
@@ -434,8 +378,8 @@
     @Override
     public void showPasswordError() {
         dismissWaitDialog();
-        mPasswordLayout.setError(getString(R.string.account_export_end_decryption_message));
-        mRingPassword.setText("");
+        binding.passwordLayout.setError(getString(R.string.account_export_end_decryption_message));
+        binding.ringPassword.setText("");
     }
 
     @Override
@@ -448,12 +392,11 @@
                 .show();
     }
 
-    public boolean isDisplayingWizard() {
+    private boolean isDisplayingWizard() {
         return mSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED;
     }
 
-    @OnEditorAction(R.id.ring_password)
-    boolean onPasswordEditorAction(TextView pwd, int actionId, KeyEvent event) {
+    private boolean onPasswordEditorAction(TextView pwd, int actionId, KeyEvent event) {
         Log.i(TAG, "onEditorAction " + actionId + " " + (event == null ? null : event.toString()));
         if (actionId == EditorInfo.IME_ACTION_DONE) {
             if (pwd.getText().length() == 0) {
@@ -466,8 +409,7 @@
         return false;
     }
 
-    @OnClick({R.id.profile_container, R.id.user_profile_edit})
-    public void profileContainerClicked() {
+    private void profileContainerClicked() {
         LayoutInflater inflater = LayoutInflater.from(getActivity());
         ViewGroup view = (ViewGroup) inflater.inflate(R.layout.dialog_profile, null);
 
@@ -498,15 +440,13 @@
                 .show();
     }
 
-    @OnClick(R.id.btn_start_export)
-    void onClickStart() {
-        mPasswordLayout.setError(null);
-        String password = mRingPassword.getText().toString();
+    private void onClickStart() {
+        binding.passwordLayout.setError(null);
+        String password = binding.ringPassword.getText().toString();
         presenter.startAccountExport(password);
     }
 
-    @OnClick(R.id.export_account_btn)
-    void onClickExport() {
+    private void onClickExport() {
         if (mAccountHasPassword) {
             onBackupAccount();
         } else {
@@ -514,13 +454,7 @@
         }
     }
 
-    @OnClick(R.id.account_switch)
-    void onToggleAccount() {
-        presenter.enableAccount(mAccountSwitch.isChecked());
-    }
-
-    @OnClick(R.id.register_name_btn)
-    void showUsernameRegistrationPopup() {
+    private void showUsernameRegistrationPopup() {
         Bundle args = new Bundle();
         args.putString(AccountEditionFragment.ACCOUNT_ID_KEY, getArguments().getString(AccountEditionFragment.ACCOUNT_ID_KEY));
         args.putBoolean(AccountEditionFragment.ACCOUNT_HAS_PASSWORD_KEY, mAccountHasPassword);
@@ -556,16 +490,6 @@
                 getString(R.string.account_password_change_wait_message));
     }
 
-    @Override
-    public int getLayout() {
-        return R.layout.frag_acc_summary;
-    }
-
-    @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
-    }
-
     private void dismissWaitDialog() {
         if (mWaitDialog != null) {
             mWaitDialog.dismiss();
@@ -576,11 +500,11 @@
 
     @Override
     public void showPIN(final String pin) {
-        mRingPassword.setText("");
+        binding.ringPassword.setText("");
         mSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
-        mPasswordLayout.setVisibility(View.GONE);
-        mEndBtn.setVisibility(View.VISIBLE);
-        mStartBtn.setVisibility(View.GONE);
+        binding.passwordLayout.setVisibility(View.GONE);
+        binding.btnEndExport.setVisibility(View.VISIBLE);
+        binding.btnStartExport.setVisibility(View.GONE);
         dismissWaitDialog();
         String pined = getString(R.string.account_end_export_infos).replace("%%", pin);
         final SpannableString styledResultText = new SpannableString(pined);
@@ -588,8 +512,8 @@
         styledResultText.setSpan(new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), pos, (pos + pin.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
         styledResultText.setSpan(new StyleSpan(Typeface.BOLD), pos, (pos + pin.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
         styledResultText.setSpan(new RelativeSizeSpan(2.8f), pos, (pos + pin.length()), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-        mExportInfos.setText(styledResultText);
-        mExportInfos.requestFocus();
+        binding.accountLinkInfo.setText(styledResultText);
+        binding.accountLinkInfo.requestFocus();
 
         KeyboardVisibilityManager.hideKeyboard(getActivity(), 0);
     }
@@ -665,7 +589,7 @@
         presenter.revokeDevice(deviceId, password);
     }
 
-    public void onBackupAccount() {
+    private void onBackupAccount() {
         BackupAccountDialog dialog = new BackupAccountDialog();
         Bundle args = new Bundle();
         args.putString(AccountEditionFragment.ACCOUNT_ID_KEY, getArguments().getString(AccountEditionFragment.ACCOUNT_ID_KEY));
@@ -696,8 +620,7 @@
         dialog.show(requireFragmentManager(), FRAGMENT_DIALOG_RENAME);
     }
 
-    @OnClick(R.id.change_password_btn)
-    public void onPasswordChangeAsked() {
+    private void onPasswordChangeAsked() {
         ChangePasswordDialog dialog = new ChangePasswordDialog();
         Bundle args = new Bundle();
         args.putString(AccountEditionFragment.ACCOUNT_ID_KEY, getArguments().getString(AccountEditionFragment.ACCOUNT_ID_KEY));
@@ -767,15 +690,13 @@
         requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, HomeActivity.REQUEST_PERMISSION_READ_STORAGE);
     }
 
-    public void updatePhoto(Uri uriImage) {
+    private void updatePhoto(Uri uriImage) {
         mDisposableBag.add(AndroidFileUtils.loadBitmap(getActivity(), uriImage)
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(this::updatePhoto, e -> Log.e(TAG, "Error loading image " + uriImage, e)));
-
-        updateUserView();
     }
 
-    public void updatePhoto(Bitmap image) {
+    private void updatePhoto(Bitmap image) {
         mSourcePhoto = image;
         AvatarDrawable avatarDrawable = new AvatarDrawable.Builder()
                         .withPhoto(image)
@@ -788,11 +709,9 @@
                 .subscribeOn(Schedulers.io())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(avatar -> mProfilePhoto.setImageDrawable(avatar), e-> Log.e(TAG, "Error loading image", e)));
-
-        updateUserView();
     }
 
-    public String getAccountAlias(Account account) {
+    private String getAccountAlias(Account account) {
         if (account == null) {
             cx.ring.utils.Log.e(TAG, "Not able to get account alias");
             return null;
@@ -801,7 +720,7 @@
         return (alias == null) ? account.getAlias() : alias;
     }
 
-    public String getAlias(Account account) {
+    private String getAlias(Account account) {
         if (account == null) {
             cx.ring.utils.Log.e(TAG, "Not able to get alias");
             return null;
@@ -819,7 +738,7 @@
         return null;
     }
 
-    public String getUri(Account account, CharSequence defaultNameSip) {
+    private String getUri(Account account, CharSequence defaultNameSip) {
         if (account.isIP2IP()) {
             return defaultNameSip.toString();
         }
@@ -845,13 +764,14 @@
 
     @Override
     public void onScrollChanged() {
-        if (mIsVisible && mScrollView != null) {
-            ((HomeActivity) getActivity()).setToolbarElevation(mScrollView.canScrollVertically(SCROLL_DIRECTION_UP));
+        if (mIsVisible && binding != null) {
+            Activity activity = getActivity();
+            if (activity instanceof HomeActivity)
+                ((HomeActivity) activity).setToolbarElevation(binding.scrollview.canScrollVertically(SCROLL_DIRECTION_UP));
         }
     }
 
     public void setFragmentVisibility(boolean isVisible) {
         mIsVisible = isVisible;
     }
-
 }
diff --git a/ring-android/app/src/main/java/cx/ring/account/JamiLinkAccountFragment.java b/ring-android/app/src/main/java/cx/ring/account/JamiLinkAccountFragment.java
index c408502..3eeca84 100644
--- a/ring-android/app/src/main/java/cx/ring/account/JamiLinkAccountFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/account/JamiLinkAccountFragment.java
@@ -20,42 +20,28 @@
 package cx.ring.account;
 
 import android.app.Activity;
+import android.os.Bundle;
 import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
-import android.widget.EditText;
 
-import butterknife.BindView;
-import butterknife.OnClick;
-import butterknife.OnEditorAction;
-import butterknife.OnTextChanged;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import cx.ring.R;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.application.JamiApplication;
+import cx.ring.databinding.FragAccRingLinkBinding;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.mvp.AccountCreationModel;
 
 public class JamiLinkAccountFragment extends BaseSupportFragment<JamiLinkAccountPresenter> implements JamiLinkAccountView {
 
     public static final String TAG = JamiLinkAccountFragment.class.getSimpleName();
-
-    @BindView(R.id.pin_box)
-    protected ViewGroup mPinBox;
-
-    @BindView(R.id.pin_help_message)
-    protected View mPinMessage;
-
-    @BindView(R.id.ring_add_pin)
-    protected EditText mPinTxt;
-
-    @BindView(R.id.ring_existing_password)
-    protected EditText mPasswordTxt;
-
-    @BindView(R.id.link_button)
-    protected Button mLinkAccountBtn;
-
     private AccountCreationModel model;
+    private FragAccRingLinkBinding binding;
 
     public static JamiLinkAccountFragment newInstance(AccountCreationModelImpl ringAccountViewModel) {
         JamiLinkAccountFragment fragment = new JamiLinkAccountFragment();
@@ -63,14 +49,53 @@
         return fragment;
     }
 
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_acc_ring_link;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragAccRingLinkBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        binding.linkButton.setOnClickListener(v -> presenter.linkClicked());
+        binding.ringAddPin.setOnEditorActionListener((v, actionId, event) -> {
+            if (actionId == EditorInfo.IME_ACTION_DONE) {
+                presenter.linkClicked();
+            }
+            return false;
+        });
+        binding.ringAddPin.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {}
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                presenter.pinChanged(s.toString());
+            }
+        });
+        binding.ringExistingPassword.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {}
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                presenter.passwordChanged(s.toString());
+            }
+        });
     }
 
     @Override
@@ -78,39 +103,16 @@
         presenter.init(model);
     }
 
-    @OnClick(R.id.link_button)
-    public void onLinkClick() {
-        presenter.linkClicked();
-    }
-
-    @OnTextChanged(value = R.id.ring_existing_password, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
-    public void afterPasswordChanged(Editable txt) {
-        presenter.passwordChanged(txt.toString());
-    }
-
-    @OnTextChanged(value = R.id.ring_add_pin, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
-    public void afterPinChanged(Editable txt) {
-        presenter.pinChanged(txt.toString());
-    }
-
-    @OnEditorAction(value = R.id.ring_add_pin)
-    public boolean onPasswordConfirmDone(int keyCode) {
-        if (keyCode == EditorInfo.IME_ACTION_DONE) {
-            presenter.linkClicked();
-        }
-        return false;
-    }
-
     @Override
     public void enableLinkButton(boolean enable) {
-        mLinkAccountBtn.setEnabled(enable);
+        binding.linkButton.setEnabled(enable);
     }
 
     @Override
     public void showPin(boolean show) {
-        mPinBox.setVisibility(show ? View.VISIBLE : View.GONE);
-        mPinMessage.setVisibility(show ? View.VISIBLE : View.GONE);
-        mLinkAccountBtn.setText(show ? R.string.account_link_device : R.string.account_link_archive_button);
+        binding.pinBox.setVisibility(show ? View.VISIBLE : View.GONE);
+        binding.pinHelpMessage.setVisibility(show ? View.VISIBLE : View.GONE);
+        binding.linkButton.setText(show ? R.string.account_link_device : R.string.account_link_archive_button);
     }
 
     @Override
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 ca6ab30..4367071 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
@@ -31,22 +31,20 @@
 import android.os.Bundle;
 import android.provider.MediaStore;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import android.text.Editable;
+import android.text.TextWatcher;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.ImageView;
+import android.view.ViewGroup;
 
 import java.io.File;
 import java.io.IOException;
 
-import butterknife.BindView;
-import butterknife.OnClick;
-import butterknife.OnTextChanged;
-import cx.ring.R;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.application.JamiApplication;
+import cx.ring.databinding.FragAccProfileCreateBinding;
 import cx.ring.model.Account;
 import cx.ring.mvp.AccountCreationModel;
 import cx.ring.mvp.BaseSupportFragment;
@@ -63,23 +61,9 @@
     public static final int REQUEST_PERMISSION_CAMERA = 3;
     public static final int REQUEST_PERMISSION_READ_STORAGE = 4;
 
-    @BindView(R.id.profile_photo)
-    protected ImageView mPhotoView;
-
-    @BindView(R.id.user_name)
-    protected EditText mFullnameView;
-
-    @BindView(R.id.gallery)
-    protected ImageButton mGalleryButton;
-
-    @BindView(R.id.camera)
-    protected ImageButton mCameraButton;
-
-    @BindView(R.id.next_create_account)
-    protected Button mNextButton;
-
     private AccountCreationModel model;
     private Uri tmpProfilePhotoUri;
+    private FragAccProfileCreateBinding binding;
 
     public static ProfileCreationFragment newInstance(AccountCreationModelImpl model) {
         ProfileCreationFragment fragment = new ProfileCreationFragment();
@@ -87,14 +71,18 @@
         return fragment;
     }
 
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_acc_profile_create;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragAccProfileCreateBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     @Override
@@ -106,8 +94,8 @@
             getActivity().finish();
             return;
         }
-        if (mPhotoView.getDrawable() == null) {
-            mPhotoView.setImageDrawable(
+        if (binding.profilePhoto.getDrawable() == null) {
+            binding.profilePhoto.setImageDrawable(
                     new AvatarDrawable.Builder()
                             .withNameData(model.getFullName(), model.getUsername())
                             .withCircleCrop(true)
@@ -115,6 +103,23 @@
             );
         }
         presenter.initPresenter(model);
+
+        binding.gallery.setOnClickListener(v -> presenter.galleryClick());
+        binding.camera.setOnClickListener(v -> presenter.cameraClick());
+        binding.nextCreateAccount.setOnClickListener(v -> presenter.nextClick());
+        binding.skipCreateAccount.setOnClickListener(v -> presenter.skipClick());
+        binding.userName.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {}
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                presenter.fullNameUpdated(s.toString());
+            }
+        });
     }
 
     @Override
@@ -163,29 +168,9 @@
         }
     }
 
-    @OnClick(R.id.gallery)
-    void galleryClicked() {
-        presenter.galleryClick();
-    }
-
-    @OnClick(R.id.camera)
-    void cameraClicked() {
-        presenter.cameraClick();
-    }
-
-    @OnClick(R.id.next_create_account)
-    void nextClicked() {
-        presenter.nextClick();
-    }
-
-    @OnClick(R.id.skip_create_account)
-    void skipClicked() {
-        presenter.skipClick();
-    }
-
     @Override
     public void displayProfileName(String profileName) {
-        mFullnameView.setText(profileName);
+        binding.userName.setText(profileName);
     }
 
     @Override
@@ -235,7 +220,7 @@
     public void setProfile(AccountCreationModel accountCreationModel) {
         AccountCreationModelImpl model = ((AccountCreationModelImpl) accountCreationModel);
         Account newAccount = model.getNewAccount();
-        mPhotoView.setImageDrawable(
+        binding.profilePhoto.setImageDrawable(
                 new AvatarDrawable.Builder()
                         .withPhoto(model.getPhoto())
                         .withNameData(accountCreationModel.getFullName(), accountCreationModel.getUsername())
@@ -245,8 +230,4 @@
         );
     }
 
-    @OnTextChanged(value = R.id.user_name, callback = OnTextChanged.Callback.AFTER_TEXT_CHANGED)
-    public void afterTextChanged(Editable txt) {
-        presenter.fullNameUpdated(txt.toString());
-    }
 }
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 83a09d6..5c46aa5 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
@@ -27,23 +27,18 @@
 import android.view.WindowManager;
 import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
-import android.widget.EditText;
 import android.widget.TextView;
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.textfield.TextInputLayout;
 
 import javax.inject.Inject;
 
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
-import butterknife.BindString;
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnEditorAction;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
+import cx.ring.databinding.FragRegisterNameBinding;
 import cx.ring.services.AccountService;
 import cx.ring.utils.RegisteredNameFilter;
 import cx.ring.utils.RegisteredNameTextWatcher;
@@ -52,28 +47,8 @@
 
 public class RegisterNameDialog extends DialogFragment {
     static final String TAG = RegisterNameDialog.class.getSimpleName();
-    @BindView(R.id.ring_username_txt_box)
-    public TextInputLayout mUsernameTxtBox;
-    @BindView(R.id.ring_username)
-    public EditText mUsernameTxt;
-    @BindView(R.id.password_txt_box)
-    public TextInputLayout mPasswordTxtBox;
-    @BindView(R.id.password_txt)
-    public EditText mPasswordTxt;
-    @BindString(R.string.register_name)
-    public String mRegisterTitle;
-    @BindString(R.string.register_username)
-    public String mRegisterMessage;
-    @BindString(R.string.prompt_new_username)
-    public String mPromptUsername;
-    @BindString(R.string.prompt_password)
-    public String mPromptPassword;
     @Inject
     AccountService mAccountService;
-    @BindString(R.string.username_already_taken)
-    String mUserNameAlreadyTaken;
-    @BindString(R.string.invalid_username)
-    String mInvalidUsername;
     @Inject
     Scheduler mUiScheduler;
 
@@ -81,16 +56,17 @@
     private RegisterNameDialogListener mListener = null;
 
     private Disposable mDisposableListener;
+    private FragRegisterNameBinding binding;
 
     public void setListener(RegisterNameDialogListener l) {
         mListener = l;
     }
 
     private void handleBlockchainResult(final int state, final String name) {
-        String actualName = mUsernameTxt.getText().toString();
-        if (actualName.isEmpty()) {
-            mUsernameTxtBox.setErrorEnabled(false);
-            mUsernameTxtBox.setError(null);
+        CharSequence actualName = binding.ringUsername.getText();
+        if (actualName == null || actualName.length() == 0) {
+            binding.ringUsernameTxtBox.setErrorEnabled(false);
+            binding.ringUsernameTxtBox.setError(null);
             return;
         }
 
@@ -98,18 +74,18 @@
             switch (state) {
                 case 0:
                     // on found
-                    mUsernameTxtBox.setErrorEnabled(true);
-                    mUsernameTxtBox.setError(mUserNameAlreadyTaken);
+                    binding.ringUsernameTxtBox.setErrorEnabled(true);
+                    binding.ringUsernameTxtBox.setError(getText(R.string.username_already_taken));
                     break;
                 case 1:
                     // invalid name
-                    mUsernameTxtBox.setErrorEnabled(true);
-                    mUsernameTxtBox.setError(mInvalidUsername);
+                    binding.ringUsernameTxtBox.setErrorEnabled(true);
+                    binding.ringUsernameTxtBox.setError(getText(R.string.invalid_username));
                     break;
                 default:
                     // on error
-                    mUsernameTxtBox.setErrorEnabled(false);
-                    mUsernameTxtBox.setError(null);
+                    binding.ringUsernameTxtBox.setErrorEnabled(false);
+                    binding.ringUsernameTxtBox.setError(null);
                     break;
             }
         }
@@ -118,11 +94,11 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        View view = getActivity().getLayoutInflater().inflate(R.layout.frag_register_name, null);
-        ButterKnife.bind(this, view);
+        binding = FragRegisterNameBinding.inflate(getActivity().getLayoutInflater());
+        View view = binding.getRoot();
 
         // dependency injection
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
 
         String accountId = "";
         boolean hasPassword = true;
@@ -132,10 +108,13 @@
             hasPassword = args.getBoolean(AccountEditionFragment.ACCOUNT_HAS_PASSWORD_KEY, true);
         }
 
-        mUsernameTxt.setFilters(new InputFilter[]{new RegisteredNameFilter()});
-        mUsernameTextWatcher = new RegisteredNameTextWatcher(getActivity(), mAccountService, accountId, mUsernameTxtBox, mUsernameTxt);
-        mUsernameTxt.addTextChangedListener(mUsernameTextWatcher);
-        mPasswordTxtBox.setVisibility(hasPassword ? View.VISIBLE : View.GONE);
+        mUsernameTextWatcher = new RegisteredNameTextWatcher(getActivity(), mAccountService, accountId, binding.ringUsernameTxtBox, binding.ringUsername);
+        binding.ringUsername.setFilters(new InputFilter[]{new RegisteredNameFilter()});
+        binding.ringUsername.addTextChangedListener(mUsernameTextWatcher);
+        // binding.ringUsername.setOnEditorActionListener((v, actionId, event) -> RegisterNameDialog.this.onEditorAction(v, actionId));
+
+        binding.passwordTxtBox.setVisibility(hasPassword ? View.VISIBLE : View.GONE);
+        binding.passwordTxt.setOnEditorActionListener((v, actionId, event) -> RegisterNameDialog.this.onEditorAction(v, actionId));
 
         AlertDialog dialog = (AlertDialog) getDialog();
         if (dialog != null) {
@@ -145,8 +124,8 @@
 
         AlertDialog result = new MaterialAlertDialogBuilder(requireContext())
                 .setView(view)
-                .setMessage(mRegisterMessage)
-                .setTitle(mRegisterTitle)
+                .setMessage(R.string.register_username)
+                .setTitle(R.string.register_name)
                 .setPositiveButton(android.R.string.ok, null) //Set to null. We override the onclick
                 .setNegativeButton(android.R.string.cancel, (d, b) -> dismiss())
                 .create();
@@ -164,10 +143,10 @@
     }
 
     @Override
-    public void onAttach(Context context) {
+    public void onAttach(@NonNull Context context) {
         super.onAttach(context);
-        if (mUsernameTxt != null) {
-            mUsernameTxt.addTextChangedListener(mUsernameTextWatcher);
+        if (binding != null) {
+            binding.ringUsername.addTextChangedListener(mUsernameTextWatcher);
         }
     }
 
@@ -188,61 +167,62 @@
 
     @Override
     public void onDetach() {
-        if (mUsernameTxt != null) {
-            mUsernameTxt.removeTextChangedListener(mUsernameTextWatcher);
+        if (binding != null) {
+            binding.ringUsername.removeTextChangedListener(mUsernameTextWatcher);
         }
         super.onDetach();
     }
 
     private boolean isValidUsername() {
-        return mUsernameTxtBox.getError() == null;
+        return binding.ringUsernameTxtBox.getError() == null;
     }
 
-    public boolean checkInput() {
-        if (mUsernameTxt.getText().toString().isEmpty()) {
-            mUsernameTxtBox.setErrorEnabled(true);
-            mUsernameTxtBox.setError(mPromptUsername);
+    private boolean checkInput() {
+        if (binding.ringUsername.getText() == null || binding.ringUsername.getText().length() == 0) {
+            binding.ringUsernameTxtBox.setErrorEnabled(true);
+            binding.ringUsernameTxtBox.setError(getText(R.string.prompt_new_username));
             return false;
         }
 
         if (!isValidUsername()) {
-            mUsernameTxt.requestFocus();
+            binding.ringUsername.requestFocus();
             return false;
         }
 
-        mUsernameTxtBox.setErrorEnabled(false);
-        mUsernameTxtBox.setError(null);
+        binding.ringUsernameTxtBox.setErrorEnabled(false);
+        binding.ringUsernameTxtBox.setError(null);
 
-        if (mPasswordTxtBox.getVisibility() == View.VISIBLE) {
-            if (mPasswordTxt.getText().toString().isEmpty()) {
-                mPasswordTxtBox.setErrorEnabled(true);
-                mPasswordTxtBox.setError(mPromptPassword);
+        if (binding.passwordTxtBox.getVisibility() == View.VISIBLE) {
+            if (binding.passwordTxt.getText() == null || binding.passwordTxt.getText().length() == 0) {
+                binding.passwordTxtBox.setErrorEnabled(true);
+                binding.passwordTxtBox.setError(getString(R.string.prompt_password));
                 return false;
             } else {
-                mPasswordTxtBox.setErrorEnabled(false);
-                mPasswordTxtBox.setError(null);
+                binding.passwordTxtBox.setErrorEnabled(false);
+                binding.passwordTxtBox.setError(null);
             }
         }
         return true;
     }
 
-    boolean validate() {
+    private boolean validate() {
         if (checkInput() && mListener != null) {
-            final String username = mUsernameTxt.getText().toString();
-            final String password = mPasswordTxt.getText().toString();
+            final String username = binding.ringUsername.getText().toString();
+            final String password = binding.passwordTxt.getText().toString();
             mListener.onRegisterName(username, password);
             return true;
         }
         return false;
     }
 
-    @OnEditorAction({R.id.ring_username, R.id.password_txt})
-    public boolean onEditorAction(TextView v, int actionId) {
-        if (v == mPasswordTxt) {
+    private boolean onEditorAction(TextView v, int actionId) {
+        if (v == binding.passwordTxt) {
             if (actionId == EditorInfo.IME_ACTION_DONE) {
                 boolean validationResult = validate();
                 if (validationResult) {
-                    getDialog().dismiss();
+                    Dialog dialog = getDialog();
+                    if (dialog != null)
+                        dialog.dismiss();
                 }
 
                 return validationResult;
diff --git a/ring-android/app/src/main/java/cx/ring/account/RenameDeviceDialog.java b/ring-android/app/src/main/java/cx/ring/account/RenameDeviceDialog.java
index ceb91d1..c81a74fc 100644
--- a/ring-android/app/src/main/java/cx/ring/account/RenameDeviceDialog.java
+++ b/ring-android/app/src/main/java/cx/ring/account/RenameDeviceDialog.java
@@ -22,34 +22,23 @@
 import android.os.Bundle;
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import com.google.android.material.textfield.TextInputLayout;
 
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
-import android.view.View;
+
 import android.view.WindowManager;
 import android.view.inputmethod.EditorInfo;
 import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
 
 import androidx.fragment.app.DialogFragment;
-import butterknife.BindString;
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnEditorAction;
 import cx.ring.R;
+import cx.ring.databinding.DialogDeviceRenameBinding;
 
 public class RenameDeviceDialog extends DialogFragment {
     public static final String DEVICENAME_KEY = "devicename_key";
     static final String TAG = RenameDeviceDialog.class.getSimpleName();
-    @BindView(R.id.ring_device_name_txt_box)
-    public TextInputLayout mDeviceNameTxtBox;
-    @BindView(R.id.ring_device_name_txt)
-    public EditText mDeviceNameTxt;
-    @BindString(R.string.account_device_name_empty)
-    protected String mPromptDeviceName;
     private RenameDeviceListener mListener = null;
+    private DialogDeviceRenameBinding binding;
 
     public void setListener(RenameDeviceListener listener) {
         mListener = listener;
@@ -58,13 +47,22 @@
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        View view = requireActivity().getLayoutInflater().inflate(R.layout.dialog_device_rename, null);
-        ButterKnife.bind(this, view);
+        binding = DialogDeviceRenameBinding.inflate(getActivity().getLayoutInflater());
 
-        mDeviceNameTxt.setText(getArguments().getString(DEVICENAME_KEY));
+        binding.ringDeviceNameTxt.setText(getArguments().getString(DEVICENAME_KEY));
+        binding.ringDeviceNameTxt.setOnEditorActionListener((v, actionId, event) -> {
+            if (actionId == EditorInfo.IME_ACTION_DONE) {
+                boolean validationResult = validate();
+                if (validationResult) {
+                    getDialog().dismiss();
+                }
+                return validationResult;
+            }
+            return false;
+        });
 
         final AlertDialog dialog = new MaterialAlertDialogBuilder(requireContext())
-                .setView(view)
+                .setView(binding.getRoot())
                 .setTitle(R.string.rename_device_title)
                 .setMessage(R.string.rename_device_message)
                 .setPositiveButton(R.string.rename_device_button, null)
@@ -90,18 +88,18 @@
 
     private boolean checkInput(String input) {
         if (input.isEmpty()) {
-            mDeviceNameTxtBox.setErrorEnabled(true);
-            mDeviceNameTxtBox.setError(mPromptDeviceName);
+            binding.ringDeviceNameTxtBox.setErrorEnabled(true);
+            binding.ringDeviceNameTxtBox.setError(getText(R.string.account_device_name_empty));
             return false;
         } else {
-            mDeviceNameTxtBox.setErrorEnabled(false);
-            mDeviceNameTxtBox.setError(null);
+            binding.ringDeviceNameTxtBox.setErrorEnabled(false);
+            binding.ringDeviceNameTxtBox.setError(null);
         }
         return true;
     }
 
     private boolean validate() {
-        String input = mDeviceNameTxt.getText().toString().trim();
+        String input = binding.ringDeviceNameTxt.getText().toString().trim();
         if (checkInput(input) && mListener != null) {
             mListener.onDeviceRename(input);
             return true;
@@ -109,20 +107,6 @@
         return false;
     }
 
-    @OnEditorAction({R.id.ring_device_name_txt})
-    public boolean onEditorAction(TextView v, int actionId) {
-        if (v == mDeviceNameTxt) {
-            if (actionId == EditorInfo.IME_ACTION_DONE) {
-                boolean validationResult = validate();
-                if (validationResult) {
-                    getDialog().dismiss();
-                }
-                return validationResult;
-            }
-        }
-        return false;
-    }
-
     public interface RenameDeviceListener {
         void onDeviceRename(String newName);
     }
diff --git a/ring-android/app/src/main/java/cx/ring/adapters/AccountView.java b/ring-android/app/src/main/java/cx/ring/adapters/AccountView.java
deleted file mode 100644
index 84a8e4d..0000000
--- a/ring-android/app/src/main/java/cx/ring/adapters/AccountView.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  Copyright (C) 2004-2019 Savoir-faire Linux Inc.
- *
- *  Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 3 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package cx.ring.adapters;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.view.View;
-import android.widget.CheckBox;
-import android.widget.ImageView;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import androidx.recyclerview.widget.RecyclerView;
-
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import cx.ring.R;
-import cx.ring.model.Account;
-import cx.ring.views.AvatarDrawable;
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
-
-public class AccountView extends RecyclerView.ViewHolder {
-
-    public interface OnAccountActionListener {
-        void onAccountSelected(Account account);
-        void onAccountEnabled(Account account);
-    }
-
-    private final OnAccountActionListener listener;
-
-    @BindView(R.id.account_photo)
-    ImageView photo;
-
-    @BindView(R.id.account_alias)
-    TextView alias;
-
-    @BindView(R.id.account_host)
-    TextView host;
-
-    @BindView(R.id.error_indicator)
-    ImageView error;
-
-    @BindView(R.id.loading_indicator)
-    ProgressBar loading;
-
-    private TextView disabled_flag;
-    private CheckBox enabled;
-
-    private final CompositeDisposable mDisposable = new CompositeDisposable();
-
-    public AccountView(View view, OnAccountActionListener l) {
-        super(view);
-        listener = l;
-        ButterKnife.bind(this, view);
-        disabled_flag = view.findViewById(R.id.account_disabled);
-        enabled = view.findViewById(R.id.account_checked);
-    }
-
-    public void update(final Account account) {
-        final Context context = itemView.getContext();
-        mDisposable.clear();
-        mDisposable.add(AvatarDrawable.load(context, account)
-                .subscribeOn(Schedulers.computation())
-                .observeOn(AndroidSchedulers.mainThread())
-                .subscribe(avatar -> photo.setImageDrawable(avatar)));
-        itemView.setOnClickListener(v -> listener.onAccountSelected(account));
-
-        mDisposable.add(account.getAccountAlias()
-                .observeOn(AndroidSchedulers.mainThread())
-                .subscribe(a -> alias.setText(a)));
-
-        host.setText(account.getDisplayUri(context.getText(R.string.account_type_ip2ip)));
-        itemView.setEnabled(account.isEnabled());
-
-        if (disabled_flag != null) {
-            disabled_flag.setVisibility(account.isEnabled() ? View.GONE : View.VISIBLE);
-        }
-
-        if (enabled != null) {
-            enabled.setChecked(account.isEnabled());
-            enabled.setOnClickListener(v -> {
-                account.setEnabled(!account.isEnabled());
-                listener.onAccountEnabled(account);
-            });
-        }
-
-        if (account.isEnabled()) {
-            alias.setTextColor(context.getResources().getColor(R.color.textColorPrimary));
-            host.setTextColor(context.getResources().getColor(R.color.textColorPrimary));
-            if (!account.isActive()) {
-                error.setImageResource(R.drawable.baseline_sync_disabled_24);
-                error.setColorFilter(Color.BLACK);
-                error.setVisibility(View.VISIBLE);
-                loading.setVisibility(View.GONE);
-            } else if (account.isTrying()) {
-                error.setVisibility(View.GONE);
-                loading.setVisibility(View.VISIBLE);
-            } else if (account.needsMigration()) {
-                host.setText(R.string.account_update_needed);
-                host.setTextColor(Color.RED);
-                error.setImageResource(R.drawable.baseline_warning_24);
-                error.setColorFilter(Color.RED);
-                error.setVisibility(View.VISIBLE);
-            } else if (account.isInError() || !account.isRegistered()) {
-                error.setImageResource(R.drawable.baseline_error_24);
-                error.setColorFilter(Color.RED);
-                error.setVisibility(View.VISIBLE);
-                loading.setVisibility(View.GONE);
-            } else {
-                error.setVisibility(View.GONE);
-                loading.setVisibility(View.GONE);
-            }
-        } else {
-            alias.setTextColor(context.getResources().getColor(R.color.textColorSecondary));
-            error.setVisibility(View.GONE);
-            loading.setVisibility(View.GONE);
-        }
-    }
-}
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 035c385..6b23129 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
@@ -300,7 +300,7 @@
         sInstance = null;
     }
 
-    public JamiInjectionComponent getRingInjectionComponent() {
+    public JamiInjectionComponent getInjectionComponent() {
         return mJamiInjectionComponent;
     }
 
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 47e0232..a76f940 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
@@ -65,7 +65,6 @@
 import cx.ring.model.SipCall;
 import cx.ring.services.AccountService;
 import cx.ring.services.NotificationService;
-import cx.ring.utils.ContentUriHandler;
 import cx.ring.utils.ConversationPath;
 import cx.ring.views.AvatarDrawable;
 import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -172,7 +171,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_details);
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
 
         CollapsingToolbarLayout collapsingToolbarLayout = findViewById(R.id.toolbar_layout);
         collapsingToolbarLayout.setTitle("");
@@ -275,7 +274,7 @@
     @Override
     protected void onDestroy() {
         adapter.actions.clear();
-        mDisposableBag.clear();
+        mDisposableBag.dispose();
         super.onDestroy();
         contactAction = null;
         colorAction = null;
diff --git a/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java b/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java
index 68a3d8c..4361b47 100644
--- a/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/client/ConversationActivity.java
@@ -40,30 +40,21 @@
 import androidx.coordinatorlayout.widget.CoordinatorLayout;
 import androidx.core.view.ViewCompat;
 
-import com.google.android.material.appbar.AppBarLayout;
-
-import butterknife.BindView;
-import butterknife.ButterKnife;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
+import cx.ring.databinding.ActivityConversationBinding;
 import cx.ring.fragments.ConversationFragment;
 import cx.ring.interfaces.Colorable;
 import cx.ring.utils.ConversationPath;
 import cx.ring.utils.MediaButtonsHelper;
 
 public class ConversationActivity extends AppCompatActivity implements Colorable {
-    @BindView(R.id.toolbar_layout)
-    AppBarLayout mToolbarLayout;
-
-    @BindView(R.id.main_toolbar)
-    Toolbar mToolbar;
 
     private ConversationFragment mConversationFragment;
-    /*private String contactUri = null;
-    private String accountId = null;*/
     private ConversationPath conversationPath = null;
 
     private Intent mPendingIntent = null;
+    private ActivityConversationBinding binding;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -71,9 +62,10 @@
 
         JamiApplication.getInstance().startDaemon();
 
-        setContentView(R.layout.activity_conversation);
-        ButterKnife.bind(this);
-        setSupportActionBar(mToolbar);
+        binding = ActivityConversationBinding.inflate(getLayoutInflater());
+        setContentView(binding.getRoot());
+
+        setSupportActionBar(binding.mainToolbar);
         ActionBar ab = getSupportActionBar();
         if (ab != null)
             ab.setDisplayHomeAsUpEnabled(true);
@@ -86,10 +78,10 @@
                         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
 
-        ViewCompat.setOnApplyWindowInsetsListener(mToolbarLayout, (v, insets) -> {
-            CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mToolbarLayout.getLayoutParams();
+        ViewCompat.setOnApplyWindowInsetsListener(binding.toolbarLayout, (v, insets) -> {
+            CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) binding.toolbarLayout.getLayoutParams();
             params.topMargin = insets.getSystemWindowInsetTop();
-            mToolbarLayout.setLayoutParams(params);
+            binding.toolbarLayout.setLayoutParams(params);
             insets.consumeSystemWindowInsets();
             return insets;
         });
@@ -153,7 +145,7 @@
     }
 
     public void setColor(@ColorInt int color) {
-        colouriseToolbar(mToolbar, color);
+        colouriseToolbar(binding.mainToolbar, color);
         //mToolbar.setBackground(new ColorDrawable(color));
         //getWindow().setStatusBarColor(color);
     }
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 4ad662e..1f03a1c 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
@@ -24,9 +24,7 @@
 import android.text.TextUtils;
 
 import androidx.annotation.Nullable;
-import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
@@ -69,7 +67,7 @@
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         setContentView(R.layout.frag_selectconv);
         RecyclerView list = findViewById(R.id.conversationList);
 
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 9e2456a..a3f204b 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
@@ -24,7 +24,6 @@
 import android.net.Uri;
 import android.os.Bundle;
 
-import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.badge.BadgeDrawable;
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@@ -34,7 +33,6 @@
 import androidx.core.util.Pair;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.app.AppCompatActivity;
-import androidx.appcompat.widget.Toolbar;
 
 import android.util.Log;
 import android.view.MenuItem;
@@ -52,8 +50,6 @@
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
 
-import butterknife.BindView;
-import butterknife.ButterKnife;
 import cx.ring.BuildConfig;
 import cx.ring.R;
 import cx.ring.about.AboutFragment;
@@ -62,6 +58,7 @@
 import cx.ring.application.JamiApplication;
 import cx.ring.contactrequests.ContactRequestsFragment;
 import cx.ring.contacts.AvatarFactory;
+import cx.ring.databinding.ActivityHomeBinding;
 import cx.ring.fragments.ConversationFragment;
 import cx.ring.fragments.SmartListFragment;
 import cx.ring.interfaces.BackHandlerInterface;
@@ -119,22 +116,12 @@
     @Inject
     NotificationService mNotificationService;
 
-    @BindView(R.id.main_toolbar)
-    Toolbar mToolbar;
-
-    @BindView(R.id.spinner_toolbar)
-    Spinner mToolbarSpinner;
-
-    @BindView(R.id.navigation_view)
-    BottomNavigationView mBottomNavigationView;
-
-    @BindView(R.id.app_bar)
-    AppBarLayout mAppBarLayout;
-
     @Inject
     @Named("UiScheduler")
     protected Scheduler mUiScheduler;
 
+    private ActivityHomeBinding binding;
+
     private boolean mIsMigrationDialogAlreadyShowed;
     private String mAccountWithPendingrequests = null;
 
@@ -162,34 +149,32 @@
         mDisposable.add(mAccountCheckDisposable);
 
         JamiApplication.getInstance().startDaemon();
-        FragmentManager fragmentManager = getSupportFragmentManager();
 
-        setContentView(R.layout.activity_home);
-
-        ButterKnife.bind(this);
+        binding = ActivityHomeBinding.inflate(getLayoutInflater());
+        setContentView(binding.getRoot());
 
         // dependency injection
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
 
         mOrientation = getResources().getConfiguration().orientation;
 
-        setSupportActionBar(mToolbar);
+        setSupportActionBar(binding.mainToolbar);
 
         ActionBar ab = getSupportActionBar();
         if (ab != null) {
             ab.setTitle("");
         }
 
-        mBottomNavigationView.setOnNavigationItemSelectedListener(this);
-        mBottomNavigationView.getMenu().getItem(NAVIGATION_CONVERSATIONS).setChecked(true);
+        binding.navigationView.setOnNavigationItemSelectedListener(this);
+        binding.navigationView.getMenu().getItem(NAVIGATION_CONVERSATIONS).setChecked(true);
 
-        mOutlineProvider = mAppBarLayout.getOutlineProvider();
+        mOutlineProvider = binding.appBar.getOutlineProvider();
 
         if (!DeviceUtils.isTablet(this)) {
             getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.bottom_navigation));
         }
 
-        mToolbarSpinner.setOnItemSelectedListener(this);
+        binding.spinnerToolbar.setOnItemSelectedListener(this);
 
         // if app opened from notification display trust request fragment when mService will connected
         Intent intent = getIntent();
@@ -203,6 +188,7 @@
         } else if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) {
             handleShareIntent(intent);
         }
+        FragmentManager fragmentManager = getSupportFragmentManager();
         fContent = fragmentManager.findFragmentById(R.id.main_frame);
         if (fContent == null || Intent.ACTION_SEARCH.equals(action)) {
             fContent = new SmartListFragment();
@@ -221,6 +207,7 @@
     protected void onDestroy() {
         super.onDestroy();
         fContent = null;
+        mDisposable.dispose();
     }
 
     private void handleShareIntent(Intent intent) {
@@ -287,20 +274,20 @@
     }
 
     public void setToolbarState(String title, String subtitle) {
-        mToolbar.setLogo(null);
-        mToolbar.setTitle(title);
+        binding.mainToolbar.setLogo(null);
+        binding.mainToolbar.setTitle(title);
 
         if (subtitle != null) {
-            mToolbar.setSubtitle(subtitle);
+            binding.mainToolbar.setSubtitle(subtitle);
         } else {
-            mToolbar.setSubtitle(null);
+            binding.mainToolbar.setSubtitle(null);
         }
     }
 
     private void showProfileInfo() {
-        mToolbarSpinner.setVisibility(View.VISIBLE);
-        mToolbar.setTitle(null);
-        mToolbar.setSubtitle(null);
+        binding.spinnerToolbar.setVisibility(View.VISIBLE);
+        binding.mainToolbar.setTitle(null);
+        binding.mainToolbar.setSubtitle(null);
 
         int targetSize = (int) (AvatarFactory.SIZE_AB * getResources().getDisplayMetrics().density);
         mDisposable.add(mAccountService.getCurrentAccountSubject()
@@ -308,7 +295,7 @@
                         .map(avatar -> new Pair<>(account, avatar)))
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribe(d -> {
-                    mToolbar.setLogo(new BitmapDrawable(getResources(), d.second));
+                    binding.mainToolbar.setLogo(new BitmapDrawable(getResources(), d.second));
                 }, e -> Log.e(TAG, "Error loading avatar", e)));
     }
 
@@ -336,7 +323,7 @@
                 .observeOn(mUiScheduler)
                 .subscribe(accounts -> {
                     mAccountAdapter = new ToolbarSpinnerAdapter(HomeActivity.this, R.layout.item_toolbar_spinner, accounts);
-                    mToolbarSpinner.setAdapter(mAccountAdapter);
+                    binding.spinnerToolbar.setAdapter(mAccountAdapter);
                     showProfileInfo();
                 }, e ->  cx.ring.utils.Log.e(TAG, "Error loading account list !", e)));
 
@@ -389,7 +376,7 @@
         }
         fContent = new ContactRequestsFragment();
         fContent.setArguments(bundle);
-        mBottomNavigationView.getMenu().getItem(NAVIGATION_CONTACT_REQUESTS).setChecked(true);
+        binding.navigationView.getMenu().getItem(NAVIGATION_CONTACT_REQUESTS).setChecked(true);
         getSupportFragmentManager().beginTransaction()
                 .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                 .replace(R.id.main_frame, fContent, CONTACT_REQUESTS_TAG)
@@ -422,8 +409,8 @@
             fContent = fragmentManager.findFragmentById(entry.getId());
             fragmentManager.popBackStack();
             if (fCount == 2) {
-                mBottomNavigationView.getMenu().getItem(NAVIGATION_CONVERSATIONS).setChecked(true);
-                mBottomNavigationView.setVisibility(View.VISIBLE);
+                binding.navigationView.getMenu().getItem(NAVIGATION_CONVERSATIONS).setChecked(true);
+                binding.navigationView.setVisibility(View.VISIBLE);
                 showProfileInfo();
                 showToolbarSpinner();
                 if (!conversationSelected) {
@@ -583,7 +570,7 @@
 
             Account account = mAccountService.getCurrentAccount();
             if (account != null) {
-                mToolbarSpinner.setSelection(mAccountService.getAccountList().indexOf(account.getAccountID()));
+                binding.spinnerToolbar.setSelection(mAccountService.getAccountList().indexOf(account.getAccountID()));
             }
         }
     }
@@ -599,21 +586,21 @@
 
     public void setBadge(int menuId, int number) {
         if (number == 0) {
-            mBottomNavigationView.removeBadge(menuId);
+            binding.navigationView.removeBadge(menuId);
             return;
         }
 
-        mBottomNavigationView.getOrCreateBadge(menuId);
-        BadgeDrawable badgeDrawable = mBottomNavigationView.getBadge(menuId);
+        binding.navigationView.getOrCreateBadge(menuId);
+        BadgeDrawable badgeDrawable = binding.navigationView.getBadge(menuId);
         if (badgeDrawable != null) {
             badgeDrawable.setNumber(number);
         }
     }
 
     private void hideTabletToolbar() {
-        TextView title = mToolbar.findViewById(R.id.contact_title);
-        TextView subtitle = mToolbar.findViewById(R.id.contact_subtitle);
-        ImageView logo = mToolbar.findViewById(R.id.contact_image);
+        TextView title = binding.mainToolbar.findViewById(R.id.contact_title);
+        TextView subtitle = binding.mainToolbar.findViewById(R.id.contact_subtitle);
+        ImageView logo = binding.mainToolbar.findViewById(R.id.contact_image);
 
         if (title != null)
             title.setText(null);
@@ -625,17 +612,17 @@
 
     private void showTabletToolbar() {
         if (DeviceUtils.isTablet(this)) {
-            mToolbar.findViewById(R.id.tablet_toolbar).setVisibility(View.VISIBLE);
+            binding.mainToolbar.findViewById(R.id.tablet_toolbar).setVisibility(View.VISIBLE);
         }
     }
 
     private void showToolbarSpinner() {
-        mToolbarSpinner.setVisibility(View.VISIBLE);
+        binding.spinnerToolbar.setVisibility(View.VISIBLE);
     }
 
     private void hideToolbarSpinner() {
         if (!DeviceUtils.isTablet(HomeActivity.this)) {
-            mToolbarSpinner.setVisibility(View.GONE);
+            binding.spinnerToolbar.setVisibility(View.GONE);
         }
     }
 
@@ -656,20 +643,19 @@
     }
 
     public void setToolbarElevation(boolean enable) {
-        if (mAppBarLayout != null)
-            mAppBarLayout.setElevation(enable ? getResources().getDimension(R.dimen.toolbar_elevation) : 0);
+        binding.appBar.setElevation(enable ? getResources().getDimension(R.dimen.toolbar_elevation) : 0);
     }
 
     public void setToolbarOutlineState(boolean enabled) {
         if (!enabled) {
-            mAppBarLayout.setOutlineProvider(null);
+            binding.appBar.setOutlineProvider(null);
         } else {
-            mAppBarLayout.setOutlineProvider(mOutlineProvider);
+            binding.appBar.setOutlineProvider(mOutlineProvider);
         }
     }
 
     public void selectNavigationItem(int id) {
-        mBottomNavigationView.setSelectedItemId(id);
+        binding.navigationView.setSelectedItemId(id);
     }
 
 }
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 ec53cee..ac37da4 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
@@ -83,7 +83,7 @@
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         setContentView(R.layout.activity_ringtone);
         super.onCreate(savedInstanceState);
         mAccount = mAccountService.getAccount(getIntent().getExtras().getString(AccountEditionFragment.ACCOUNT_ID_KEY));
diff --git a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListFragment.java b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListFragment.java
index ed38dc1..b0956e1 100644
--- a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListFragment.java
@@ -23,20 +23,17 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.TextView;
 
 import java.util.Collection;
 
-import butterknife.BindView;
-import cx.ring.R;
 import cx.ring.account.AccountEditionFragment;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.application.JamiApplication;
+import cx.ring.databinding.FragBlacklistBinding;
 import cx.ring.model.CallContact;
 import cx.ring.mvp.BaseSupportFragment;
 
@@ -45,35 +42,27 @@
 
     public static final String TAG = BlackListFragment.class.getSimpleName();
 
-    @BindView(R.id.blacklist)
-    protected RecyclerView mBlacklist;
-
-    @BindView(R.id.emptyTextView)
-    protected TextView mEmptyTextView;
-
     private BlackListAdapter mAdapter;
-
-    @Override
-    public int getLayout() {
-        return R.layout.frag_blacklist;
-    }
-
-    @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
-    }
+    private FragBlacklistBinding binding;
 
     @Nullable
     @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragBlacklistBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         setHasOptionsMenu(true);
-        return super.onCreateView(inflater, container, savedInstanceState);
+        return binding.getRoot();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     @Override
     public void onResume() {
         super.onResume();
-
         if (getArguments() == null || getArguments().getString(AccountEditionFragment.ACCOUNT_ID_KEY) == null) {
             return;
         }
@@ -81,7 +70,7 @@
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
         menu.clear();
     }
 
@@ -97,26 +86,24 @@
 
     @Override
     public void updateView(final Collection<CallContact> list) {
-        getActivity().runOnUiThread(() -> {
-            mBlacklist.setVisibility(View.VISIBLE);
-            if (mBlacklist.getAdapter() != null) {
-                mAdapter.replaceAll(list);
-            } else {
-                mAdapter = new BlackListAdapter(list, BlackListFragment.this);
-                LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
-                mBlacklist.setLayoutManager(layoutManager);
-                mBlacklist.setAdapter(mAdapter);
-            }
-        });
+        binding.blacklist.setVisibility(View.VISIBLE);
+        if (binding.blacklist.getAdapter() != null) {
+            mAdapter.replaceAll(list);
+        } else {
+            mAdapter = new BlackListAdapter(list, BlackListFragment.this);
+            LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
+            binding.blacklist.setLayoutManager(layoutManager);
+            binding.blacklist.setAdapter(mAdapter);
+        }
     }
 
     @Override
     public void hideListView() {
-        getActivity().runOnUiThread(() -> mBlacklist.setVisibility(View.GONE));
+        binding.blacklist.setVisibility(View.GONE);
     }
 
     @Override
     public void displayEmptyListMessage(final boolean display) {
-        getActivity().runOnUiThread(() -> mEmptyTextView.setVisibility(display ? View.VISIBLE : View.GONE));
+        binding.emptyTextView.setVisibility(display ? View.VISIBLE : View.GONE);
     }
 }
\ No newline at end of file
diff --git a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListViewHolder.java b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListViewHolder.java
index 3e52d2a..dbbdcef 100644
--- a/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListViewHolder.java
+++ b/ring-android/app/src/main/java/cx/ring/contactrequests/BlackListViewHolder.java
@@ -21,36 +21,22 @@
 
 import androidx.recyclerview.widget.RecyclerView;
 import android.view.View;
-import android.widget.ImageButton;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import cx.ring.R;
 import cx.ring.contacts.AvatarFactory;
+import cx.ring.databinding.ItemContactBlacklistBinding;
 import cx.ring.model.CallContact;
 
 public class BlackListViewHolder extends RecyclerView.ViewHolder {
-    @BindView(R.id.unblock)
-    protected ImageButton mButtonUnblock;
+    private final ItemContactBlacklistBinding binding;
 
-    @BindView(R.id.photo)
-    protected ImageView mPhoto;
-
-    @BindView(R.id.display_name)
-    protected TextView mDisplayname;
-
-
-    public BlackListViewHolder(View view) {
+    BlackListViewHolder(View view) {
         super(view);
-        ButterKnife.bind(this, view);
+        binding = ItemContactBlacklistBinding.bind(view);
     }
 
-    public void bind(final BlackListListeners clickListener, final CallContact contact) {
-        AvatarFactory.loadGlideAvatar(mPhoto, contact);
-        mDisplayname.setText(contact.getRingUsername());
-        mButtonUnblock.setOnClickListener(view -> clickListener.onUnblockClicked(contact));
+    void bind(final BlackListListeners clickListener, final CallContact contact) {
+        AvatarFactory.loadGlideAvatar(binding.photo, contact);
+        binding.displayName.setText(contact.getRingUsername());
+        binding.unblock.setOnClickListener(view -> clickListener.onUnblockClicked(contact));
     }
 
     public interface BlackListListeners {
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 ba51dd5..85b71ba 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
@@ -24,6 +24,7 @@
 import android.os.Bundle;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import android.view.LayoutInflater;
@@ -31,17 +32,16 @@
 import android.view.MenuInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.TextView;
 
 import java.util.List;
 import java.util.Objects;
 
-import butterknife.BindView;
 import cx.ring.R;
 import cx.ring.adapters.SmartListAdapter;
+import cx.ring.application.JamiApplication;
 import cx.ring.client.ConversationActivity;
 import cx.ring.client.HomeActivity;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.databinding.FragPendingContactRequestsBinding;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.smartlist.SmartListViewModel;
 import cx.ring.utils.ConversationPath;
@@ -56,31 +56,23 @@
 
     private static final int SCROLL_DIRECTION_UP = -1;
 
-    @BindView(R.id.requests_list)
-    protected RecyclerView mRequestsList;
+    private SmartListAdapter mAdapter;
+    private FragPendingContactRequestsBinding binding;
 
-    @BindView(R.id.pane_ringID)
-    protected TextView mPaneTextView;
-
-    @BindView(R.id.emptyTextView)
-    protected TextView mEmptyTextView;
-
-    public SmartListAdapter mAdapter;
-
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_pending_contact_requests;
-    }
-
-    @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
-    }
-
-    @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragPendingContactRequestsBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         setHasOptionsMenu(true);
-        return super.onCreateView(inflater, parent, savedInstanceState);
+        return binding.getRoot();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        mAdapter = null;
+        binding = null;
     }
 
     public void presentForAccount(Bundle bundle) {
@@ -103,7 +95,7 @@
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
         menu.clear();
     }
 
@@ -114,26 +106,26 @@
 
     @Override
     public void updateView(final List<SmartListViewModel> list) {
-        if (mPaneTextView == null || mEmptyTextView == null) {
+        if (binding == null) {
             return;
         }
 
         if (!list.isEmpty()) {
-            mPaneTextView.setVisibility(/*viewModel.hasPane() ? View.VISIBLE :*/ View.GONE);
+            binding.paneRingID.setVisibility(/*viewModel.hasPane() ? View.VISIBLE :*/ View.GONE);
         }
 
-        mEmptyTextView.setVisibility(list.isEmpty() ? View.VISIBLE : View.GONE);
+        binding.emptyTextView.setVisibility(list.isEmpty() ? View.VISIBLE : View.GONE);
 
-        if (mRequestsList.getAdapter() != null) {
+        if (binding.requestsList.getAdapter() != null) {
             mAdapter.update(list);
         } else {
             mAdapter = new SmartListAdapter(list, ContactRequestsFragment.this);
-            mRequestsList.setAdapter(mAdapter);
+            binding.requestsList.setAdapter(mAdapter);
             LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
-            mRequestsList.setLayoutManager(mLayoutManager);
+            binding.requestsList.setLayoutManager(mLayoutManager);
         }
 
-        mRequestsList.addOnScrollListener(new RecyclerView.OnScrollListener() {
+        binding.requestsList.addOnScrollListener(new RecyclerView.OnScrollListener() {
             @Override
             public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                 super.onScrollStateChanged(recyclerView, newState);
@@ -141,7 +133,7 @@
 
             @Override
             public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
-                ((HomeActivity) getActivity()).setToolbarElevation(mRequestsList.canScrollVertically(SCROLL_DIRECTION_UP));
+                ((HomeActivity) getActivity()).setToolbarElevation(recyclerView.canScrollVertically(SCROLL_DIRECTION_UP));
             }
         });
 
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 e3f7eab..a6da464 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
@@ -67,7 +67,7 @@
     @Singleton
     PreferencesService provideSettingsService() {
         SharedPreferencesServiceImpl settingsService = new SharedPreferencesServiceImpl();
-        mJamiApplication.getRingInjectionComponent().inject(settingsService);
+        mJamiApplication.getInjectionComponent().inject(settingsService);
         return settingsService;
     }
 
@@ -75,7 +75,7 @@
     @Singleton
     HistoryService provideHistoryService() {
         HistoryServiceImpl historyService = new HistoryServiceImpl();
-        mJamiApplication.getRingInjectionComponent().inject(historyService);
+        mJamiApplication.getInjectionComponent().inject(historyService);
         return historyService;
     }
 
@@ -91,7 +91,7 @@
     @Singleton
     NotificationService provideNotificationService() {
         NotificationServiceImpl service = new NotificationServiceImpl();
-        mJamiApplication.getRingInjectionComponent().inject(service);
+        mJamiApplication.getInjectionComponent().inject(service);
         service.initHelper();
         return service;
     }
@@ -100,7 +100,7 @@
     @Singleton
     DeviceRuntimeService provideDeviceRuntimeService(LogService logService) {
         DeviceRuntimeServiceImpl runtimeService = new DeviceRuntimeServiceImpl();
-        mJamiApplication.getRingInjectionComponent().inject(runtimeService);
+        mJamiApplication.getInjectionComponent().inject(runtimeService);
         runtimeService.loadNativeLibrary();
         return runtimeService;
     }
@@ -109,7 +109,7 @@
     @Singleton
     DaemonService provideDaemonService(DeviceRuntimeService deviceRuntimeService) {
         DaemonService daemonService = new DaemonService(deviceRuntimeService);
-        mJamiApplication.getRingInjectionComponent().inject(daemonService);
+        mJamiApplication.getInjectionComponent().inject(daemonService);
         return daemonService;
     }
 
@@ -117,7 +117,7 @@
     @Singleton
     CallService provideCallService() {
         CallService callService = new CallService();
-        mJamiApplication.getRingInjectionComponent().inject(callService);
+        mJamiApplication.getInjectionComponent().inject(callService);
         return callService;
     }
 
@@ -125,7 +125,7 @@
     @Singleton
     AccountService provideAccountService() {
         AccountService accountService = new AccountService();
-        mJamiApplication.getRingInjectionComponent().inject(accountService);
+        mJamiApplication.getInjectionComponent().inject(accountService);
         return accountService;
     }
 
@@ -133,7 +133,7 @@
     @Singleton
     HardwareService provideHardwareService(Context context) {
         HardwareServiceImpl hardwareService = new HardwareServiceImpl(context);
-        mJamiApplication.getRingInjectionComponent().inject(hardwareService);
+        mJamiApplication.getInjectionComponent().inject(hardwareService);
         return hardwareService;
     }
 
@@ -141,7 +141,7 @@
     @Singleton
     ContactService provideContactService(PreferencesService sharedPreferencesService) {
         ContactServiceImpl contactService = new ContactServiceImpl();
-        mJamiApplication.getRingInjectionComponent().inject(contactService);
+        mJamiApplication.getInjectionComponent().inject(contactService);
         return contactService;
     }
 
@@ -154,7 +154,7 @@
             AccountService accountService,
             NotificationService notificationService) {
         ConversationFacade conversationFacade = new ConversationFacade(historyService, callService, accountService, contactService, notificationService);
-        mJamiApplication.getRingInjectionComponent().inject(conversationFacade);
+        mJamiApplication.getInjectionComponent().inject(conversationFacade);
         return conversationFacade;
     }
 
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 c6a11cd..1eea06b 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
@@ -25,15 +25,13 @@
 import android.content.pm.ActivityInfo;
 import android.os.Bundle;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
 import android.text.TextUtils;
-import android.util.Log;
-import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
 import android.widget.TextView;
 
 import java.util.HashMap;
@@ -44,13 +42,9 @@
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnClick;
-import butterknife.OnEditorAction;
-import butterknife.OnFocusChange;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
+import cx.ring.databinding.FragAccountMigrationBinding;
 import cx.ring.model.Account;
 import cx.ring.model.AccountConfig;
 import cx.ring.model.ConfigKey;
@@ -63,9 +57,9 @@
     static final String TAG = AccountMigrationFragment.class.getSimpleName();
     @Inject
     AccountService mAccountService;
-    // UI references.
-    @BindView(R.id.ring_password)
-    EditText mRingPassword;
+
+    private FragAccountMigrationBinding binding;
+
     private String mAccountId;
     private ProgressDialog mProgress = null;
 
@@ -80,33 +74,22 @@
     }
 
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
-        final View inflatedView = inflater.inflate(R.layout.frag_account_migration, parent, false);
-        ButterKnife.bind(this, inflatedView);
-
-        // dependency injection
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
-
-        return inflatedView;
+    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
+        binding = FragAccountMigrationBinding.inflate(inflater, parent, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
-    @OnEditorAction(R.id.ring_password)
-    public boolean onPasswordEditorAction(TextView v, int actionId, KeyEvent event) {
-        Log.d(TAG, "onPasswordEditorAction: " + actionId + " " + (event == null ? null : event.toString()));
-        return actionId == EditorInfo.IME_ACTION_NEXT && checkPassword(v, null);
-    }
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        binding.ringPassword.setOnEditorActionListener((v, actionId, event) -> actionId == EditorInfo.IME_ACTION_NEXT && checkPassword(v, null));
+        binding.ringPassword.setOnFocusChangeListener((v, hasFocus) -> {
+            if (!hasFocus) {
+                checkPassword((TextView) v, null);
+            }
+        });
 
-    @OnFocusChange(R.id.ring_password)
-    public void onPasswordFocusChange(View v, boolean hasFocus) {
-        if (!hasFocus) {
-            checkPassword((TextView) v, null);
-        }
-    }
-
-    @OnClick(R.id.ring_migrate_btn)
-    @SuppressWarnings("unused")
-    void onMigrateButtonClick(View view) {
-        initAccountMigration(mRingPassword.getText().toString());
+        binding.ringMigrateBtn.setOnClickListener(v -> initAccountMigration(binding.ringPassword.getText().toString()));
     }
 
     @Override
@@ -117,12 +100,6 @@
         }
     }
 
-    @Override
-    public void onPause() {
-        super.onPause();
-    }
-
-    @SuppressWarnings("unchecked")
     private void initAccountMigration(String password) {
         if (migratingAccount) {
             return;
@@ -131,7 +108,9 @@
         migratingAccount = true;
 
         //orientation is locked during the migration of account to avoid the destruction of the thread
-        getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
+        Activity activity = getActivity();
+        if (activity != null)
+            getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
 
         mProgress = new ProgressDialog(getActivity());
         mProgress.setTitle(R.string.dialog_wait_update);
@@ -196,24 +175,24 @@
             //do things
         });
         boolean success = false;
-        switch (newState) {
-            case AccountConfig.STATE_INVALID:
-                dialogBuilder.setTitle(R.string.account_cannot_be_found_title)
-                        .setMessage(R.string.account_cannot_be_updated_message);
-                break;
-            default:
-                dialogBuilder.setTitle(R.string.account_device_updated_title)
-                        .setMessage(R.string.account_device_updated_message);
-                success = true;
-                break;
+        if (AccountConfig.STATE_INVALID.equals(newState)) {
+            dialogBuilder.setTitle(R.string.account_cannot_be_found_title)
+                    .setMessage(R.string.account_cannot_be_updated_message);
+        } else {
+            dialogBuilder.setTitle(R.string.account_device_updated_title)
+                    .setMessage(R.string.account_device_updated_message);
+            success = true;
         }
         AlertDialog dialogSuccess = dialogBuilder.show();
         if (success) {
             dialogSuccess.setOnDismissListener(dialogInterface -> {
-                getActivity().setResult(Activity.RESULT_OK, new Intent());
-                //unlock the screen orientation
-                getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
-                getActivity().finish();
+                Activity activity = getActivity();
+                if (activity != null) {
+                    activity.setResult(Activity.RESULT_OK, new Intent());
+                    //unlock the screen orientation
+                    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
+                    activity.finish();
+                }
             });
         }
     }
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/AdvancedAccountFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/AdvancedAccountFragment.java
index b87dc65..ea9b89c 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/AdvancedAccountFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/AdvancedAccountFragment.java
@@ -47,7 +47,7 @@
 
     @Override
     public void onCreatePreferences(Bundle bundle, String s) {
-        ((JamiApplication) requireActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) requireActivity().getApplication()).getInjectionComponent().inject(this);
         super.onCreatePreferences(bundle, s);
 
         // Load the preferences from an XML resource
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 e35cf8c..02008e0 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
@@ -263,16 +263,6 @@
     }
 
     @Override
-    public int getLayout() {
-        return R.layout.frag_call;
-    }
-
-    @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
-    }
-
-    @Override
     public void onStart() {
         super.onStart();
         if (restartVideo && restartPreview) {
@@ -299,7 +289,7 @@
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
-        injectFragment(((JamiApplication) requireActivity().getApplication()).getRingInjectionComponent());
+        ((JamiApplication) requireActivity().getApplication()).getInjectionComponent().inject(this);
         binding = DataBindingUtil.inflate(inflater, R.layout.frag_call, container, false);
         binding.setPresenter(this);
         return binding.getRoot();
@@ -541,8 +531,14 @@
         if (mScreenWakeLock != null && mScreenWakeLock.isHeld()) {
             mScreenWakeLock.release();
         }
+        binding = null;
     }
 
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        mCompositeDisposable.dispose();
+    }
 
     @Override
     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
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 3c86847..b6bf0e0 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
@@ -75,7 +75,6 @@
 import java.util.List;
 import java.util.Map;
 
-import butterknife.OnEditorAction;
 import cx.ring.BuildConfig;
 import cx.ring.R;
 import cx.ring.adapters.ConversationAdapter;
@@ -89,7 +88,6 @@
 import cx.ring.conversation.ConversationPresenter;
 import cx.ring.conversation.ConversationView;
 import cx.ring.databinding.FragConversationBinding;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
 import cx.ring.interfaces.Colorable;
 import cx.ring.model.Account;
 import cx.ring.model.CallContact;
@@ -197,16 +195,6 @@
         }
     }
 
-    @Override
-    public int getLayout() {
-        return R.layout.frag_conversation;
-    }
-
-    @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
-    }
-
     private static void setBottomPadding(@NonNull View view, int padding) {
         view.setPadding(
                 view.getPaddingLeft(),
@@ -227,7 +215,7 @@
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
-        injectFragment(((JamiApplication) getActivity().getApplication()).getRingInjectionComponent());
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         Resources res = getResources();
         marginPx = res.getDimensionPixelSize(R.dimen.conversation_message_input_margin);
         mapWidth = res.getDimensionPixelSize(R.dimen.location_sharing_minmap_width);
@@ -340,6 +328,8 @@
         if (animator != null)
             animator.setSupportsChangeAnimations(false);
         binding.histList.setAdapter(mAdapter);
+
+
     }
 
     @Override
@@ -741,7 +731,6 @@
         }
     }
 
-    @OnEditorAction(R.id.msg_input_txt)
     boolean actionSendMsgText(int actionId) {
         switch (actionId) {
             case EditorInfo.IME_ACTION_SEND:
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountFragment.java
index 945885a..b037f35 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/GeneralAccountFragment.java
@@ -143,7 +143,7 @@
 
     @Override
     public void onCreatePreferences(Bundle bundle, String rootKey) {
-        ((JamiApplication) requireActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) requireActivity().getApplication()).getInjectionComponent().inject(this);
         super.onCreatePreferences(bundle, rootKey);
 
         Bundle args = getArguments();
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 b34d0bb..958d229 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
@@ -157,7 +157,7 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        ((JamiApplication) requireActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) requireActivity().getApplication()).getInjectionComponent().inject(this);
         setRetainInstance(true);
 
         Bundle args = getArguments();
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferenceFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferenceFragment.java
index f333745..a9ff785 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferenceFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/MediaPreferenceFragment.java
@@ -74,7 +74,7 @@
 
     @Override
     public void onCreatePreferences(Bundle bundle, String rootKey) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         super.onCreatePreferences(bundle, rootKey);
 
         String accountId = getArguments().getString(AccountEditionFragment.ACCOUNT_ID_KEY);
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/SIPAccountCreationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/SIPAccountCreationFragment.java
index 1b3e61a..119e609 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/SIPAccountCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/SIPAccountCreationFragment.java
@@ -25,68 +25,54 @@
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 
-import android.view.KeyEvent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 import android.view.inputmethod.EditorInfo;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 
-import butterknife.BindView;
-import butterknife.OnClick;
-import butterknife.OnEditorAction;
 import cx.ring.R;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.application.JamiApplication;
+import cx.ring.databinding.FragAccSipCreateBinding;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.mvp.SIPCreationView;
 import cx.ring.wizard.SIPCreationPresenter;
 
 public class SIPAccountCreationFragment extends BaseSupportFragment<SIPCreationPresenter> implements SIPCreationView {
-
     public static final String TAG = SIPAccountCreationFragment.class.getSimpleName();
 
-    @BindView(R.id.alias)
-    protected EditText mAliasView;
-
-    @BindView(R.id.hostname)
-    protected EditText mHostnameView;
-
-    @BindView(R.id.username)
-    protected EditText mUsernameView;
-
-    @BindView(R.id.password)
-    protected EditText mPasswordView;
-
-    @BindView(R.id.create_sip_button)
-    protected Button mCreateSIPAccountButton;
-
     private ProgressDialog mProgress = null;
+    private FragAccSipCreateBinding binding = null;
 
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_acc_sip_create;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragAccSipCreateBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
-    @OnEditorAction(R.id.password)
-    public boolean keyPressedOnPasswordField(TextView v, int actionId, KeyEvent event) {
-        if (actionId == EditorInfo.IME_ACTION_DONE) {
-            mCreateSIPAccountButton.callOnClick();
-        }
-        return false;
-    }
-
-    /************************
-     * SIP Account ADD
-     ***********************/
-    @OnClick(R.id.create_sip_button)
-    public void createSIPAccount() {
-        createSIPAccount(false);
+    @Override
+    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        binding.password.setOnEditorActionListener((v, actionId, event) -> {
+            if (actionId == EditorInfo.IME_ACTION_DONE) {
+                binding.createSipButton.callOnClick();
+            }
+            return false;
+        });
+        binding.createSipButton.setOnClickListener(v -> createSIPAccount(false));
     }
 
     /**
@@ -98,17 +84,17 @@
         //orientation is locked during the create of account to avoid the destruction of the thread
         getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
 
-        String alias = mAliasView.getText().toString();
-        String hostname = mHostnameView.getText().toString();
-        String username = mUsernameView.getText().toString();
-        String password = mPasswordView.getText().toString();
+        String alias = binding.alias.getText().toString();
+        String hostname = binding.hostname.getText().toString();
+        String username = binding.username.getText().toString();
+        String password = binding.password.getText().toString();
         presenter.startCreation(alias, hostname, username, password, bypassWarnings);
     }
 
     @Override
     public void showUsernameError() {
-        mUsernameView.setError(getString(R.string.error_field_required));
-        mUsernameView.requestFocus();
+        binding.username.setError(getString(R.string.error_field_required));
+        binding.username.requestFocus();
     }
 
     @Override
@@ -123,20 +109,20 @@
 
     @Override
     public void resetErrors() {
-        mAliasView.setError(null);
-        mPasswordView.setError(null);
+        binding.alias.setError(null);
+        binding.password.setError(null);
     }
 
     @Override
     public void showAliasError() {
-        mAliasView.setError(getString(R.string.error_field_required));
-        mAliasView.requestFocus();
+        binding.alias.setError(getString(R.string.error_field_required));
+        binding.alias.requestFocus();
     }
 
     @Override
     public void showPasswordError() {
-        mPasswordView.setError(getString(R.string.error_field_required));
-        mPasswordView.requestFocus();
+        binding.password.setError(getString(R.string.error_field_required));
+        binding.password.requestFocus();
     }
 
     @Override
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/SecurityAccountFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/SecurityAccountFragment.java
index ab6cdd5..ee1c375 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/SecurityAccountFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/SecurityAccountFragment.java
@@ -100,7 +100,7 @@
     @Override
     public void onCreatePreferences(Bundle bundle, String s) {
         // dependency injection
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         super.onCreatePreferences(bundle, s);
 
         addPreferencesFromResource(R.xml.account_security_prefs);
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 77047de..863783b 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
@@ -32,7 +32,6 @@
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.appcompat.widget.Toolbar;
 
-import android.text.TextUtils;
 import android.util.Log;
 import android.view.InflateException;
 import android.view.LayoutInflater;
@@ -83,7 +82,7 @@
      * fragment (e.g. upon screen orientation changes).
      */
     public ShareWithFragment() {
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
     }
 
     public static ShareWithFragment newInstance() {
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 3cdb1da..61418c0 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
@@ -35,7 +35,6 @@
 import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
 import com.google.android.material.snackbar.Snackbar;
 
-import androidx.coordinatorlayout.widget.CoordinatorLayout;
 import androidx.recyclerview.widget.DefaultItemAnimator;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
@@ -45,6 +44,7 @@
 import android.os.Handler;
 import android.text.InputType;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -53,7 +53,6 @@
 import android.view.inputmethod.EditorInfo;
 import android.widget.EditText;
 import android.widget.ImageView;
-import android.widget.ProgressBar;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
@@ -61,16 +60,15 @@
 
 import javax.inject.Inject;
 
-import butterknife.BindView;
-import butterknife.OnClick;
 import cx.ring.R;
 import cx.ring.adapters.SmartListAdapter;
+import cx.ring.application.JamiApplication;
 import cx.ring.client.CallActivity;
 import cx.ring.client.ConversationActivity;
 import cx.ring.client.HomeActivity;
 import cx.ring.client.QRCodeActivity;
 import cx.ring.contacts.AvatarFactory;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.databinding.FragSmartlistBinding;
 import cx.ring.model.CallContact;
 import cx.ring.model.Conversation;
 import cx.ring.mvp.BaseSupportFragment;
@@ -96,24 +94,6 @@
 
     private static final int SCROLL_DIRECTION_UP = -1;
 
-    @BindView(R.id.list_coordinator)
-    protected CoordinatorLayout mCoordinator;
-
-    @BindView(R.id.newconv_fab)
-    protected ExtendedFloatingActionButton mFloatingActionButton;
-
-    @BindView(R.id.confs_list)
-    protected RecyclerView mRecyclerView;
-
-    @BindView(R.id.loading_indicator)
-    protected ProgressBar mLoader;
-
-    @BindView(R.id.empty_text_view)
-    protected TextView mEmptyTextView;
-
-    @BindView(R.id.newcontact_element)
-    protected ViewGroup mNewContact;
-
     @Inject
     AccountService mAccountService;
 
@@ -122,6 +102,7 @@
     private SearchView mSearchView = null;
     private MenuItem mSearchMenuItem = null;
     private MenuItem mDialpadMenuItem = null;
+    private FragSmartlistBinding binding;
 
     @Override
     public void onResume() {
@@ -140,7 +121,7 @@
             @Override
             public boolean onMenuItemActionCollapse(MenuItem item) {
                 mDialpadMenuItem.setVisible(false);
-                mFloatingActionButton.show();
+                binding.newconvFab.show();
                 setOverflowMenuVisible(menu, true);
                 changeSeparatorHeight(false);
                 return true;
@@ -149,7 +130,7 @@
             @Override
             public boolean onMenuItemActionExpand(MenuItem item) {
                 mDialpadMenuItem.setVisible(true);
-                mFloatingActionButton.hide();
+                binding.newconvFab.hide();
                 setOverflowMenuVisible(menu, false);
                 changeSeparatorHeight(true);
                 return true;
@@ -238,11 +219,10 @@
 
     @Override
     public void onSaveInstanceState(@NonNull Bundle outState) {
-        if (null != mLoader) {
-            // if there's another fragment on top of this one, when a rotation is done, this fragment is destroyed and
-            // in the process of recreating it, as it is not shown on the top of the screen, the "onCreateView" method is never called, so the mLoader is null
-            outState.putBoolean(STATE_LOADING, mLoader.isShown());
-        }
+        // if there's another fragment on top of this one, when a rotation is done, this fragment is destroyed and
+        // in the process of recreating it, as it is not shown on the top of the screen, the "onCreateView" method is never called, so the mLoader is null
+        if (binding != null)
+            outState.putBoolean(STATE_LOADING, binding.loadingIndicator.isShown());
         super.onSaveInstanceState(outState);
     }
 
@@ -252,14 +232,18 @@
         return true;
     }
 
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_smartlist;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragSmartlistBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     @Override
@@ -267,9 +251,9 @@
         setHasOptionsMenu(true);
         super.onViewCreated(view, savedInstanceState);
 
-        mNewContact.setVisibility(View.GONE);
+        binding.newcontactElement.setVisibility(View.GONE);
 
-        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+        binding.confsList.addOnScrollListener(new RecyclerView.OnScrollListener() {
             @Override
             public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                 super.onScrollStateChanged(recyclerView, newState);
@@ -278,14 +262,12 @@
             @Override
             public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                 boolean canScrollUp = recyclerView.canScrollVertically(SCROLL_DIRECTION_UP);
-                ExtendedFloatingActionButton btn = mFloatingActionButton;
-                if (btn != null) {
-                    boolean isExtended = btn.isExtended();
-                    if (dy > 0 && isExtended) {
-                        btn.shrink();
-                    } else if ((dy < 0 || !canScrollUp) && !isExtended) {
-                        btn.extend();
-                    }
+                ExtendedFloatingActionButton btn = binding.newconvFab;
+                boolean isExtended = btn.isExtended();
+                if (dy > 0 && isExtended) {
+                    btn.shrink();
+                } else if ((dy < 0 || !canScrollUp) && !isExtended) {
+                    btn.extend();
                 }
 
                 HomeActivity activity = (HomeActivity) getActivity();
@@ -294,33 +276,19 @@
             }
         });
 
-        DefaultItemAnimator animator = (DefaultItemAnimator) mRecyclerView.getItemAnimator();
+        DefaultItemAnimator animator = (DefaultItemAnimator) binding.confsList.getItemAnimator();
         if (animator != null) {
             animator.setSupportsChangeAnimations(false);
         }
-    }
 
-    @OnClick(R.id.newcontact_element)
-    void newContactClicked() {
-        presenter.newContactClicked();
-    }
-
-    @OnClick(R.id.quick_call)
-    void quickCallClicked() {
-        presenter.quickCallClicked();
-    }
-
-    @OnClick(R.id.newconv_fab)
-    void fabButtonClicked() {
-        presenter.fabButtonClicked();
+        binding.newcontactElement.setOnClickListener(v -> presenter.newContactClicked());
+        //binding.quickCall.setOnClickListener(v -> presenter.quickCallClicked());
+        binding.newconvFab.setOnClickListener(v -> presenter.fabButtonClicked());
     }
 
     @Override
     public void setLoading(final boolean loading) {
-        if (mLoader == null) {
-            return;
-        }
-        mLoader.setVisibility(loading ? View.VISIBLE : View.GONE);
+        binding.loadingIndicator.setVisibility(loading ? View.VISIBLE : View.GONE);
     }
 
     /**
@@ -355,11 +323,9 @@
 
     @Override
     public void clipBoardDidCopyNumber(String copiedNumber) {
-        if (mCoordinator != null) {
-            String snackbarText = getString(R.string.conversation_action_copied_peer_number_clipboard,
-                    ActionHelper.getShortenedNumber(copiedNumber));
-            Snackbar.make(mCoordinator, snackbarText, Snackbar.LENGTH_LONG).show();
-        }
+        String snackbarText = getString(R.string.conversation_action_copied_peer_number_clipboard,
+                ActionHelper.getShortenedNumber(copiedNumber));
+        Snackbar.make(binding.listCoordinator, snackbarText, Snackbar.LENGTH_LONG).show();
     }
 
     public void onFabButtonClicked() {
@@ -368,17 +334,13 @@
 
     @Override
     public void displayContact(final CallContact contact) {
-        if (mNewContact == null) {
-            return;
-        }
-
-        TextView display_name = mNewContact.findViewById(R.id.display_name);
+        TextView display_name = binding.newcontactElement.findViewById(R.id.display_name);
         display_name.setText(contact.getRingUsername());
 
-        ImageView photo = mNewContact.findViewById(R.id.photo);
+        ImageView photo = binding.newcontactElement.findViewById(R.id.photo);
 
         AvatarFactory.loadGlideAvatar(photo, contact);
-        mNewContact.setVisibility(View.VISIBLE);
+        binding.newcontactElement.setVisibility(View.VISIBLE);
     }
 
     @Override
@@ -399,8 +361,8 @@
     @Override
     public void displayNoConversationMessage() {
         String emptyText = getResources().getQuantityString(R.plurals.home_conferences_title, 0, 0);
-        mEmptyTextView.setText(emptyText);
-        mEmptyTextView.setVisibility(View.VISIBLE);
+        binding.emptyTextView.setText(emptyText);
+        binding.emptyTextView.setVisibility(View.VISIBLE);
     }
 
     @Override
@@ -449,38 +411,35 @@
 
     @Override
     public void hideSearchRow() {
-        if (mNewContact == null) {
-            return;
-        }
-        mNewContact.setVisibility(View.GONE);
+        binding.newcontactElement.setVisibility(View.GONE);
     }
 
 
     @Override
     public void hideList() {
-        mRecyclerView.setVisibility(View.GONE);
+        binding.confsList.setVisibility(View.GONE);
     }
 
     @Override
     public void hideNoConversationMessage() {
-        mEmptyTextView.setVisibility(View.GONE);
+        binding.emptyTextView.setVisibility(View.GONE);
     }
 
     @Override
     public void updateList(@Nullable final List<SmartListViewModel> smartListViewModels) {
-        if (mRecyclerView == null)
+        if (binding == null)
             return;
-        if (mRecyclerView.getAdapter() == null) {
+        if (binding.confsList.getAdapter() == null) {
             mSmartListAdapter = new SmartListAdapter(smartListViewModels, SmartListFragment.this);
-            mRecyclerView.setAdapter(mSmartListAdapter);
-            mRecyclerView.setHasFixedSize(true);
+            binding.confsList.setAdapter(mSmartListAdapter);
+            binding.confsList.setHasFixedSize(true);
             LinearLayoutManager llm = new LinearLayoutManager(getActivity());
             llm.setOrientation(RecyclerView.VERTICAL);
-            mRecyclerView.setLayoutManager(llm);
+            binding.confsList.setLayoutManager(llm);
         } else {
             mSmartListAdapter.update(smartListViewModels);
         }
-        mRecyclerView.setVisibility(View.VISIBLE);
+        binding.confsList.setVisibility(View.VISIBLE);
 
         View view = getView();
         if (view != null) {
@@ -553,8 +512,8 @@
 
     @Override
     public void scrollToTop() {
-        if (mRecyclerView != null)
-            mRecyclerView.scrollToPosition(0);
+        if (binding != null)
+            binding.confsList.scrollToPosition(0);
     }
 
     @Override
@@ -569,27 +528,25 @@
 
     private void changeSeparatorHeight(boolean open) {
         if (DeviceUtils.isTablet(getActivity())) {
-            int margin;
+            int margin = 0;
 
-            View separator = getView().findViewById(R.id.separator);
-            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) separator.getLayoutParams();
+            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) binding.separator.getLayoutParams();
             if (open) {
                 Toolbar toolbar = getActivity().findViewById(R.id.main_toolbar);
-                margin = toolbar.getHeight();
-            } else {
-                margin = 0;
+                if (toolbar != null)
+                    margin = toolbar.getHeight();
             }
 
             params.topMargin = margin;
-            separator.setLayoutParams(params);
+            binding.separator.setLayoutParams(params);
         }
     }
 
     private void selectFirstItem() {
         if (mSmartListAdapter != null && mSmartListAdapter.getItemCount() > 0) {
             new Handler().postDelayed(() -> {
-                if (mRecyclerView != null) {
-                    RecyclerView.ViewHolder holder = mRecyclerView.findViewHolderForAdapterPosition(0);
+                if (binding != null) {
+                    RecyclerView.ViewHolder holder = binding.confsList.findViewHolderForAdapterPosition(0);
                     if (holder != null)
                         holder.itemView.performClick();
                 }
diff --git a/ring-android/app/src/main/java/cx/ring/history/DatabaseHelper.java b/ring-android/app/src/main/java/cx/ring/history/DatabaseHelper.java
index 555ac63..9b950ae 100644
--- a/ring-android/app/src/main/java/cx/ring/history/DatabaseHelper.java
+++ b/ring-android/app/src/main/java/cx/ring/history/DatabaseHelper.java
@@ -65,7 +65,7 @@
     public DatabaseHelper(Context context, String dbDirectory) {
         super(context, dbDirectory, null, DATABASE_VERSION);
         Log.d(TAG, "Helper initialized for " + dbDirectory);
-        ((JamiApplication) context.getApplicationContext()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) context.getApplicationContext()).getInjectionComponent().inject(this);
     }
 
     /**
diff --git a/ring-android/app/src/main/java/cx/ring/launch/LaunchActivity.java b/ring-android/app/src/main/java/cx/ring/launch/LaunchActivity.java
index c70976d..e94d914 100644
--- a/ring-android/app/src/main/java/cx/ring/launch/LaunchActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/launch/LaunchActivity.java
@@ -40,7 +40,7 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         // dependency injection
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         super.onCreate(savedInstanceState);
         JamiApplication.getInstance().startDaemon();
 
diff --git a/ring-android/app/src/main/java/cx/ring/mvp/BaseFragment.java b/ring-android/app/src/main/java/cx/ring/mvp/BaseFragment.java
index de3634d..b4cbf93 100644
--- a/ring-android/app/src/main/java/cx/ring/mvp/BaseFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/mvp/BaseFragment.java
@@ -22,20 +22,12 @@
 import android.app.Fragment;
 import android.os.Bundle;
 
-import androidx.annotation.LayoutRes;
-import androidx.annotation.Nullable;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.Toast;
 
 import javax.inject.Inject;
 
-import butterknife.ButterKnife;
-import butterknife.Unbinder;
 import cx.ring.R;
-import cx.ring.application.JamiApplication;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
 import cx.ring.model.Error;
 
 public abstract class BaseFragment<T extends RootPresenter> extends Fragment implements BaseView {
@@ -45,24 +37,6 @@
     @Inject
     protected T presenter;
 
-    private Unbinder mUnbinder;
-
-    @LayoutRes
-    public abstract int getLayout();
-
-    public abstract void injectFragment(JamiInjectionComponent component);
-
-    @Nullable
-    @Override
-    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
-        final View inflatedView = inflater.inflate(getLayout(), container, false);
-        // dependency injection
-        injectFragment(((JamiApplication) getActivity().getApplication()).getRingInjectionComponent());
-        //Butterknife
-        mUnbinder = ButterKnife.bind(this, inflatedView);
-        return inflatedView;
-    }
-
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
@@ -76,11 +50,6 @@
     public void onDestroyView() {
         super.onDestroyView();
         presenter.unbindView();
-        // Butterknife unbinding
-        if (mUnbinder != null) {
-            mUnbinder.unbind();
-            mUnbinder = null;
-        }
     }
 
     public void displayErrorToast(Error error) {
diff --git a/ring-android/app/src/main/java/cx/ring/mvp/BaseSupportFragment.java b/ring-android/app/src/main/java/cx/ring/mvp/BaseSupportFragment.java
index 928c668..9e78028 100644
--- a/ring-android/app/src/main/java/cx/ring/mvp/BaseSupportFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/mvp/BaseSupportFragment.java
@@ -20,24 +20,16 @@
 package cx.ring.mvp;
 
 import android.os.Bundle;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
 import android.widget.Toast;
 
 import javax.inject.Inject;
 
 import androidx.annotation.IdRes;
-import androidx.annotation.LayoutRes;
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
-import butterknife.ButterKnife;
-import butterknife.Unbinder;
 import cx.ring.R;
 import cx.ring.account.JamiAccountCreationFragment;
-import cx.ring.application.JamiApplication;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
 import cx.ring.model.Error;
 
 public abstract class BaseSupportFragment<T extends RootPresenter> extends Fragment implements BaseView {
@@ -47,28 +39,8 @@
     @Inject
     protected T presenter;
 
-    private Unbinder mUnbinder;
-
-    @LayoutRes
-    public abstract int getLayout();
-
-    public abstract void injectFragment(JamiInjectionComponent component);
-
-    @Nullable
-    @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
-        final View inflatedView = inflater.inflate(getLayout(), container, false);
-        // dependency injection
-        injectFragment(((JamiApplication) getActivity().getApplication()).getRingInjectionComponent());
-        //Butterknife
-        mUnbinder = ButterKnife.bind(this, inflatedView);
-        return inflatedView;
-    }
-
     @Override
     public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-
         //Be sure to do the injection in onCreateView method
         if (presenter != null) {
             presenter.bindView(this);
@@ -81,10 +53,6 @@
         super.onDestroyView();
         if (presenter != null)
             presenter.unbindView();
-        // Butterknife unbinding
-        if (mUnbinder != null) {
-            mUnbinder.unbind();
-        }
     }
 
     public void displayErrorToast(Error error) {
diff --git a/ring-android/app/src/main/java/cx/ring/service/BootReceiver.java b/ring-android/app/src/main/java/cx/ring/service/BootReceiver.java
index 08ba0bf..6e0207a 100644
--- a/ring-android/app/src/main/java/cx/ring/service/BootReceiver.java
+++ b/ring-android/app/src/main/java/cx/ring/service/BootReceiver.java
@@ -42,7 +42,7 @@
         final String action = intent.getAction();
         if (Intent.ACTION_BOOT_COMPLETED.equals(action) || Intent.ACTION_REBOOT.equals(action)) {
             try {
-                ((JamiApplication) context.getApplicationContext()).getRingInjectionComponent().inject(this);
+                ((JamiApplication) context.getApplicationContext()).getInjectionComponent().inject(this);
                 boolean isAllowRingOnStartup = mPreferencesService.getSettings().isAllowRingOnStartup();
 
                 if (isAllowRingOnStartup) {
diff --git a/ring-android/app/src/main/java/cx/ring/service/CallNotificationService.java b/ring-android/app/src/main/java/cx/ring/service/CallNotificationService.java
index e4e1b2e..bfdb470 100644
--- a/ring-android/app/src/main/java/cx/ring/service/CallNotificationService.java
+++ b/ring-android/app/src/main/java/cx/ring/service/CallNotificationService.java
@@ -65,7 +65,7 @@
 
     @Override
     public void onCreate() {
-        ((JamiApplication) getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getApplication()).getInjectionComponent().inject(this);
         notificationManager = NotificationManagerCompat.from(this);
         super.onCreate();
     }
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 3d71e8b..281d276 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
@@ -49,13 +49,10 @@
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ScheduledExecutorService;
 
 import javax.inject.Inject;
-import javax.inject.Named;
 import javax.inject.Singleton;
 
 import cx.ring.BuildConfig;
@@ -63,7 +60,6 @@
 import cx.ring.client.CallActivity;
 import cx.ring.client.ConversationActivity;
 import cx.ring.facades.ConversationFacade;
-import cx.ring.fragments.ConversationFragment;
 import cx.ring.model.Codec;
 import cx.ring.model.Settings;
 import cx.ring.model.Uri;
@@ -554,7 +550,7 @@
         super.onCreate();
 
         // dependency injection
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         isRunning = true;
 
         if (mDeviceRuntimeService.hasContactPermission()) {
diff --git a/ring-android/app/src/main/java/cx/ring/services/DataTransferService.java b/ring-android/app/src/main/java/cx/ring/services/DataTransferService.java
index 1205531..573bdbd 100644
--- a/ring-android/app/src/main/java/cx/ring/services/DataTransferService.java
+++ b/ring-android/app/src/main/java/cx/ring/services/DataTransferService.java
@@ -84,7 +84,7 @@
     @Override
     public void onCreate() {
         Log.d(TAG, "OnCreate(), Service has been initialized");
-        ((JamiApplication) getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getApplication()).getInjectionComponent().inject(this);
         notificationManager = NotificationManagerCompat.from(this);
         super.onCreate();
     }
diff --git a/ring-android/app/src/main/java/cx/ring/services/JamiChooserTargetService.java b/ring-android/app/src/main/java/cx/ring/services/JamiChooserTargetService.java
index 337523c..7c93589 100644
--- a/ring-android/app/src/main/java/cx/ring/services/JamiChooserTargetService.java
+++ b/ring-android/app/src/main/java/cx/ring/services/JamiChooserTargetService.java
@@ -58,7 +58,7 @@
     public void onCreate() {
         super.onCreate();
         JamiApplication.getInstance().startDaemon();
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         targetSize = (int) (AvatarFactory.SIZE_NOTIF * getResources().getDisplayMetrics().density);
     }
 
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 f504f81..a8e4b89 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
@@ -129,7 +129,7 @@
 
     @Override
     public void onCreate() {
-        ((JamiApplication) getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getApplication()).getInjectionComponent().inject(this);
 
         mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
         mNoticationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
diff --git a/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java b/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java
index 9fff9d7..d24ffc6 100644
--- a/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/settings/SettingsFragment.java
@@ -23,6 +23,7 @@
 import android.graphics.Typeface;
 import android.os.Bundle;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.widget.Toolbar;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
@@ -31,6 +32,7 @@
 import com.google.android.material.snackbar.Snackbar;
 
 import android.text.TextUtils;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.View;
@@ -39,22 +41,17 @@
 import android.widget.CompoundButton;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
-import android.widget.Switch;
 import android.widget.TextView;
 import android.widget.Toast;
 
-import butterknife.BindView;
-import butterknife.OnCheckedChanged;
-import butterknife.OnClick;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
 import cx.ring.client.HomeActivity;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.databinding.FragSettingsBinding;
 import cx.ring.model.Settings;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.mvp.GenericView;
 import cx.ring.utils.DeviceUtils;
-import cx.ring.views.BoundedScrollView;
 
 /**
  * TODO: improvements : handle multiples permissions for feature.
@@ -63,40 +60,31 @@
 
     private static final int SCROLL_DIRECTION_UP = -1;
 
-    @BindView(R.id.settings_push_notifications_layout)
-    ViewGroup mGroupPushNotifications;
-    @BindView(R.id.settings_push_notifications)
-    Switch mViewPushNotifications;
-    @BindView(R.id.settings_startup)
-    Switch mViewStartup;
-    @BindView(R.id.settings_persistNotification)
-    Switch mViewPersistNotif;
-    @BindView(R.id.settings_video_layout)
-    View settings_video_layout;
-    @BindView(R.id.settings_dark_theme)
-    Switch mDarkTheme;
-    @BindView(R.id.scrollview)
-    BoundedScrollView mScrollView;
+    private FragSettingsBinding binding;
 
     private boolean mIsRefreshingViewFromPresenter;
 
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_settings;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragSettingsBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     @Override
     public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
         setHasOptionsMenu(true);
         super.onViewCreated(view, savedInstanceState);
-        mDarkTheme.setChecked(presenter.getDarkMode());
+        binding.settingsDarkTheme.setChecked(presenter.getDarkMode());
         if (TextUtils.isEmpty(JamiApplication.getInstance().getPushToken())) {
-            mGroupPushNotifications.setVisibility(View.GONE);
+            binding.settingsPushNotificationsLayout.setVisibility(View.GONE);
         }
         // loading preferences
         presenter.loadSettings();
@@ -118,13 +106,43 @@
             ((HomeActivity) getActivity()).setToolbarState(R.string.menu_item_settings);
         }
 
-        mScrollView.getViewTreeObserver().addOnScrollChangedListener(this);
+        binding.scrollview.getViewTreeObserver().addOnScrollChangedListener(this);
+        binding.settingsDarkTheme.setOnCheckedChangeListener((buttonView, isChecked) -> presenter.setDarkMode(isChecked));
+
+        CompoundButton.OnCheckedChangeListener save = (buttonView, isChecked) -> {
+            if (!mIsRefreshingViewFromPresenter)
+                saveSettings();
+        };
+        binding.settingsPushNotifications.setOnCheckedChangeListener(save);
+        binding.settingsStartup.setOnCheckedChangeListener(save);
+        binding.settingsPersistNotification.setOnCheckedChangeListener(save);
+
+        binding.settingsVideoLayout.setOnClickListener(v -> {
+            HomeActivity activity = (HomeActivity) getActivity();
+            if (activity != null)
+                activity.goToVideoSettings();
+        });
+
+        binding.settingsClearHistory.setOnClickListener(v -> new MaterialAlertDialogBuilder(view.getContext())
+                .setTitle(getString(R.string.clear_history_dialog_title))
+                .setMessage(getString(R.string.clear_history_dialog_message))
+                .setPositiveButton(android.R.string.ok, (dialog, id) -> {
+                    // ask the presenter to clear history
+                    presenter.clearHistory();
+                    Snackbar.make(view,
+                            getString(R.string.clear_history_completed),
+                            Snackbar.LENGTH_SHORT).show();
+                })
+                .setNegativeButton(android.R.string.cancel, (dialog, id) -> {
+                    //~ Empty
+                })
+                .show());
     }
 
     @Override
     public void onResume() {
         super.onResume();
-        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
+        FragmentManager fragmentManager = requireFragmentManager();
         Fragment existingFragment = fragmentManager.findFragmentByTag(SettingsFragment.TAG);
         if (existingFragment == null) {
             ((HomeActivity) getActivity()).goToSettings();
@@ -132,7 +150,7 @@
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    public void onCreateOptionsMenu(Menu menu, @NonNull MenuInflater inflater) {
         menu.clear();
     }
 
@@ -141,58 +159,16 @@
         menu.clear();
     }
 
-    @OnCheckedChanged(R.id.settings_dark_theme)
-    public void onDarkThemeChanged(CompoundButton button, boolean isChecked) {
-        presenter.setDarkMode(isChecked);
-    }
-
-    @OnCheckedChanged({
-        R.id.settings_push_notifications,
-        R.id.settings_startup,
-        R.id.settings_persistNotification
-    })
-    public void onSettingsCheckedChanged(CompoundButton button, boolean isChecked) {
-        if (!mIsRefreshingViewFromPresenter)
-            saveSettings();
-    }
-
     private void saveSettings() {
         Settings newSettings = new Settings();
-
-        newSettings.setAllowRingOnStartup(mViewStartup.isChecked());
-        newSettings.setAllowPushNotifications(mViewPushNotifications.isChecked());
-        newSettings.setAllowPersistentNotification(mViewPersistNotif.isChecked());
+        newSettings.setAllowRingOnStartup(binding.settingsStartup.isChecked());
+        newSettings.setAllowPushNotifications(binding.settingsPushNotifications.isChecked());
+        newSettings.setAllowPersistentNotification(binding.settingsPersistNotification.isChecked());
 
         // save settings according to UI inputs
         presenter.saveSettings(newSettings);
     }
 
-    @OnClick(R.id.settings_video_layout)
-    void onVideoClick() {
-        HomeActivity activity = (HomeActivity) getActivity();
-        if (activity != null) {
-            activity.goToVideoSettings();
-        }
-    }
-
-    @OnClick(R.id.settings_clear_history)
-    public void onClearHistoryClick() {
-        new MaterialAlertDialogBuilder(getActivity())
-                .setTitle(getString(R.string.clear_history_dialog_title))
-                .setMessage(getString(R.string.clear_history_dialog_message))
-                .setPositiveButton(android.R.string.ok, (dialog, id) -> {
-                    // ask the presenter to clear history
-                    presenter.clearHistory();
-                    Snackbar.make(getView(),
-                            getString(R.string.clear_history_completed),
-                            Snackbar.LENGTH_SHORT).show();
-                })
-                .setNegativeButton(android.R.string.cancel, (dialog, id) -> {
-                    //~ Empty
-                })
-                .show();
-    }
-
     /**
      * Presents a Toast explaining why the Read Contacts permission is required to display the devi-
      * ces contacts in Ring.
@@ -220,16 +196,18 @@
     @Override
     public void showViewModel(Settings viewModel) {
         mIsRefreshingViewFromPresenter = true;
-        mViewPushNotifications.setChecked(viewModel.isAllowPushNotifications());
-        mViewPersistNotif.setChecked(viewModel.isAllowPersistentNotification());
-        mViewStartup.setChecked(viewModel.isAllowRingOnStartup());
+        binding.settingsPushNotifications.setChecked(viewModel.isAllowPushNotifications());
+        binding.settingsPersistNotification.setChecked(viewModel.isAllowPersistentNotification());
+        binding.settingsStartup.setChecked(viewModel.isAllowRingOnStartup());
         mIsRefreshingViewFromPresenter = false;
     }
 
     @Override
     public void onScrollChanged() {
-        if (mScrollView != null) {
-            ((HomeActivity) getActivity()).setToolbarElevation(mScrollView.canScrollVertically(SCROLL_DIRECTION_UP));
+        if (binding != null) {
+            Activity activity = getActivity();
+            if (activity instanceof HomeActivity)
+                ((HomeActivity) activity).setToolbarElevation(binding.scrollview.canScrollVertically(SCROLL_DIRECTION_UP));
         }
     }
 
diff --git a/ring-android/app/src/main/java/cx/ring/share/ScanFragment.java b/ring-android/app/src/main/java/cx/ring/share/ScanFragment.java
index f8ed56c..7afc4c8 100644
--- a/ring-android/app/src/main/java/cx/ring/share/ScanFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/share/ScanFragment.java
@@ -52,7 +52,6 @@
 
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
 import cx.ring.fragments.ConversationFragment;
 import cx.ring.mvp.BaseSupportFragment;
 
@@ -63,21 +62,12 @@
     private DecoratedBarcodeView barcodeView;
     private TextView mErrorMessageTextView;
 
-    @Override
-    public int getLayout() {
-        return R.layout.frag_scan;
-    }
-
-    @Override
-    public void injectFragment(JamiInjectionComponent component) {
-    }
-
     private boolean hasCameraPermission() {
         return ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
     }
 
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         View rootView = inflater.inflate(R.layout.frag_scan, container, false);
 
         barcodeView = rootView.findViewById(R.id.barcode_scanner);
@@ -153,7 +143,7 @@
         }
     }
 
-    public void displayNoPermissionsError() {
+    private void displayNoPermissionsError() {
         showErrorPanel(R.string.error_scan_no_camera_permissions);
     }
 
@@ -202,7 +192,7 @@
         }
     };
 
-    public void goToConversation(String contactId) {
+    private void goToConversation(String contactId) {
         Intent intent = new Intent().
                 putExtra(ConversationFragment.KEY_CONTACT_RING_ID, contactId);
         getActivity().setResult(Activity.RESULT_OK, intent);
diff --git a/ring-android/app/src/main/java/cx/ring/share/ShareFragment.java b/ring-android/app/src/main/java/cx/ring/share/ShareFragment.java
index 9079628..6e31bc7 100644
--- a/ring-android/app/src/main/java/cx/ring/share/ShareFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/share/ShareFragment.java
@@ -23,68 +23,54 @@
 import android.graphics.Bitmap;
 import android.os.Bundle;
 import android.text.TextUtils;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
-import android.widget.Button;
-import android.widget.ImageView;
-import android.widget.TextView;
+import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
-import butterknife.BindString;
-import butterknife.BindView;
-import butterknife.OnClick;
+import androidx.annotation.Nullable;
+
 import cx.ring.R;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.application.JamiApplication;
+import cx.ring.databinding.FragShareBinding;
 import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.mvp.GenericView;
 import cx.ring.utils.QRCodeUtils;
 
 public class ShareFragment extends BaseSupportFragment<SharePresenter> implements GenericView<ShareViewModel> {
 
-    @BindView(R.id.share_instruction)
-    protected TextView mShareInstruction;
-
-    @BindView(R.id.qr_image)
-    protected ImageView mQrImage;
-
-    @BindString(R.string.share_message)
-    protected String mShareMessage;
-
-    @BindView(R.id.share_button)
-    protected Button mShareButton;
-
-    @BindString(R.string.share_message_no_account)
-    protected String mShareMessageNoAccount;
-
-    @BindString(R.string.account_contact_me)
-    protected String mAccountCountactMe;
-
-    @BindString(R.string.share_via)
-    protected String mShareVia;
-
     private String mUriToShow;
     private boolean isShareLocked = false;
+    private FragShareBinding binding;
 
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.frag_share;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragShareBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     @Override
     public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         setHasOptionsMenu(true);
+        binding.shareButton.setOnClickListener(v -> {
+            if (!isShareLocked) shareAccount();
+        });
     }
 
     @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) {
         inflater.inflate(R.menu.qr_menu, menu);
     }
 
@@ -104,40 +90,31 @@
         }
     }
 
-    @OnClick(R.id.share_button)
-    void shareClicked(View view) {
-        if(!isShareLocked) {
-            shareAccount();
-        }
-    }
-
     private void shareAccount() {
         if (!TextUtils.isEmpty(mUriToShow)) {
             Intent sharingIntent = new Intent(Intent.ACTION_SEND);
             sharingIntent.setType("text/plain");
-            sharingIntent.putExtra(Intent.EXTRA_SUBJECT, mAccountCountactMe);
+            sharingIntent.putExtra(Intent.EXTRA_SUBJECT, getText(R.string.account_contact_me));
             sharingIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.account_share_body, mUriToShow, getText(R.string.app_website)));
-            startActivity(Intent.createChooser(sharingIntent, mShareVia));
+            startActivity(Intent.createChooser(sharingIntent, getText(R.string.share_via)));
         }
     }
 
     @Override
     public void showViewModel(final ShareViewModel viewModel) {
-        final QRCodeUtils.QRCodeData qrCodeData = viewModel.getAccountQRCodeData(0xFF000000, 0xFFFFFFFF);
-
-        if (mQrImage == null || mShareInstruction == null) {
+        if (binding == null)
             return;
-        }
 
+        final QRCodeUtils.QRCodeData qrCodeData = viewModel.getAccountQRCodeData(0xFF000000, 0xFFFFFFFF);
         if (qrCodeData == null) {
-            mQrImage.setVisibility(View.INVISIBLE);
-            mShareInstruction.setText(mShareMessageNoAccount);
+            binding.qrImage.setVisibility(View.INVISIBLE);
+            binding.shareInstruction.setText(R.string.share_message_no_account);
         } else {
             Bitmap bitmap = Bitmap.createBitmap(qrCodeData.getWidth(), qrCodeData.getHeight(), Bitmap.Config.ARGB_8888);
             bitmap.setPixels(qrCodeData.getData(), 0, qrCodeData.getWidth(), 0, 0, qrCodeData.getWidth(), qrCodeData.getHeight());
-            mQrImage.setImageBitmap(bitmap);
-            mShareInstruction.setText(mShareMessage);
-            mQrImage.setVisibility(View.VISIBLE);
+            binding.qrImage.setImageBitmap(bitmap);
+            binding.shareInstruction.setText(R.string.share_message);
+            binding.qrImage.setVisibility(View.VISIBLE);
         }
 
         mUriToShow = viewModel.getAccountDisplayUri();
diff --git a/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsPresenter.java
index ef7701c..51420db 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/about/AboutDetailsPresenter.java
@@ -20,21 +20,14 @@
 import android.content.Context;
 import androidx.leanback.widget.Presenter;
 import android.view.LayoutInflater;
-import android.view.View;
 import android.view.ViewGroup;
-import android.widget.TextView;
 
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import cx.ring.R;
+import cx.ring.databinding.DetailViewContentBinding;
 import cx.ring.tv.cards.iconcards.IconCard;
 
 public class AboutDetailsPresenter extends Presenter {
-    @BindView(R.id.primary_text)
-    TextView mPrimaryText;
-    @BindView(R.id.extra_text)
-    TextView mExtraText;
     private Context mContext;
+    private DetailViewContentBinding binding;
 
     public AboutDetailsPresenter(Context context) {
         mContext = context;
@@ -42,17 +35,15 @@
 
     @Override
     public ViewHolder onCreateViewHolder(ViewGroup parent) {
-        View view = LayoutInflater.from(mContext).inflate(R.layout.detail_view_content, null);
-        ButterKnife.bind(this, view);
-        return new ViewHolder(view);
+        binding = DetailViewContentBinding.inflate(LayoutInflater.from(mContext));
+        return new ViewHolder(binding.getRoot());
     }
 
     @Override
     public void onBindViewHolder(ViewHolder viewHolder, Object itemData) {
         IconCard card = (IconCard) itemData;
-
-        mPrimaryText.setText(card.getTitle());
-        mExtraText.setText(card.getDescription());
+        binding.primaryText.setText(card.getTitle());
+        binding.extraText.setText(card.getDescription());
     }
 
     @Override
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountExport.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountExport.java
index a44d6d4..8b176e9 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountExport.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVAccountExport.java
@@ -65,7 +65,7 @@
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
 
         super.onViewCreated(view, savedInstanceState);
         presenter.setAccountId(mIdAccount);
@@ -77,7 +77,7 @@
         String title = getString(R.string.account_export_title);
         String breadcrumb = "";
         String description = getString(R.string.account_link_export_info_light);
-        Drawable icon = getActivity().getResources().getDrawable(R.drawable.baseline_devices_24);
+        Drawable icon = getContext().getDrawable(R.drawable.baseline_devices_24);
         return new GuidanceStylist.Guidance(title, description, breadcrumb, icon);
     }
 
@@ -214,7 +214,7 @@
     }
 
     @Override
-    public void updateUserView() {
+    public void updateUserView(Account account) {
 
     }
 
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 0f2a0cf..b9ceec3 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
@@ -22,7 +22,6 @@
 import android.app.FragmentManager;
 import android.app.ProgressDialog;
 import android.content.Intent;
-import android.content.pm.ActivityInfo;
 import android.os.Bundle;
 
 import androidx.leanback.app.GuidedStepSupportFragment;
@@ -32,7 +31,6 @@
 
 import java.io.File;
 
-import butterknife.ButterKnife;
 import cx.ring.R;
 import cx.ring.account.AccountCreationModelImpl;
 import cx.ring.account.AccountWizardPresenter;
@@ -42,7 +40,6 @@
 import cx.ring.model.AccountConfig;
 import cx.ring.mvp.AccountCreationModel;
 import cx.ring.mvp.BaseActivity;
-import cx.ring.tv.main.HomeActivity;
 import cx.ring.utils.VCardUtils;
 import ezvcard.VCard;
 import io.reactivex.Single;
@@ -61,9 +58,8 @@
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         super.onCreate(savedInstanceState);
-        ButterKnife.bind(this);
         JamiApplication.getInstance().startDaemon();
 
         Intent intent = getIntent();
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVHomeAccountCreationFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVHomeAccountCreationFragment.java
index 1e364c3..3cb287b 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVHomeAccountCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVHomeAccountCreationFragment.java
@@ -42,7 +42,7 @@
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
 
         super.onViewCreated(view, savedInstanceState);
     }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiAccountCreationFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiAccountCreationFragment.java
index 5a8cd74..f544abd 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiAccountCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiAccountCreationFragment.java
@@ -84,7 +84,7 @@
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
 
         // Bind the presenter to the view
         super.onViewCreated(view, savedInstanceState);
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiLinkAccountFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiLinkAccountFragment.java
index f3051c5..45d822c 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiLinkAccountFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVJamiLinkAccountFragment.java
@@ -53,7 +53,7 @@
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         super.onViewCreated(view, savedInstanceState);
 
         presenter.init(model);
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 88efde7..4c86f3f 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
@@ -119,7 +119,7 @@
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         super.onViewCreated(view, savedInstanceState);
 
         if (mModel == null) {
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 af550c9..79216d7 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
@@ -112,7 +112,7 @@
 
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         super.onViewCreated(view, savedInstanceState);
         iconSize = (int) getResources().getDimension(R.dimen.tv_avatar_size);
     }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/account/TVSettingsFragment.java b/ring-android/app/src/main/java/cx/ring/tv/account/TVSettingsFragment.java
index bf7b122..f211dd6 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/account/TVSettingsFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/account/TVSettingsFragment.java
@@ -71,7 +71,7 @@
 
         @Override
         public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
-            ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+            ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
             super.onViewCreated(view, savedInstanceState);
             presenter.init();
         }
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 2dafd65..4c2972f 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
@@ -21,18 +21,18 @@
 
 import android.graphics.Bitmap;
 import android.os.Bundle;
+import android.view.LayoutInflater;
 import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
+import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
-import butterknife.BindString;
-import butterknife.BindView;
 import cx.ring.R;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
+import cx.ring.application.JamiApplication;
+import cx.ring.databinding.TvFragShareBinding;
 import cx.ring.model.Account;
-import cx.ring.mvp.BaseFragment;
+import cx.ring.mvp.BaseSupportFragment;
 import cx.ring.mvp.GenericView;
 import cx.ring.services.VCardServiceImpl;
 import cx.ring.share.SharePresenter;
@@ -40,38 +40,32 @@
 import cx.ring.utils.Log;
 import cx.ring.utils.QRCodeUtils;
 import cx.ring.views.AvatarDrawable;
+import io.reactivex.disposables.CompositeDisposable;
 
-public class TVShareFragment extends BaseFragment<SharePresenter> implements GenericView<ShareViewModel> {
+public class TVShareFragment extends BaseSupportFragment<SharePresenter> implements GenericView<ShareViewModel> {
 
+    private TvFragShareBinding binding;
+    private final CompositeDisposable disposable = new CompositeDisposable();
 
-    @BindView(R.id.share_qr_instruction)
-    protected TextView mShareInstruction;
-
-    @BindView(R.id.qr_image)
-    protected ImageView mQrImage;
-
-    @BindString(R.string.share_message)
-    protected String mShareMessage;
-
-    @BindView(R.id.share_uri)
-    protected TextView mShareUri;
-
-    @BindView(R.id.qr_user_photo)
-    protected ImageView mUserPhoto;
-
+    @Nullable
     @Override
-    public int getLayout() {
-        return R.layout.tv_frag_share;
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = TvFragShareBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
     }
 
     @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
+        disposable.clear();
     }
 
     @Override
-    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
+    public void onDestroy() {
+        super.onDestroy();
+        disposable.dispose();
     }
 
     @Override
@@ -79,37 +73,37 @@
         final QRCodeUtils.QRCodeData qrCodeData = viewModel.getAccountQRCodeData(0x00000000, 0xFFFFFFFF);
         getUserAvatar(viewModel.getAccount());
 
-        if (mQrImage == null || mShareInstruction == null || mShareUri == null) {
+        if (binding == null) {
             return;
         }
 
         if (qrCodeData == null) {
-            mQrImage.setVisibility(View.INVISIBLE);
+            binding.qrImage.setVisibility(View.INVISIBLE);
 
         } else {
             Bitmap bitmap = Bitmap.createBitmap(qrCodeData.getWidth(), qrCodeData.getHeight(), Bitmap.Config.ARGB_8888);
             bitmap.setPixels(qrCodeData.getData(), 0, qrCodeData.getWidth(), 0, 0, qrCodeData.getWidth(), qrCodeData.getHeight());
-            mQrImage.setImageBitmap(bitmap);
-            mShareInstruction.setText(mShareMessage);
-            mQrImage.setVisibility(View.VISIBLE);
+            binding.qrImage.setImageBitmap(bitmap);
+            binding.shareQrInstruction.setText(R.string.share_message);
+            binding.qrImage.setVisibility(View.VISIBLE);
         }
     }
 
     private void getUserAvatar(Account account) {
-        VCardServiceImpl
+        disposable.add(VCardServiceImpl
                 .loadProfile(account)
                 .doOnSuccess(profile -> {
-                    mShareUri.setVisibility(View.VISIBLE);
+                    binding.shareUri.setVisibility(View.VISIBLE);
                     if (profile.first != null && !profile.first.isEmpty()) {
-                        mShareUri.setText(profile.first);
+                        binding.shareUri.setText(profile.first);
                     } else {
-                        mShareUri.setText(account.getDisplayUri());
+                        binding.shareUri.setText(account.getDisplayUri());
                     }
                 })
                 .flatMap(p -> AvatarDrawable.load(getActivity(), account))
                 .subscribe(a -> {
-                    mUserPhoto.setVisibility(View.VISIBLE);
-                    mUserPhoto.setImageDrawable(a);
-                }, e-> Log.e(TAG, e.getMessage()));
+                    binding.qrUserPhoto.setVisibility(View.VISIBLE);
+                    binding.qrUserPhoto.setImageDrawable(a);
+                }, e-> Log.e(TAG, e.getMessage())));
     }
 }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java
index 17f2b45..20f19ba 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/call/TVCallActivity.java
@@ -66,7 +66,7 @@
         setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
 
         // dependency injection
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         JamiApplication.getInstance().startDaemon();
 
         boolean audioOnly = false;
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 e20d26d..ef26e92 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
@@ -166,22 +166,12 @@
     }
 
     @Override
-    public int getLayout() {
-        return R.layout.tv_frag_call;
-    }
-
-    @Override
     public void handleCallWakelock(boolean isAudioOnly) { }
 
-    @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
-    }
-
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
-        injectFragment(((JamiApplication) getActivity().getApplication()).getRingInjectionComponent());
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         binding = TvFragCallBinding.inflate(inflater, container, false);
         binding.setPresenter(this);
         return binding.getRoot();
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 d647c43..7a83ab2 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
@@ -38,17 +38,13 @@
 import android.widget.FrameLayout;
 import android.widget.Toast;
 
-import com.google.android.material.floatingactionbutton.FloatingActionButton;
-
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.OnClick;
 import cx.ring.R;
+import cx.ring.databinding.CamerapickerBinding;
 import cx.ring.utils.AndroidFileUtils;
 import cx.ring.utils.ContentUriHandler;
 import io.reactivex.Single;
@@ -64,17 +60,14 @@
     private int cameraBack = -1;
     private int currentCamera = 0;
 
+    private CamerapickerBinding binding;
+
     private MediaRecorder recorder;
     private boolean mRecording = false;
     private boolean mActionVideo = false;
 
     private File mVideoFile;
 
-    @BindView(R.id.button_video)
-    FloatingActionButton mButtonVideo;
-    @BindView(R.id.button_picture)
-    FloatingActionButton mButtonPicture;
-
     private Camera mCamera;
     private CameraPreview mCameraPreview;
     private final Camera.PictureCallback mPicture = (input, camera) -> Single.fromCallable(() ->  {
@@ -99,13 +92,12 @@
                 finish();
             });
 
-    @OnClick(R.id.button_picture)
     public void takePicture() {
         if (mRecording)
             releaseMediaRecorder();
         if (mCamera != null) {
-            mButtonPicture.setEnabled(false);
-            mButtonVideo.setVisibility(View.GONE);
+            binding.buttonPicture.setEnabled(false);
+            binding.buttonVideo.setVisibility(View.GONE);
             try {
                 mCamera.takePicture(null, null, mPicture);
             } catch (Exception e) {
@@ -114,7 +106,6 @@
         }
     }
 
-    @OnClick(R.id.button_video)
     public void takeVideo() {
         if (mRecording) {
             releaseMediaRecorder();
@@ -124,13 +115,13 @@
                     .setType(TYPE_VIDEO);
             setResult(RESULT_OK, intent);
             finish();
-            mButtonVideo.setImageResource(R.drawable.baseline_videocam_24);
+            binding.buttonVideo.setImageResource(R.drawable.baseline_videocam_24);
             return;
         }
         if (mCamera != null) {
             initRecorder();
-            mButtonVideo.setImageResource(R.drawable.lb_ic_stop);
-            mButtonPicture.setVisibility(View.GONE);
+            binding.buttonVideo.setImageResource(R.drawable.lb_ic_stop);
+            binding.buttonPicture.setVisibility(View.GONE);
         }
         mRecording = !mRecording;
     }
@@ -141,8 +132,9 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.camerapicker);
-        ButterKnife.bind(this);
+        binding = CamerapickerBinding.inflate(getLayoutInflater());
+        binding.buttonPicture.setOnClickListener(v -> takePicture());
+        binding.buttonVideo.setOnClickListener(v -> takeVideo());
 
         if (getIntent().getAction() != null) {
             mActionVideo = getIntent().getAction().equals(MediaStore.ACTION_VIDEO_CAPTURE);
@@ -159,7 +151,7 @@
         preview.addView(mCameraPreview, 0);
 
         if (mActionVideo) {
-            mButtonVideo.setVisibility(View.VISIBLE);
+            binding.buttonVideo.setVisibility(View.VISIBLE);
         }
     }
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java
index ba0cbaf..b824b3b 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/cards/iconcards/IconCardPresenter.java
@@ -43,7 +43,7 @@
 
     @Override
     protected ImageCardView onCreateView() {
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         ImageCardView imageCardView = new ImageCardView(getContext());
         final ImageView image = imageCardView.getMainImageView();
         image.setBackgroundResource(R.drawable.icon_focused);
diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactDetailPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactDetailPresenter.java
index 1b719a0..830edce 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactDetailPresenter.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactDetailPresenter.java
@@ -37,8 +37,7 @@
 
     @Override
     public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {
-        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.tv, viewGroup, false);
-        return new CustomViewHolder(view);
+        return new CustomViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.tv, viewGroup, false));
     }
 
     @Override
@@ -51,13 +50,13 @@
 
     }
 
-    public static class CustomViewHolder extends Presenter.ViewHolder {
+    private static class CustomViewHolder extends Presenter.ViewHolder {
 
-        public CustomViewHolder(View view) {
+        CustomViewHolder(View view) {
             super(view);
         }
 
-        public void bind(TVListViewModel object) {
+        void bind(TVListViewModel object) {
             Fragment fragment = TvConversationFragment.newInstance(object);
             FragmentManager fragmentManager = ((TVContactActivity) view.getContext()).getSupportFragmentManager();
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.java
index 5d8b804..78e612c 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.java
@@ -72,7 +72,7 @@
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         super.onCreate(savedInstanceState);
     }
 
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 84d1d59..b2fa171 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
@@ -23,7 +23,6 @@
 import android.app.Activity;
 import android.content.ActivityNotFoundException;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.media.MediaPlayer;
@@ -35,7 +34,6 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
-import androidx.core.app.ActivityCompat;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.transition.TransitionManager;
@@ -44,6 +42,7 @@
 import android.speech.RecognizerIntent;
 import android.text.TextUtils;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
@@ -69,8 +68,8 @@
 import cx.ring.contacts.AvatarFactory;
 import cx.ring.conversation.ConversationPresenter;
 import cx.ring.conversation.ConversationView;
-import cx.ring.dependencyinjection.JamiInjectionComponent;
 import cx.ring.model.Account;
+import cx.ring.databinding.FragConversationTvBinding;
 import cx.ring.model.CallContact;
 import cx.ring.model.Conversation;
 import cx.ring.model.DataTransfer;
@@ -130,6 +129,7 @@
     private Map<String, AvatarDrawable> mParticipantAvatars = new HashMap<>();
 
     private final CompositeDisposable mCompositeDisposable = new CompositeDisposable();
+    private FragConversationTvBinding binding;
 
     public static TvConversationFragment newInstance(TVListViewModel param) {
         TvConversationFragment fragment = new TvConversationFragment();
@@ -141,13 +141,25 @@
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
         super.onCreate(savedInstanceState);
         if (getArguments() != null) {
             mTvListViewModel = getArguments().getParcelable(ARG_MODEL);
         }
+        requestPermissions(permissions, REQUEST_RECORD_AUDIO_PERMISSION);
+    }
 
-        ActivityCompat.requestPermissions(getActivity(), permissions, REQUEST_RECORD_AUDIO_PERMISSION);
+    @Nullable
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+        binding = FragConversationTvBinding.inflate(inflater, container, false);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
+        return binding.getRoot();
+    }
+
+    @Override
+    public void onDestroyView() {
+        super.onDestroyView();
+        binding = null;
     }
 
     // Create an intent that can start the Speech Recognizer activity
@@ -158,17 +170,6 @@
         startActivityForResult(intent, REQUEST_SPEECH_CODE);
     }
 
-
-    @Override
-    public int getLayout() {
-        return R.layout.frag_conversation_tv;
-    }
-
-    @Override
-    public void injectFragment(JamiInjectionComponent component) {
-        component.inject(this);
-    }
-
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
@@ -281,14 +282,11 @@
                 .create();
         alertDialog.getWindow().setLayout(DIALOG_WIDTH, DIALOG_HEIGHT);
         alertDialog.setOwnerActivity(getActivity());
-        alertDialog.setOnShowListener(new DialogInterface.OnShowListener() {
-            @Override
-            public void onShow(DialogInterface dialog) {
-                Button positive = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
-                positive.setFocusable(true);
-                positive.setFocusableInTouchMode(true);
-                positive.requestFocus();
-            }
+        alertDialog.setOnShowListener(dialog -> {
+            Button positive = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
+            positive.setFocusable(true);
+            positive.setFocusableInTouchMode(true);
+            positive.requestFocus();
         });
 
         alertDialog.show();
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 9f95266..0f64dd6 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
@@ -46,7 +46,7 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         JamiApplication.getInstance().startDaemon();
-        JamiApplication.getInstance().getRingInjectionComponent().inject(this);
+        JamiApplication.getInstance().getInjectionComponent().inject(this);
         setContentView(R.layout.tv_activity_home);
         mBackgroundManager = BackgroundManager.getInstance(this);
         mBackgroundManager.attach(getWindow());
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 9b962c2..5400c86 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
@@ -98,7 +98,7 @@
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         return super.onCreateView(inflater, container, savedInstanceState);
     }
 
diff --git a/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchFragment.java b/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchFragment.java
index 3baae2f..c4fdc5e 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/search/ContactSearchFragment.java
@@ -33,9 +33,6 @@
 import androidx.core.content.ContextCompat;
 import android.view.View;
 
-import butterknife.BindView;
-import butterknife.ButterKnife;
-import butterknife.Unbinder;
 import cx.ring.R;
 import cx.ring.application.JamiApplication;
 import cx.ring.client.CallActivity;
@@ -51,16 +48,10 @@
 
 public class ContactSearchFragment extends BaseSearchFragment<ContactSearchPresenter>
         implements SearchSupportFragment.SearchResultProvider, ContactSearchView {
-
-    private static final String TAG = ContactSearchFragment.class.getSimpleName();
-    @BindView(R.id.lb_search_text_editor)
-    SearchEditText mTextEditor;
-
-    @BindView(R.id.lb_search_bar)
-    SearchBar mSearchBar;
+    private SearchEditText mTextEditor;
+    private SearchBar mSearchBar;
 
     private final ArrayObjectAdapter mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
-    private Unbinder mUnbinder;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -68,7 +59,7 @@
         setSearchResultProvider(this);
 
         // dependency injection
-        ((JamiApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        ((JamiApplication) getActivity().getApplication()).getInjectionComponent().inject(this);
         setOnItemViewClickedListener((itemViewHolder, item, rowViewHolder, row) -> presenter.contactClicked(((ContactCard) item).getModel()));
         setBadgeDrawable(ContextCompat.getDrawable(getActivity(), R.mipmap.ic_launcher));
         setSearchQuery("", false);
@@ -77,8 +68,9 @@
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
+        mTextEditor = view.findViewById(R.id.lb_search_text_editor);
+        mSearchBar = view.findViewById(R.id.lb_search_bar);
         // view injection
-        mUnbinder = ButterKnife.bind(this, view);
         mSearchBar.setSearchBarListener(new SearchBar.SearchBarListener() {
             @Override
             public void onSearchQueryChange(String query) {
@@ -109,7 +101,6 @@
 
     @Override
     public void onDestroyView() {
-        mUnbinder.unbind();
         super.onDestroyView();
     }
 
diff --git a/ring-android/app/src/main/res/layout/add_new_device_layout.xml b/ring-android/app/src/main/res/layout/add_new_device_layout.xml
deleted file mode 100644
index 25e3db6..0000000
--- a/ring-android/app/src/main/res/layout/add_new_device_layout.xml
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2017-2019 Savoir-faire Linux Inc.
-
-Authors: Aline Bonnet <aline.bonnet@savoirfairelinux.com>
-         Adrien Beraud <adrien.beraud@savoirfairelinux.com>
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
--->
-<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_gravity="bottom"
-    android:clipToPadding="false"
-    tools:showIn="@layout/frag_acc_summary">
-
-    <com.google.android.material.card.MaterialCardView
-        android:id="@+id/layout_add_device"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        app:cardCornerRadius="15dp"
-        android:layout_marginBottom="-15dp"
-        android:elevation="4dp"
-        app:behavior_hideable="false"
-        app:behavior_peekHeight="50dp"
-        app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
-        >
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:background="@color/colorPrimary"
-            android:paddingBottom="15dp"
-            android:orientation="vertical">
-
-        <com.google.android.material.button.MaterialButton
-            android:id="@+id/btn_add_device"
-            style="@style/Widget.MaterialComponents.Button.TextButton"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_horizontal"
-            android:text="@string/account_link_export_button"
-            android:textColor="@color/colorOnPrimary" />
-
-        <ScrollView
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content">
-
-                <LinearLayout
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:orientation="vertical">
-
-                    <TextView
-                        android:id="@+id/account_link_info"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:gravity="top"
-                        android:paddingLeft="16dp"
-                        android:paddingTop="5dp"
-                        android:paddingRight="16dp"
-                        android:paddingBottom="8dp"
-                        android:text="@string/account_link_export_info"
-                        android:textColor="@color/colorOnPrimary"
-                        android:textIsSelectable="true"
-                        android:textSize="14sp" />
-
-                    <com.google.android.material.textfield.TextInputLayout
-                        android:id="@+id/password_layout"
-                        android:layout_width="match_parent"
-                        android:layout_height="wrap_content"
-                        android:textColorHint="@color/colorPrimary"
-                        app:passwordToggleTint="@color/colorPrimary"
-                        android:paddingLeft="16dp"
-                        android:paddingRight="16dp"
-                        android:layout_marginBottom="8dp"
-                        app:passwordToggleEnabled="true">
-
-                        <com.google.android.material.textfield.TextInputEditText
-                            android:id="@+id/ring_password"
-                            android:layout_width="match_parent"
-                            android:layout_height="wrap_content"
-                            android:hint="@string/account_enter_password"
-                            android:textColor="@color/colorPrimary"
-                            android:backgroundTint="@color/colorOnPrimary"
-                            android:imeOptions="actionDone"
-                            android:inputType="textPassword" />
-                    </com.google.android.material.textfield.TextInputLayout>
-
-                    <com.google.android.material.button.MaterialButton
-                        android:id="@+id/btn_start_export"
-                        style="@style/Widget.MaterialComponents.Button"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_gravity="center_horizontal"
-                        android:layout_marginBottom="8dp"
-                        android:text="@string/account_start_export_button"
-                        app:backgroundTint="@color/colorSecondary"
-                        android:textColor="@color/colorOnSecondary"/>
-
-                    <com.google.android.material.button.MaterialButton
-                        android:id="@+id/btn_end_export"
-                        style="@style/Widget.MaterialComponents.Button.TextButton"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        android:layout_gravity="center_horizontal"
-                        android:text="@string/account_end_export_button"
-                        android:textColor="@color/colorOnPrimary"
-                        android:visibility="gone" />
-
-                </LinearLayout>
-            </ScrollView>
-
-        </LinearLayout>
-
-        </com.google.android.material.card.MaterialCardView>
-
-</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/ring-android/app/src/main/res/layout/frag_acc_summary.xml b/ring-android/app/src/main/res/layout/frag_acc_summary.xml
index 3abfa6b..74753e7 100644
--- a/ring-android/app/src/main/res/layout/frag_acc_summary.xml
+++ b/ring-android/app/src/main/res/layout/frag_acc_summary.xml
@@ -19,7 +19,8 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    tools:context=".client.HomeActivity">
 
     <ScrollView
         android:id="@+id/scrollview"
@@ -37,37 +38,36 @@
                 android:id="@+id/ring_account_status_container"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
+                android:clipChildren="false"
+                android:clipToPadding="false"
                 android:paddingStart="16dp"
                 android:paddingTop="8dp"
                 android:paddingEnd="16dp"
-                android:paddingBottom="8dp"
-                android:clipToPadding="false"
-                android:clipChildren="false"
-                >
+                android:paddingBottom="8dp">
 
                 <com.google.android.material.chip.Chip
                     android:id="@+id/account_status"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_alignParentTop="true"
                     android:layout_alignParentStart="true"
+                    android:layout_alignParentTop="true"
                     android:textColor="@color/white"
-                    tools:text="Registered"/>
+                    tools:text="Registered" />
 
                 <androidx.appcompat.widget.SwitchCompat
                     android:id="@+id/account_switch"
                     android:layout_width="50dp"
                     android:layout_height="wrap_content"
-                    android:layout_alignParentEnd="true"
-                    android:layout_alignParentTop="true"/>
+                    android:layout_alignParentTop="true"
+                    android:layout_alignParentEnd="true" />
 
                 <TextView
                     android:id="@+id/account_alias_txt"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:layout_below="@id/account_switch"
-                    android:paddingBottom="8dp"
                     android:paddingTop="8dp"
+                    android:paddingBottom="8dp"
                     android:textAppearance="@style/TextAppearance.MaterialComponents.Overline"
                     tools:text="@string/profile" />
 
@@ -77,68 +77,63 @@
                     android:layout_height="wrap_content"
                     android:layout_below="@+id/account_alias_txt"
                     android:layout_centerHorizontal="true"
-                    android:clipToPadding="false"
                     android:clipChildren="false"
-                    >
+                    android:clipToPadding="false">
 
                     <ImageView
                         android:id="@+id/user_photo"
                         android:layout_width="90dp"
                         android:layout_height="90dp"
                         android:src="@drawable/ic_contact_picture_fallback"
-                        app:layout_constraintTop_toTopOf="parent"
                         app:layout_constraintStart_toStartOf="parent"
-                        />
+                        app:layout_constraintTop_toTopOf="parent" />
 
                     <View
                         android:id="@+id/anchor"
                         android:layout_width="20dp"
                         android:layout_height="20dp"
-                        app:layout_constraintStart_toStartOf="@id/user_photo"
-                        app:layout_constraintEnd_toEndOf="@id/user_photo"
                         app:layout_constraintBottom_toBottomOf="@id/user_photo"
-                        />
+                        app:layout_constraintEnd_toEndOf="@id/user_photo"
+                        app:layout_constraintStart_toStartOf="@id/user_photo" />
 
                     <com.google.android.material.floatingactionbutton.FloatingActionButton
                         android:id="@+id/user_profile_edit"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         app:fabSize="mini"
-                        app:srcCompat="@drawable/baseline_edit_24"
+                        app:layout_constraintStart_toEndOf="@id/anchor"
                         app:layout_constraintTop_toTopOf="@id/anchor"
-                        app:layout_constraintStart_toEndOf="@id/anchor"/>
+                        app:srcCompat="@drawable/baseline_edit_24" />
 
                     <TextView
                         android:id="@+id/username"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_toEndOf="@+id/user_photo"
+                        android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle2"
                         android:textSize="18sp"
-                        app:layout_constraintVertical_chainStyle="packed"
-                        app:layout_constraintTop_toTopOf="@id/user_photo"
                         app:layout_constraintBottom_toTopOf="@id/subtitle"
                         app:layout_constraintStart_toStartOf="@id/subtitle"
-                        android:textAppearance="@style/TextAppearance.MaterialComponents.Subtitle2"
-                        tools:text="username"
-                        />
+                        app:layout_constraintTop_toTopOf="@id/user_photo"
+                        app:layout_constraintVertical_chainStyle="packed"
+                        tools:text="username" />
 
                     <TextView
                         android:id="@+id/subtitle"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
-                        app:layout_constrainedWidth="true"
+                        android:layout_marginStart="20dp"
                         android:ellipsize="end"
                         android:maxLines="1"
                         android:textColor="@color/darker_gray"
                         android:textSize="14sp"
-                        android:layout_marginStart="20dp"
-                        tools:text="sub-username"
-                        app:layout_constraintTop_toBottomOf="@+id/username"
-                        app:layout_constraintStart_toEndOf="@+id/user_photo"
+                        app:layout_constrainedWidth="true"
                         app:layout_constraintBottom_toBottomOf="@id/user_photo"
                         app:layout_constraintEnd_toEndOf="parent"
                         app:layout_constraintHorizontal_bias="0"
-                        />
+                        app:layout_constraintStart_toEndOf="@+id/user_photo"
+                        app:layout_constraintTop_toBottomOf="@+id/username"
+                        tools:text="sub-username" />
 
                 </androidx.constraintlayout.widget.ConstraintLayout>
 
@@ -326,9 +321,113 @@
         </RelativeLayout>
     </ScrollView>
 
-    <include
-        layout="@layout/add_new_device_layout"
+    <androidx.coordinatorlayout.widget.CoordinatorLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true" />
+        android:layout_alignParentBottom="true"
+        android:layout_gravity="bottom"
+        android:clipToPadding="false"
+        tools:showIn="@layout/frag_acc_summary">
+
+        <com.google.android.material.card.MaterialCardView
+            android:id="@+id/layout_add_device"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="-15dp"
+            android:elevation="4dp"
+            app:behavior_hideable="false"
+            app:behavior_peekHeight="50dp"
+            app:cardCornerRadius="15dp"
+            app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@color/colorPrimary"
+                android:orientation="vertical"
+                android:paddingBottom="15dp">
+
+                <com.google.android.material.button.MaterialButton
+                    android:id="@+id/btn_add_device"
+                    style="@style/Widget.MaterialComponents.Button.TextButton"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center_horizontal"
+                    android:text="@string/account_link_export_button"
+                    android:textColor="@color/colorOnPrimary" />
+
+                <ScrollView
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:id="@+id/account_link_info"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:gravity="top"
+                            android:paddingLeft="16dp"
+                            android:paddingTop="5dp"
+                            android:paddingRight="16dp"
+                            android:paddingBottom="8dp"
+                            android:text="@string/account_link_export_info"
+                            android:textColor="@color/colorOnPrimary"
+                            android:textIsSelectable="true"
+                            android:textSize="14sp" />
+
+                        <com.google.android.material.textfield.TextInputLayout
+                            android:id="@+id/password_layout"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:layout_marginBottom="8dp"
+                            android:paddingLeft="16dp"
+                            android:paddingRight="16dp"
+                            android:textColorHint="@color/colorPrimary"
+                            app:passwordToggleEnabled="true"
+                            app:passwordToggleTint="@color/colorPrimary">
+
+                            <com.google.android.material.textfield.TextInputEditText
+                                android:id="@+id/ring_password"
+                                android:layout_width="match_parent"
+                                android:layout_height="wrap_content"
+                                android:backgroundTint="@color/colorOnPrimary"
+                                android:hint="@string/account_enter_password"
+                                android:imeOptions="actionDone"
+                                android:inputType="textPassword"
+                                android:textColor="@color/colorPrimary" />
+                        </com.google.android.material.textfield.TextInputLayout>
+
+                        <com.google.android.material.button.MaterialButton
+                            android:id="@+id/btn_start_export"
+                            style="@style/Widget.MaterialComponents.Button"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center_horizontal"
+                            android:layout_marginBottom="8dp"
+                            android:text="@string/account_start_export_button"
+                            android:textColor="@color/colorOnSecondary"
+                            app:backgroundTint="@color/colorSecondary" />
+
+                        <com.google.android.material.button.MaterialButton
+                            android:id="@+id/btn_end_export"
+                            style="@style/Widget.MaterialComponents.Button.TextButton"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center_horizontal"
+                            android:text="@string/account_end_export_button"
+                            android:textColor="@color/colorOnPrimary"
+                            android:visibility="gone" />
+
+                    </LinearLayout>
+                </ScrollView>
+
+            </LinearLayout>
+
+        </com.google.android.material.card.MaterialCardView>
+
+    </androidx.coordinatorlayout.widget.CoordinatorLayout>
 </RelativeLayout>
