diff --git a/jami-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.kt b/jami-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.kt
index 13f62e9e6b9b7e0fe02b4d95b7a69a9db0fb4282..4521932f1d99f2224ab0dee4df66e7cfa0ca8ed9 100644
--- a/jami-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.kt
+++ b/jami-android/app/src/main/java/cx/ring/tv/contact/TVContactFragment.kt
@@ -57,9 +57,8 @@ class TVContactFragment : BaseDetailFragment<TVContactPresenter>(), TVContactVie
         else
             ConversationPath.fromIntent(requireActivity().intent)!!
         iconSize = resources.getDimensionPixelSize(R.dimen.tv_avatar_size)
-        presenter.setContact(mConversationPath)
-
         setupAdapter()
+        presenter.setContact(mConversationPath)
     }
 
     private fun setupAdapter() {
diff --git a/jami-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.kt b/jami-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.kt
index ce10e602bed8d586f0306bcc5d14c623b1c4ba2e..68701ad4a1727470d5ae5b8b187703d6a4a10ca0 100644
--- a/jami-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.kt
+++ b/jami-android/app/src/main/java/cx/ring/tv/conversation/TvConversationFragment.kt
@@ -43,6 +43,7 @@ import android.view.animation.Animation
 import android.widget.Toast
 import androidx.appcompat.app.AlertDialog
 import androidx.core.content.ContextCompat
+import androidx.core.view.isVisible
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.transition.TransitionManager
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -102,7 +103,37 @@ class TvConversationFragment : BaseSupportFragment<ConversationPresenter, Conver
     }
 
     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
