diff --git a/ring-android/app/src/main/AndroidManifest.xml b/ring-android/app/src/main/AndroidManifest.xml
index 5d266ca..03ec089 100644
--- a/ring-android/app/src/main/AndroidManifest.xml
+++ b/ring-android/app/src/main/AndroidManifest.xml
@@ -330,6 +330,10 @@
             android:name=".tv.contactrequest.TVContactRequestActivity"
             android:theme="@style/Theme.Leanback.Details" />
         <activity
+            android:name=".tv.contact.TVContactActivity"
+            android:theme="@style/Theme.Leanback.Details" />
+
+        <activity
             android:name=".tv.account.TVSettingsActivity"
             android:theme="@style/LeanbackPreferences" />
 
diff --git a/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java b/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java
index 8099d43..4a99f00 100755
--- a/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java
+++ b/ring-android/app/src/main/java/cx/ring/dependencyinjection/RingInjectionComponent.java
@@ -76,6 +76,7 @@
 import cx.ring.tv.account.TVSettingsFragment;
 import cx.ring.tv.call.TVCallActivity;
 import cx.ring.tv.call.TVCallFragment;
+import cx.ring.tv.contact.TVContactFragment;
 import cx.ring.tv.contactrequest.TVContactRequestFragment;
 import cx.ring.tv.main.MainFragment;
 import cx.ring.tv.search.RingSearchFragment;
@@ -193,6 +194,8 @@
 
     void inject(TVContactRequestFragment fragment);
 
+    void inject(TVContactFragment fragment);
+
     void inject(TVSettingsFragment tvSettingsFragment);
 
     void inject(TVSettingsFragment.PrefsFragment prefsFragment);
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 987ae36..9e0df9e 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
@@ -104,8 +104,8 @@
 
     public static final int REQ_ADD_CONTACT = 42;
 