-        FragConversationTvBinding.inflate(inflater, container, false).apply { binding = this }.root
+        FragConversationTvBinding.inflate(inflater, container, false).apply {
+            buttonText.setOnClickListener { displaySpeechRecognizer() }
+            buttonVideo.setOnClickListener {
+                if (checkAudioPermission(REQUEST_AUDIO_PERMISSION_FOR_VIDEO))
+                    openVideoRecorder()
+            }
+            buttonAudio.setOnClickListener {
+                onRecord(mStartRecording)
+                mStartRecording = !mStartRecording
+            }
+            buttonText.onFocusChangeListener =
+                View.OnFocusChangeListener { _, hasFocus: Boolean ->
+                    TransitionManager.beginDelayedTransition(textContainer)
+                    textText.visibility = if (hasFocus) View.VISIBLE else View.GONE
+                }
+            buttonAudio.onFocusChangeListener =
+                View.OnFocusChangeListener { _, hasFocus: Boolean ->
+                    TransitionManager.beginDelayedTransition(audioContainer)
+                    textAudio.visibility = if (hasFocus) View.VISIBLE else View.GONE
+                }
+            buttonVideo.onFocusChangeListener =
+                View.OnFocusChangeListener { _, hasFocus: Boolean ->
+                    TransitionManager.beginDelayedTransition(videoContainer)
+                    textVideo.visibility = if (hasFocus) View.VISIBLE else View.GONE
+                }
+            recyclerView.layoutManager = LinearLayoutManager(root.context).apply {
+                reverseLayout = true
+                stackFromEnd = true
+            }
+            binding = this
+        }.root
 
     override fun onDestroyView() {
         super.onDestroyView()
@@ -135,43 +166,9 @@ class TvConversationFragment : BaseSupportFragment<ConversationPresenter, Conver
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-
-        //ConversationPath path = ConversationPath.fromIntent(requireActivity().getIntent());
-        presenter.init(mConversationPath!!.conversationUri, mConversationPath!!.accountId)
         mAdapter = TvConversationAdapter(this, presenter)
-
-        binding!!.let { binding ->
-            binding.buttonText.setOnClickListener { displaySpeechRecognizer() }
-            binding.buttonVideo.setOnClickListener {
-                if (checkAudioPermission(REQUEST_AUDIO_PERMISSION_FOR_VIDEO))
-                    openVideoRecorder()
-            }
-
-            binding.buttonAudio.setOnClickListener {
-                onRecord(mStartRecording)
-                mStartRecording = !mStartRecording
-            }
-            binding.buttonText.onFocusChangeListener =
-                View.OnFocusChangeListener { _, hasFocus: Boolean ->
-                    TransitionManager.beginDelayedTransition(binding.textContainer)
-                    binding.textText.visibility = if (hasFocus) View.VISIBLE else View.GONE
-                }
-            binding.buttonAudio.onFocusChangeListener =
-                View.OnFocusChangeListener { _, hasFocus: Boolean ->
-                    TransitionManager.beginDelayedTransition(binding.audioContainer)
-                    binding.textAudio.visibility = if (hasFocus) View.VISIBLE else View.GONE
-                }
-            binding.buttonVideo.onFocusChangeListener =
-                View.OnFocusChangeListener { _, hasFocus: Boolean ->
-                    TransitionManager.beginDelayedTransition(binding.videoContainer)
-                    binding.textVideo.visibility = if (hasFocus) View.VISIBLE else View.GONE
-                }
-            val linearLayoutManager = LinearLayoutManager(context)
-            linearLayoutManager.reverseLayout = true
-            linearLayoutManager.stackFromEnd = true
-            binding.recyclerView.layoutManager = linearLayoutManager
-            binding.recyclerView.adapter = mAdapter
-        }
+        presenter.init(mConversationPath!!.conversationUri, mConversationPath!!.accountId)
+        binding!!.recyclerView.adapter = mAdapter
     }
 
     private fun checkAudioPermission(code: Int): Boolean {
@@ -626,27 +623,50 @@ class TvConversationFragment : BaseSupportFragment<ConversationPresenter, Conver
 
     override fun goToContactActivity(accountId: String, uri: net.jami.model.Uri) {}
     override fun switchToUnknownView(name: String) {
-        // todo
+        binding?.apply {
+            conversationActionGroup.isVisible = false
+            conversationActionMessage.text = getString(R.string.message_contact_not_trusted, name)
+            conversationActionMessage.isVisible = true
+        }
     }
 
-    override fun switchToIncomingTrustRequestView(message: String) {
-        // todo
+    override fun switchToIncomingTrustRequestView(name: String) {
+        binding?.apply {
+            conversationActionGroup.isVisible = false
+            conversationActionMessage.text = name
+            conversationActionMessage.isVisible = true
+        }
     }
 
     override fun switchToConversationView() {
-        // todo
+        binding?.apply {
+            conversationActionGroup.isVisible = true
+            conversationActionMessage.isVisible = false
+        }
     }
 
     override fun switchToBannedView() {
-        // todo
+        binding?.apply {
+            conversationActionGroup.isVisible = false
+            conversationActionMessage.text = getString(R.string.conversation_contact_banned, "")
+            conversationActionMessage.isVisible = true
+        }
     }
 
     override fun switchToSyncingView() {
-        // todo
+        binding?.apply {
+            conversationActionGroup.isVisible = false
+            conversationActionMessage.text = getString(R.string.conversation_contact_banned, "")
+            conversationActionMessage.isVisible = true
+        }
     }
 
     override fun switchToEndedView() {
-        // todo
+        binding?.apply {
+            conversationActionGroup.isVisible = false
+            conversationActionMessage.text = getText(R.string.conversation_ended)
+            conversationActionMessage.isVisible = true
+        }
     }
 
     override fun openFilePicker() {}
diff --git a/jami-android/app/src/main/java/cx/ring/tv/main/MainFragment.kt b/jami-android/app/src/main/java/cx/ring/tv/main/MainFragment.kt
index 728d846b54ade759273a48e7f1303cc47501df21..9a6a64cd24f11a08f70947f5a22d62483ec3d5a8 100644
--- a/jami-android/app/src/main/java/cx/ring/tv/main/MainFragment.kt
+++ b/jami-android/app/src/main/java/cx/ring/tv/main/MainFragment.kt
@@ -88,34 +88,28 @@ class MainFragment : BaseBrowseFragment<MainPresenter>(), MainView {
     }
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        mTitleView = view.findViewById(R.id.browse_title_group)
-        super.onViewCreated(view, savedInstanceState)
-        setupUIElements(requireContext(), presenter.conversationFacade)
-    }
-
-    override fun onDestroyView() {
-        super.onDestroyView()
-        mDisposable.clear()
-    }
-
-    private fun setupUIElements(context: Context, conversationFacade: ConversationFacade) {
-        selector = CardPresenterSelector(context, conversationFacade)
+        mTitleView = view.findViewById<CustomTitleView>(R.id.browse_title_group).apply {
+            settingsButton.setOnClickListener { presenter.onSettingsClicked() }
+        }
+        onItemViewClickedListener = ItemViewClickedListener()
+        setOnSearchClickedListener { startActivity(Intent(context, SearchActivity::class.java)) }
+        selector = CardPresenterSelector(requireContext(), presenter.conversationFacade)
         cardRowAdapter = ArrayObjectAdapter(selector)
-
-        /* Contact Presenter */
         val contactRow = CardRow(false, getString(R.string.tv_contact_row_header), ArrayList())
         val cardPresenterHeader = HeaderItem(HEADER_CONTACTS, getString(R.string.tv_contact_row_header))
         val contactListRow = CardListRow(cardPresenterHeader, cardRowAdapter, contactRow)
-        accountSettingsRow = createAccountSettingsRow(context)
+        accountSettingsRow = createAccountSettingsRow(requireContext())
         adapter = ArrayObjectAdapter(ShadowRowPresenterSelector()).apply {
             add(contactListRow)
             add(accountSettingsRow)
         }
 
-        // listeners
-        setOnSearchClickedListener { startActivity(Intent(context, SearchActivity::class.java)) }
-        onItemViewClickedListener = ItemViewClickedListener()
-        mTitleView!!.settingsButton.setOnClickListener { presenter.onSettingsClicked() }
+        super.onViewCreated(view, savedInstanceState)
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        mDisposable.clear()
     }
 
     private fun createRow(titleSection: String, cards: List<Card>, shadow: Boolean): ListRow {
diff --git a/jami-android/app/src/main/res/layout/frag_conversation_tv.xml b/jami-android/app/src/main/res/layout/frag_conversation_tv.xml
index 70647e86179f64856e9884937bd410b31457d279..350c0b65311f972b870fb5af0c3ba0cb1ea4796e 100644
--- a/jami-android/app/src/main/res/layout/frag_conversation_tv.xml
+++ b/jami-android/app/src/main/res/layout/frag_conversation_tv.xml
@@ -63,7 +63,20 @@
                 app:cardCornerRadius="32dp"
                 app:cardElevation="4dp">
 
+                <TextView
+                    android:id="@+id/conversation_action_message"
+                    tools:text="@string/contact_request_msg"
+                    tools:visibility="visible"
+                    android:visibility="gone"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:textColor="@color/colorOnPrimary"
+                    android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
+                    android:gravity="center" />
+
                 <LinearLayout
+                    android:id="@+id/conversation_action_group"
+                    tools:visibility="gone"
                     android:layout_width="match_parent"
                     android:layout_height="match_parent"
                     android:baselineAligned="false"
diff --git a/jami-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt b/jami-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt
index a48c54372eb557dc091a2855491df4584e92cd19..ccbf9a78fe7d6a14790af0485cd571dd335f9dd8 100644
--- a/jami-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt
+++ b/jami-android/libjamiclient/src/main/kotlin/net/jami/conversation/ConversationPresenter.kt
@@ -92,7 +92,7 @@ class ConversationPresenter @Inject constructor(
     }
 
     private fun setConversation(account: Account, conversation: Conversation) {
-        Log.w(TAG, "setConversation " + conversation.aggregateHistory.size)
+        Log.w(TAG, "setConversation ${conversation.aggregateHistory.size}")
         if (mConversation == conversation) return
         mConversation = conversation
         mConversationSubject.onNext(conversation)
@@ -116,12 +116,9 @@ class ConversationPresenter @Inject constructor(
             }) { e -> Log.e(TAG, "Error loading conversation", e) })
     }
 
-    private fun initContact(account: Account,
-                            c: ConversationItemViewModel,
-                            view: ConversationView
-    ) {
+    private fun initContact(account: Account, c: ConversationItemViewModel, view: ConversationView) {
         if (account.isJami) {
-            Log.w(TAG, "initContact " + c.uri + " mode: " + c.mode)
+            Log.w(TAG, "initContact ${c.uri} mode: ${c.mode}")
             if (c.mode === Conversation.Mode.Syncing) {
                 view.switchToSyncingView()
             } else if (c.mode == Conversation.Mode.Request) {
@@ -146,7 +143,7 @@ class ConversationPresenter @Inject constructor(
     }
 
     private fun initView(account: Account, c: Conversation, view: ConversationView) {
-        Log.w(TAG, "initView " + c.uri)
+        Log.w(TAG, "initView ${c.uri}")
         val disposable = mConversationDisposable?.apply { clear() } ?: CompositeDisposable().apply {
             mConversationDisposable = this
             mCompositeDisposable.add(this)
@@ -179,14 +176,12 @@ class ConversationPresenter @Inject constructor(
             })
         disposable.add(c.sortedHistory
             .observeOn(uiScheduler)
-            .subscribe({ conversation: List<Interaction> -> this.view?.refreshView(conversation) }) { e: Throwable ->
-                Log.e(TAG, "Can't update element", e)
-            })
+            .subscribe({ conversation -> this.view?.refreshView(conversation) })
+                { e -> Log.e(TAG, "Can't update element", e) })
         disposable.add(c.cleared
             .observeOn(uiScheduler)
-            .subscribe({ conversation: List<Interaction> -> this.view?.refreshView(conversation) }) { e: Throwable ->
-                Log.e(TAG, "Can't update elements", e)
-            })
+            .subscribe({ conversation -> this.view?.refreshView(conversation) })
+                { e -> Log.e(TAG, "Can't update elements", e) })
         disposable.add(c.contactUpdates
             .switchMap { contacts -> Observable.merge(contactService.observeLoadedContact(c.accountId, contacts, true)) }
             .observeOn(uiScheduler)