-    public static final String KEY_CONTACT_RING_ID = BuildConfig.APPLICATION_ID + "CONTACT_RING_ID";
-    public static final String KEY_ACCOUNT_ID = BuildConfig.APPLICATION_ID + "ACCOUNT_ID";
+    public static final String KEY_CONTACT_RING_ID = BuildConfig.APPLICATION_ID + ".CONTACT_RING_ID";
+    public static final String KEY_ACCOUNT_ID = BuildConfig.APPLICATION_ID + ".ACCOUNT_ID";
     public static final String KEY_PREFERENCE_PENDING_MESSAGE = "pendingMessage";
     public static final String KEY_PREFERENCE_CONVERSATION_COLOR = "color";
 
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 bab8d92..be443d8 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
@@ -584,7 +584,7 @@
             boolean incomingCall = newState == SipCall.State.RINGING && call.isIncoming();
             if (incomingCall) {
                 Bundle extras = new Bundle();
-                extras.putString("account", mAccountService.getCurrentAccount().getAccountID());
+                extras.putString(ConversationFragment.KEY_ACCOUNT_ID, mAccountService.getCurrentAccount().getAccountID());
                 extras.putString(NotificationService.KEY_CALL_ID, call.getCallId());
                 startActivity(new Intent(Intent.ACTION_VIEW)
                         .putExtras(extras)
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 5819abe..05617c3 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
@@ -22,6 +22,7 @@
 import android.app.Fragment;
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
+import android.media.AudioManager;
 import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
@@ -32,6 +33,7 @@
 import cx.ring.R;
 import cx.ring.application.RingApplication;
 import cx.ring.call.CallView;
+import cx.ring.fragments.ConversationFragment;
 import cx.ring.services.NotificationService;
 import cx.ring.utils.Log;
 
@@ -54,14 +56,15 @@
                     WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
         }
         setContentView(R.layout.tv_activity_call);
+        setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
 
         // dependency injection
         RingApplication.getInstance().getRingInjectionComponent().inject(this);
         RingApplication.getInstance().startDaemon();
 
         boolean audioOnly = false;
-        String accountId = getIntent().getStringExtra("account");
-        String ringId = getIntent().getStringExtra("ringId");
+        String accountId = getIntent().getStringExtra(ConversationFragment.KEY_ACCOUNT_ID);
+        String ringId = getIntent().getStringExtra(ConversationFragment.KEY_CONTACT_RING_ID);
 
         FragmentManager fragmentManager = getFragmentManager();
         FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactActivity.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactActivity.java
new file mode 100644
index 0000000..bb88755
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactActivity.java
@@ -0,0 +1,39 @@
+/*
+ *  Copyright (C) 2004-2018 Savoir-faire Linux Inc.
+ *
+ *  Author: Hadrien De Sousa <hadrien.desousa@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.tv.contact;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.FragmentActivity;
+import cx.ring.R;
+
+public class TVContactActivity extends FragmentActivity {
+    public static final String SHARED_ELEMENT_NAME = "photo";
+    public static final String CONTACT_REQUEST = "ContactRequest";
+
+    /**
+     * Called when the activity is first created.
+     */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.tv_frag_contact);
+    }
+}
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
new file mode 100644
index 0000000..3c23b89
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactDetailPresenter.java
@@ -0,0 +1,38 @@
+/*
+ *  Copyright (C) 2004-2018 Savoir-faire Linux Inc.
+ *
+ *  Author: Hadrien De Sousa <hadrien.desousa@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.tv.contact;
+
+import androidx.leanback.widget.AbstractDetailsDescriptionPresenter;
+import cx.ring.tv.model.TVListViewModel;
+
+public class TVContactDetailPresenter extends AbstractDetailsDescriptionPresenter {
+
+    @Override
+    protected void onBindDescription(ViewHolder viewHolder, Object item) {
+        TVListViewModel viewModel = (TVListViewModel) item;
+        if (viewModel != null) {
+            String id = viewModel.getContact().getRingUsername();
+            String displayName = viewModel.getContact().getDisplayName();
+            viewHolder.getTitle().setText(displayName);
+            if (!displayName.equals(id))
+                viewHolder.getSubtitle().setText(id);
+        }
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..a7d6227
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.java
@@ -0,0 +1,147 @@
+/*
+ *  Copyright (C) 2004-2018 Savoir-faire Linux Inc.
+ *
+ *  Author: Hadrien De Sousa <hadrien.desousa@savoirfairelinux.com>
+ *  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.tv.contact;
+
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+
+import androidx.core.content.ContextCompat;
+import androidx.leanback.app.BackgroundManager;
+import androidx.leanback.widget.Action;
+import androidx.leanback.widget.ArrayObjectAdapter;
+import androidx.leanback.widget.BrowseFrameLayout;
+import androidx.leanback.widget.ClassPresenterSelector;
+import androidx.leanback.widget.DetailsOverviewLogoPresenter;
+import androidx.leanback.widget.DetailsOverviewRow;
+import androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter;
+import androidx.leanback.widget.FullWidthDetailsOverviewSharedElementHelper;
+import androidx.leanback.widget.ListRow;
+import androidx.leanback.widget.ListRowPresenter;
+import cx.ring.R;
+import cx.ring.application.RingApplication;
+import cx.ring.fragments.ConversationFragment;
+import cx.ring.model.Uri;
+import cx.ring.tv.call.TVCallActivity;
+import cx.ring.tv.main.BaseDetailFragment;
+import cx.ring.tv.model.TVListViewModel;
+import cx.ring.views.AvatarDrawable;
+
+public class TVContactFragment extends BaseDetailFragment<TVContactPresenter> implements TVContactView {
+
+    private static final int ACTION_CALL = 0;
+    private static final int ACTION_DELETE = 1;
+
+    private Uri mContactUri;
+    private ArrayObjectAdapter mAdapter;
+    private int iconSize = -1;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        ((RingApplication) getActivity().getApplication()).getRingInjectionComponent().inject(this);
+        super.onCreate(savedInstanceState);
+        mContactUri = (Uri) getActivity().getIntent().getSerializableExtra(TVContactActivity.CONTACT_REQUEST);
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        BrowseFrameLayout layout = (BrowseFrameLayout) view;
+
+        // Override down navigation as we do not use it in this screen
+        // Only the detailPresenter will be displayed
+        layout.setOnDispatchKeyListener((v, keyCode, event) -> event.getKeyCode() == KeyEvent.KEYCODE_DPAD_DOWN);
+        prepareBackgroundManager();
+        if (mContactUri != null) {
+            setupAdapter();
+        }
+        Resources res = getResources();
+        iconSize = res.getDimensionPixelSize(R.dimen.tv_avatar_size);
+        presenter.setContact(mContactUri);
+    }
+
+    private void prepareBackgroundManager() {
+        BackgroundManager mBackgroundManager = BackgroundManager.getInstance(getActivity());
+        mBackgroundManager.attach(getActivity().getWindow());
+    }
+
+    private void setupAdapter() {
+        // Set detail background and style.
+        FullWidthDetailsOverviewRowPresenter detailsPresenter =
+                new FullWidthDetailsOverviewRowPresenter(
+                        new TVContactDetailPresenter(),
+                        new DetailsOverviewLogoPresenter());
+
+        detailsPresenter.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.color_primary_dark));
+        detailsPresenter.setInitialState(FullWidthDetailsOverviewRowPresenter.STATE_HALF);
+
+        // Hook up transition element.
+        FullWidthDetailsOverviewSharedElementHelper mHelper = new FullWidthDetailsOverviewSharedElementHelper();
+        mHelper.setSharedElementEnterTransition(getActivity(), TVContactActivity.SHARED_ELEMENT_NAME);
+        detailsPresenter.setListener(mHelper);
+        detailsPresenter.setParticipatingEntranceTransition(false);
+        prepareEntranceTransition();
+
+        detailsPresenter.setOnActionClickedListener(action -> {
+            if (action.getId() == ACTION_CALL) {
+                presenter.contactClicked(mContactUri);
+            } else if (action.getId() == ACTION_DELETE) {
+                presenter.removeContact(mContactUri);
+            }
+        });
+
+        ClassPresenterSelector mPresenterSelector = new ClassPresenterSelector();
+        mPresenterSelector.addClassPresenter(DetailsOverviewRow.class, detailsPresenter);
+        mPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
+        mAdapter = new ArrayObjectAdapter(mPresenterSelector);
+        setAdapter(mAdapter);
+    }
+
+    public void showContact(TVListViewModel model) {
+        final DetailsOverviewRow row = new DetailsOverviewRow(model);
+        AvatarDrawable avatar = new AvatarDrawable(getActivity(), model.getContact(), false);
+        avatar.setInSize(iconSize);
+        row.setImageDrawable(avatar);
+
+        ArrayObjectAdapter adapter = new ArrayObjectAdapter();
+        adapter.add(ACTION_CALL, new Action(ACTION_CALL, getResources().getString(R.string.ab_action_video_call)));
+        adapter.add(ACTION_DELETE, new Action(ACTION_DELETE, getResources().getString(R.string.conversation_action_remove_this)));
+        row.setActionsAdapter(adapter);
+
+        mAdapter.add(row);
+    }
+
+    @Override
+    public void callContact(String accountID, Uri uri) {
+        Intent intent = new Intent(getActivity(), TVCallActivity.class);
+        intent.putExtra(ConversationFragment.KEY_ACCOUNT_ID, accountID);
+        intent.putExtra(ConversationFragment.KEY_CONTACT_RING_ID, uri.getRawUriString());
+        getActivity().startActivity(intent, null);
+    }
+
+    @Override
+    public void finishView() {
+        getActivity().finish();
+    }
+}
diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java
new file mode 100644
index 0000000..a6af67f
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactPresenter.java
@@ -0,0 +1,77 @@
+/*
+ *  Copyright (C) 2004-2018 Savoir-faire Linux Inc.
+ *
+ *  Author: Hadrien De Sousa <hadrien.desousa@savoirfairelinux.com>
+ *  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.tv.contact;
+
+import javax.inject.Inject;
+
+import cx.ring.facades.ConversationFacade;
+import cx.ring.model.Account;
+import cx.ring.model.RingError;
+import cx.ring.model.Uri;
+import cx.ring.mvp.RootPresenter;
+import cx.ring.services.AccountService;
+import cx.ring.services.HardwareService;
+import cx.ring.tv.model.TVListViewModel;
+import io.reactivex.Scheduler;
+
+public class TVContactPresenter extends RootPresenter<TVContactView> {
+
+    private final AccountService mAccountService;
+    private final ConversationFacade mConversationService;
+    private final HardwareService mHardwareService;
+    private final Scheduler mUiScheduler;
+
+    @Inject
+    public TVContactPresenter(AccountService accountService,
+                              ConversationFacade conversationService,
+                              HardwareService hardwareService,
+                              Scheduler uiScheduler) {
+        mAccountService = accountService;
+        mConversationService = conversationService;
+        mHardwareService = hardwareService;
+        mUiScheduler = uiScheduler;
+    }
+
+    public void setContact(Uri uri) {
+        mCompositeDisposable.add(mConversationService
+                .getCurrentAccountSubject()
+                .map(a -> new TVListViewModel(a.getByUri(uri).getContact()))
+                .observeOn(mUiScheduler)
+                .subscribe(c -> getView().showContact(c)));
+    }
+
+    public void removeContact(Uri viewModel) {
+        String accountId = mAccountService.getCurrentAccount().getAccountID();
+        mConversationService.removeConversation(accountId, viewModel).subscribe();
+        getView().finishView();
+    }
+
+    public void contactClicked(Uri uri) {
+        if (!mHardwareService.isVideoAvailable() && !mHardwareService.hasMicrophone()) {
+            getView().displayErrorToast(RingError.NO_INPUT);
+            return;
+        }
+
+        Account account = mAccountService.getCurrentAccount();
+        getView().callContact(account.getAccountID(), uri);
+    }
+
+}
diff --git a/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactView.java b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactView.java
new file mode 100644
index 0000000..e0dcda7
--- /dev/null
+++ b/ring-android/app/src/main/java/cx/ring/tv/contact/TVContactView.java
@@ -0,0 +1,31 @@
+/*
+ *  Copyright (C) 2004-2018 Savoir-faire Linux Inc.
+ *
+ *  Author: Hadrien De Sousa <hadrien.desousa@savoirfairelinux.com>
+ *  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.tv.contact;
+
+import cx.ring.model.Uri;
+import cx.ring.mvp.BaseView;
+import cx.ring.tv.model.TVListViewModel;
+
+public interface TVContactView extends BaseView {
+     void showContact(TVListViewModel model);
+     void callContact(String accountID, Uri uri);
+     void finishView();
+}
diff --git a/ring-android/app/src/main/java/cx/ring/tv/contactrequest/TVContactRequestFragment.java b/ring-android/app/src/main/java/cx/ring/tv/contactrequest/TVContactRequestFragment.java
index 48c6ff8..895f3e5 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/contactrequest/TVContactRequestFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/contactrequest/TVContactRequestFragment.java
@@ -33,15 +33,11 @@
 import androidx.leanback.widget.FullWidthDetailsOverviewSharedElementHelper;
 import androidx.leanback.widget.ListRow;
 import androidx.leanback.widget.ListRowPresenter;
-import androidx.leanback.widget.Presenter;
 import androidx.leanback.widget.SparseArrayObjectAdapter;
 import androidx.core.content.ContextCompat;
 
 import android.view.KeyEvent;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
 
 import cx.ring.R;
 import cx.ring.application.RingApplication;
@@ -52,15 +48,13 @@
 
 public class TVContactRequestFragment extends BaseDetailFragment<TVContactRequestPresenter> implements TVContactRequestView {
 
-    private static final int ACTION_ACCEPT = 1;
-    private static final int ACTION_REFUSE = 2;
-    private static final int ACTION_BLOCK = 3;
+    private static final int ACTION_ACCEPT = 0;
+    private static final int ACTION_REFUSE = 1;
+    private static final int ACTION_BLOCK = 2;
 
     private Uri mSelectedContactRequest;
     private ArrayObjectAdapter mAdapter;
     private int iconSize = -1;
-    private int imageCardWidth = -1;
-    private int imageCardHeight = -1;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -86,8 +80,6 @@
         }
         Resources res = getResources();
         iconSize = res.getDimensionPixelSize(R.dimen.tv_avatar_size);
-        imageCardWidth = res.getDimensionPixelSize(R.dimen.default_image_card_width);
-        imageCardHeight = res.getDimensionPixelSize(R.dimen.default_image_card_height);
         presenter.setContact(mSelectedContactRequest);
     }
 
@@ -98,9 +90,9 @@
 
     private void setupAdapter() {
         // Set detail background and style.
-        FullWidthDetailsOverviewRowPresenter detailsPresenter =
-                new FullWidthDetailsOverviewRowPresenter(new TVContactRequestDetailPresenter(),
-                        new LogoPresenter(imageCardWidth, imageCardHeight));
+        FullWidthDetailsOverviewRowPresenter detailsPresenter = new FullWidthDetailsOverviewRowPresenter(
+                new TVContactRequestDetailPresenter(),
+                new DetailsOverviewLogoPresenter());
 
         detailsPresenter.setBackgroundColor(
                 ContextCompat.getColor(getActivity(), R.color.color_primary_dark));
@@ -108,8 +100,7 @@
 
         // Hook up transition element.
         FullWidthDetailsOverviewSharedElementHelper mHelper = new FullWidthDetailsOverviewSharedElementHelper();
-        mHelper.setSharedElementEnterTransition(getActivity(),
-                TVContactRequestActivity.SHARED_ELEMENT_NAME);
+        mHelper.setSharedElementEnterTransition(getActivity(), TVContactRequestActivity.SHARED_ELEMENT_NAME);
         detailsPresenter.setListener(mHelper);
         detailsPresenter.setParticipatingEntranceTransition(false);
         prepareEntranceTransition();
@@ -136,6 +127,7 @@
         AvatarDrawable avatar = new AvatarDrawable(getActivity(), model.getContact(), false);
         avatar.setInSize(iconSize);
         row.setImageDrawable(avatar);
+        row.setImageScaleUpAllowed(false);
 
         SparseArrayObjectAdapter adapter = new SparseArrayObjectAdapter();
         adapter.set(ACTION_ACCEPT, new Action(ACTION_ACCEPT, getResources()
@@ -151,32 +143,4 @@
     public void finishView() {
         getActivity().finish();
     }
-
-    static class LogoPresenter extends DetailsOverviewLogoPresenter {
-        private final int lw, lh;
-        LogoPresenter(int w, int h) {
-            lw = w;
-            lh = h;
-        }
-
-        @Override
-        public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) {
-            ImageView imageView = (ImageView) LayoutInflater.from(parent.getContext())
-                    .inflate(R.layout.lb_fullwidth_details_overview_logo, parent, false);
-            imageView.setLayoutParams(new ViewGroup.MarginLayoutParams(lw, lh));
-            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
-            return new ViewHolder(imageView);
-        }
-
-        @Override
-        public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
-            DetailsOverviewRow row = (DetailsOverviewRow) item;
-            ImageView imageView = ((ImageView) viewHolder.view);
-            imageView.setImageDrawable(row.getImageDrawable());
-            if (isBoundToImage((ViewHolder) viewHolder, row)) {
-                LogoPresenter.ViewHolder vh = (LogoPresenter.ViewHolder) viewHolder;
-                vh.getParentPresenter().notifyOnBindLogo(vh.getParentViewHolder());
-            }
-        }
-    }
 }
diff --git a/ring-android/app/src/main/java/cx/ring/tv/main/BaseDetailFragment.java b/ring-android/app/src/main/java/cx/ring/tv/main/BaseDetailFragment.java
index 315aa78..796c39f 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/main/BaseDetailFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/main/BaseDetailFragment.java
@@ -20,18 +20,18 @@
 package cx.ring.tv.main;
 
 import android.os.Bundle;
-import androidx.leanback.app.DetailsFragment;
 import android.view.View;
 import android.widget.Toast;
 
 import javax.inject.Inject;
 
+import androidx.leanback.app.DetailsSupportFragment;
 import cx.ring.R;
 import cx.ring.model.RingError;
 import cx.ring.mvp.BaseView;
 import cx.ring.mvp.RootPresenter;
 
-public class BaseDetailFragment<T extends RootPresenter> extends DetailsFragment implements BaseView {
+public class BaseDetailFragment<T extends RootPresenter> extends DetailsSupportFragment implements BaseView {
 
     protected static final String TAG = BaseBrowseFragment.class.getSimpleName();
 
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 d791cb7..c4a15fd 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
@@ -43,6 +43,7 @@
 
 import cx.ring.R;
 import cx.ring.application.RingApplication;
+import cx.ring.fragments.ConversationFragment;
 import cx.ring.model.Account;
 import cx.ring.navigation.RingNavigationViewModel;
 import cx.ring.services.VCardServiceImpl;
@@ -59,6 +60,7 @@
 import cx.ring.tv.cards.contacts.ContactCard;
 import cx.ring.tv.cards.iconcards.IconCard;
 import cx.ring.tv.cards.iconcards.IconCardHelper;
+import cx.ring.tv.contact.TVContactActivity;
 import cx.ring.tv.contactrequest.TVContactRequestActivity;
 import cx.ring.tv.model.TVListViewModel;
 import cx.ring.tv.search.SearchActivity;
@@ -239,10 +241,10 @@
     }
 
     @Override
-    public void callContact(String accountID, String ringID) {
+    public void callContact(String accountID, String number) {
         Intent intent = new Intent(getActivity(), TVCallActivity.class);
-        intent.putExtra("account", accountID);
-        intent.putExtra("ringId", ringID);
+        intent.putExtra(ConversationFragment.KEY_ACCOUNT_ID, accountID);
+        intent.putExtra(ConversationFragment.KEY_CONTACT_RING_ID, number);
         getActivity().startActivity(intent, null);
     }
 
@@ -316,7 +318,13 @@
                             TVContactRequestActivity.SHARED_ELEMENT_NAME).toBundle();
                     getActivity().startActivity(intent, bundle);
                 } else {
-                    presenter.contactClicked(model);
+                    Intent intent = new Intent(getActivity(), TVContactActivity.class);
+                    intent.putExtra(TVContactActivity.CONTACT_REQUEST, model.getContact().getPrimaryUri());
+
+                    Bundle bundle = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
+                            ((ImageCardView) itemViewHolder.view).getMainImageView(),
+                            TVContactRequestActivity.SHARED_ELEMENT_NAME).toBundle();
+                    getActivity().startActivity(intent, bundle);
                 }
             } else if (item instanceof IconCard) {
                 IconCard card = (IconCard) item;
diff --git a/ring-android/app/src/main/java/cx/ring/tv/search/RingSearchFragment.java b/ring-android/app/src/main/java/cx/ring/tv/search/RingSearchFragment.java
index 4dcd1be..5554981 100644
--- a/ring-android/app/src/main/java/cx/ring/tv/search/RingSearchFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/tv/search/RingSearchFragment.java
@@ -40,6 +40,7 @@
 import butterknife.Unbinder;
 import cx.ring.R;
 import cx.ring.application.RingApplication;
+import cx.ring.fragments.ConversationFragment;
 import cx.ring.model.CallContact;
 import cx.ring.tv.call.TVCallActivity;
 import cx.ring.tv.cards.Card;
@@ -128,8 +129,8 @@
     @Override
     public void startCall(String accountID, String number) {
         Intent intent = new Intent(getActivity(), TVCallActivity.class);
-        intent.putExtra("account", accountID);
-        intent.putExtra("ringId", number);
+        intent.putExtra(ConversationFragment.KEY_ACCOUNT_ID, accountID);
+        intent.putExtra(ConversationFragment.KEY_CONTACT_RING_ID, number);
         getActivity().startActivity(intent, null);
         getActivity().finish();
     }
diff --git a/ring-android/app/src/main/res/layout/tv_frag_contact.xml b/ring-android/app/src/main/res/layout/tv_frag_contact.xml
new file mode 100644
index 0000000..ba46381
--- /dev/null
+++ b/ring-android/app/src/main/res/layout/tv_frag_contact.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/details_fragment"
+    android:name="cx.ring.tv.contact.TVContactFragment"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content" />
\ No newline at end of file
