[automerger skipped] Import translations. DO NOT MERGE ANYWHERE am: 910bae76fa -s ours

am skip reason: subject contains skip directive

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Car/Dialer/+/12880149

Change-Id: Iad815f0fc73f4029dcc7f90eb39b673a5bd308d9
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..32c0811
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,132 @@
+//
+// Copyright (C) 2015 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+android_app {
+    name: "CarDialerApp",
+
+    srcs: ["src/**/*.java"],
+
+    resource_dirs: ["res"],
+
+    platform_apis: true,
+
+    required: ["privapp_whitelist_com.android.car.dialer"],
+
+    overrides: ["Dialer"],
+
+    libs: ["android.car"],
+
+    static_libs: [
+        "androidx.recyclerview_recyclerview",
+        "androidx.lifecycle_lifecycle-extensions",
+        "androidx.preference_preference",
+        "androidx-constraintlayout_constraintlayout",
+        "androidx.legacy_legacy-support-v4",
+        "androidx.cardview_cardview",
+        "car-apps-common",
+        "car-arch-common",
+        "car-telephony-common",
+        "car-theme-lib",
+        "car-ui-lib",
+        "car-uxr-client-lib",
+        "androidx-constraintlayout_constraintlayout-solver",
+        "guava",
+        "glide-prebuilt",
+        "libphonenumber",
+        "androidx.sqlite_sqlite-framework",
+        "androidx.sqlite_sqlite",
+        "androidx.room_room-runtime",
+    ],
+
+    plugins: ["androidx.room_room-compiler-plugin"],
+
+    optimize: {
+        enabled: false,
+    },
+
+    privileged: true,
+
+    dex_preopt: {
+        enabled: false,
+    },
+
+    product_variables: {
+        pdk: {
+            enabled: false,
+        },
+    },
+}
+
+//##################################################################################
+// Duplicate of CarDialerApp which includes testing only resources for Robolectric #
+//##################################################################################
+
+android_app {
+    name: "CarDialerAppForTesting",
+
+    srcs: ["src/**/*.java"],
+
+    resource_dirs: [
+        "res",
+        "tests/robotests/res",
+    ],
+
+    platform_apis: true,
+
+    libs: ["android.car"],
+
+    static_libs: [
+        "androidx.recyclerview_recyclerview",
+        "androidx.lifecycle_lifecycle-extensions",
+        "androidx.preference_preference",
+        "androidx-constraintlayout_constraintlayout",
+        "androidx.legacy_legacy-support-v4",
+        "androidx.cardview_cardview",
+        "car-apps-common",
+        "car-arch-common",
+        "car-telephony-common",
+        "car-theme-lib",
+        "car-ui-lib",
+        "car-uxr-client-lib",
+        "androidx-constraintlayout_constraintlayout-solver",
+        "guava",
+        "glide-prebuilt",
+        "libphonenumber",
+        "androidx.sqlite_sqlite-framework",
+        "androidx.sqlite_sqlite",
+        "androidx.room_room-runtime",
+    ],
+
+    plugins: ["androidx.room_room-compiler-plugin"],
+
+    optimize: {
+        enabled: false,
+    },
+
+    privileged: true,
+
+    dex_preopt: {
+        enabled: false,
+    },
+
+    product_variables: {
+        pdk: {
+            enabled: false,
+        },
+    },
+}
+
+//##################################################################################
diff --git a/Android.mk b/Android.mk
deleted file mode 100644
index ad4996f..0000000
--- a/Android.mk
+++ /dev/null
@@ -1,178 +0,0 @@
-#
-# Copyright (C) 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-ifneq ($(TARGET_BUILD_PDK), true)
-
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-
-LOCAL_PACKAGE_NAME := CarDialerApp
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_REQUIRED_MODULES := privapp_whitelist_com.android.car.dialer
-
-LOCAL_OVERRIDES_PACKAGES := Dialer
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_USE_AAPT2 := true
-
-LOCAL_JAVA_LIBRARIES += \
-    android.car
-
-LOCAL_STATIC_ANDROID_LIBRARIES += \
-    androidx.recyclerview_recyclerview \
-    androidx.lifecycle_lifecycle-extensions \
-    androidx.preference_preference \
-    androidx-constraintlayout_constraintlayout \
-    androidx.legacy_legacy-support-v4 \
-    androidx.cardview_cardview \
-    car-apps-common \
-    car-arch-common \
-    car-telephony-common \
-    car-theme-lib \
-    car-ui-lib \
-    car-uxr-client-lib
-
-# Including the resources for the static android libraries allows to pick up their static overlays.
-LOCAL_RESOURCE_DIR += \
-    $(LOCAL_PATH)/../libs/car-apps-common/res \
-    $(LOCAL_PATH)/../libs/car-telephony-common/res \
-    $(LOCAL_PATH)/../libs/car-theme-lib/res \
-    $(LOCAL_PATH)/../libs/car-ui-lib/res \
-    $(LOCAL_PATH)/../libs/car-uxr-client-lib/res
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    androidx-constraintlayout_constraintlayout-solver \
-    guava \
-    car-glide \
-    car-glide-disklrucache \
-    car-gifdecoder \
-    libphonenumber \
-    androidx.sqlite_sqlite-framework \
-    androidx.sqlite_sqlite \
-    car-androidx-room-common-nodeps \
-    car-androidx-room-runtime-nodeps
-
-LOCAL_ANNOTATION_PROCESSORS := \
-    car-androidx-annotation-nodeps \
-    car-androidx-room-common-nodeps \
-    car-androidx-room-compiler-nodeps \
-    car-androidx-room-migration-nodeps \
-    car-antlr4-nodeps \
-    car-apache-commons-codec-nodeps \
-    car-auto-common-nodeps \
-    car-javapoet-nodeps \
-    car-jetbrains-annotations-nodeps \
-    car-kotlin-metadata-nodeps \
-    car-sqlite-jdbc-nodeps \
-    guava-21.0 \
-    kotlin-stdlib
-
-LOCAL_ANNOTATION_PROCESSOR_CLASSES := \
-    androidx.room.RoomProcessor
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_DEX_PREOPT := false
-
-include $(BUILD_PACKAGE)
-
-###################################################################################
-# Duplicate of CarDialerApp which includes testing only resources for Robolectric #
-###################################################################################
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_RESOURCE_DIR := \
-    $(LOCAL_PATH)/res \
-    $(LOCAL_PATH)/tests/robotests/res
-
-LOCAL_PACKAGE_NAME := CarDialerAppForTesting
-LOCAL_PRIVATE_PLATFORM_APIS := true
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_USE_AAPT2 := true
-
-LOCAL_JAVA_LIBRARIES += \
-    android.car
-
-LOCAL_STATIC_ANDROID_LIBRARIES += \
-    androidx.recyclerview_recyclerview \
-    androidx.lifecycle_lifecycle-extensions \
-    androidx.preference_preference \
-    androidx-constraintlayout_constraintlayout \
-    androidx.legacy_legacy-support-v4 \
-    androidx.cardview_cardview \
-    car-apps-common \
-    car-arch-common \
-    car-telephony-common \
-    car-theme-lib \
-    car-ui-lib \
-    car-uxr-client-lib
-
-LOCAL_STATIC_JAVA_LIBRARIES := \
-    androidx-constraintlayout_constraintlayout-solver \
-    guava \
-    car-glide \
-    car-glide-disklrucache \
-    car-gifdecoder \
-    libphonenumber \
-    androidx.sqlite_sqlite-framework \
-    androidx.sqlite_sqlite \
-    car-androidx-room-common-nodeps \
-    car-androidx-room-runtime-nodeps
-
-LOCAL_ANNOTATION_PROCESSORS := \
-    car-androidx-annotation-nodeps \
-    car-androidx-room-common-nodeps \
-    car-androidx-room-compiler-nodeps \
-    car-androidx-room-migration-nodeps \
-    car-antlr4-nodeps \
-    car-apache-commons-codec-nodeps \
-    car-auto-common-nodeps \
-    car-javapoet-nodeps \
-    car-jetbrains-annotations-nodeps \
-    car-kotlin-metadata-nodeps \
-    car-sqlite-jdbc-nodeps \
-    guava-21.0 \
-    kotlin-stdlib
-
-LOCAL_ANNOTATION_PROCESSOR_CLASSES := \
-    androidx.room.RoomProcessor
-
-LOCAL_PROGUARD_ENABLED := disabled
-
-LOCAL_PRIVILEGED_MODULE := true
-
-LOCAL_DEX_PREOPT := false
-
-include $(BUILD_PACKAGE)
-###################################################################################
-
-# Use the following include to make our test apk.
-ifeq (,$(ONE_SHOT_MAKEFILE))
-include $(call all-makefiles-under,$(LOCAL_PATH))
-endif
-
-endif
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 70bfcce..eed8a1e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -19,7 +19,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     package="com.android.car.dialer">
 
-    <uses-sdk android:minSdkVersion="24" android:targetSdkVersion='24'/>
+    <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29"/>
 
     <uses-permission android:name="android.permission.BLUETOOTH"/>
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
@@ -52,6 +52,11 @@
             <meta-data android:name="distractionOptimized" android:value="true"/>
             <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
             <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+            <intent-filter>
                 <action android:name="android.intent.action.DIAL"/>
                 <category android:name="android.intent.category.DEFAULT"/>
             </intent-filter>
@@ -65,11 +70,6 @@
                 <category android:name="android.intent.category.DEFAULT"/>
                 <data android:scheme="tel"/>
             </intent-filter>
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
 
             <intent-filter>
                 <action android:name="android.intent.action.SEARCH"/>
@@ -98,6 +98,11 @@
                   android:label="@string/setting_title">
         </activity>
 
+        <activity android:name=".ui.NoHfpActivity"
+                  android:launchMode="singleTask"
+                  android:theme="@style/Theme.Dialer.ErrorActivity">
+        </activity>
+
         <service android:name="com.android.car.dialer.telecom.InCallServiceImpl"
                  android:permission="android.permission.BIND_INCALL_SERVICE"
                  android:exported="true">
@@ -128,13 +133,5 @@
             </intent-filter>
         </receiver>
 
-        <!-- Workaround for b/113294940, remove when converting to Android.bp -->
-        <provider
-            android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
-            tools:replace="android:authorities"
-            android:authorities="${applicationId}"
-            android:exported="false"
-            android:multiprocess="true" />
-
     </application>
 </manifest>
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..0ebddf2
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,6 @@
+# Default code reviewers picked from top 3 or more developers.
+# Please update this list if you find better candidates.
+ajchen@google.com
+# sriniv@google.com     # not found in AOSP Gerrit yet
+# jiayuzhou@google.com  # not found in AOSP Gerrit yet
+igorr@google.com
diff --git a/res/color/primary_text_selector.xml b/res/color/primary_text_selector.xml
deleted file mode 100644
index b6c837c..0000000
--- a/res/color/primary_text_selector.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!--
-  Copyright (C) 2019 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:color="@color/primary_text_color"
-          android:state_enabled="true"/>
-    <item android:color="@color/secondary_text_color"
-          android:state_enabled="false"/>
-</selector>
diff --git a/res/drawable/ic_contact.xml b/res/drawable/ic_contact.xml
index 56785b9..e4003d7 100644
--- a/res/drawable/ic_contact.xml
+++ b/res/drawable/ic_contact.xml
@@ -14,11 +14,11 @@
 limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:viewportWidth="48"
-        android:viewportHeight="48"
+        android:viewportWidth="24"
+        android:viewportHeight="24"
         android:width="@dimen/primary_icon_size"
         android:height="@dimen/primary_icon_size">
     <path
-        android:pathData="M6 10l0 28c0 2.21 1.79 4 4 4l28 0c2.21 0 4 -1.79 4 -4L42 10C42 7.79 40.21 6 38 6L10 6C7.79 6 6 7.79 6 10Zm24 8c0 3.32 -2.69 6 -6 6 -3.31 0 -6 -2.68 -6 -6 0 -3.31 2.69 -6 6 -6 3.31 0 6 2.69 6 6zM12 34c0 -4 8 -6.2 12 -6.2 4 0 12 2.2 12 6.2l0 2 -24 0 0 -2z"
+        android:pathData="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z"
         android:fillColor="#000000"/>
 </vector>
\ No newline at end of file
diff --git a/res/drawable/ic_merge.xml b/res/drawable/ic_merge.xml
new file mode 100644
index 0000000..443fed6
--- /dev/null
+++ b/res/drawable/ic_merge.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="@dimen/primary_icon_size"
+        android:height="@dimen/primary_icon_size"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0"
+        android:tint="@color/icon_tint_state_list">
+  <path
+      android:pathData="M18.41,18.59L17,20l-3.41,-3.41L15,15.18l3.41,3.41zM16.5,7.5L12,3 7.5,7.5l1.41,1.41L11,6.83v6.35l-5.41,5.41L7,20l6,-6V6.83l2.09,2.09L16.5,7.5z"
+      android:fillColor="#000000"/>
+</vector>
diff --git a/res/drawable/ic_swap_calls.xml b/res/drawable/ic_swap_calls.xml
deleted file mode 100644
index 098ca97..0000000
--- a/res/drawable/ic_swap_calls.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="@dimen/primary_icon_size"
-        android:height="@dimen/primary_icon_size"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-
-    <path
-        android:pathData="M0 0h24v24H0z" />
-    <path
-        android:fillColor="#fffafafa"
-        android:pathData="M18 4l-4 4h3v7c0 1.1-.9 2-2 2s-2-.9-2-2V8c0-2.21-1.79-4-4-4S5 5.79 5 8v7H2l4 4 4-4H7V8c0-1.1.9-2 2-2s2 .9 2 2v7c0 2.21 1.79 4 4 4s4-1.79 4-4V8h3l-4-4z"/>
-</vector>
diff --git a/res/layout-h456dp/keypad_dividers.xml b/res/layout-h456dp/keypad_dividers.xml
deleted file mode 100644
index 196543a..0000000
--- a/res/layout-h456dp/keypad_dividers.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2019 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-<merge
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto">
-
-    <!-- Add horizontal dividers -->
-    <View
-        android:background="@color/divider_color"
-        android:layout_height="@dimen/dialpad_line_divider_height"
-        android:layout_width="0dp"
-        app:layout_constraintTop_toBottomOf="@id/one"
-        app:layout_constraintBottom_toTopOf="@id/four"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"/>
-
-    <View
-        android:background="@color/divider_color"
-        android:layout_height="@dimen/dialpad_line_divider_height"
-        android:layout_width="0dp"
-        app:layout_constraintTop_toBottomOf="@id/four"
-        app:layout_constraintBottom_toTopOf="@id/seven"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"/>
-
-    <View
-        android:background="@color/divider_color"
-        android:layout_height="@dimen/dialpad_line_divider_height"
-        android:layout_width="0dp"
-        app:layout_constraintTop_toBottomOf="@id/seven"
-        app:layout_constraintBottom_toTopOf="@id/star"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"/>
-
-    <!-- Add vertical dividers-->
-    <View
-        android:background="@color/divider_color"
-        android:layout_height="0dp"
-        android:layout_width="@dimen/dialpad_line_divider_height"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toEndOf="@id/one"
-        app:layout_constraintEnd_toStartOf="@id/two"/>
-
-    <View
-        android:background="@color/divider_color"
-        android:layout_height="0dp"
-        android:layout_width="@dimen/dialpad_line_divider_height"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toEndOf="@id/two"
-        app:layout_constraintEnd_toStartOf="@id/three"/>
-
-</merge>
diff --git a/res/layout-port/dialpad_fragment.xml b/res/layout-port/dialpad_fragment.xml
deleted file mode 100644
index 6c28f31..0000000
--- a/res/layout-port/dialpad_fragment.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 The Android Open Source Project
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-       http://www.apache.org/licenses/LICENSE-2.0
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<androidx.constraintlayout.widget.ConstraintLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <androidx.constraintlayout.widget.Guideline
-        android:id="@+id/type_down_guideline"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal"
-        app:layout_constraintGuide_percent="@dimen/config_type_down_guideline_percent"/>
-
-    <fragment
-        android:id="@+id/dialpad_fragment"
-        android:name="com.android.car.dialer.ui.dialpad.KeypadFragment"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        android:layout_marginStart="@dimen/dialpad_info_margin_start"
-        app:layout_constraintTop_toBottomOf="@id/type_down_guideline"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"/>
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/dialpad_line_divider_height"
-        android:background="@color/divider_color"
-        android:layout_marginStart="@dimen/horizontal_divider_inset"
-        android:layout_marginEnd="@dimen/horizontal_divider_inset"
-        app:layout_constraintTop_toBottomOf="@id/type_down_guideline"/>
-
-    <include
-        layout="@layout/dialpad_info"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        app:layout_constraintTop_toTopOf="@id/dialpad_fragment"
-        app:layout_constraintBottom_toBottomOf="@id/dialpad_fragment"
-        app:layout_constraintStart_toEndOf="@id/dialpad_fragment"
-        app:layout_constraintEnd_toEndOf="parent"/>
-
-    <include
-        layout="@layout/list_fragment"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toTopOf="@id/type_down_guideline"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"/>
-
-</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/conference_call_user_list.xml b/res/layout/conference_call_user_list.xml
new file mode 100644
index 0000000..4a07c62
--- /dev/null
+++ b/res/layout/conference_call_user_list.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    app:layout_constraintBottom_toBottomOf="parent"
+    app:layout_constraintTop_toTopOf="parent"
+    app:layout_constraintEnd_toEndOf="parent"
+    app:layout_constraintStart_toStartOf="parent">
+
+    <LinearLayout
+        android:id="@+id/conference_header"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="35dp"
+        android:layout_marginBottom="35dp"
+        android:layout_marginLeft="170dp"
+        app:layout_constraintBottom_toTopOf="@+id/recycler_view"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <TextView
+            android:id="@+id/conference_title"
+            android:textAppearance="@style/TextAppearance.InCallState"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <!-- A textView without a fixed width will call requestLayout() every time its text is changed -->
+        <!-- So we have to make this Chronometer match_parent to avoid redrawing the whole screen -->
+        <Chronometer
+            android:id="@+id/call_duration"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.InCallState"
+            android:singleLine="true"/>
+    </LinearLayout>
+
+    <com.android.car.ui.recyclerview.CarUiRecyclerView
+        android:id="@+id/recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_marginTop="30dp"
+        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/conference_header"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/res/layout/dialpad_fragment.xml b/res/layout/dialpad_fragment_with_type_down.xml
similarity index 61%
copy from res/layout/dialpad_fragment.xml
copy to res/layout/dialpad_fragment_with_type_down.xml
index a265518..6986311 100644
--- a/res/layout/dialpad_fragment.xml
+++ b/res/layout/dialpad_fragment_with_type_down.xml
@@ -19,15 +19,29 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <fragment
-        android:id="@+id/dialpad_fragment"
-        android:name="com.android.car.dialer.ui.dialpad.KeypadFragment"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
+    <com.android.car.ui.FocusArea
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:gravity="center_horizontal"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toStartOf="@+id/divider"/>
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toLeftOf="@+id/divider">
+
+        <fragment
+            android:id="@+id/dialpad_fragment"
+            android:name="com.android.car.dialer.ui.dialpad.KeypadFragment"
+            android:layout_weight="1"
+            android:layout_height="match_parent"
+            android:layout_width="wrap_content"/>
+
+        <ImageView
+            android:id="@+id/call_button"
+            style="@style/DialpadPrimaryButton"
+            android:src="@drawable/icon_call_button"/>
+
+    </com.android.car.ui.FocusArea>
 
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/divider"
@@ -36,13 +50,14 @@
         android:orientation="vertical"
         app:layout_constraintGuide_percent="0.5"/>
 
-    <FrameLayout
-        android:layout_height="0dp"
+    <com.android.car.ui.FocusArea
         android:layout_width="0dp"
+        android:layout_height="0dp"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toEndOf="@id/divider"
-        app:layout_constraintEnd_toEndOf="parent">
+        app:layout_constraintLeft_toRightOf="@id/divider"
+        app:layout_constraintRight_toRightOf="parent">
         <include layout="@layout/dialpad_info"/>
-    </FrameLayout>
+    </com.android.car.ui.FocusArea>
+
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/dialpad_fragment.xml b/res/layout/dialpad_fragment_without_type_down.xml
similarity index 67%
rename from res/layout/dialpad_fragment.xml
rename to res/layout/dialpad_fragment_without_type_down.xml
index a265518..d1ee53b 100644
--- a/res/layout/dialpad_fragment.xml
+++ b/res/layout/dialpad_fragment_without_type_down.xml
@@ -1,12 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
+<!-- Copyright (C) 2020 The Android Open Source Project
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
-
        http://www.apache.org/licenses/LICENSE-2.0
-
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -19,16 +16,6 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <fragment
-        android:id="@+id/dialpad_fragment"
-        android:name="com.android.car.dialer.ui.dialpad.KeypadFragment"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toStartOf="@+id/divider"/>
-
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/divider"
         android:layout_width="wrap_content"
@@ -36,13 +23,32 @@
         android:orientation="vertical"
         app:layout_constraintGuide_percent="0.5"/>
 
-    <FrameLayout
-        android:layout_height="0dp"
-        android:layout_width="0dp"
+    <fragment
+        android:id="@+id/dialpad_fragment"
+        android:name="com.android.car.dialer.ui.dialpad.KeypadFragment"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toEndOf="@id/divider"
-        app:layout_constraintEnd_toEndOf="parent">
-        <include layout="@layout/dialpad_info"/>
-    </FrameLayout>
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toLeftOf="@+id/divider"/>
+
+    <include
+        layout="@layout/dialpad_info"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintTop_toTopOf="@id/dialpad_fragment"
+        app:layout_constraintBottom_toTopOf="@+id/call_button"
+        app:layout_constraintLeft_toRightOf="@id/divider"
+        app:layout_constraintRight_toRightOf="parent"/>
+
+    <ImageView
+        android:id="@+id/call_button"
+        style="@style/DialpadPrimaryButton"
+        android:src="@drawable/icon_call_button"
+        android:layout_marginBottom="@dimen/dialpad_info_edge_padding_size"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toRightOf="@id/divider"
+        app:layout_constraintRight_toRightOf="parent"/>
+
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/dialpad_info.xml b/res/layout/dialpad_info.xml
index d92afd5..25001c4 100644
--- a/res/layout/dialpad_info.xml
+++ b/res/layout/dialpad_info.xml
@@ -52,22 +52,13 @@
         app:layout_constraintLeft_toRightOf="@id/title"
         app:layout_constraintRight_toRightOf="parent"/>
 
-    <ImageView
-        android:id="@+id/call_button"
-        style="@style/DialpadPrimaryButton"
-        android:src="@drawable/icon_call_button"
-        android:layout_marginBottom="@dimen/dialpad_info_edge_padding_size"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"/>
-
     <include
         layout="@layout/dialpad_user_profile"
         android:layout_width="match_parent"
         android:layout_height="0dp"
         android:layout_marginTop="@dimen/dialpad_user_profile_padding"
         app:layout_constraintTop_toBottomOf="@id/title"
-        app:layout_constraintBottom_toTopOf="@id/call_button"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"/>
 
@@ -77,7 +68,7 @@
         android:layout_height="0dp"
         android:layout_marginBottom="@dimen/dialpad_user_profile_padding"
         app:layout_constraintTop_toBottomOf="@id/title"
-        app:layout_constraintBottom_toTopOf="@id/call_button"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintEnd_toEndOf="parent"/>
 
diff --git a/res/layout/in_call_activity.xml b/res/layout/in_call_activity.xml
index c7a0684..23dc0fe 100644
--- a/res/layout/in_call_activity.xml
+++ b/res/layout/in_call_activity.xml
@@ -28,4 +28,10 @@
         android:id="@+id/ongoing_call_fragment"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
+
+    <fragment
+        android:name="com.android.car.dialer.ui.activecall.OngoingConfCallFragment"
+        android:id="@+id/ongoing_conf_call_fragment"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
 </FrameLayout>
diff --git a/res/layout/incall_dialpad_fragment.xml b/res/layout/incall_dialpad_fragment.xml
index 1d1dc4c..c66d64d 100644
--- a/res/layout/incall_dialpad_fragment.xml
+++ b/res/layout/incall_dialpad_fragment.xml
@@ -20,15 +20,22 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <fragment
-        android:id="@+id/dialpad_fragment"
-        android:name="com.android.car.dialer.ui.dialpad.KeypadFragment"
-        android:layout_height="wrap_content"
-        android:layout_width="wrap_content"
+    <com.android.car.ui.FocusArea
+        android:id="@+id/dialpad_focus_area"
+        android:layout_height="0dp"
+        android:layout_width="0dp"
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toStartOf="@+id/divider"/>
+        app:layout_constraintEnd_toStartOf="@+id/divider">
+
+        <fragment
+            android:id="@+id/dialpad_fragment"
+            android:name="com.android.car.dialer.ui.dialpad.KeypadFragment"
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"/>
+
+    </com.android.car.ui.FocusArea>
 
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/divider"
@@ -42,8 +49,8 @@
         android:layout_width="0dp"
         android:id="@+id/dialpad_info_boundaries"
         app:layout_constraintDimensionRatio="W, 1:1"
-        app:layout_constraintTop_toTopOf="@id/dialpad_fragment"
-        app:layout_constraintBottom_toBottomOf="@id/dialpad_fragment"
+        app:layout_constraintTop_toTopOf="@id/dialpad_focus_area"
+        app:layout_constraintBottom_toBottomOf="@id/dialpad_focus_area"
         app:layout_constraintStart_toEndOf="@id/divider"
         app:layout_constraintEnd_toEndOf="parent"/>
 
diff --git a/res/layout/keypad.xml b/res/layout/keypad.xml
index 7d8d47c..a5f2333 100644
--- a/res/layout/keypad.xml
+++ b/res/layout/keypad.xml
@@ -152,6 +152,4 @@
         app:layout_constraintLeft_toRightOf="@id/zero"
         app:layout_constraintRight_toRightOf="parent"/>
 
-    <include layout="@layout/keypad_dividers"/>
-
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/keypad_dividers.xml b/res/layout/keypad_dividers.xml
deleted file mode 100644
index 27d8736..0000000
--- a/res/layout/keypad_dividers.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2019 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<!-- For very short screen whose height is less than 456dp, there is no dividers.-->
-<merge/>
diff --git a/res/layout/loading_list_fragment.xml b/res/layout/loading_list_fragment.xml
index 4bd9c8d..7c8707d 100644
--- a/res/layout/loading_list_fragment.xml
+++ b/res/layout/loading_list_fragment.xml
@@ -19,5 +19,12 @@
     android:id="@+id/loading_frame_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
-    <include layout="@layout/list_fragment"/>
+
+    <com.android.car.ui.FocusArea
+        android:id="@+id/loading_focus_area"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+        <include layout="@layout/list_fragment"/>
+    </com.android.car.ui.FocusArea>
+
 </com.android.car.dialer.widget.LoadingFrameLayout>
diff --git a/res/layout/no_hfp.xml b/res/layout/no_hfp.xml
index 0ec017e..fbdcaa5 100644
--- a/res/layout/no_hfp.xml
+++ b/res/layout/no_hfp.xml
@@ -13,56 +13,62 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<androidx.constraintlayout.widget.ConstraintLayout
+<com.android.car.ui.FocusArea
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/no_hfp_error_container"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <Button
-        android:id="@+id/emergency_call_button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/emergency_button_text"
-        android:minWidth="@dimen/emergency_button_min_width"
-        android:minHeight="@dimen/emergency_button_min_height"
-        android:background="?android:attr/selectableItemBackground"
-        android:textColor="@color/emergency_text_color"
-        android:layout_marginBottom="@dimen/emergency_button_bottom_margin"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"/>
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/no_hfp_error_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
 
-    <ImageView
-        android:id="@+id/error_icon"
-        android:layout_width="@dimen/no_hfp_icon_size"
-        android:layout_height="@dimen/no_hfp_icon_size"
-        android:tint="@color/primary_icon_color"
-        android:src="@drawable/ic_bluetooth"
-        android:layout_marginBottom="@dimen/no_hfp_icon_margin_bottom"
-        app:layout_constraintVertical_chainStyle="packed"
-        app:layout_constraintTop_toTopOf="parent"
-        app:layout_constraintBottom_toTopOf="@id/error_string"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"/>
+        <Button
+            android:id="@+id/emergency_call_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/emergency_button_text"
+            android:minWidth="@dimen/emergency_button_min_width"
+            android:minHeight="@dimen/emergency_button_min_height"
+            android:background="?android:attr/selectableItemBackground"
+            android:textColor="@color/emergency_text_color"
+            android:layout_marginBottom="@dimen/emergency_button_bottom_margin"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
 
-    <TextView
-        android:id="@id/error_string"
-        style="@style/FullScreenErrorMessageStyle"
-        android:text="@string/no_hfp"
-        app:layout_constraintTop_toBottomOf="@id/error_icon"
-        app:layout_constraintBottom_toTopOf="@+id/connect_bluetooth_button"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"/>
+        <ImageView
+            android:id="@+id/error_icon"
+            android:layout_width="@dimen/no_hfp_icon_size"
+            android:layout_height="@dimen/no_hfp_icon_size"
+            android:tint="@color/primary_icon_color"
+            android:src="@drawable/ic_bluetooth"
+            android:layout_marginBottom="@dimen/no_hfp_icon_margin_bottom"
+            app:layout_constraintVertical_chainStyle="packed"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toTopOf="@id/error_string"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
 
-    <com.android.car.apps.common.UxrButton
-        android:id="@+id/connect_bluetooth_button"
-        style="@style/FullScreenErrorButtonStyle"
-        android:text="@string/connect_bluetooth_button_text"
-        android:layout_marginTop="@dimen/connect_bluetooth_button_margin_top"
-        app:layout_constraintTop_toBottomOf="@+id/error_string"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"/>
-</androidx.constraintlayout.widget.ConstraintLayout>
+        <TextView
+            android:id="@id/error_string"
+            style="@style/FullScreenErrorMessageStyle"
+            android:text="@string/no_hfp"
+            app:layout_constraintTop_toBottomOf="@id/error_icon"
+            app:layout_constraintBottom_toTopOf="@+id/connect_bluetooth_button"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+        <com.android.car.apps.common.UxrButton
+            android:id="@+id/connect_bluetooth_button"
+            style="@style/FullScreenErrorButtonStyle"
+            android:text="@string/connect_bluetooth_button_text"
+            android:layout_marginTop="@dimen/connect_bluetooth_button_margin_top"
+            app:layout_constraintTop_toBottomOf="@+id/error_string"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</com.android.car.ui.FocusArea>
diff --git a/res/layout/on_going_call_controller_bar_fragment.xml b/res/layout/on_going_call_controller_bar_fragment.xml
index c9902c2..8061b71 100644
--- a/res/layout/on_going_call_controller_bar_fragment.xml
+++ b/res/layout/on_going_call_controller_bar_fragment.xml
@@ -52,14 +52,13 @@
         app:layout_constraintEnd_toStartOf="@+id/voice_channel_view"
         app:layout_constraintTop_toTopOf="parent"/>
 
-    <LinearLayout
+    <FrameLayout
         android:id="@+id/voice_channel_view"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:orientation="vertical"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toEndOf="@+id/end_call_button"
-        app:layout_constraintEnd_toStartOf="@+id/pause_button"
+        app:layout_constraintEnd_toStartOf="@+id/button_wrapper"
         app:layout_constraintTop_toTopOf="parent">
 
         <ImageView
@@ -76,17 +75,32 @@
             android:layout_height="wrap_content"
             android:visibility="gone"/>
 
-    </LinearLayout>
+    </FrameLayout>
 
-    <ImageView
-        android:id="@+id/pause_button"
-        android:layout_width="@dimen/in_call_button_size"
-        android:layout_height="@dimen/in_call_button_size"
-        android:background="@drawable/dialer_ripple_background"
-        android:scaleType="center"
-        android:src="@drawable/ic_pause_activatable"
+    <LinearLayout
+        android:id="@+id/button_wrapper"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintStart_toEndOf="@+id/voice_channel_view"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintTop_toTopOf="parent"/>
+        app:layout_constraintTop_toTopOf="parent">
+
+        <ImageView
+            android:id="@+id/merge_button"
+            android:layout_width="@dimen/in_call_button_size"
+            android:layout_height="@dimen/in_call_button_size"
+            android:background="@drawable/dialer_ripple_background"
+            android:scaleType="center"
+            android:src="@drawable/ic_merge"/>
+
+        <ImageView
+            android:id="@+id/pause_button"
+            android:layout_width="@dimen/in_call_button_size"
+            android:layout_height="@dimen/in_call_button_size"
+            android:background="@drawable/dialer_ripple_background"
+            android:scaleType="center"
+            android:src="@drawable/ic_pause_activatable"/>
+    </LinearLayout>
+
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/ongoing_call_fragment.xml b/res/layout/ongoing_call_fragment.xml
index 007531b..7981e79 100644
--- a/res/layout/ongoing_call_fragment.xml
+++ b/res/layout/ongoing_call_fragment.xml
@@ -43,17 +43,21 @@
             android:layout_width="match_parent"
             android:layout_height="0dp"
             app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toTopOf="@+id/ongoing_call_control_bar"/>
+            app:layout_constraintBottom_toTopOf="@+id/control_bar_focus_area"/>
 
-        <include
-            layout="@layout/user_profile_large"
-            android:id="@+id/user_profile_container"
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="0dp"
             app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toTopOf="@+id/ongoing_call_control_bar"
+            app:layout_constraintBottom_toTopOf="@+id/control_bar_focus_area"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"/>
+            app:layout_constraintStart_toStartOf="parent">
+
+            <include
+                layout="@layout/user_profile_large"
+                android:id="@+id/user_profile_container"/>
+
+        </LinearLayout>
 
         <fragment
             android:id="@+id/onhold_user_profile"
@@ -67,17 +71,25 @@
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintEnd_toEndOf="parent"/>
 
-        <fragment
-            android:id="@+id/ongoing_call_control_bar"
-            android:name="com.android.car.dialer.ui.activecall.OnGoingCallControllerBarFragment"
+        <com.android.car.ui.FocusArea
+            android:id="@+id/control_bar_focus_area"
             android:layout_width="match_parent"
-            android:layout_height="@dimen/in_call_controller_bar_height"
-            android:layout_marginStart="@dimen/in_call_controller_bar_margin"
-            android:layout_marginEnd="@dimen/in_call_controller_bar_margin"
+            android:layout_height="wrap_content"
             android:layout_marginBottom="@dimen/in_call_controller_bar_margin_bottom"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"/>
+            app:layout_constraintStart_toStartOf="parent">
+
+            <fragment
+                android:id="@+id/ongoing_call_control_bar"
+                android:name="com.android.car.dialer.ui.activecall.OnGoingCallControllerBarFragment"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/in_call_controller_bar_height"
+                android:layout_marginStart="@dimen/in_call_controller_bar_margin"
+                android:layout_marginEnd="@dimen/in_call_controller_bar_margin"/>
+
+        </com.android.car.ui.FocusArea>
+
     </androidx.constraintlayout.widget.ConstraintLayout>
 
 </androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/ongoing_conf_call_fragment.xml b/res/layout/ongoing_conf_call_fragment.xml
new file mode 100644
index 0000000..2fdf0d5
--- /dev/null
+++ b/res/layout/ongoing_conf_call_fragment.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <!-- This ConstraintLayout is to make a full-screen transparent background -->
+    <!-- so that the ripple effects in the controller bar buttons work.        -->
+    <!-- If you put the transparent background on the root element of          -->
+    <!-- in_call_fragment, the BackgroundImageView will cover up the ripples.  -->
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        android:background="@android:color/transparent">
+
+        <fragment
+            android:name="com.android.car.dialer.ui.dialpad.InCallDialpadFragment"
+            android:id="@+id/incall_dialpad_fragment"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toTopOf="@+id/ongoing_call_control_bar"/>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toTopOf="@+id/ongoing_call_control_bar"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent">
+
+            <include
+                layout="@layout/conference_call_user_list"
+                android:id="@+id/conference_profiles"/>
+
+        </LinearLayout>
+
+        <fragment
+            android:id="@+id/onhold_user_profile"
+            android:name="com.android.car.dialer.ui.activecall.OnHoldCallUserProfileFragment"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/onhold_user_info_height"
+            android:layout_marginTop="@dimen/onhold_profile_margin_y"
+            android:layout_marginStart="@dimen/onhold_profile_margin_x"
+            android:layout_marginEnd="@dimen/onhold_profile_margin_x"
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+        <fragment
+            android:id="@+id/ongoing_call_control_bar"
+            android:name="com.android.car.dialer.ui.activecall.OnGoingCallControllerBarFragment"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/in_call_controller_bar_height"
+            android:layout_marginStart="@dimen/in_call_controller_bar_margin"
+            android:layout_marginEnd="@dimen/in_call_controller_bar_margin"
+            android:layout_marginBottom="@dimen/in_call_controller_bar_margin_bottom"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"/>
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/res/layout/onhold_user_profile.xml b/res/layout/onhold_user_profile.xml
index 5498471..15b2af8 100644
--- a/res/layout/onhold_user_profile.xml
+++ b/res/layout/onhold_user_profile.xml
@@ -10,74 +10,121 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<androidx.cardview.widget.CardView
+<com.android.car.ui.FocusArea
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:elevation="@dimen/dialer_card_elevation"
-    app:cardBackgroundColor="@color/onhold_call_background"
-    app:cardCornerRadius="@dimen/onhold_profile_corner_radius">
+    android:layout_height="match_parent">
 
-    <androidx.constraintlayout.widget.ConstraintLayout
+    <androidx.cardview.widget.CardView
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:id="@+id/swap_calls_view"
-        android:background="?android:attr/selectableItemBackground">
+        android:elevation="@dimen/dialer_card_elevation"
+        app:cardBackgroundColor="@color/onhold_call_background"
+        app:cardCornerRadius="@dimen/onhold_profile_corner_radius">
 
-        <androidx.constraintlayout.widget.Guideline
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:id="@+id/guideline"
-            android:orientation="vertical"
-            app:layout_constraintGuide_begin="@dimen/onhold_profile_guideline"/>
-
-        <ImageView
-            android:id="@+id/icon"
-            android:layout_width="@dimen/avatar_icon_size"
-            android:layout_height="@dimen/avatar_icon_size"
-            android:scaleType="centerCrop"
-            android:layout_marginStart="@dimen/onhold_profile_avatar_margin"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="parent"/>
-
-        <TextView
-            android:id="@+id/title"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:theme="@style/Theme.Dialer.BidiText"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            android:singleLine="true"
-            app:layout_constraintVertical_chainStyle="packed"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toTopOf="@+id/text"
-            app:layout_constraintStart_toStartOf="@id/guideline"
-            app:layout_constraintEnd_toStartOf="@+id/swap_call_icon"/>
-
-        <TextView
-            android:id="@id/text"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:text="@string/onhold_call_label"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:singleLine="true"
-            app:layout_constraintTop_toBottomOf="@id/title"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintStart_toStartOf="@id/guideline"
-            app:layout_constraintEnd_toStartOf="@+id/swap_call_icon"/>
-
-        <ImageView
-            android:id="@+id/swap_call_icon"
-            android:layout_width="0dp"
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:src="@drawable/ic_swap_calls"
-            android:scaleType="center"
-            android:tint="@color/secondary_icon_color"
-            android:paddingLeft="@dimen/swap_call_button_margin"
-            android:paddingRight="@dimen/swap_call_button_margin"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintEnd_toEndOf="parent"/>
-    </androidx.constraintlayout.widget.ConstraintLayout>
-</androidx.cardview.widget.CardView>
+            android:id="@+id/swap_calls_view"
+            android:background="?android:attr/selectableItemBackground">
+
+            <androidx.constraintlayout.widget.Guideline
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/guideline"
+                android:orientation="vertical"
+                app:layout_constraintGuide_begin="@dimen/onhold_profile_guideline"/>
+
+            <ImageView
+                android:id="@+id/icon"
+                android:layout_width="@dimen/small_avatar_icon_size"
+                android:layout_height="@dimen/small_avatar_icon_size"
+                android:scaleType="centerCrop"
+                android:layout_marginStart="@dimen/onhold_profile_avatar_margin"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toStartOf="parent"/>
+
+            <TextView
+                android:id="@+id/title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:theme="@style/Theme.Dialer.BidiText"
+                android:textAppearance="?android:attr/textAppearanceLarge"
+                android:singleLine="true"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toStartOf="@id/guideline"
+                app:layout_constraintEnd_toStartOf="@+id/title_separator"/>
+
+            <TextView
+                android:id="@id/title_separator"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/onhold_profile_status_margin"
+                android:layout_marginEnd="@dimen/onhold_profile_status_margin"
+                android:textAppearance="?android:attr/textAppearanceLarge"
+                android:singleLine="true"
+                android:text="@string/onhold_call_separator"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toEndOf="@id/title"
+                app:layout_constraintEnd_toStartOf="@+id/time"/>
+
+            <Chronometer
+                android:id="@id/time"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceLarge"
+                android:textColor="@color/onhold_time_color"
+                android:singleLine="true"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toEndOf="@id/title_separator"
+                app:layout_constraintEnd_toStartOf="@+id/time_separator"/>
+
+            <TextView
+                android:id="@id/time_separator"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/onhold_profile_status_margin"
+                android:layout_marginEnd="@dimen/onhold_profile_status_margin"
+                android:textAppearance="?android:attr/textAppearanceLarge"
+                android:singleLine="true"
+                android:text="@string/onhold_call_separator"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toEndOf="@id/time"
+                app:layout_constraintEnd_toStartOf="@+id/onhold_label"/>
+
+            <TextView
+                android:id="@id/onhold_label"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceLarge"
+                android:singleLine="true"
+                android:text="@string/call_state_hold"
+                android:textColor="@color/onhold_label_color"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintStart_toEndOf="@id/time_separator"
+                app:layout_constraintEnd_toStartOf="@+id/swap_call"/>
+
+            <TextView
+                android:id="@id/swap_call"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="@dimen/onhold_profile_avatar_margin"
+                android:text="@string/swap_call_label"
+                android:textAppearance="?android:attr/textAppearanceLarge"
+                android:singleLine="true"
+                android:textColor="?android:attr/colorAccent"
+                app:layout_constraintTop_toTopOf="parent"
+                app:layout_constraintBottom_toBottomOf="parent"
+                app:layout_constraintEnd_toEndOf="parent"/>
+        </androidx.constraintlayout.widget.ConstraintLayout>
+
+    </androidx.cardview.widget.CardView>
+
+</com.android.car.ui.FocusArea>
diff --git a/res/layout/telecom_activity.xml b/res/layout/telecom_activity.xml
index 655f48c..97797bd 100644
--- a/res/layout/telecom_activity.xml
+++ b/res/layout/telecom_activity.xml
@@ -1,42 +1,23 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
+<!--
+  ~ Copyright (C) 2017 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
 
 <FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/fragment_container"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
-    <androidx.constraintlayout.widget.ConstraintLayout
-        android:id="@+id/content_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-        <!-- The main content view. Fragments will be added here. -->
-        <FrameLayout
-            android:id="@+id/content_fragment_container"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"/>
-
-        <com.android.car.ui.toolbar.Toolbar
-            android:id="@+id/car_ui_toolbar"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
-    </androidx.constraintlayout.widget.ConstraintLayout>
-
-    <FrameLayout
-        android:id="@+id/overlay_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
 </FrameLayout>
diff --git a/res/layout/user_profile_list_item.xml b/res/layout/user_profile_list_item.xml
new file mode 100644
index 0000000..b3e2462
--- /dev/null
+++ b/res/layout/user_profile_list_item.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/user_profile_list_item_height"
+    android:gravity="start|center_vertical"
+    android:orientation="horizontal"
+    android:paddingStart="@dimen/in_call_user_profile_list_margin"
+    android:paddingEnd="@dimen/in_call_user_profile_list_margin">
+    <ImageView
+        android:id="@+id/user_profile_avatar"
+        android:layout_width="@dimen/in_call_avatar_icon_size_small"
+        android:layout_height="@dimen/in_call_avatar_icon_size_small"
+        android:scaleType="fitCenter"/>
+
+    <LinearLayout
+        android:layout_height="wrap_content"
+        android:layout_width="fill_parent"
+        android:theme="@style/Theme.Dialer.BidiText"
+        android:orientation="vertical"
+        android:paddingStart="@dimen/in_call_margin_between_avatar_and_text">
+        <TextView
+            android:id="@+id/user_profile_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.Display3"
+            android:singleLine="true"/>
+        <TextView
+            android:id="@+id/user_profile_phone_number"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textAppearance="@style/TextAppearance.Body3"
+            android:singleLine="true"
+            android:layout_marginTop="@dimen/in_call_phone_number_margin_top"/>
+
+    </LinearLayout>
+</LinearLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index d11c5d3..9f42cbb 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Gemiste oproepe (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Gemiste oproep</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Hou aan"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Wissel tussen oproepe"</string>
     <string name="setting_title" msgid="1296639422364732365">"Instellings"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Beginskerm"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontakvolgorde"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Van"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Voer oproepoudio uit na:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferensie"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 2e2b53a..047faf5 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">ያመለጡ ጥሪዎች(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">ያመለጡ ጥሪዎች(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"ያዝ እና ቆይ"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"ጥሪዎችን ቀይር"</string>
     <string name="setting_title" msgid="1296639422364732365">"ቅንብሮች"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"የመጀመሪያ ማያ ገጽ"</string>
     <string name="sort_order_title" msgid="975104366728292702">"የእውቂያ ቅደም ተከተል"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"የአያት ስም"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"የጥሪ ኦዲዮን በዚህ ያሰሙ፦"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"ጉባዔ"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 1d4e0bb..f791bae 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -70,7 +70,8 @@
       <item quantity="other"><xliff:g id="NUMBER">%1$d</xliff:g> مكالمة فائتة </item>
       <item quantity="one">مكالمة فائتة واحدة</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"قيد الانتظار"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"تبديل المكالمات"</string>
     <string name="setting_title" msgid="1296639422364732365">"الإعدادات"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"شاشة البدء"</string>
     <string name="sort_order_title" msgid="975104366728292702">"ترتيب جهات الاتصال"</string>
@@ -83,4 +84,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"اسم العائلة"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"الاستماع إلى صوت المكالمة لـ:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"مكالمة فيديو"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 4e52234..0002000 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">মিছড কল(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">মিছড কল(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"হ’ল্ডত আছে"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"কল সলনি কৰক"</string>
     <string name="setting_title" msgid="1296639422364732365">"ছেটিংসমূহ"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"আৰম্ভণিৰ স্ক্ৰীণ"</string>
     <string name="sort_order_title" msgid="975104366728292702">"সম্পৰ্কৰ ক্ৰম"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"উপাধি"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"কল অডিঅ\'ৰ বাবে এয়া ব্যৱহাৰ কৰক:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"কনফাৰেন্স"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 7372caa..cf77f27 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Buraxılmış zənglər (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Buraxılmış zəng</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Gözləmədə"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Zəngləri dəyişdirin"</string>
     <string name="setting_title" msgid="1296639422364732365">"Ayarlar"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Başlanğıc ekranı"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontakt sırası"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Soyad"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Zəng audiosunu buraya göndərin:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konfrans"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 1822f27..0d525d3 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -23,7 +23,7 @@
     <string name="bluetooth_unpaired" msgid="1600552386483652892">"Da biste upućivali ili primali pozive, uparite telefon sa automobilom."</string>
     <string name="connect_bluetooth_button_text" msgid="293188695227298042">"Poveži sa Bluetooth-om"</string>
     <string name="emergency_button_text" msgid="3467659545392931727">"Hitan slučaj"</string>
-    <string name="emergency_call_description" msgid="6700161437750325693">"Hitni poziv"</string>
+    <string name="emergency_call_description" msgid="6700161437750325693">"Hitan poziv"</string>
     <string name="error_contact_deleted" msgid="6356539067659368396">"Ovaj kontakt je možda izbrisan."</string>
     <string name="error_invalid_phone_number" msgid="5349049631580646136">"Pozivanje ovog broja nije uspelo. Proverite ga i probajte ponovo."</string>
     <string name="error_telephony_not_available" msgid="8715829862083386178">"Telefonski poziv nije dostupan. Probajte ponovo kasnije."</string>
@@ -67,7 +67,8 @@
       <item quantity="few">Propušteni pozivi(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Propušteni pozivi(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Na čekanju"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Promeni poziv"</string>
     <string name="setting_title" msgid="1296639422364732365">"Podešavanja"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Početni ekran"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Redosled kontakata"</string>
@@ -80,4 +81,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Prezime"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Izaberite izlaz za zvuk poziva:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferencija"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 75151bd..87baf9c 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="many">Прапушчаныя выклікі (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Прапушчаныя выклікі (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"На ўтрыманні"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Пераключыцца на іншы выклік"</string>
     <string name="setting_title" msgid="1296639422364732365">"Налады"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Пачатковы экран"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Парадак кантактаў"</string>
@@ -81,4 +82,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Прозвішча"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Вывадзіць гук выкліку на:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Канферэнцыя"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index e5f41d5..6d1e7e7 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Пропуснати обаждания (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Пропуснато обаждане</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Задържано"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Превключване на обажданията"</string>
     <string name="setting_title" msgid="1296639422364732365">"Настройки"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Начален екран"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Подредба на контактите"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Фамилно име"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Извеждане на аудиото на обаждането до:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Конферентно обаждане"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index c157e1a..0a1302b 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">মিসড কল(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">মিসড কল(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"হোল্ডে আছে"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"কল পরিবর্তন করুন"</string>
     <string name="setting_title" msgid="1296639422364732365">"সেটিংস"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"স্ক্রিন চালু করুন"</string>
     <string name="sort_order_title" msgid="975104366728292702">"পরিচিতির ক্রম"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"পদবি"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"কলের অডিও এখানে শুনুন:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"কনফারেন্স"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 1cafb37..0c149d7 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -67,7 +67,8 @@
       <item quantity="few">Propušteni pozivi (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Propušteni pozivi (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Na čekanju"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Prebacivanje poziva"</string>
     <string name="setting_title" msgid="1296639422364732365">"Postavke"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Početni ekran"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Redoslijed kontakata"</string>
@@ -80,4 +81,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Prezime"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Odaberite izlaz za zvuk poziva:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferencija"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 0780a5d..cfa2d6d 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Trucades perdudes (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Trucada perduda</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"En espera"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Canvia de trucada"</string>
     <string name="setting_title" msgid="1296639422364732365">"Configuració"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Pantalla d\'inici"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Ordre dels contactes"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Cognoms"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Sortida d\'àudio per a trucades:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conferència"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 5af0101..0902534 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="other">Zmeškané hovory (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Zmeškaný hovor</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Podrženo"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Přepnout hovory"</string>
     <string name="setting_title" msgid="1296639422364732365">"Nastavení"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Úvodní obrazovka"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Pořadí kontaktů"</string>
@@ -81,4 +82,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Příjmení"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Směrování zvuku odchozího hovoru:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konference"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 4f0bcde..a676e14 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">Mistet opkald (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Mistede opkald (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Afventer"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Skift opkald"</string>
     <string name="setting_title" msgid="1296639422364732365">"Indstillinger"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Startskærm"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontaktrækkefølge"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Efternavn"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Send opkaldslyd til:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Møde"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index d59b115..2beeeec 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Verpasste Anrufe (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Verpasster Anruf</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Wird gehalten"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Zwischen Anrufen wechseln"</string>
     <string name="setting_title" msgid="1296639422364732365">"Einstellungen"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Startbildschirm"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Reihenfolge der Kontakte"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Nachname"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Audio des Anrufs ausgeben an:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferenz"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index f3dec63..e792037 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Αναπάντητες κλήσεις(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Αναπάντητη κλήση</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Σε αναμονή"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Εναλλαγή κλήσεων"</string>
     <string name="setting_title" msgid="1296639422364732365">"Ρυθμίσεις"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Οθόνη έναρξης"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Παραγγελία επαφής"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Επώνυμο"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Έξοδος ήχου κλήσης σε:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Συνδιάσκεψη"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index dc99bb0..aa8b134 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Missed calls(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Missed call</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"On Hold"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Switch calls"</string>
     <string name="setting_title" msgid="1296639422364732365">"Settings"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Start screen"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Contact order"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Surname"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Output call audio to:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conference"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index dc99bb0..aa8b134 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Missed calls(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Missed call</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"On Hold"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Switch calls"</string>
     <string name="setting_title" msgid="1296639422364732365">"Settings"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Start screen"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Contact order"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Surname"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Output call audio to:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conference"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index dc99bb0..aa8b134 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Missed calls(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Missed call</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"On Hold"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Switch calls"</string>
     <string name="setting_title" msgid="1296639422364732365">"Settings"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Start screen"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Contact order"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Surname"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Output call audio to:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conference"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index dc99bb0..aa8b134 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Missed calls(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Missed call</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"On Hold"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Switch calls"</string>
     <string name="setting_title" msgid="1296639422364732365">"Settings"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Start screen"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Contact order"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Surname"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Output call audio to:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conference"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index eb46171..2bd8bfd 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎Missed calls(‎‏‎‎‏‏‎<xliff:g id="NUMBER">%1$d</xliff:g>‎‏‎‎‏‏‏‎) ‎‏‎‎‏‎</item>
       <item quantity="one">‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‏‏‎‎‎‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‎‏‏‎‎‎‏‎‏‎‏‏‎‏‎‎‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‏‏‎‎‎‎‎‎‎Missed call‎‏‎‎‏‎</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‏‎‎‎‎‏‏‎‏‏‎‏‎‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‎‏‏‎‏‏‎On Hold‎‏‎‎‏‎"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‏‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‎•‎‏‎‎‏‎"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‏‏‏‎‎‎‎‎‎‏‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‎‏‏‎‎Switch calls‎‏‎‎‏‎"</string>
     <string name="setting_title" msgid="1296639422364732365">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‎‏‏‏‏‎‏‎‎‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‎‎‏‏‎‏‎Settings‎‏‎‎‏‎"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‏‏‏‎‎‎‎‎‏‏‎‏‎‏‎‎‎‎‏‏‏‎‏‏‎‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‏‎‎‏‎‎‏‏‏‎Start screen‎‏‎‎‏‎"</string>
     <string name="sort_order_title" msgid="975104366728292702">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‎‎‎‏‎‎‎‏‎‎‎‏‎‎‎‎‎‏‎‏‎‏‎‏‎‏‏‏‎‎‎‏‎‏‏‎‏‎‏‎‎‏‎‏‎‏‏‏‏‎‎Contact order‎‏‎‎‏‎"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‎‎‎‏‏‎‎‏‎‏‎‎‏‏‎Last name‎‏‎‎‏‎"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‏‎‏‎‏‎‏‏‏‎‎Output call audio to:‎‏‎‎‏‎"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‎‏‏‏‎‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‏‏‏‎‏‏‏‎Conference‎‏‎‎‏‎"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‏‏‎‏‏‎‏‎‏‎‎‎‎‏‏‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‏‎‎‎‎‎‎‏‏‎‏‎‏‎‎‎%1$s (%2$d) - ‎‏‎‎‏‎ "</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 4992bdb..30c56b7 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Llamadas perdidas (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Llamada perdida</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"En espera"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Cambiar llamadas"</string>
     <string name="setting_title" msgid="1296639422364732365">"Configuración"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Pantalla de inicio"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Orden de los contactos"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Apellido"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Llamada de audio saliente a:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conferencia"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index daaecbb..bc1d53f 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Llamadas perdidas (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Llamada perdida</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"En espera"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Cambiar de llamada"</string>
     <string name="setting_title" msgid="1296639422364732365">"Ajustes"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Pantalla de inicio"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Orden de los contactos"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Apellido"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Salida de audio de las llamadas en:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conferencia"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 8d76f2c..62fcf4e 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Vastamata kõned (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Vastamata kõne</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Ootel"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Kõne vahetamine"</string>
     <string name="setting_title" msgid="1296639422364732365">"Seaded"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Avakuva"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontaktide järjestus"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Perekonnanimi"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Kõne heliväljund:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konverents"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 9c38315..35f64cb 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Dei galduak (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Dei galdua</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Zain"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Aldatu deia"</string>
     <string name="setting_title" msgid="1296639422364732365">"Ezarpenak"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Hasierako pantaila"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontaktuak bistaratzeko ordena"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Abizena"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Deien audioaren irteera:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferentzia-deia"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index fa23411..938f908 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="one">تماس‌های بی‌پاسخ (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">تماس‌های بی‌پاسخ (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"در انتظار"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"جابه‌جایی تماس‌ها"</string>
     <string name="setting_title" msgid="1296639422364732365">"تنظیمات"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"صفحه شروع"</string>
     <string name="sort_order_title" msgid="975104366728292702">"ترتیب مخاطبین"</string>
@@ -83,4 +84,6 @@
     <skip />
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"خروجی صدای تماس به:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"کنفرانس"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s‏ (%2$d) - "</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 654fd3d..fbd152a 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Vastaamattomia puheluita (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Vastaamaton puhelu</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Pidossa"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Vaihda puhelua"</string>
     <string name="setting_title" msgid="1296639422364732365">"Asetukset"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Aloitusnäyttö"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Yhteystietojen järjestys"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Sukunimi"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Toista puhelun ääni täällä:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Kokous"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index f9f2409..5046595 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">Appel manqué (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Appels manqués (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"En attente"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Basculer entre les appels"</string>
     <string name="setting_title" msgid="1296639422364732365">"Paramètres"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Écran de démarrage"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Ordre des contacts"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Nom de famille"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Sortie de l\'appel audio sur :"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conférence"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 5117d81..61dced3 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">Appel manqué (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Appels manqués (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"En attente"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Passer d\'un appel à l\'autre"</string>
     <string name="setting_title" msgid="1296639422364732365">"Paramètres"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Écran d\'accueil"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Ordre des contacts"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Nom"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Sortie de l\'appel audio sur :"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conférence"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 914fc17..c3344a5 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Chamadas perdidas (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Chamada perdida</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"En espera"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Cambiar de chamada"</string>
     <string name="setting_title" msgid="1296639422364732365">"Configuración"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Pantalla de inicio"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Orde dos contactos"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Apelidos"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Enviar o audio das chamadas a:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conferencia"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d): "</string>
 </resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 019ca78..949bc8f 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">ચૂકી ગયેલો (<xliff:g id="NUMBER">%1$d</xliff:g>) કૉલ </item>
       <item quantity="other">ચૂકી ગયેલા (<xliff:g id="NUMBER">%1$d</xliff:g>) કૉલ </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"હોલ્ડ પર"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"કૉલ સ્વિચ કરો"</string>
     <string name="setting_title" msgid="1296639422364732365">"સેટિંગ"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"શરૂઆતની સ્ક્રીન"</string>
     <string name="sort_order_title" msgid="975104366728292702">"સંપર્કનો ક્રમ સૉર્ટ કરો"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"અટક"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"કૉલ ઑડિયોનું આઉટપુટ અહીં આપો:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"કૉન્ફરન્સ"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 18dda1e..9d0a720 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">मिस्ड कॉल (छूटे हुए कॉल)(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">मिस्ड कॉल (छूटे हुए कॉल)(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"कॉल होल्ड पर है"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"दूसरे कॉल पर जाएं"</string>
     <string name="setting_title" msgid="1296639422364732365">"सेटिंग"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"शुरुआती स्क्रीन"</string>
     <string name="sort_order_title" msgid="975104366728292702">"संपर्कों का क्रम"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"उपनाम"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"आउटपुट कॉल यहां से सुनाई देगी:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"कॉन्फ़्रेंस"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index c5c3ac8..874d185 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -67,7 +67,8 @@
       <item quantity="few">Propušteni pozivi (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Propušteni pozivi (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Na čekanju"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Prebacivanje poziva"</string>
     <string name="setting_title" msgid="1296639422364732365">"Postavke"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Početni zaslon"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Redoslijed kontakata"</string>
@@ -80,4 +81,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Prezime"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Odaberite izlaz za zvuk poziva:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferencija"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 62d042c..7907a0c 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other"><xliff:g id="NUMBER">%1$d</xliff:g> nem fogadott hívás</item>
       <item quantity="one">Nem fogadott hívás</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Várakoztatva"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Váltás a hívások között"</string>
     <string name="setting_title" msgid="1296639422364732365">"Beállítások"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Kezdőképernyő"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Névjegyek rendezése"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Családnév"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Hívás hangjának kimenete:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferenciahívás"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index cfde350..df0a29b 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">Բաց թողնված զանգեր (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Բաց թողնված զանգեր (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Զանգը սպասման մեջ է"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Անցնել մյուս զանգին"</string>
     <string name="setting_title" msgid="1296639422364732365">"Կարգավորումներ"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Սկզբնական էկրան"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Կոնտակտների հերթականություն"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Ազգանուն"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Զանգի աուդիոելք՝"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Կոնֆերանս"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index ef2d621..35a3bb1 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Panggilan tak terjawab(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Panggilan tak terjawab</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Harap Tunggu"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Alihkan panggilan"</string>
     <string name="setting_title" msgid="1296639422364732365">"Setelan"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Layar awal"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Urutan kontak"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Nama belakang"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Bunyikan audio panggilan telepon ke:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferensi"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 34e55bc..7c1531b 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">Ósvöruð símtöl(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Ósvöruð símtöl(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Í bið"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Skipta um símtal"</string>
     <string name="setting_title" msgid="1296639422364732365">"Stillingar"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Upphafsskjár"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Röðun tengiliða"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Eftirnafn"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Senda símtalshljóð í:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Fundur"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 7788bf7..b418d4c 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Chiamate senza risposta (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Chiamata senza risposta</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"In attesa"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Cambia chiamata"</string>
     <string name="setting_title" msgid="1296639422364732365">"Impostazioni"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Schermata iniziale"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Ordine dei contatti"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Cognome"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Uscita audio chiamate su:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conferenza"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index c0eef33..868fa9e 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="other">שיחות שלא נענו (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">שיחה שלא נענתה</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"בהמתנה"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"החלפת השיחות"</string>
     <string name="setting_title" msgid="1296639422364732365">"הגדרות"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"המסך ההתחלתי"</string>
     <string name="sort_order_title" msgid="975104366728292702">"סדר אנשי הקשר"</string>
@@ -81,4 +82,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"שם משפחה"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"פלט של שיחות אודיו אל:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"ועידה"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s‏ (%2$d) - "</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index f5e5a21..43210f2 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">不在着信(<xliff:g id="NUMBER">%1$d</xliff:g> 件)</item>
       <item quantity="one">不在着信</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"保留中"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"通話を切り替える"</string>
     <string name="setting_title" msgid="1296639422364732365">"設定"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"起動画面"</string>
     <string name="sort_order_title" msgid="975104366728292702">"連絡先の順序"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"姓"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"通話音声の出力先:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"会議"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s(%2$d)- "</string>
 </resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 195b383..31f7858 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">გამოტოვებული ზარები(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">გამოტოვებული ზარი</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"შეყოვნების რეჟიმში"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"ზარების გადართვა"</string>
     <string name="setting_title" msgid="1296639422364732365">"პარამეტრები"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"საწყისი ეკრანი"</string>
     <string name="sort_order_title" msgid="975104366728292702">"კონტაქტების თანმიმდევრობა"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"გვარი"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"ზარის აუდიოს გამოტანა:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"კონფერენცია"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 875b7e3..c972bfa 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Өткізіп алған қоңыраулар (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Өткізіп алған қоңырау</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Күтуде"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Басқа қоңырауға өту"</string>
     <string name="setting_title" msgid="1296639422364732365">"Параметрлер"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Бастау экраны"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Контактілер реті"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Тегі"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Қоңырау дыбысын қабылдайтын құрылғы:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Конференция"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 30e8078..b6b8a64 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">ខកខាន​ទទួល (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">ខកខាន​ទទួល</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"រង់ចាំ"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"ប្ដូរ​ការហៅ​ទូរសព្ទ"</string>
     <string name="setting_title" msgid="1296639422364732365">"ការកំណត់"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"​អេក្រង់ចាប់​ផ្ដើម"</string>
     <string name="sort_order_title" msgid="975104366728292702">"លំដាប់​ទំនាក់ទំនង"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"នាមត្រកូល"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"បញ្ចេញសំឡេង​ហៅទូរសព្ទទៅ៖"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"ការហៅ​ជា​ក្រុម"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 41f236b..81f647e 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">ಮಿಸ್ಡ್‌ ಕರೆಗಳು (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">ಮಿಸ್ಡ್‌ ಕರೆಗಳು (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"ತಡೆಹಿಡಿಯಲಾಗಿದೆ"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"ಕರೆಗಳನ್ನು ಸ್ವಿಚ್ ಮಾಡಿ"</string>
     <string name="setting_title" msgid="1296639422364732365">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"ಸ್ಕ್ರೀನ್ ಪ್ರಾರಂಭಿಸಿ"</string>
     <string name="sort_order_title" msgid="975104366728292702">"ಸಂಪರ್ಕದ ಕ್ರಮ"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"ಕೊನೆಯ ಹೆಸರು"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"ಇದಕ್ಕೆ ಕರೆಯ ಆಡಿಯೊ ಔಟ್‌ಪುಟ್:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"ಕಾನ್ಫರೆನ್ಸ್"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 906103e..4d4c082 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">부재중 전화(<xliff:g id="NUMBER">%1$d</xliff:g>건) </item>
       <item quantity="one">부재중 전화</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"대기 중"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"통화 전환"</string>
     <string name="setting_title" msgid="1296639422364732365">"설정"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"시작 화면"</string>
     <string name="sort_order_title" msgid="975104366728292702">"연락처 순서"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"성"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"다음으로 통화 오디오 출력:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"다자간 통화"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s(%2$d) - "</string>
 </resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 47ab97e..3553ac0 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -47,8 +47,8 @@
     <string name="favorites_empty" msgid="5794510741132758130">"Сүйүктүүлөр тизмеси бош"</string>
     <string name="no_favorites_added" msgid="2359050103464783907">"Азырынча бир да сүйүктүү байланышыңыз жок"</string>
     <string name="add_favorite_button" msgid="7914955940249767808">"Сүйүктүү номер кошуу"</string>
-    <string name="search_title" msgid="5412680850141871664">"Байланыштарды издеңиз"</string>
-    <string name="search_hint" msgid="3099066132607042439">"Байланыштарды издеңиз"</string>
+    <string name="search_title" msgid="5412680850141871664">"Байланыштарды издөө"</string>
+    <string name="search_hint" msgid="3099066132607042439">"Байланыштарды издөө"</string>
     <string name="type_multiple" msgid="3402949522797441236">"Бир нече"</string>
     <string name="select_number_dialog_title" msgid="5770700626013782205">"Телефон номерин тандоо"</string>
     <string name="select_number_dialog_just_once_button" msgid="1814381354393374660">"Бир жолу гана"</string>
@@ -66,7 +66,8 @@
       <item quantity="other">Жооп берилбеген чалуулар (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Жооп берилбеген чалуу</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Күтүү режиминде"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Чалууларды которуштуруу"</string>
     <string name="setting_title" msgid="1296639422364732365">"Жөндөөлөр"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Баштоо экраны"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Байланыштын ирети"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Фамилиясы"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Төмөнкүгө телефон чалуу:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Конференция"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 4d5f97b..6b34546 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">ສາຍບໍ່ໄດ້ຮັບ(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">ສາຍບໍ່ໄດ້ຮັບ</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"ຖືສາຍລໍຖ້າ"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"ສະຫຼັບສາຍ"</string>
     <string name="setting_title" msgid="1296639422364732365">"ການຕັ້ງຄ່າ"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"ໜ້າຈໍເລີ່ມຕົ້ນ"</string>
     <string name="sort_order_title" msgid="975104366728292702">"ລຳດັບລາຍຊື່ຜູ້ຕິດຕໍ່"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"ນາມສະກຸນ"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"ປັບສຽງໂທອອກໄປທີ່:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"ການປະຊຸມ"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 8f1e651..7d892e5 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="many">Praleisti skambučiai (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Praleisti skambučiai (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Sulaikyta"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Perjungti skambučius"</string>
     <string name="setting_title" msgid="1296639422364732365">"Nustatymai"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Pradžios ekranas"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontaktų rūšiavimo tvarka"</string>
@@ -81,4 +82,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Pavardė"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Skambučio garso išvestis į:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferencija"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 644e8dc..0aab98a 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -67,7 +67,8 @@
       <item quantity="one">Neatbildēti zvani (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Neatbildēti zvani (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Aizturēts"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Pārslēgt zvanus"</string>
     <string name="setting_title" msgid="1296639422364732365">"Iestatījumi"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Sākuma ekrāns"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontaktpersonu secība"</string>
@@ -80,4 +81,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Uzvārds"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Zvana audio izeja:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konference"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) — "</string>
 </resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 5296cd1..138ff3a 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">Пропуштени повици (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Пропуштени повици (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"На чекање"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Префрли ги повиците"</string>
     <string name="setting_title" msgid="1296639422364732365">"Поставки"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Почетен екран"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Подредување контакти"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Презиме"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Аудиото на повикот да се слуша на:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Конференција"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 747d43e..fc2e6cb 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">മിസ്‌ഡ് കോളുകൾ(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">മിസ്‌ഡ് കോൾ</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"ഹോൾഡിലാണ്"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"കോളുകൾ മാറുക"</string>
     <string name="setting_title" msgid="1296639422364732365">"ക്രമീകരണം"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"സ്‌ക്രീൻ ആരംഭിക്കുക"</string>
     <string name="sort_order_title" msgid="975104366728292702">"കോൺടാക്റ്റ് ഓർഡർ"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"ലാസ്റ്റ് നെയിം"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"ഇനിപ്പറയുന്നതിലേക്ക് കോൾ ഓഡിയോ ഔട്ട്പുട്ട് ചെയ്യുക:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"കോൺഫറൻസ്"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index c2e2233..29d59e1 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Аваагүй дуудлагууд(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Аваагүй дуудлага</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Хүлээлгэнд байгаа"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Дуудлага сэлгэх"</string>
     <string name="setting_title" msgid="1296639422364732365">"Тохиргоо"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Дэлгэцийг эхлүүлэх"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Харилцагчийн захиалга"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Овог"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Дуудлагын аудио гаралтын чиглэл:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Хурал"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 6e7d4a2..182898b 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="other">(<xliff:g id="NUMBER">%1$d</xliff:g>) मिस्ड कॉल </item>
       <item quantity="one">मिस्ड कॉल</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"होल्डवर"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"कॉल स्विच करा"</string>
     <string name="setting_title" msgid="1296639422364732365">"सेटिंग्ज"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"सुरुवातीची स्क्रीन"</string>
     <string name="sort_order_title" msgid="975104366728292702">"संपर्क क्रम"</string>
@@ -83,4 +84,6 @@
     <skip />
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"आउटपुट कॉल ऑडिओ यावर पाठवा:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"कॉंफरन्स"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 2b8d7f6..ec251b7 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Panggilan terlepas(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Panggilan terlepas</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Ditunda"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Beralih panggilan"</string>
     <string name="setting_title" msgid="1296639422364732365">"Tetapan"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Skrin mula"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Tertib kenalan"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Nama keluarga"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Outputkan audio panggilan ke:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Persidangan"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 03ecd8e..08a0eb0 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">လွတ်သွားသော ခေါ်ဆိုမှုများ(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">လွတ်သွားသော ခေါ်ဆိုမှု</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"ဖုန်းကိုင်ထားသည်"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"ခေါ်ဆိုမှုများ ပြောင်းရန်"</string>
     <string name="setting_title" msgid="1296639422364732365">"ဆက်တင်များ"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"စတင်မှု ဖန်သားပြင်"</string>
     <string name="sort_order_title" msgid="975104366728292702">"အဆက်အသွယ် အစီအစဉ်"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"နောက်အမည်"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"ဖုန်းခေါ်ဆိုမှု အသံ ထုတ်ရန်နေရာ-"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"အစည်းအဝေး"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 082d47e..1344cd2 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Tapte anrop (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Tapt anrop</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"På vent"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Bytt samtaler"</string>
     <string name="setting_title" msgid="1296639422364732365">"Innstillinger"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Startskjerm"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontaktrekkefølge"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Etternavn"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Send samtalelyd til:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferanse"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 9a1856f..40804be 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="other">छुटेका कलहरू(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">छुटेको कल</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"होल्डमा छ"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"कलहरू बदल्नुहोस्"</string>
     <string name="setting_title" msgid="1296639422364732365">"सेटिङ"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"सुरु गर्ने स्क्रिन"</string>
     <string name="sort_order_title" msgid="975104366728292702">"सम्पर्क ठेगानाको क्रम"</string>
@@ -83,4 +84,6 @@
     <skip />
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"निम्न यन्त्रबाट कलको अडियो सुन्नुहोस्:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"सम्मेलन कल"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 2515c16..24ce35b 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Gemiste gesprekken (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Gemist gesprek</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"In de wacht"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Gesprekken wisselen"</string>
     <string name="setting_title" msgid="1296639422364732365">"Instellingen"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Startscherm"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Contactvolgorde"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Achternaam"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Gespreksaudio uitvoeren naar:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conferentie"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 5ec070d..1404980 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">ମିସ୍ଡ କଲ୍(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">ମିସ୍ଡ କଲ୍</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"ହୋଲ୍ଡରେ ଅଛି"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"କଲଗୁଡ଼ିକୁ ସ୍ୱିଚ୍ କରନ୍ତୁ"</string>
     <string name="setting_title" msgid="1296639422364732365">"ସେଟିଂସ୍"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"ସ୍କ୍ରିନ୍ ଆରମ୍ଭ କରନ୍ତୁ"</string>
     <string name="sort_order_title" msgid="975104366728292702">"ଯୋଗାଯୋଗ କ୍ରମରେ ସଜାନ୍ତୁ"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"ଶେଷ ନାମ"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"ଆଉଟପୁଟ୍ କଲ୍‌ ଏଠାରୁ ଶୁଣାଯିବ:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"କନଫରେନ୍ସ"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index d29c992..e2c2738 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">ਮਿਸ ਕਾਲ(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">ਮਿਸ ਕਾਲਾਂ(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"ਰੋਕ ਕੇ ਰੱਖੀ ਗਈ"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"ਕਾਲਾਂ ਦੀ ਅਦਲਾ ਬਦਲੀ ਕਰੋ"</string>
     <string name="setting_title" msgid="1296639422364732365">"ਸੈਟਿੰਗਾਂ"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"ਸ਼ੁਰੂਆਤੀ ਸਕ੍ਰੀਨ"</string>
     <string name="sort_order_title" msgid="975104366728292702">"ਸੰਪਰਕ ਕ੍ਰਮ"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"ਨਾਮ ਦਾ ਆਖਰੀ ਭਾਗ"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"ਇਸ \'ਤੇ ਆਊਟਪੁੱਟ ਕਾਲ ਆਡੀਓ:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"ਕਾਨਫ਼ਰੰਸ"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index c0334e3..86ff3b6 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="other">Nieodebrane połączenia (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Nieodebrane połączenie</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Oczekujące"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Przełącz połączenia"</string>
     <string name="setting_title" msgid="1296639422364732365">"Ustawienia"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Ekran powitalny"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kolejność kontaktów"</string>
@@ -81,4 +82,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Nazwisko"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Odtwórz dźwięk połączenia na:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferencja"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-port/configs.xml b/res/values-port/configs.xml
deleted file mode 100644
index ea45c2c..0000000
--- a/res/values-port/configs.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  Copyright (C) 2019 The Android Open Source Project
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-<resources>
-    <!-- Use app name as toolbar title. Supported value see @attr/toolbarTitleMode -->
-    <integer name="config_toolbar_title_mode">0</integer>
-</resources>
diff --git a/res/values-port/dimens.xml b/res/values-port/dimens.xml
index 5318d56..cdb70cf 100644
--- a/res/values-port/dimens.xml
+++ b/res/values-port/dimens.xml
@@ -22,5 +22,4 @@
     <dimen name="keypad_margin">@*android:dimen/car_padding_4</dimen>
 
     <dimen name="dialpad_info_title_text_size_max">36sp</dimen>
-    <dimen name="dialpad_info_margin_start">154dp</dimen>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 4cddc17..c50c68b 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Chamadas não atendidas (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Chamada não atendida</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Em espera"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Mudar de chamada"</string>
     <string name="setting_title" msgid="1296639422364732365">"Definições"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Ecrã inicial"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Ordem dos contactos"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Apelido"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Áudio da chamada de saída para:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conferência"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index a29c037..c0000b9 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">Chamada perdida (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Chamadas perdidas (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Em espera"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Trocar as chamadas"</string>
     <string name="setting_title" msgid="1296639422364732365">"Configurações"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Tela inicial"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Ordem dos contatos"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Sobrenome"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Saída de áudio da chamada:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conferência"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 58b9c7e..72961d4 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -67,7 +67,8 @@
       <item quantity="other">Apeluri nepreluate (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Apel nepreluat</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"În așteptare"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Comutați între apeluri"</string>
     <string name="setting_title" msgid="1296639422364732365">"Setări"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Ecran de pornire"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Ordinea persoanelor de contact"</string>
@@ -80,4 +81,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Nume"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Transmiteți conținutul audio al apelurilor către:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Conferință"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index d592e27..6aadc04 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="many"><xliff:g id="NUMBER">%1$d</xliff:g> пропущенных вызовов </item>
       <item quantity="other"><xliff:g id="NUMBER">%1$d</xliff:g> пропущенного вызова </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"На удержании"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Переключить вызов"</string>
     <string name="setting_title" msgid="1296639422364732365">"Настройки"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Начальный экран"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Порядок контактов"</string>
@@ -81,4 +82,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"По фамилии"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Вывод звука для вызова:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Конференц-вызов"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d): "</string>
 </resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 829107a..aca9a2c 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">මඟහැරුණු ඇමතුම් (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">මඟහැරුණු ඇමතුම් (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"රඳවා ඇත"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"ඇමතුම් මාරු කරන්න"</string>
     <string name="setting_title" msgid="1296639422364732365">"සැකසීම්"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"ආරම්භක තිරය"</string>
     <string name="sort_order_title" msgid="975104366728292702">"සම්බන්ධතා අනුපිළිවෙළ"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"අග නම"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"ඇමතුම් ශ්‍රව්‍ය ප්‍රතිදානය කරන්නේ:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"සමුළුව"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 6de24d1..5870d03 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="other">Zmeškané hovory (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Zmeškaný hovor</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Pozdržané"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Prepnúť hovory"</string>
     <string name="setting_title" msgid="1296639422364732365">"Nastavenia"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Úvodná obrazovka"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Poradie kontaktov"</string>
@@ -81,4 +82,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Priezvisko"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Smerovanie zvuku odchádzajúceho hovoru:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Videohovor"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 068fe64..340cd3c 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="few">Neodgovorjeni klici (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Neodgovorjeni klici (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Na čakanju"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Preklopi na drugi klic"</string>
     <string name="setting_title" msgid="1296639422364732365">"Nastavitve"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Začetni zaslon"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Vrstni red stikov"</string>
@@ -81,4 +82,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Priimek"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Izberite izhod za zvok klica:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferenca"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 819ade9..ee45f77 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Telefonata të humbura (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Telefonatë e humbur</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Në pritje"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Ndërro telefonatat"</string>
     <string name="setting_title" msgid="1296639422364732365">"Cilësimet"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Ekrani i nisjes"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Renditja e kontakteve"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Mbiemri"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Dërgoje audion e telefonatës te:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferenca"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index e9f7f49..34057de 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -23,7 +23,7 @@
     <string name="bluetooth_unpaired" msgid="1600552386483652892">"Да бисте упућивали или примали позиве, упарите телефон са аутомобилом."</string>
     <string name="connect_bluetooth_button_text" msgid="293188695227298042">"Повежи са Bluetooth-ом"</string>
     <string name="emergency_button_text" msgid="3467659545392931727">"Хитан случај"</string>
-    <string name="emergency_call_description" msgid="6700161437750325693">"Хитни позив"</string>
+    <string name="emergency_call_description" msgid="6700161437750325693">"Хитан позив"</string>
     <string name="error_contact_deleted" msgid="6356539067659368396">"Овај контакт је можда избрисан."</string>
     <string name="error_invalid_phone_number" msgid="5349049631580646136">"Позивање овог броја није успело. Проверите га и пробајте поново."</string>
     <string name="error_telephony_not_available" msgid="8715829862083386178">"Телефонски позив није доступан. Пробајте поново касније."</string>
@@ -67,7 +67,8 @@
       <item quantity="few">Пропуштени позиви(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Пропуштени позиви(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"На чекању"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Промени позив"</string>
     <string name="setting_title" msgid="1296639422364732365">"Подешавања"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Почетни екран"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Редослед контаката"</string>
@@ -80,4 +81,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Презиме"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Изаберите излаз за звук позива:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Конференција"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 1a37f19..7fae811 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Missade samtal (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Missat samtal</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Parkerat"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Byt mellan samtal"</string>
     <string name="setting_title" msgid="1296639422364732365">"Inställningar"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Startskärm"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontaktordning"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Efternamn"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Använd följande utgång för samtalsljud:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferens"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 0135d15..9e8c824 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Simu ambazo hukujibu(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Simu ambayo hukujibu</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Imesitishwa."</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Badilisha simu unayopokea"</string>
     <string name="setting_title" msgid="1296639422364732365">"Mipangilio"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Skrini ya kwanza"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Mpangilio wa anwani"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Jina la mwisho"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Toa sauti ya simu kwenye:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Mkutano wa video"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index dfad421..d6958d6 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">தவறிய அழைப்புகள்(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">தவறிய அழைப்பு</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"ஹோல்டில் உள்ளது"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"அழைப்புகளை மாற்று"</string>
     <string name="setting_title" msgid="1296639422364732365">"அமைப்புகள்"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"தொடக்கப் பக்கம்"</string>
     <string name="sort_order_title" msgid="975104366728292702">"தொடர்புகளின் வரிசை"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"பெயரின் பிற்பகுதி"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"அழைப்பின் ஆடியோவை இதில் வெளியீடு செய்:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"குழு அழைப்பு"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index e65bee7..88da129 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">మిస్డ్ కాల్‌లు(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">మిస్డ్ కాల్</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"హోల్డ్‌లో ఉంది"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"కాల్‌ల మధ్య స్విచ్ అవ్వండి"</string>
     <string name="setting_title" msgid="1296639422364732365">"సెట్టింగ్‌లు"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"స్క్రీన్‌ను ప్రారంభించు"</string>
     <string name="sort_order_title" msgid="975104366728292702">"పరిచయాల క్రమం"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"చివరి పేరు"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"దీనికి అవుట్‌పుట్ కాల్ ఆడియో:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"కాన్ఫరెన్స్"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index cb254fb..18f48db 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">สายที่ไม่ได้รับ(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">สายที่ไม่ได้รับ</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"พักสาย"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"สลับสาย"</string>
     <string name="setting_title" msgid="1296639422364732365">"การตั้งค่า"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"หน้าจอเริ่มต้น"</string>
     <string name="sort_order_title" msgid="975104366728292702">"ลำดับรายชื่อติดต่อ"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"นามสกุล"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"เอาต์พุตเสียงโทรศัพท์ไปที่:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"การประชุม"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 8ccef58..a59a37a 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">Mga hindi nasagot na tawag(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Mga hindi nasagot na tawag(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Naka-hold"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Magpalit ng tawag"</string>
     <string name="setting_title" msgid="1296639422364732365">"Mga Setting"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Screen ng simula"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Pagkakasunud-sunod ng contact"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Apelyido"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Gamiting output ng audio ng tawag ang:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Kumperensya"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 2dfdaf9..33da560 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Cevapsız aramalar (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Cevapsız arama</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Beklemede"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Aramalar arasında geçiş yap"</string>
     <string name="setting_title" msgid="1296639422364732365">"Ayarlar"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Başlangıç ekranı"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kişi sırası"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Soyadı"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Çağrı sesini şuraya ver:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferans"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 1b21937..f0ee563 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -68,7 +68,8 @@
       <item quantity="many">Пропущені виклики (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Пропущені виклики (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Утримується"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Перейти до іншого виклику"</string>
     <string name="setting_title" msgid="1296639422364732365">"Налаштування"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Початковий екран"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Порядок відображення"</string>
@@ -81,4 +82,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Прізвище"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Куди виводити звук виклику:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Конференція"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 33bfd48..1641de3 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">چھوٹی ہوئی کالز(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">چھوٹی ہوئی کال</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"ہولڈ پر ہے"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"کالز سوئچ کریں"</string>
     <string name="setting_title" msgid="1296639422364732365">"ترتیبات"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"اسکرین شروع کریں"</string>
     <string name="sort_order_title" msgid="975104366728292702">"رابطہ کی ترتیب"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"آخری نام"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"آؤٹ پٹ کال آڈیو کے ليے:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"کانفرنس"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s ‪(%2$d) - "</string>
 </resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 706fd22..9c45e5c 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Javobsiz chaqiruvlar (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Javobsiz chaqiruv</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Kutish holatida"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Chaqiruvlarni almashtirish"</string>
     <string name="setting_title" msgid="1296639422364732365">"Sozlamalar"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Bosh ekran"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Kontaktlar tartibi"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Familiyalar asosida"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Chaqiruv audiosi chiqishi:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Konferensiya"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 89f3f91..c8a34a9 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">Cuộc gọi nhỡ (<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="one">Cuộc gọi nhỡ</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Đang giữ máy"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Chuyển cuộc gọi"</string>
     <string name="setting_title" msgid="1296639422364732365">"Cài đặt"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Màn hình bắt đầu"</string>
     <string name="sort_order_title" msgid="975104366728292702">"Thứ tự danh bạ"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Họ"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Chuyển âm thanh cuộc gọi sang:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Hội nghị"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) – "</string>
 </resources>
diff --git a/res/values-w1280dp-land/dimens.xml b/res/values-w1280dp-land/dimens.xml
index cddf4f6..8790808 100644
--- a/res/values-w1280dp-land/dimens.xml
+++ b/res/values-w1280dp-land/dimens.xml
@@ -15,5 +15,5 @@
 -->
 <resources>
     <dimen name="dialpad_info_title_text_size_max">36sp</dimen>
-    <dimen name="onhold_profile_margin_x">112dp</dimen>
+    <dimen name="onhold_profile_margin_x">165dp</dimen>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index b190bd1..cadc8d5 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">未接电话 (<xliff:g id="NUMBER">%1$d</xliff:g>)</item>
       <item quantity="one">未接电话</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"呼叫等待"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"切换通话"</string>
     <string name="setting_title" msgid="1296639422364732365">"设置"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"开始屏幕"</string>
     <string name="sort_order_title" msgid="975104366728292702">"联系人顺序"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"姓氏"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"将通话音频输出到:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"会议"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 276d9e1..d31f981 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">未接來電 (<xliff:g id="NUMBER">%1$d</xliff:g>)</item>
       <item quantity="one">未接來電</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"保留通話"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"切換通話"</string>
     <string name="setting_title" msgid="1296639422364732365">"設定"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"開始畫面"</string>
     <string name="sort_order_title" msgid="975104366728292702">"聯絡人排序"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"姓氏"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"將通話音訊輸出至:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"會議"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 50160b4..e8cb483 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="other">未接來電 (<xliff:g id="NUMBER">%1$d</xliff:g>)</item>
       <item quantity="one">未接來電</item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"保留中"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"切換通話"</string>
     <string name="setting_title" msgid="1296639422364732365">"設定"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"開始畫面"</string>
     <string name="sort_order_title" msgid="975104366728292702">"聯絡人順序"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"姓氏"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"將通話音訊輸出至:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"會議"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 7135f77..d0e80bf 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -66,7 +66,8 @@
       <item quantity="one">Amakholi aphuthile(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
       <item quantity="other">Amakholi akuphuthile(<xliff:g id="NUMBER">%1$d</xliff:g>) </item>
     </plurals>
-    <string name="onhold_call_label" msgid="1937027519810985499">"Ibanjiwe"</string>
+    <string name="onhold_call_separator" msgid="2357788035385100805">"•"</string>
+    <string name="swap_call_label" msgid="309322319645637302">"Shintsha amakholi"</string>
     <string name="setting_title" msgid="1296639422364732365">"Izilungiselelo"</string>
     <string name="pref_start_page_title" msgid="1953465507368478503">"Isikrini sokuqala"</string>
     <string name="sort_order_title" msgid="975104366728292702">"I-oda loxhumana naye"</string>
@@ -79,4 +80,6 @@
     <string name="family_name_first_title" msgid="7721976826282427987">"Isibongo"</string>
     <string name="audio_route_dialog_title" msgid="2904553846970171054">"Khiphela umsindo wekholi kulokhu:"</string>
     <string name="audio_route_dialog_subtitle" msgid="8780526104805330121"></string>
+    <string name="ongoing_conf_title" msgid="4161590966144000887">"Inkomfa"</string>
+    <string name="ongoing_conf_title_format" msgid="7667048745156395220">"%1$s (%2$d) - "</string>
 </resources>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 49d2e52..5370346 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -15,28 +15,30 @@
 -->
 <resources>
     <!-- InCall page -->
-    <color name="phone_call">@*android:color/car_green_700</color>
-    <color name="phone_end_call">@*android:color/car_red_500a</color>
-    <color name="onhold_call_background">@*android:color/car_grey_868</color>
-    <color name="audio_output_accent">@*android:color/car_accent</color>
+    <color name="phone_call">@color/car_green_700</color>
+    <color name="phone_end_call">@color/car_red_500a</color>
+    <color name="onhold_call_background">@color/car_grey_868</color>
+    <color name="onhold_label_color">#FFA000</color>
+    <color name="audio_output_accent">#356FE5</color>
+    <color name="onhold_time_color">#B8FFFFFF</color>
 
     <!-- Dialpad page -->
-    <color name="call_button_outline">@*android:color/car_green_500</color>
+    <color name="call_button_outline">@color/car_green_500</color>
 
     <color name="car_key2">@color/car_key2_dark</color>
-    <color name="car_key2_light">@*android:color/car_grey_400</color>
-    <color name="car_key2_dark">@*android:color/car_grey_700</color>
+    <color name="car_key2_light">@color/car_grey_400</color>
+    <color name="car_key2_dark">@color/car_grey_700</color>
 
-    <color name="emergency_text_color">@*android:color/car_red_500a</color>
+    <color name="emergency_text_color">@color/car_red_500a</color>
 
     <!-- Components -->
     <color name="divider_color">@color/divider_color_light</color>
     <color name="divider_color_dark">#1EFFFFFF</color>
     <color name="divider_color_light">#38FFFFFF</color>
-    <color name="primary_icon_color">@*android:color/car_tint</color>
+    <color name="primary_icon_color">@color/icon_tint</color>
     <color name="secondary_icon_color">@color/secondary_icon_color_light</color>
     <color name="secondary_icon_color_dark">#8ADADCE0</color>
     <color name="secondary_icon_color_light">#99FFFFFF</color>
-    <color name="add_favorite_background_color">@*android:color/car_grey_868</color>
+    <color name="add_favorite_background_color">@color/car_grey_868</color>
 
 </resources>
diff --git a/res/values/configs.xml b/res/values/configs.xml
index 8ff5979..9ea27bf 100644
--- a/res/values/configs.xml
+++ b/res/values/configs.xml
@@ -43,8 +43,8 @@
     <!-- A config determines if to show the action bar avatar in the contact details page.-->
     <bool name="config_show_contact_details_action_bar_avatar">true</bool>
 
-    <!-- No toolbar title. Supported value see @attr/toolbarTitleMode -->
-    <integer name="config_toolbar_title_mode">1</integer>
+    <!-- Use app name as toolbar title. Supported value see @attr/toolbarTitleMode -->
+    <integer name="config_toolbar_title_mode">0</integer>
 
     <!-- A config determines whether to show the full screen ui when call is answered-->
     <bool name="config_show_fullscreen_incall_ui">true</bool>
@@ -52,6 +52,9 @@
     when call is answered-->
     <bool name="config_should_show_active_call_setting">false</bool>
 
+    <!-- Config for enabling incoming call HUN fullscreen intent -->
+    <bool name="config_show_hun_fullscreen_incall_ui">true</bool>
+
     <!-- A config determines whether to show a heads up notification when there's a incoming call-->
     <bool name="config_should_suppress_incoming_call_hun">false</bool>
     <!-- A config determines whether to show an entry in setting to config showing a heads up
@@ -63,6 +66,4 @@
     <!-- A config determines whether to show user profile for input number only when type down is
     not showing. This config works only when config_show_type_down_list_on_dialpad is false. -->
     <bool name="config_show_detailed_user_profile_on_dialpad">false</bool>
-    <!-- A percent determines the size of the area for type down list on Dialpad in portrait mode. -->
-    <item name="config_type_down_guideline_percent" format="float" type="dimen">0.3</item>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 16d2ce1..2ab877c 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -17,27 +17,24 @@
     <!-- Dialer -->
     <dimen name="dialer_card_elevation">2dp</dimen>
 
-    <!-- TODO: UNUSED! REMOVE THIS. b/149125789-->
-    <dimen name="audio_route_constraint_guide_begin">@dimen/list_item_guideline</dimen>
-
     <!-- Call list dimensions -->
     <dimen name="call_history_item_height">@dimen/list_item_height</dimen>
     <dimen name="call_history_item_padding">@dimen/list_item_padding</dimen>
     <dimen name="call_history_guideline_begin">@dimen/list_item_guideline_begin</dimen>
     <dimen name="call_history_guideline_end">@dimen/list_item_guideline_end</dimen>
     <dimen name="call_history_text_margin_end">@dimen/list_item_text_margin_end</dimen>
-    <dimen name="call_history_icons_margin">@*android:dimen/car_padding_1</dimen>
+    <dimen name="call_history_icons_margin">@dimen/car_ui_padding_1</dimen>
     <dimen name="call_log_icon_margin">4dp</dimen>
 
     <!-- Contact details dimensions -->
-    <dimen name="contact_details_avatar_margin_top">@*android:dimen/car_padding_4</dimen>
-    <dimen name="contact_details_title_margin_top">@*android:dimen/car_padding_4</dimen>
-    <dimen name="contact_details_title_margin_bottom">@*android:dimen/car_padding_5</dimen>
+    <dimen name="contact_details_avatar_margin_top">@dimen/car_ui_padding_4</dimen>
+    <dimen name="contact_details_title_margin_top">@dimen/car_ui_padding_4</dimen>
+    <dimen name="contact_details_title_margin_bottom">@dimen/car_ui_padding_5</dimen>
     <dimen name="contact_details_avatar_size">126dp</dimen>
     <dimen name="contact_details_item_height">@dimen/list_item_height</dimen>
-    <dimen name="contact_details_number_padding_start">@*android:dimen/car_keyline_1</dimen>
-    <dimen name="contact_details_number_padding_end">@*android:dimen/car_padding_2</dimen>
-    <dimen name="contact_details_text_button_guideline">@*android:dimen/car_keyline_3</dimen>
+    <dimen name="contact_details_number_padding_start">@dimen/car_keyline_1</dimen>
+    <dimen name="contact_details_number_padding_end">@dimen/car_ui_padding_2</dimen>
+    <dimen name="contact_details_text_button_guideline">@dimen/car_keyline_3</dimen>
     <dimen name="contact_details_action_bar_avatar_size">@dimen/primary_icon_size</dimen>
 
     <!-- Contact list dimensions -->
@@ -54,50 +51,51 @@
 
     <!-- In-call dimensions -->
     <dimen name="in_call_controller_bar_height">@dimen/control_bar_height</dimen>
-    <dimen name="in_call_controller_bar_margin">@*android:dimen/car_padding_5</dimen>
+    <dimen name="in_call_controller_bar_margin">@dimen/car_ui_padding_5</dimen>
     <dimen name="in_call_controller_bar_margin_bottom">0dp</dimen>
     <dimen name="in_call_avatar_icon_size">196dp</dimen>
-    <dimen name="in_call_phone_number_margin_top">@*android:dimen/car_padding_2</dimen>
-    <dimen name="in_call_state_margin_top">@*android:dimen/car_padding_2</dimen>
+    <dimen name="in_call_avatar_icon_size_small">98dp</dimen>
+    <dimen name="in_call_phone_number_margin_top">@dimen/car_ui_padding_2</dimen>
+    <dimen name="in_call_state_margin_top">@dimen/car_ui_padding_2</dimen>
     <dimen name="in_call_margin_between_avatar_and_text">48dp</dimen>
-    <dimen name="in_call_user_profile_margin">@*android:dimen/car_margin</dimen>
-    <dimen name="onhold_user_info_height">@dimen/list_item_height</dimen>
+    <dimen name="in_call_user_profile_margin">@dimen/car_ui_margin</dimen>
+    <dimen name="in_call_user_profile_list_margin">60dp</dimen>
+    <dimen name="onhold_user_info_height">90dp</dimen>
     <dimen name="onhold_profile_margin_x">@dimen/list_item_padding</dimen>
-    <dimen name="onhold_profile_margin_y">@*android:dimen/car_padding_3</dimen>
+    <dimen name="onhold_profile_margin_y">@dimen/car_ui_padding_3</dimen>
     <dimen name="onhold_profile_corner_radius">8dp</dimen>
-    <dimen name="onhold_profile_avatar_margin">@*android:dimen/car_keyline_1</dimen>
+    <dimen name="onhold_profile_avatar_margin">@dimen/car_keyline_1</dimen>
     <dimen name="onhold_profile_guideline">@dimen/list_item_guideline</dimen>
-    <dimen name="swap_call_button_margin">@*android:dimen/car_keyline_1</dimen>
+    <dimen name="onhold_profile_status_margin">12dp</dimen>
+    <dimen name="user_profile_list_item_height">150dp</dimen>
 
     <!-- Ringing call dimensions -->
     <dimen name="ringing_call_button_touch_target_size">@dimen/touch_target_size</dimen>
-    <dimen name="ringing_call_text_margin">@*android:dimen/car_padding_4</dimen>
+    <dimen name="ringing_call_text_margin">@dimen/car_ui_padding_4</dimen>
 
     <!-- Dialpad dimensions -->
-    <dimen name="dialpad_line_divider_height">@dimen/vertical_divider_width</dimen>
-    <dimen name="dialpad_info_title_padding_size">@*android:dimen/car_padding_4</dimen>
-    <dimen name="dialpad_info_edge_padding_size">@*android:dimen/car_padding_2</dimen>
+    <dimen name="dialpad_info_title_padding_size">@dimen/car_ui_padding_4</dimen>
+    <dimen name="dialpad_info_edge_padding_size">@dimen/car_ui_padding_2</dimen>
     <dimen name="dialpad_info_guideline">@dimen/touch_target_size</dimen>
-    <dimen name="dialpad_user_profile_padding">@*android:dimen/car_padding_3</dimen>
-    <dimen name="call_state_padding">@*android:dimen/car_padding_3</dimen>
+    <dimen name="dialpad_user_profile_padding">@dimen/car_ui_padding_3</dimen>
+    <dimen name="call_state_padding">@dimen/car_ui_padding_3</dimen>
     <dimen name="dialpad_info_title_container_size">@dimen/touch_target_size</dimen>
     <dimen name="dialpad_info_title_text_size_max">28sp</dimen>
     <dimen name="dialpad_info_title_text_size_min">24sp</dimen>
     <dimen name="dialpad_contact_avatar_size">64dp</dimen>
     <dimen name="dialpad_contact_label_margin">12dp</dimen>
     <dimen name="dialpad_info_margin_end">112dp</dimen>
-    <dimen name="dialpad_info_margin_start">154dp</dimen>
     <dimen name="type_down_list_item_height">@dimen/control_bar_height</dimen>
 
     <!-- Keypad dimensions -->
     <dimen name="keypad_minimum_size">@dimen/touch_target_size</dimen>
-    <dimen name="keypad_margin_x">@*android:dimen/car_padding_2</dimen>
+    <dimen name="keypad_margin_x">@dimen/car_ui_padding_2</dimen>
     <dimen name="keypad_margin_y">0dp</dimen>
 
     <!-- Favorites dimensions -->
-    <dimen name="favorite_card_space_horizontal">@*android:dimen/car_padding_3</dimen>
-    <dimen name="favorite_card_space_vertical">@*android:dimen/car_padding_2</dimen>
-    <dimen name="favorites_avatar_margin_bottom">@*android:dimen/car_padding_3</dimen>
+    <dimen name="favorite_card_space_horizontal">@dimen/car_ui_padding_3</dimen>
+    <dimen name="favorite_card_space_vertical">@dimen/car_ui_padding_2</dimen>
+    <dimen name="favorites_avatar_margin_bottom">@dimen/car_ui_padding_3</dimen>
 
     <dimen name="call_fab_elevation">8dp</dimen>
     <dimen name="bksp_button_width">@dimen/touch_target_size</dimen>
@@ -116,24 +114,24 @@
     <dimen name="no_hfp_icon_size">56dp</dimen>
     <dimen name="emergency_button_min_height">@dimen/touch_target_size</dimen>
     <dimen name="emergency_button_min_width">@dimen/touch_target_width</dimen>
-    <dimen name="emergency_button_bottom_margin">@*android:dimen/car_padding_4</dimen>
-    <dimen name="no_hfp_icon_margin_bottom">@*android:dimen/car_padding_3</dimen>
-    <dimen name="connect_bluetooth_button_margin_top">@*android:dimen/car_padding_5</dimen>
+    <dimen name="emergency_button_bottom_margin">@dimen/car_ui_padding_4</dimen>
+    <dimen name="no_hfp_icon_margin_bottom">@dimen/car_ui_padding_3</dimen>
+    <dimen name="connect_bluetooth_button_margin_top">@dimen/car_ui_padding_5</dimen>
 
-    <dimen name="list_top_padding">@*android:dimen/car_padding_2</dimen>
+    <dimen name="list_top_padding">@dimen/car_ui_padding_2</dimen>
     <!-- Components -->
     <dimen name="list_item_height">116dp</dimen>
-    <dimen name="list_item_guideline">@*android:dimen/car_keyline_3</dimen>
-    <dimen name="list_item_guideline_begin">@*android:dimen/car_keyline_4</dimen>
-    <dimen name="list_item_guideline_end">@*android:dimen/car_keyline_3</dimen>
-    <dimen name="list_item_text_margin_end">@*android:dimen/car_padding_2</dimen>
-    <dimen name="list_item_padding">@*android:dimen/car_keyline_1</dimen>
-    <dimen name="list_divider_inset">@*android:dimen/car_keyline_1</dimen>
-    <dimen name="list_divider_height">@*android:dimen/car_list_divider_height</dimen>
-    <dimen name="horizontal_divider_inset">@*android:dimen/car_padding_2</dimen>
-    <dimen name="vertical_divider_inset">@*android:dimen/car_padding_2</dimen>
+    <dimen name="list_item_guideline">@dimen/car_keyline_3</dimen>
+    <dimen name="list_item_guideline_begin">@dimen/car_keyline_4</dimen>
+    <dimen name="list_item_guideline_end">@dimen/car_keyline_3</dimen>
+    <dimen name="list_item_text_margin_end">@dimen/car_ui_padding_2</dimen>
+    <dimen name="list_item_padding">@dimen/car_keyline_1</dimen>
+    <dimen name="list_divider_inset">@dimen/car_keyline_1</dimen>
+    <dimen name="list_divider_height">@dimen/car_ui_list_item_action_divider_height</dimen>
+    <dimen name="vertical_divider_inset">@dimen/car_ui_padding_2</dimen>
     <dimen name="vertical_divider_width">2dp</dimen>
-    <dimen name="primary_icon_size">@*android:dimen/car_primary_icon_size</dimen>
+    <dimen name="primary_icon_size">@dimen/car_ui_primary_icon_size</dimen>
+    <dimen name="small_avatar_icon_size">56dp</dimen>
     <dimen name="avatar_icon_size">76dp</dimen>
     <dimen name="large_avatar_icon_size">96dp</dimen>
     <dimen name="primary_icon_enclosing_circle_size">64dp</dimen>
@@ -142,10 +140,13 @@
     <dimen name="touch_target_width">156dp</dimen>
     <dimen name="subheader_list_height">76dp</dimen>
     <dimen name="control_bar_height">96dp</dimen>
+    <dimen name="car_keyline_1">32dp</dimen>
+    <dimen name="car_keyline_3">128dp</dimen>
+    <dimen name="car_keyline_4">168dp</dimen>
 
     <!-- Loading status view dimensions -->
     <dimen name="loading_info_icon_size">56dp</dimen>
-    <dimen name="loading_info_icon_margin_bottom">@*android:dimen/car_padding_3</dimen>
-    <dimen name="loading_info_button_margin_top">@*android:dimen/car_padding_2</dimen>
+    <dimen name="loading_info_icon_margin_bottom">@dimen/car_ui_padding_3</dimen>
+    <dimen name="loading_info_button_margin_top">@dimen/car_ui_padding_2</dimen>
 
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1232b60..fe3a700 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -191,7 +191,8 @@
 
     <!-- Onhold User Profile Info -->
     <!-- Text to show the call is onhold [CHAR LIMIT=40]-->
-    <string name="onhold_call_label">On Hold</string>
+    <string name="onhold_call_separator">•</string>
+    <string name="swap_call_label">Switch calls</string>
 
     <!-- Contact list headers -->
     <!-- Contact list label for contact names starting with special characters -->
@@ -239,4 +240,10 @@
     <!-- Audio route selection dialog. Placeholder resources for overriding -->
     <string name="audio_route_dialog_title">Output call audio to:</string>
     <string name="audio_route_dialog_subtitle"></string>
+
+    <!-- Ongoing Conference Call -->
+    <!-- Title of conference page -->
+    <string name="ongoing_conf_title">Conference</string>
+    <string name="ongoing_conf_title_format">%1$s (%2$d) -\u0020</string>
+
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index a7c24a3..b34518b 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -75,10 +75,10 @@
     <!-- In-call styling for everything except short landscape screens -->
     <style name="TextAppearance.InCallUserTitle" parent="TextAppearance.Display2"/>
     <style name="TextAppearance.InCallUserPhoneNumber" parent="TextAppearance.Body1">
-        <item name="android:textColor">#B8FFFFFF</item>
+        <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
     <style name="TextAppearance.InCallState" parent="TextAppearance.Body1">
-        <item name="android:textColor">#B8FFFFFF</item>
+        <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
 
     <!-- Call history -->
@@ -86,7 +86,7 @@
     <!-- Customized text color for missed calls can be added here -->
     <style name="TextAppearance.CallLogTitleMissedCall" parent="TextAppearance.Body1"/>
     <style name="TextAppearance.CallLogSubtitle" parent="TextAppearance.Body3">
-        <item name="android:textColor">@color/secondary_text_color</item>
+        <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
     <style name="TextAppearance.CallLogCallCountDefault" parent="TextAppearance.CallLogSubtitle"/>
     <!-- Customized text color for missed calls can be added here -->
@@ -99,7 +99,7 @@
     <style name="TextAppearance.ContactDetailsTitle" parent="TextAppearance.Display2"/>
     <style name="TextAppearance.ContactDetailsListTitle" parent="TextAppearance.Body1"/>
     <style name="TextAppearance.ContactDetailsListSubtitle" parent="TextAppearance.Body3">
-        <item name="android:textColor">@color/secondary_text_color</item>
+        <item name="android:textColor">?android:attr/textColorSecondary</item>
     </style>
     <style name="TextAppearance.DefaultNumberLabel" parent="TextAppearance.Body3">
         <item name="android:textColor">@*android:color/accent_device_default_light</item>
@@ -107,15 +107,15 @@
 
     <!-- Contact results -->
     <style name="TextAppearance.ContactResultTitle" parent="TextAppearance.Body1">
-        <item name="android:textColor">@color/primary_text_selector</item>
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
 
     <!-- Add to favorite flow dialog -->
     <style name="TextAppearance.AddFavoriteNumberTitle" parent="TextAppearance.Body1">
-        <item name="android:textColor">@color/primary_text_selector</item>
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
     <style name="TextAppearance.AddFavoriteNumberSubtitle" parent="TextAppearance.Body3">
-        <item name="android:textColor">@color/primary_text_selector</item>
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
 
     <!-- Subheader -->
diff --git a/res/values/themes.xml b/res/values/themes.xml
index 28726d1..3638b14 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -15,7 +15,7 @@
 -->
 <resources>
     <!-- The base theme for the Dialer app. -->
-    <style name="Theme.Dialer" parent="Theme.CarUi">
+    <style name="Theme.Dialer" parent="Theme.CarUi.WithToolbar">
         <item name="android:listDivider">@drawable/list_divider</item>
         <item name="android:buttonStyle">@style/Widget.Dialer.Button</item>
         <item name="android:textDirection">locale</item>
@@ -30,8 +30,14 @@
         <item name="toolbarTitleMode">@integer/config_toolbar_title_mode</item>
     </style>
 
-    <style name="Theme.Dialer.InCall"/>
+    <style name="Theme.Dialer.InCall">
+        <item name="carUiToolbar">false</item>
+    </style>
 
     <style name="Theme.Dialer.Setting"/>
 
+    <style name="Theme.Dialer.ErrorActivity">
+        <item name="carUiToolbar">false</item>
+    </style>
+
 </resources>
diff --git a/src/com/android/car/dialer/bluetooth/BluetoothHeadsetClientProvider.java b/src/com/android/car/dialer/bluetooth/BluetoothHeadsetClientProvider.java
index fbbb3c3..e736969 100644
--- a/src/com/android/car/dialer/bluetooth/BluetoothHeadsetClientProvider.java
+++ b/src/com/android/car/dialer/bluetooth/BluetoothHeadsetClientProvider.java
@@ -54,8 +54,8 @@
             bluetoothAdapter.getProfileProxy(context, new BluetoothProfile.ServiceListener() {
                 @Override
                 public void onServiceConnected(int profile, BluetoothProfile proxy) {
+                    // On bind or turning bluetooth on will trigger onServiceConnected.
                     if (profile == BluetoothProfile.HEADSET_CLIENT) {
-                        // On bind or turning bluetooth on will trigger onServiceConnected.
                         mBluetoothHeadsetClient = (BluetoothHeadsetClient) proxy;
                         mIsBluetoothHeadsetClientConnected.setValue(true);
                     }
diff --git a/src/com/android/car/dialer/bluetooth/UiBluetoothMonitor.java b/src/com/android/car/dialer/bluetooth/UiBluetoothMonitor.java
index d232216..1f17142 100644
--- a/src/com/android/car/dialer/bluetooth/UiBluetoothMonitor.java
+++ b/src/com/android/car/dialer/bluetooth/UiBluetoothMonitor.java
@@ -23,7 +23,6 @@
 import androidx.lifecycle.Observer;
 import androidx.lifecycle.Transformations;
 
-import com.android.car.dialer.livedata.BluetoothHfpStateLiveData;
 import com.android.car.dialer.livedata.BluetoothPairListLiveData;
 import com.android.car.dialer.livedata.BluetoothStateLiveData;
 import com.android.car.dialer.livedata.HfpDeviceListLiveData;
@@ -39,12 +38,10 @@
 
     private final Context mContext;
 
-    private BluetoothHfpStateLiveData mHfpStateLiveData;
     private BluetoothPairListLiveData mPairListLiveData;
     private BluetoothStateLiveData mBluetoothStateLiveData;
     private HfpDeviceListLiveData mHfpDeviceListLiveData;
 
-    private Observer mHfpStateObserver;
     private Observer mPairListObserver;
     private Observer mBluetoothStateObserver;
     private Observer mHfpDeviceListObserver;
@@ -77,17 +74,14 @@
 
     private UiBluetoothMonitor(Context applicationContext) {
         mContext = applicationContext;
-        mHfpStateLiveData = new BluetoothHfpStateLiveData(mContext);
         mPairListLiveData = new BluetoothPairListLiveData(mContext);
         mBluetoothStateLiveData = new BluetoothStateLiveData(mContext);
         mHfpDeviceListLiveData = new HfpDeviceListLiveData(mContext);
 
-        mHfpStateObserver = o -> L.i(TAG, "HfpState is updated");
         mPairListObserver = o -> L.i(TAG, "PairList is updated");
         mBluetoothStateObserver = o -> L.i(TAG, "BluetoothState is updated");
         mHfpDeviceListObserver = o -> L.i(TAG, "HfpDeviceList is updated");
 
-        mHfpStateLiveData.observeForever(mHfpStateObserver);
         mPairListLiveData.observeForever(mPairListObserver);
         mBluetoothStateLiveData.observeForever(mBluetoothStateObserver);
         mHfpDeviceListLiveData.observeForever(mHfpDeviceListObserver);
@@ -98,7 +92,6 @@
      * {@link #get()} won't return a valid {@link UiBluetoothMonitor} after calling this function.
      */
     public void tearDown() {
-        removeObserver(mHfpStateLiveData, mHfpStateObserver);
         removeObserver(mPairListLiveData, mPairListObserver);
         removeObserver(mBluetoothStateLiveData, mBluetoothStateObserver);
         removeObserver(mHfpDeviceListLiveData, mHfpDeviceListObserver);
@@ -107,13 +100,6 @@
     }
 
     /**
-     * Returns a LiveData which monitors the HFP profile state changes.
-     */
-    public BluetoothHfpStateLiveData getHfpStateLiveData() {
-        return mHfpStateLiveData;
-    }
-
-    /**
      * Returns a LiveData which monitors the paired device list changes.
      */
     public BluetoothPairListLiveData getPairListLiveData() {
diff --git a/src/com/android/car/dialer/livedata/BluetoothErrorStringLiveData.java b/src/com/android/car/dialer/livedata/BluetoothErrorStringLiveData.java
new file mode 100644
index 0000000..2b474dc
--- /dev/null
+++ b/src/com/android/car/dialer/livedata/BluetoothErrorStringLiveData.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dialer.livedata;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+
+import androidx.lifecycle.MediatorLiveData;
+
+import com.android.car.dialer.R;
+import com.android.car.dialer.bluetooth.UiBluetoothMonitor;
+import com.android.car.dialer.log.L;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A {@link androidx.lifecycle.LiveData<String>} that has a string describing the current bluetooth
+ * error. If there is no error, its value will be {@link #NO_BT_ERROR}.
+ */
+public class BluetoothErrorStringLiveData extends MediatorLiveData<String> {
+    private static final String TAG = "CD.BluetoothErrorStringLiveData";
+
+    public static final String NO_BT_ERROR = "NO_ERROR";
+
+    private Context mContext;
+
+    private HfpDeviceListLiveData mHfpDeviceListLiveData;
+    private BluetoothPairListLiveData mPairListLiveData;
+    private BluetoothStateLiveData mBluetoothStateLiveData;
+
+    /**
+     * Creates {@link BluetoothErrorStringLiveData}.
+     *
+     * @param context A context for getting strings.
+     */
+    public static BluetoothErrorStringLiveData get(Context context) {
+        return new BluetoothErrorStringLiveData(context);
+    }
+
+    private BluetoothErrorStringLiveData(Context context) {
+        mContext = context.getApplicationContext();
+
+        if (BluetoothAdapter.getDefaultAdapter() == null) {
+            setValue(mContext.getString(R.string.bluetooth_unavailable));
+        } else {
+            setValue(NO_BT_ERROR);
+            UiBluetoothMonitor uiBluetoothMonitor = UiBluetoothMonitor.get();
+            mHfpDeviceListLiveData = uiBluetoothMonitor.getHfpDeviceListLiveData();
+            mPairListLiveData = uiBluetoothMonitor.getPairListLiveData();
+            mBluetoothStateLiveData = uiBluetoothMonitor.getBluetoothStateLiveData();
+
+            addSource(mHfpDeviceListLiveData, this::onHfpDevicesChanged);
+            addSource(mPairListLiveData, this::onPairListChanged);
+            addSource(mBluetoothStateLiveData, this::onBluetoothStateChanged);
+        }
+    }
+
+    private void onHfpDevicesChanged(List<BluetoothDevice> bluetoothDevices) {
+        update();
+    }
+
+    private void onPairListChanged(Set<BluetoothDevice> pairedDevices) {
+        update();
+    }
+
+    private void onBluetoothStateChanged(Integer state) {
+        update();
+    }
+
+    private void update() {
+        boolean isBluetoothEnabled = isBluetoothEnabled();
+        boolean hasPairedDevices = hasPairedDevices();
+        boolean isHfpConnected = isHfpConnected();
+        L.d(TAG, "Update error string."
+                        + " isBluetoothEnabled: %s"
+                        + " hasPairedDevices: %s"
+                        + " isHfpConnected: %s",
+                isBluetoothEnabled,
+                hasPairedDevices,
+                isHfpConnected);
+        if (isHfpConnected) {
+            if (!NO_BT_ERROR.equals(getValue())) {
+                setValue(NO_BT_ERROR);
+            }
+        } else if (!isBluetoothEnabled) {
+            setValue(mContext.getString(R.string.bluetooth_disabled));
+        } else if (!hasPairedDevices) {
+            setValue(mContext.getString(R.string.bluetooth_unpaired));
+        } else {
+            setValue(mContext.getString(R.string.no_hfp));
+        }
+    }
+
+    private boolean isHfpConnected() {
+        List<BluetoothDevice> mHfpDeviceList = mHfpDeviceListLiveData.getValue();
+        return mHfpDeviceList != null && !mHfpDeviceList.isEmpty();
+    }
+
+    private boolean isBluetoothEnabled() {
+        Integer bluetoothState = mBluetoothStateLiveData.getValue();
+        return bluetoothState == null
+                || bluetoothState != BluetoothStateLiveData.BluetoothState.DISABLED;
+    }
+
+    private boolean hasPairedDevices() {
+        Set<BluetoothDevice> pairedDevices = mPairListLiveData.getValue();
+        return pairedDevices == null || !pairedDevices.isEmpty();
+    }
+}
diff --git a/src/com/android/car/dialer/livedata/BluetoothHfpStateLiveData.java b/src/com/android/car/dialer/livedata/BluetoothHfpStateLiveData.java
deleted file mode 100644
index 4257d59..0000000
--- a/src/com/android/car/dialer/livedata/BluetoothHfpStateLiveData.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.car.dialer.livedata;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothHeadsetClient;
-import android.bluetooth.BluetoothProfile;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-
-import com.android.car.dialer.log.L;
-
-import androidx.lifecycle.LiveData;
-
-/**
- * Provides the connectivity state of HFP Bluetooth profile. States can be one of:
- * <ul>
- * <li>{@link BluetoothProfile#STATE_DISCONNECTED},
- * <li>{@link BluetoothProfile#STATE_CONNECTING},
- * <li>{@link BluetoothProfile#STATE_CONNECTED},
- * <li>{@link BluetoothProfile#STATE_DISCONNECTING}
- * </ul>
- */
-public class BluetoothHfpStateLiveData extends LiveData<Integer> {
-    private static final String TAG = "CD.BluetoothHfpStateLiveData";
-
-    private final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-    private final Context mContext;
-    private final IntentFilter mIntentFilter = new IntentFilter();
-
-    private BroadcastReceiver mBluetoothStateReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            updateState();
-        }
-    };
-
-    /** Creates a new {@link BluetoothHfpStateLiveData}. Call on main thread. */
-    public BluetoothHfpStateLiveData(Context context) {
-        mContext = context;
-        mIntentFilter.addAction(BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED);
-    }
-
-    @Override
-    protected void onActive() {
-        if (mBluetoothAdapter != null) {
-            updateState();
-            mContext.registerReceiver(mBluetoothStateReceiver, mIntentFilter);
-        }
-    }
-
-    @Override
-    protected void onInactive() {
-        if (mBluetoothAdapter != null) {
-            mContext.unregisterReceiver(mBluetoothStateReceiver);
-        }
-    }
-
-    private void updateState() {
-        int state = mBluetoothAdapter.getProfileConnectionState(
-                BluetoothProfile.HEADSET_CLIENT);
-        if (getValue() == null || state != getValue()) {
-            L.d(TAG, "updateState to %s", state);
-            setValue(state);
-        }
-    }
-}
diff --git a/src/com/android/car/dialer/livedata/CallDetailLiveData.java b/src/com/android/car/dialer/livedata/CallDetailLiveData.java
index 4d81801..58328e0 100644
--- a/src/com/android/car/dialer/livedata/CallDetailLiveData.java
+++ b/src/com/android/car/dialer/livedata/CallDetailLiveData.java
@@ -19,7 +19,7 @@
 import android.telecom.Call;
 import android.telecom.InCallService;
 
-import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.lifecycle.LiveData;
 
 import com.android.car.telephony.common.CallDetail;
@@ -31,23 +31,18 @@
  */
 public class CallDetailLiveData extends LiveData<CallDetail> {
 
-    private final Call mTelecomCall;
-
-    public CallDetailLiveData(@NonNull Call telecomCall) {
-        mTelecomCall = telecomCall;
-    }
+    private Call mTelecomCall;
 
     @Override
     protected void onActive() {
         super.onActive();
-        setTelecomCallDetail(mTelecomCall);
-        mTelecomCall.registerCallback(mCallback);
+        setTelecomCall(mTelecomCall);
     }
 
     @Override
     protected void onInactive() {
         super.onInactive();
-        mTelecomCall.unregisterCallback(mCallback);
+        setTelecomCall(null);
     }
 
     private Call.Callback mCallback = new Call.Callback() {
@@ -88,7 +83,22 @@
         }
     };
 
-    private void setTelecomCallDetail(Call telecomCall) {
-        setValue(CallDetail.fromTelecomCallDetail(telecomCall.getDetails()));
+    /**
+     * Sets the {@link Call} of which this live data sources.
+     */
+    public void setTelecomCall(Call telecomCall) {
+        if (mTelecomCall != null) {
+            mTelecomCall.unregisterCallback(mCallback);
+        }
+        mTelecomCall = telecomCall;
+        setTelecomCallDetail(mTelecomCall);
+        if (mTelecomCall != null) {
+            mTelecomCall.registerCallback(mCallback);
+        }
+    }
+
+    private void setTelecomCallDetail(@Nullable Call telecomCall) {
+        setValue(telecomCall != null ? CallDetail.fromTelecomCallDetail(telecomCall.getDetails())
+                : null);
     }
 }
diff --git a/src/com/android/car/dialer/notification/InCallNotificationController.java b/src/com/android/car/dialer/notification/InCallNotificationController.java
index b10a358..464787b 100644
--- a/src/com/android/car/dialer/notification/InCallNotificationController.java
+++ b/src/com/android/car/dialer/notification/InCallNotificationController.java
@@ -16,7 +16,6 @@
 
 package com.android.car.dialer.notification;
 
-import android.annotation.TargetApi;
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
@@ -47,6 +46,8 @@
 
     private static InCallNotificationController sInCallNotificationController;
 
+    private boolean mShowFullscreenIncallUi;
+
     /**
      * Initialized a globally accessible {@link InCallNotificationController} which can be retrieved
      * by {@link #get}. If this function is called a second time before calling {@link #tearDown()},
@@ -84,9 +85,11 @@
     private final Set<String> mActiveInCallNotifications;
     private CompletableFuture<Void> mNotificationFuture;
 
-    @TargetApi(26)
     private InCallNotificationController(Context context) {
         mContext = context;
+
+        mShowFullscreenIncallUi = mContext.getResources().getBoolean(
+                R.bool.config_show_hun_fullscreen_incall_ui);
         mNotificationManager =
                 (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
 
@@ -106,7 +109,6 @@
 
 
     /** Show a new incoming call notification or update the existing incoming call notification. */
-    @TargetApi(26)
     public void showInCallNotification(Call call) {
         L.d(TAG, "showInCallNotification");
 
@@ -118,8 +120,12 @@
         String number = callDetail.getNumber();
         String callId = call.getDetails().getTelecomCallId();
         mActiveInCallNotifications.add(callId);
+
+        if (mShowFullscreenIncallUi) {
+            mNotificationBuilder.setFullScreenIntent(
+                    getFullscreenIntent(call), /* highPriority= */true);
+        }
         mNotificationBuilder
-                .setFullScreenIntent(getFullscreenIntent(call), /* highPriority= */true)
                 .setLargeIcon((Icon) null)
                 .setContentTitle(TelecomUtils.getBidiWrappedNumber(number))
                 .setContentText(mContext.getString(R.string.notification_incoming_call))
@@ -188,6 +194,7 @@
 
     private Intent getIntent(String action, Call call) {
         Intent intent = new Intent(action, null, mContext, NotificationService.class);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         intent.putExtra(NotificationService.EXTRA_CALL_ID, call.getDetails().getTelecomCallId());
         return intent;
     }
diff --git a/src/com/android/car/dialer/notification/MissedCallNotificationController.java b/src/com/android/car/dialer/notification/MissedCallNotificationController.java
index 717a985..219f879 100644
--- a/src/com/android/car/dialer/notification/MissedCallNotificationController.java
+++ b/src/com/android/car/dialer/notification/MissedCallNotificationController.java
@@ -16,7 +16,6 @@
 
 package com.android.car.dialer.notification;
 
-import android.annotation.TargetApi;
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
@@ -98,7 +97,6 @@
     private final List<PhoneCallLog> mCurrentPhoneCallLogList;
     private final Map<String, CompletableFuture<Void>> mUpdateFutures = new HashMap<>();
 
-    @TargetApi(26)
     private MissedCallNotificationController(Context context) {
         mContext = context;
         mNotificationManager =
diff --git a/src/com/android/car/dialer/notification/MissedCallReceiver.java b/src/com/android/car/dialer/notification/MissedCallReceiver.java
index 25b7e15..4431ec2 100644
--- a/src/com/android/car/dialer/notification/MissedCallReceiver.java
+++ b/src/com/android/car/dialer/notification/MissedCallReceiver.java
@@ -23,9 +23,9 @@
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.telecom.Log;
 
 import com.android.car.dialer.log.L;
+import com.android.car.telephony.common.TelecomUtils;
 
 /**
  * A {@link BroadcastReceiver} that is used to inform telecom manager that we are showing the
@@ -47,6 +47,6 @@
         int count = intent.getIntExtra(EXTRA_NOTIFICATION_COUNT, 0);
         String phoneNumber = intent.getStringExtra(EXTRA_NOTIFICATION_PHONE_NUMBER);
 
-        L.d(TAG, "Count: %d PhoneNumber: %s", count, Log.pii(phoneNumber));
+        L.d(TAG, "Count: %d PhoneNumber: %s", count, TelecomUtils.piiLog(phoneNumber));
     }
 }
diff --git a/src/com/android/car/dialer/telecom/InCallRouter.java b/src/com/android/car/dialer/telecom/InCallRouter.java
index 43619fd..590b136 100644
--- a/src/com/android/car/dialer/telecom/InCallRouter.java
+++ b/src/com/android/car/dialer/telecom/InCallRouter.java
@@ -159,6 +159,7 @@
         }
 
         Intent launchIntent = new Intent(mContext, InCallActivity.class);
+        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         launchIntent.putExtra(Constants.Intents.EXTRA_SHOW_INCOMING_CALL, showDialpad);
         mContext.startActivity(launchIntent);
     }
diff --git a/src/com/android/car/dialer/telecom/InCallServiceImpl.java b/src/com/android/car/dialer/telecom/InCallServiceImpl.java
index ab75c6e..0efe65f 100644
--- a/src/com/android/car/dialer/telecom/InCallServiceImpl.java
+++ b/src/com/android/car/dialer/telecom/InCallServiceImpl.java
@@ -24,7 +24,9 @@
 import android.telecom.InCallService;
 
 import com.android.car.dialer.log.L;
+import com.android.car.dialer.ui.activecall.InCallActivity;
 
+import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
@@ -124,6 +126,20 @@
         mInCallRouter.routeToFullScreenIncomingCallPage(showDialpad);
     }
 
+    /**
+     * Starts InCallActivity if the ongoing call list has changed.
+     */
+    public void maybeStartInCallActivity(List<Call> ongoingCallList) {
+        if (ongoingCallList == null || ongoingCallList.isEmpty()) {
+            return;
+        }
+
+        L.d(TAG, "Start InCallActivity");
+        Intent launchIntent = new Intent(getApplicationContext(), InCallActivity.class);
+        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        startActivity(launchIntent);
+    }
+
     public void addCallAudioStateChangedCallback(CallAudioStateCallback callback) {
         mCallAudioStateCallbacks.add(callback);
     }
diff --git a/src/com/android/car/dialer/telecom/ProjectionCallHandler.java b/src/com/android/car/dialer/telecom/ProjectionCallHandler.java
index 50e0334..4a1b2ba 100644
--- a/src/com/android/car/dialer/telecom/ProjectionCallHandler.java
+++ b/src/com/android/car/dialer/telecom/ProjectionCallHandler.java
@@ -15,7 +15,6 @@
  */
 package com.android.car.dialer.telecom;
 
-import android.annotation.Nullable;
 import android.bluetooth.BluetoothDevice;
 import android.car.Car;
 import android.car.CarProjectionManager;
@@ -29,8 +28,10 @@
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+
 import com.android.car.dialer.log.L;
-import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.Collections;
 import java.util.List;
@@ -45,30 +46,47 @@
     @VisibleForTesting static final String PROJECTION_STATUS_EXTRA_DEVICE_STATE =
             "android.car.projection.DEVICE_STATE";
 
-    private final CarProjectionManager mCarProjectionManager;
+    private final Context mContext;
     private final TelecomManager mTelecomManager;
+    private final CarProjectionManagerProvider mCarProjectionManagerProvider;
+    private Car mCar;
+    private CarProjectionManager mCarProjectionManager;
 
     private int mProjectionState = ProjectionStatus.PROJECTION_STATE_INACTIVE;
     private List<ProjectionStatus> mProjectionDetails = Collections.emptyList();
 
     ProjectionCallHandler(Context context) {
-        this(context.getSystemService(TelecomManager.class),
-                (CarProjectionManager)
-                        Car.createCar(context).getCarManager(Car.PROJECTION_SERVICE));
+        this(context, context.getSystemService(TelecomManager.class),
+                car -> (CarProjectionManager) car.getCarManager(Car.PROJECTION_SERVICE));
     }
 
     @VisibleForTesting
-    ProjectionCallHandler(TelecomManager telecomManager, CarProjectionManager projectionManager) {
+    ProjectionCallHandler(Context context, TelecomManager telecomManager,
+            CarProjectionManagerProvider projectionManagerProvider) {
+        mContext = context;
         mTelecomManager = telecomManager;
-        mCarProjectionManager = projectionManager;
+        mCarProjectionManagerProvider = projectionManagerProvider;
     }
 
     void start() {
-        mCarProjectionManager.registerProjectionStatusListener(this);
+        if (mCar == null) {
+            mCar = Car.createCar(mContext);
+        }
+        if (mCarProjectionManager == null) {
+            mCarProjectionManager = mCarProjectionManagerProvider.getCarProjectionManager(mCar);
+            mCarProjectionManager.registerProjectionStatusListener(this);
+        }
     }
 
     void stop() {
-        mCarProjectionManager.unregisterProjectionStatusListener(this);
+        if (mCarProjectionManager != null) {
+            mCarProjectionManager.unregisterProjectionStatusListener(this);
+            mCarProjectionManager = null;
+        }
+        if (mCar != null) {
+            mCar.disconnect();
+            mCar = null;
+        }
     }
 
     @Override
@@ -182,4 +200,8 @@
         // No projecting apps want to suppress this device, so let it through.
         return false;
     }
+
+    interface CarProjectionManagerProvider {
+        CarProjectionManager getCarProjectionManager(Car car);
+    }
 }
diff --git a/src/com/android/car/dialer/telecom/UiCallManager.java b/src/com/android/car/dialer/telecom/UiCallManager.java
index 41d5a3b..5ddc162 100644
--- a/src/com/android/car/dialer/telecom/UiCallManager.java
+++ b/src/com/android/car/dialer/telecom/UiCallManager.java
@@ -24,22 +24,20 @@
 import android.content.ServiceConnection;
 import android.net.Uri;
 import android.os.IBinder;
-import android.os.ServiceManager;
 import android.telecom.Call;
 import android.telecom.CallAudioState;
-import android.telecom.CallAudioState.CallAudioRoute;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 import android.text.TextUtils;
 import android.widget.Toast;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.car.dialer.R;
 import com.android.car.dialer.bluetooth.BluetoothHeadsetClientProvider;
 import com.android.car.dialer.log.L;
 import com.android.car.telephony.common.TelecomUtils;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.telephony.ITelephony;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -241,7 +239,7 @@
     /**
      * Re-route the audio out phone of the ongoing phone call.
      */
-    public void setAudioRoute(@CallAudioRoute int audioRoute) {
+    public void setAudioRoute(int audioRoute) {
         BluetoothHeadsetClient bluetoothHeadsetClient = mBluetoothHeadsetClientProvider.get();
         if (bluetoothHeadsetClient != null && isBluetoothCall()) {
             for (BluetoothDevice device : bluetoothHeadsetClient.getConnectedDevices()) {
@@ -273,21 +271,15 @@
             Uri uri = Uri.fromParts("tel", number, null);
             L.d(TAG, "android.telecom.TelecomManager#placeCall: %s", number);
 
-            // Check if ITelephony is present before placing a call to avoid crash. This is a
-            // temporary fix where system performance is the root cause of the availability of
-            // the service.
-            // TODO(b/138866013): revert when the system is stable and is able to bring up the
-            // ITelephony in time.
-            ITelephony telephony = ITelephony.Stub.asInterface(
-                    ServiceManager.getService(Context.TELEPHONY_SERVICE));
-            if (telephony != null) {
+            try {
                 mTelecomManager.placeCall(uri, null);
                 return true;
+            } catch (IllegalStateException e) {
+                Toast.makeText(mContext, R.string.error_telephony_not_available,
+                        Toast.LENGTH_SHORT).show();
+                L.w(TAG, e.toString());
+                return false;
             }
-
-            Toast.makeText(mContext, R.string.error_telephony_not_available,
-                    Toast.LENGTH_SHORT).show();
-            return false;
         } else {
             L.d(TAG, "invalid number dialed", number);
             Toast.makeText(mContext, R.string.error_invalid_phone_number,
diff --git a/src/com/android/car/dialer/ui/NoHfpActivity.java b/src/com/android/car/dialer/ui/NoHfpActivity.java
new file mode 100644
index 0000000..9c9e588
--- /dev/null
+++ b/src/com/android/car/dialer/ui/NoHfpActivity.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dialer.ui;
+
+import android.content.Intent;
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.ViewModelProvider;
+
+import com.android.car.dialer.livedata.BluetoothErrorStringLiveData;
+import com.android.car.dialer.ui.warning.NoHfpFragment;
+
+/**
+ * An activity to host {@link NoHfpFragment} and
+ * {@link com.android.car.dialer.ui.dialpad.DialpadFragment#newEmergencyDialpad()}.
+ */
+public class NoHfpActivity extends FragmentActivity {
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        BluetoothErrorStringLiveData errorStringLiveData = (new ViewModelProvider(this))
+                .get(NoHfpActivityViewModel.class)
+                .getBluetoothErrorStringLiveData();
+
+        errorStringLiveData.observe(this, (String error) -> {
+            if (BluetoothErrorStringLiveData.NO_BT_ERROR.equals(error)) {
+                startActivity(new Intent(this, TelecomActivity.class));
+                finish();
+            } else {
+                Fragment currentFragment = getSupportFragmentManager()
+                        .findFragmentById(android.R.id.content);
+                if (currentFragment instanceof NoHfpFragment) {
+                    ((NoHfpFragment) currentFragment).setErrorMessage(error);
+                }
+            }
+        });
+
+        if (savedInstanceState == null) {
+            getSupportFragmentManager().beginTransaction()
+                    .replace(android.R.id.content,
+                            NoHfpFragment.newInstance(errorStringLiveData.getValue()))
+                    .commit();
+        }
+    }
+}
diff --git a/src/com/android/car/dialer/ui/NoHfpActivityViewModel.java b/src/com/android/car/dialer/ui/NoHfpActivityViewModel.java
new file mode 100644
index 0000000..9474e8d
--- /dev/null
+++ b/src/com/android/car/dialer/ui/NoHfpActivityViewModel.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dialer.ui;
+
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+import androidx.lifecycle.AndroidViewModel;
+
+import com.android.car.dialer.livedata.BluetoothErrorStringLiveData;
+
+/** View model for {@link NoHfpActivity} */
+public class NoHfpActivityViewModel extends AndroidViewModel {
+
+    private final BluetoothErrorStringLiveData mBluetoothErrorStringLiveData;
+
+    public NoHfpActivityViewModel(@NonNull Application application) {
+        super(application);
+
+        mBluetoothErrorStringLiveData = BluetoothErrorStringLiveData.get(application);
+    }
+
+    public BluetoothErrorStringLiveData getBluetoothErrorStringLiveData() {
+        return mBluetoothErrorStringLiveData;
+    }
+}
diff --git a/src/com/android/car/dialer/ui/TelecomActivity.java b/src/com/android/car/dialer/ui/TelecomActivity.java
index 94899f4..e327458 100644
--- a/src/com/android/car/dialer/ui/TelecomActivity.java
+++ b/src/com/android/car/dialer/ui/TelecomActivity.java
@@ -19,15 +19,12 @@
 import android.app.SearchManager;
 import android.content.Intent;
 import android.content.SharedPreferences;
-import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.provider.CallLog;
 import android.telecom.Call;
 import android.telephony.PhoneNumberUtils;
-import android.view.View;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 import androidx.lifecycle.LiveData;
@@ -38,54 +35,50 @@
 import com.android.car.apps.common.util.Themes;
 import com.android.car.dialer.Constants;
 import com.android.car.dialer.R;
+import com.android.car.dialer.livedata.BluetoothErrorStringLiveData;
 import com.android.car.dialer.log.L;
 import com.android.car.dialer.notification.NotificationService;
 import com.android.car.dialer.telecom.UiCallManager;
 import com.android.car.dialer.ui.activecall.InCallActivity;
 import com.android.car.dialer.ui.activecall.InCallViewModel;
-import com.android.car.dialer.ui.calllog.CallHistoryFragment;
 import com.android.car.dialer.ui.common.DialerBaseFragment;
-import com.android.car.dialer.ui.contact.ContactListFragment;
 import com.android.car.dialer.ui.dialpad.DialpadFragment;
-import com.android.car.dialer.ui.favorite.FavoriteFragment;
 import com.android.car.dialer.ui.search.ContactResultsFragment;
 import com.android.car.dialer.ui.settings.DialerSettingsActivity;
-import com.android.car.dialer.ui.warning.NoHfpFragment;
+import com.android.car.ui.baselayout.Insets;
+import com.android.car.ui.baselayout.InsetsChangedListener;
+import com.android.car.ui.core.CarUi;
 import com.android.car.ui.toolbar.MenuItem;
-import com.android.car.ui.toolbar.Toolbar;
+import com.android.car.ui.toolbar.ToolbarController;
 
 import java.util.List;
 
 /**
- * Main activity for the Dialer app. It contains two layers:
- * <ul>
- * <li>Overlay layer for {@link NoHfpFragment}
- * <li>Content layer for {@link FavoriteFragment} {@link CallHistoryFragment} {@link
- * ContactListFragment} and {@link DialpadFragment}
+ * Main activity for the Dialer app. It hosts most of the fragments for the app.
  *
  * <p>Start {@link InCallActivity} if there are ongoing calls
  *
  * <p>Based on call and connectivity status, it will choose the right page to display.
  */
 public class TelecomActivity extends FragmentActivity implements
-        DialerBaseFragment.DialerFragmentParent {
+        DialerBaseFragment.DialerFragmentParent, InsetsChangedListener {
     private static final String TAG = "CD.TelecomActivity";
     private LiveData<String> mBluetoothErrorMsgLiveData;
-    private LiveData<Integer> mDialerAppStateLiveData;
     private LiveData<List<Call>> mOngoingCallListLiveData;
     private LiveData<Boolean> mRefreshUiLiveData;
     // View objects for this activity.
     private TelecomPageTab.Factory mTabFactory;
-    private Toolbar mCarUiToolbar;
+    private ToolbarController mCarUiToolbar;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         L.d(TAG, "onCreate");
+
         setContentView(R.layout.telecom_activity);
 
-        mCarUiToolbar = findViewById(R.id.car_ui_toolbar);
+        mCarUiToolbar = CarUi.requireToolbar(this);
 
         setupTabLayout(false);
 
@@ -96,9 +89,13 @@
         mRefreshUiLiveData.observe(this, v -> refreshUi());
 
         mBluetoothErrorMsgLiveData = viewModel.getErrorMessage();
-        mDialerAppStateLiveData = viewModel.getDialerAppState();
-        mDialerAppStateLiveData.observe(this,
-                dialerAppState -> updateCurrentFragment(dialerAppState));
+        mBluetoothErrorMsgLiveData.observe(this, (String error) -> {
+            if (!BluetoothErrorStringLiveData.NO_BT_ERROR.equals(error)) {
+                startActivity(new Intent(this, NoHfpActivity.class));
+                finish();
+            }
+        });
+
         MutableLiveData<Integer> toolbarTitleMode = viewModel.getToolbarTitleMode();
         toolbarTitleMode.setValue(Themes.getAttrInteger(this, R.attr.toolbarTitleMode));
 
@@ -131,10 +128,7 @@
         switch (action) {
             case Intent.ACTION_DIAL:
                 number = PhoneNumberUtils.getNumberFromIntent(intent, this);
-                if (TelecomActivityViewModel.DialerAppState.BLUETOOTH_ERROR
-                        != mDialerAppStateLiveData.getValue()) {
-                    showDialPadFragment(number);
-                }
+                showDialPadFragment(number);
                 break;
 
             case Intent.ACTION_CALL:
@@ -148,20 +142,14 @@
                 break;
 
             case Constants.Intents.ACTION_SHOW_PAGE:
-                if (TelecomActivityViewModel.DialerAppState.BLUETOOTH_ERROR
-                        != mDialerAppStateLiveData.getValue()) {
-                    showTabPage(intent.getStringExtra(Constants.Intents.EXTRA_SHOW_PAGE));
-                    if (intent.getBooleanExtra(Constants.Intents.EXTRA_ACTION_READ_MISSED, false)) {
-                        NotificationService.readAllMissedCall(this);
-                    }
+                showTabPage(intent.getStringExtra(Constants.Intents.EXTRA_SHOW_PAGE));
+                if (intent.getBooleanExtra(Constants.Intents.EXTRA_ACTION_READ_MISSED, false)) {
+                    NotificationService.readAllMissedCall(this);
                 }
                 break;
             case Intent.ACTION_VIEW:
                 if (CallLog.Calls.CONTENT_TYPE.equals(intent.getType())) {
-                    if (TelecomActivityViewModel.DialerAppState.BLUETOOTH_ERROR
-                            != mDialerAppStateLiveData.getValue()) {
-                        showTabPage(TelecomPageTab.Page.CALL_HISTORY);
-                    }
+                    showTabPage(TelecomPageTab.Page.CALL_HISTORY);
                 }
                 break;
             default:
@@ -174,85 +162,9 @@
         maybeStartInCallActivity(mOngoingCallListLiveData.getValue());
     }
 
-    /**
-     * Update the current visible fragment of this Activity based on the state of the application.
-     * <ul>
-     * <li> If bluetooth is not connected or there is an active call, show overlay, lock drawer,
-     * hide action bar and hide the content layer.
-     * <li> Otherwise, show the content layer, show action bar, hide the overlay and reset drawer
-     * lock mode.
-     */
-    private void updateCurrentFragment(
-            @TelecomActivityViewModel.DialerAppState int dialerAppState) {
-        L.d(TAG, "updateCurrentFragment, dialerAppState: %d", dialerAppState);
-
-        boolean isOverlayFragmentVisible =
-                TelecomActivityViewModel.DialerAppState.DEFAULT != dialerAppState;
-        findViewById(R.id.content_container)
-                .setVisibility(isOverlayFragmentVisible ? View.GONE : View.VISIBLE);
-        findViewById(R.id.overlay_container)
-                .setVisibility(isOverlayFragmentVisible ? View.VISIBLE : View.GONE);
-
-        switch (dialerAppState) {
-            case TelecomActivityViewModel.DialerAppState.BLUETOOTH_ERROR:
-                showNoHfpOverlay(mBluetoothErrorMsgLiveData.getValue());
-                break;
-
-            case TelecomActivityViewModel.DialerAppState.EMERGENCY_DIALPAD:
-                setOverlayFragment(DialpadFragment.newEmergencyDialpad());
-                break;
-
-            case TelecomActivityViewModel.DialerAppState.DEFAULT:
-            default:
-                clearOverlayFragment();
-                break;
-        }
-    }
-
-    private void showNoHfpOverlay(String errorMsg) {
-        Fragment overlayFragment = getCurrentOverlayFragment();
-        if (overlayFragment instanceof NoHfpFragment) {
-            ((NoHfpFragment) overlayFragment).setErrorMessage(errorMsg);
-        } else {
-            setOverlayFragment(NoHfpFragment.newInstance(errorMsg));
-        }
-    }
-
-    private void setOverlayFragment(@NonNull Fragment overlayFragment) {
-        L.d(TAG, "setOverlayFragment: %s", overlayFragment);
-
-        getSupportFragmentManager()
-                .beginTransaction()
-                .replace(R.id.overlay_container, overlayFragment)
-                .commitNow();
-    }
-
-    private void clearOverlayFragment() {
-        L.d(TAG, "clearOverlayFragment");
-
-        Fragment overlayFragment = getCurrentOverlayFragment();
-        if (overlayFragment == null) {
-            return;
-        }
-
-        getSupportFragmentManager()
-                .beginTransaction()
-                .remove(overlayFragment)
-                .commitNow();
-    }
-
-    /**
-     * Returns the fragment that is currently being displayed as the overlay view on top.
-     */
-    @Nullable
-    private Fragment getCurrentOverlayFragment() {
-        return getSupportFragmentManager().findFragmentById(R.id.overlay_container);
-    }
-
     private void setupTabLayout(boolean forceInit) {
         boolean wasContentFragmentRestored = false;
         mTabFactory = new TelecomPageTab.Factory(this, getSupportFragmentManager());
-
         for (int i = 0; i < mTabFactory.getTabCount(); i++) {
             TelecomPageTab tab = mTabFactory.createTab(getBaseContext(), i, forceInit);
             mCarUiToolbar.addTab(tab);
@@ -329,7 +241,7 @@
 
         getSupportFragmentManager()
                 .beginTransaction()
-                .replace(R.id.content_fragment_container, fragment, fragmentTag)
+                .replace(R.id.fragment_container, fragment, fragmentTag)
                 .addToBackStack(fragmentTag)
                 .commit();
     }
@@ -340,7 +252,7 @@
 
         getSupportFragmentManager()
                 .beginTransaction()
-                .replace(R.id.content_fragment_container, topContentFragment, fragmentTag)
+                .replace(R.id.fragment_container, topContentFragment, fragmentTag)
                 .addToBackStack(fragmentTag)
                 .commit();
     }
@@ -386,7 +298,7 @@
 
     private void navigateToContactResultsFragment(String query) {
         Fragment topFragment = getSupportFragmentManager().findFragmentById(
-                R.id.content_fragment_container);
+                R.id.fragment_container);
 
         // Top fragment is ContactResultsFragment, update search query
         if (topFragment instanceof ContactResultsFragment) {
@@ -422,10 +334,10 @@
         return mTabFactory.getTabIndex(sharedPreferences.getString(key, defaultValue));
     }
 
-    /**
-     * Sets the background of the Activity's tool bar to a {@link Drawable}
-     */
-    public void setShowToolbarBackground(boolean showToolbarBackground) {
-        mCarUiToolbar.setBackgroundShown(showToolbarBackground);
+    @Override
+    public void onCarUiInsetsChanged(Insets insets) {
+        // Do nothing, this is just a marker that we will handle the insets in fragments.
+        // This is only necessary because the fragments are not immediately added to the
+        // activity when calling .commit()
     }
 }
diff --git a/src/com/android/car/dialer/ui/TelecomActivityViewModel.java b/src/com/android/car/dialer/ui/TelecomActivityViewModel.java
index e3f9b46..5a09ca1 100644
--- a/src/com/android/car/dialer/ui/TelecomActivityViewModel.java
+++ b/src/com/android/car/dialer/ui/TelecomActivityViewModel.java
@@ -16,34 +16,28 @@
 
 package com.android.car.dialer.ui;
 
-import android.annotation.IntDef;
 import android.app.Application;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
 import android.content.Context;
 
+import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 import androidx.lifecycle.AndroidViewModel;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MediatorLiveData;
 import androidx.lifecycle.MutableLiveData;
 
-import com.android.car.dialer.R;
 import com.android.car.dialer.bluetooth.UiBluetoothMonitor;
-import com.android.car.dialer.livedata.BluetoothHfpStateLiveData;
-import com.android.car.dialer.livedata.BluetoothPairListLiveData;
-import com.android.car.dialer.livedata.BluetoothStateLiveData;
+import com.android.car.dialer.livedata.BluetoothErrorStringLiveData;
 import com.android.car.dialer.log.L;
 import com.android.car.dialer.ui.common.SingleLiveEvent;
 
-import com.google.common.annotations.VisibleForTesting;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.List;
-import java.util.Set;
 
 /**
  * View model for {@link TelecomActivity}.
@@ -53,11 +47,9 @@
     /**
      * A constant which indicates that there's no Bluetooth error.
      */
-    public static final String NO_BT_ERROR = "NO_ERROR";
 
     private final Context mApplicationContext;
     private final LiveData<String> mErrorStringLiveData;
-    private final MutableLiveData<Integer> mDialerAppStateLiveData;
     private RefreshUiEvent mRefreshTabsLiveData;
 
     private final ToolbarTitleLiveData mToolbarTitleLiveData;
@@ -81,30 +73,17 @@
 
         mToolbarTitleMode = new MediatorLiveData<>();
         mToolbarTitleLiveData = new ToolbarTitleLiveData(mApplicationContext, mToolbarTitleMode);
+        mErrorStringLiveData = BluetoothErrorStringLiveData.get(mApplicationContext);
 
-        if (BluetoothAdapter.getDefaultAdapter() == null) {
-            MutableLiveData<String> bluetoothUnavailableLiveData = new MutableLiveData<>();
-            bluetoothUnavailableLiveData.setValue(
-                    mApplicationContext.getString(R.string.bluetooth_unavailable));
-            mErrorStringLiveData = bluetoothUnavailableLiveData;
-        } else {
-            UiBluetoothMonitor uiBluetoothMonitor = UiBluetoothMonitor.get();
-            mErrorStringLiveData = new ErrorStringLiveData(
-                    mApplicationContext,
-                    uiBluetoothMonitor.getHfpStateLiveData(),
-                    uiBluetoothMonitor.getPairListLiveData(),
-                    uiBluetoothMonitor.getBluetoothStateLiveData());
-
+        if (BluetoothAdapter.getDefaultAdapter() != null) {
             mRefreshTabsLiveData = new RefreshUiEvent(
-                    uiBluetoothMonitor.getHfpDeviceListLiveData());
+                    UiBluetoothMonitor.get().getHfpDeviceListLiveData());
         }
-
-        mDialerAppStateLiveData = new DialerAppStateLiveData(mErrorStringLiveData);
     }
 
     /**
      * Returns the {@link LiveData} for the toolbar title, which provides the toolbar title
-     * depending on the {@link R.attr#toolbarTitleMode}.
+     * depending on the {@link com.android.car.dialer.R.attr#toolbarTitleMode}.
      */
     public LiveData<String> getToolbarTitle() {
         return mToolbarTitleLiveData;
@@ -119,15 +98,8 @@
     }
 
     /**
-     * Returns the state of Dialer App.
-     */
-    public MutableLiveData<Integer> getDialerAppState() {
-        return mDialerAppStateLiveData;
-    }
-
-    /**
      * Returns a LiveData which provides the warning string based on Bluetooth states. Returns
-     * {@link #NO_BT_ERROR} if there's no error.
+     * {@link BluetoothErrorStringLiveData#NO_BT_ERROR} if there's no error.
      */
     public LiveData<String> getErrorMessage() {
         return mErrorStringLiveData;
@@ -140,119 +112,6 @@
         return mRefreshTabsLiveData;
     }
 
-    private static class DialerAppStateLiveData extends MediatorLiveData<Integer> {
-        private final LiveData<String> mErrorStringLiveData;
-
-        private DialerAppStateLiveData(LiveData<String> errorStringLiveData) {
-            this.mErrorStringLiveData = errorStringLiveData;
-            setValue(DialerAppState.DEFAULT);
-
-            addSource(mErrorStringLiveData, errorMsg -> updateDialerAppState());
-        }
-
-        private void updateDialerAppState() {
-            L.d(TAG, "updateDialerAppState, error: %s", mErrorStringLiveData.getValue());
-
-            // If bluetooth is not connected, user can make an emergency call. So show the in
-            // call fragment no matter if bluetooth is connected or not.
-            // Bluetooth error
-            if (!NO_BT_ERROR.equals(mErrorStringLiveData.getValue())) {
-                // Currently bluetooth is not connected, stay on the emergency dial pad page.
-                if (getValue() == DialerAppState.EMERGENCY_DIALPAD) {
-                    return;
-                }
-                setValue(DialerAppState.BLUETOOTH_ERROR);
-                return;
-            }
-
-            // Bluetooth connected.
-            setValue(DialerAppState.DEFAULT);
-        }
-
-        @Override
-        public void setValue(@DialerAppState Integer newValue) {
-            // Only set value and notify observers when the value changes.
-            if (getValue() != newValue) {
-                super.setValue(newValue);
-            }
-        }
-    }
-
-    private static class ErrorStringLiveData extends MediatorLiveData<String> {
-        private LiveData<Integer> mHfpStateLiveData;
-        private LiveData<Set<BluetoothDevice>> mPairedListLiveData;
-        private LiveData<Integer> mBluetoothStateLiveData;
-
-        private Context mContext;
-
-        ErrorStringLiveData(Context context,
-                BluetoothHfpStateLiveData hfpStateLiveData,
-                BluetoothPairListLiveData pairListLiveData,
-                BluetoothStateLiveData bluetoothStateLiveData) {
-            mContext = context;
-            mHfpStateLiveData = hfpStateLiveData;
-            mPairedListLiveData = pairListLiveData;
-            mBluetoothStateLiveData = bluetoothStateLiveData;
-            setValue(NO_BT_ERROR);
-
-            addSource(hfpStateLiveData, this::onHfpStateChanged);
-            addSource(pairListLiveData, this::onPairListChanged);
-            addSource(bluetoothStateLiveData, this::onBluetoothStateChanged);
-        }
-
-        private void onHfpStateChanged(Integer state) {
-            update();
-        }
-
-        private void onPairListChanged(Set<BluetoothDevice> pairedDevices) {
-            update();
-        }
-
-        private void onBluetoothStateChanged(Integer state) {
-            update();
-        }
-
-        private void update() {
-            boolean isBluetoothEnabled = isBluetoothEnabled();
-            boolean hasPairedDevices = hasPairedDevices();
-            boolean isHfpConnected = isHfpConnected();
-            L.d(TAG, "Update error string."
-                            + " isBluetoothEnabled: %s"
-                            + " hasPairedDevices: %s"
-                            + " isHfpConnected: %s",
-                    isBluetoothEnabled,
-                    hasPairedDevices,
-                    isHfpConnected);
-            if (isHfpConnected) {
-                if (!NO_BT_ERROR.equals(getValue())) {
-                    setValue(NO_BT_ERROR);
-                }
-            } else if (!isBluetoothEnabled) {
-                setValue(mContext.getString(R.string.bluetooth_disabled));
-            } else if (!hasPairedDevices) {
-                setValue(mContext.getString(R.string.bluetooth_unpaired));
-            } else {
-                setValue(mContext.getString(R.string.no_hfp));
-            }
-        }
-
-        private boolean isHfpConnected() {
-            Integer hfpState = mHfpStateLiveData.getValue();
-            return hfpState == null || hfpState == BluetoothProfile.STATE_CONNECTED;
-        }
-
-        private boolean isBluetoothEnabled() {
-            Integer bluetoothState = mBluetoothStateLiveData.getValue();
-            return bluetoothState == null
-                    || bluetoothState != BluetoothStateLiveData.BluetoothState.DISABLED;
-        }
-
-        private boolean hasPairedDevices() {
-            Set<BluetoothDevice> pairedDevices = mPairedListLiveData.getValue();
-            return pairedDevices == null || !pairedDevices.isEmpty();
-        }
-    }
-
     /**
      * This is an event live data to determine if the Ui needs to be refreshed.
      */
diff --git a/src/com/android/car/dialer/ui/activecall/ConferenceProfileAdapter.java b/src/com/android/car/dialer/ui/activecall/ConferenceProfileAdapter.java
new file mode 100644
index 0000000..224b6ed
--- /dev/null
+++ b/src/com/android/car/dialer/ui/activecall/ConferenceProfileAdapter.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dialer.ui.activecall;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.car.dialer.R;
+import com.android.car.telephony.common.CallDetail;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Adapter for holding user profiles of a conference.
+ */
+public class ConferenceProfileAdapter extends RecyclerView.Adapter<ConferenceProfileViewHolder> {
+
+    private Context mContext;
+    private List<CallDetail> mConferenceList = new ArrayList<>();
+
+    public ConferenceProfileAdapter(Context context) {
+        mContext = context;
+    }
+
+    /**
+     * Sets {@link #mConferenceList} based on live data.
+     */
+    public void setConferenceList(List<CallDetail> list) {
+        mConferenceList.clear();
+        if (list != null) {
+            mConferenceList.addAll(list);
+        }
+        notifyDataSetChanged();
+    }
+
+    @NonNull
+    @Override
+    public ConferenceProfileViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+        View view = LayoutInflater.from(mContext).inflate(R.layout.user_profile_list_item,
+                viewGroup, false);
+        return new ConferenceProfileViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull ConferenceProfileViewHolder conferenceProfileViewHolder,
+            int i) {
+        conferenceProfileViewHolder.bind(mConferenceList.get(i));
+    }
+
+    @Override
+    public int getItemCount() {
+        return mConferenceList.size();
+    }
+}
diff --git a/src/com/android/car/dialer/ui/activecall/ConferenceProfileViewHolder.java b/src/com/android/car/dialer/ui/activecall/ConferenceProfileViewHolder.java
new file mode 100644
index 0000000..9dc5f88
--- /dev/null
+++ b/src/com/android/car/dialer/ui/activecall/ConferenceProfileViewHolder.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dialer.ui.activecall;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.android.car.apps.common.LetterTileDrawable;
+import com.android.car.dialer.R;
+import com.android.car.dialer.ui.view.ContactAvatarOutputlineProvider;
+import com.android.car.telephony.common.CallDetail;
+import com.android.car.telephony.common.TelecomUtils;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.RequestOptions;
+import com.bumptech.glide.request.target.SimpleTarget;
+import com.bumptech.glide.request.transition.Transition;
+
+/**
+ * View holder for a user profile of a conference
+ */
+public class ConferenceProfileViewHolder extends RecyclerView.ViewHolder {
+
+    private ImageView mAvatar;
+    private TextView mTitle;
+    private TextView mNumber;
+    private Context mContext;
+
+    ConferenceProfileViewHolder(View v) {
+        super(v);
+
+        mAvatar = v.findViewById(R.id.user_profile_avatar);
+        mAvatar.setOutlineProvider(ContactAvatarOutputlineProvider.get());
+        mTitle = v.findViewById(R.id.user_profile_title);
+        mNumber = v.findViewById(R.id.user_profile_phone_number);
+        mContext = v.getContext();
+    }
+
+    /**
+     * Binds call details to the profile views
+     */
+    public void bind(CallDetail callDetail) {
+        String number = callDetail.getNumber();
+        TelecomUtils.getPhoneNumberInfo(mContext, number)
+                .thenAcceptAsync((info) -> {
+                    if (mContext == null) {
+                        return;
+                    }
+
+                    mAvatar.setImageDrawable(TelecomUtils.createLetterTile(mContext, null, null));
+                    mTitle.setText(info.getDisplayName());
+
+                    String phoneNumberLabel = info.getTypeLabel();
+                    if (!phoneNumberLabel.isEmpty()) {
+                        phoneNumberLabel += " ";
+                    }
+                    phoneNumberLabel += TelecomUtils.getFormattedNumber(mContext, number);
+                    if (!TextUtils.isEmpty(phoneNumberLabel)
+                            && !phoneNumberLabel.equals(info.getDisplayName())) {
+                        mNumber.setText(phoneNumberLabel);
+                    } else {
+                        mNumber.setText(mContext.getString(R.string.unknown));
+                    }
+
+                    LetterTileDrawable letterTile = TelecomUtils.createLetterTile(
+                            mContext, info.getInitials(), info.getDisplayName());
+
+                    Glide.with(mContext)
+                            .load(info.getAvatarUri())
+                            .apply(new RequestOptions().centerCrop().error(letterTile))
+                            .into(new SimpleTarget<Drawable>() {
+                                @Override
+                                public void onResourceReady(Drawable resource,
+                                        Transition<? super Drawable> glideAnimation) {
+                                    mAvatar.setImageDrawable(resource);
+                                }
+
+                                @Override
+                                public void onLoadFailed(Drawable errorDrawable) {
+                                    mAvatar.setImageDrawable(letterTile);
+                                }
+                            });
+
+                }, mContext.getMainExecutor());
+    }
+}
diff --git a/src/com/android/car/dialer/ui/activecall/InCallActivity.java b/src/com/android/car/dialer/ui/activecall/InCallActivity.java
index af438a1..bf22b27 100644
--- a/src/com/android/car/dialer/ui/activecall/InCallActivity.java
+++ b/src/com/android/car/dialer/ui/activecall/InCallActivity.java
@@ -23,6 +23,7 @@
 import androidx.core.util.Pair;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentTransaction;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.ViewModelProviders;
@@ -32,13 +33,13 @@
 import com.android.car.dialer.R;
 import com.android.car.dialer.log.L;
 import com.android.car.dialer.notification.InCallNotificationController;
-
-import java.util.List;
+import com.android.car.telephony.common.CallDetail;
 
 /** Activity for ongoing call and incoming call. */
 public class InCallActivity extends FragmentActivity {
     private static final String TAG = "CD.InCallActivity";
     private Fragment mOngoingCallFragment;
+    private Fragment mOngoingConfCallFragment;
     private Fragment mIncomingCallFragment;
 
     private InCallViewModel mInCallViewModel;
@@ -54,14 +55,23 @@
 
         mOngoingCallFragment = getSupportFragmentManager().findFragmentById(
                 R.id.ongoing_call_fragment);
+        mOngoingConfCallFragment = getSupportFragmentManager().findFragmentById(
+                R.id.ongoing_conf_call_fragment);
         mIncomingCallFragment = getSupportFragmentManager().findFragmentById(
                 R.id.incoming_call_fragment);
 
+        // Initially hide all fragments to prevent animation flicker
+        getSupportFragmentManager().beginTransaction()
+                .hide(mIncomingCallFragment)
+                .hide(mOngoingCallFragment)
+                .hide(mOngoingConfCallFragment)
+                .commit();
+
         mShowIncomingCall = new MutableLiveData<>();
         mInCallViewModel = ViewModelProviders.of(this).get(InCallViewModel.class);
         mIncomingCallLiveData = LiveDataFunctions.iff(mShowIncomingCall,
                 mInCallViewModel.getIncomingCall());
-        LiveDataFunctions.pair(mInCallViewModel.getOngoingCallList(),
+        LiveDataFunctions.pair(mInCallViewModel.getPrimaryCallDetail(),
                 mIncomingCallLiveData).observe(this, this::updateVisibility);
 
         handleIntent();
@@ -85,14 +95,32 @@
         handleIntent();
     }
 
-    private void updateVisibility(Pair<List<Call>, Call> callList) {
-        if ((callList.first == null || callList.first.isEmpty()) && callList.second == null) {
+    private void updateVisibility(Pair<CallDetail, Call> callList) {
+        CallDetail detail = callList.first;
+        Call incomingCall = callList.second;
+
+        if (detail == null && incomingCall == null) {
             L.d(TAG, "No call to show. Finish InCallActivity");
             finish();
             return;
         }
 
-        updateIncomingCallVisibility(callList.second);
+        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
+
+        if (incomingCall == null) {
+            ft.show(detail.isConference() ? mOngoingConfCallFragment : mOngoingCallFragment)
+                    .hide(detail.isConference() ? mOngoingCallFragment : mOngoingConfCallFragment)
+                    .hide(mIncomingCallFragment);
+
+            mShowIncomingCall.setValue(false);
+            setIntent(null);
+        } else {
+            ft.show(mIncomingCallFragment)
+                    .hide(mOngoingCallFragment)
+                    .hide(mOngoingConfCallFragment);
+        }
+
+        ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out).commit();
     }
 
     private void handleIntent() {
@@ -107,24 +135,4 @@
             mShowIncomingCall.setValue(false);
         }
     }
-
-    private void updateIncomingCallVisibility(Call incomingCall) {
-        if (incomingCall == null) {
-            getSupportFragmentManager()
-                    .beginTransaction()
-                    .show(mOngoingCallFragment)
-                    .hide(mIncomingCallFragment)
-                    .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
-                    .commit();
-            mShowIncomingCall.setValue(false);
-            setIntent(null);
-        } else {
-            getSupportFragmentManager()
-                    .beginTransaction()
-                    .show(mIncomingCallFragment)
-                    .hide(mOngoingCallFragment)
-                    .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
-                    .commit();
-        }
-    }
 }
diff --git a/src/com/android/car/dialer/ui/activecall/InCallFragment.java b/src/com/android/car/dialer/ui/activecall/InCallFragment.java
index 6076266..1b70a40 100644
--- a/src/com/android/car/dialer/ui/activecall/InCallFragment.java
+++ b/src/com/android/car/dialer/ui/activecall/InCallFragment.java
@@ -169,9 +169,8 @@
             mUserProfileCallStateText.start();
         } else {
             mUserProfileCallStateText.stop();
-            mUserProfileCallStateText.setText(
-                    TelecomUtils.callStateToUiString(getContext(),
-                            callStateAndConnectTime.first));
+            mUserProfileCallStateText.setText(TelecomUtils.callStateToUiString(getContext(),
+                    callStateAndConnectTime.first));
         }
     }
 
diff --git a/src/com/android/car/dialer/ui/activecall/InCallViewModel.java b/src/com/android/car/dialer/ui/activecall/InCallViewModel.java
index 39210fa..7e60ebf 100644
--- a/src/com/android/car/dialer/ui/activecall/InCallViewModel.java
+++ b/src/com/android/car/dialer/ui/activecall/InCallViewModel.java
@@ -59,20 +59,24 @@
 
     private final MutableLiveData<List<Call>> mCallListLiveData;
     private final MutableLiveData<List<Call>> mOngoingCallListLiveData;
+    private final MutableLiveData<List<Call>> mConferenceCallListLiveData;
+    private final LiveData<List<CallDetail>> mConferenceCallDetailListLiveData;
     private final Comparator<Call> mCallComparator;
 
     private final MutableLiveData<Call> mIncomingCallLiveData;
 
-    private final LiveData<CallDetail> mCallDetailLiveData;
+    private final CallDetailLiveData mCallDetailLiveData;
     private final LiveData<Integer> mCallStateLiveData;
     private final LiveData<Call> mPrimaryCallLiveData;
     private final LiveData<Call> mSecondaryCallLiveData;
-    private final LiveData<CallDetail> mSecondaryCallDetailLiveData;
+    private final CallDetailLiveData mSecondaryCallDetailLiveData;
+    private final LiveData<Pair<Call, Call>> mOngoingCallPairLiveData;
     private final LiveData<Integer> mAudioRouteLiveData;
     private MutableLiveData<CallAudioState> mCallAudioStateLiveData;
     private final MutableLiveData<Boolean> mDialpadIsOpen;
     private final ShowOnholdCallLiveData mShowOnholdCall;
     private LiveData<Long> mCallConnectTimeLiveData;
+    private LiveData<Long> mSecondaryCallConnectTimeLiveData;
     private LiveData<Pair<Integer, Long>> mCallStateAndConnectTimeLiveData;
     private final Context mContext;
 
@@ -109,12 +113,25 @@
             // Sets value to trigger incoming call and active call list to update.
             mCallListLiveData.setValue(mCallListLiveData.getValue());
         }
+
+        @Override
+        public void onParentChanged(Call call, Call parent) {
+            L.d(TAG, "onParentChanged %s", call);
+            updateCallList();
+        }
+
+        @Override
+        public void onChildrenChanged(Call call, List<Call> children) {
+            L.d(TAG, "onChildrenChanged %s", call);
+            updateCallList();
+        }
     };
 
     public InCallViewModel(@NonNull Application application) {
         super(application);
         mContext = application.getApplicationContext();
 
+        mConferenceCallListLiveData = new MutableLiveData<>();
         mIncomingCallLiveData = new MutableLiveData<>();
         mOngoingCallListLiveData = new MutableLiveData<>();
         mCallAudioStateLiveData = new MutableLiveData<>();
@@ -126,16 +143,40 @@
                 List<Call> activeCallList = filter(callList,
                         call -> call != null && call.getState() != Call.STATE_RINGING);
                 activeCallList.sort(mCallComparator);
-                mOngoingCallListLiveData.setValue(activeCallList);
+                List<Call> conferenceList = filter(activeCallList,
+                        call -> call.getParent() != null);
+                List<Call> ongoingCallList = filter(activeCallList,
+                        call -> call.getParent() == null);
+                mConferenceCallListLiveData.setValue(conferenceList);
+                mOngoingCallListLiveData.setValue(ongoingCallList);
+                if (mInCallService != null) {
+                    mInCallService.maybeStartInCallActivity(ongoingCallList);
+                }
                 mIncomingCallLiveData.setValue(firstMatch(callList,
                         call -> call != null && call.getState() == Call.STATE_RINGING));
+
+                L.d(TAG, "size:" + activeCallList.size() + " activeList" + activeCallList);
+                L.d(TAG, "conf:%s" + conferenceList, conferenceList.size());
+                L.d(TAG, "ongoing:%s" + ongoingCallList, ongoingCallList.size());
             }
         };
 
-        mPrimaryCallLiveData = Transformations.map(mOngoingCallListLiveData,
-                input -> input.isEmpty() ? null : input.get(0));
-        mCallDetailLiveData = Transformations.switchMap(mPrimaryCallLiveData,
-                input -> input != null ? new CallDetailLiveData(input) : null);
+        mConferenceCallDetailListLiveData = Transformations.map(mConferenceCallListLiveData,
+                callList -> {
+                    List<CallDetail> detailList = new ArrayList<>();
+                    for (Call call : callList) {
+                        detailList.add(CallDetail.fromTelecomCallDetail(call.getDetails()));
+                    }
+                    return detailList;
+                });
+
+        mCallDetailLiveData = new CallDetailLiveData();
+        mPrimaryCallLiveData = Transformations.map(mOngoingCallListLiveData, input -> {
+            Call call = input.isEmpty() ? null : input.get(0);
+            mCallDetailLiveData.setTelecomCall(call);
+            return call;
+        });
+
         mCallStateLiveData = Transformations.switchMap(mPrimaryCallLiveData,
                 input -> input != null ? new CallStateLiveData(input) : null);
         mCallConnectTimeLiveData = Transformations.map(mCallDetailLiveData, (details) -> {
@@ -147,11 +188,23 @@
         mCallStateAndConnectTimeLiveData =
                 LiveDataFunctions.pair(mCallStateLiveData, mCallConnectTimeLiveData);
 
-        mSecondaryCallLiveData = Transformations.map(mOngoingCallListLiveData,
-                callList -> (callList != null && callList.size() > 1) ? callList.get(1) : null);
+        mSecondaryCallDetailLiveData = new CallDetailLiveData();
+        mSecondaryCallLiveData = Transformations.map(mOngoingCallListLiveData, callList -> {
+            Call call = (callList != null && callList.size() > 1) ? callList.get(1) : null;
+            mSecondaryCallDetailLiveData.setTelecomCall(call);
+            return call;
+        });
 
-        mSecondaryCallDetailLiveData = Transformations.switchMap(mSecondaryCallLiveData,
-                input -> input != null ? new CallDetailLiveData(input) : null);
+        mSecondaryCallConnectTimeLiveData = Transformations.map(mSecondaryCallDetailLiveData,
+                details -> {
+                    if (details == null) {
+                        return 0L;
+                    }
+                    return details.getConnectTimeMillis();
+                });
+
+        mOngoingCallPairLiveData = LiveDataFunctions.pair(mPrimaryCallLiveData,
+                mSecondaryCallLiveData);
 
         mAudioRouteLiveData = new AudioRouteLiveData(mContext);
 
@@ -166,6 +219,22 @@
         mContext.bindService(intent, mInCallServiceConnection, Context.BIND_AUTO_CREATE);
     }
 
+    /** Merge primary and secondary calls into a conference */
+    public void mergeConference() {
+        Call call = mPrimaryCallLiveData.getValue();
+        Call otherCall = mSecondaryCallLiveData.getValue();
+
+        if (call == null || otherCall == null) {
+            return;
+        }
+        call.conference(otherCall);
+    }
+
+    /** Returns the live data which monitors conference calls */
+    public LiveData<List<CallDetail>> getConferenceCallDetailList() {
+        return mConferenceCallDetailListLiveData;
+    }
+
     /** Returns the live data which monitors all the calls. */
     public LiveData<List<Call>> getAllCallList() {
         return mCallListLiveData;
@@ -229,6 +298,20 @@
     }
 
     /**
+     * Returns the live data which monitors the secondary call connect time.
+     */
+    public LiveData<Long> getSecondaryCallConnectTime() {
+        return mSecondaryCallConnectTimeLiveData;
+    }
+
+    /**
+     * Returns the live data that monitors the primary and secondary calls.
+     */
+    public LiveData<Pair<Call, Call>> getOngoingCallPair() {
+        return mOngoingCallPairLiveData;
+    }
+
+    /**
      * Returns current audio route.
      */
     public LiveData<Integer> getAudioRoute() {
diff --git a/src/com/android/car/dialer/ui/activecall/OnGoingCallControllerBarFragment.java b/src/com/android/car/dialer/ui/activecall/OnGoingCallControllerBarFragment.java
index 1bd62b9..b35635c 100644
--- a/src/com/android/car/dialer/ui/activecall/OnGoingCallControllerBarFragment.java
+++ b/src/com/android/car/dialer/ui/activecall/OnGoingCallControllerBarFragment.java
@@ -21,7 +21,6 @@
 import android.os.Bundle;
 import android.telecom.Call;
 import android.telecom.CallAudioState;
-import android.telecom.CallAudioState.CallAudioRoute;
 import android.text.SpannableString;
 import android.text.style.ForegroundColorSpan;
 import android.view.LayoutInflater;
@@ -34,6 +33,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
+import androidx.core.util.Pair;
 import androidx.core.util.Preconditions;
 import androidx.fragment.app.Fragment;
 import androidx.lifecycle.LiveData;
@@ -56,7 +56,7 @@
 
 /** A Fragment of the bar which controls on going call. */
 public class OnGoingCallControllerBarFragment extends Fragment {
-    private static String TAG = "CDialer.OngoingCallCtlFrg";
+    private static final String TAG = "CD.OngoingCallCtlFrg";
 
     private static final ImmutableMap<Integer, AudioRouteInfo> AUDIO_ROUTES =
             ImmutableMap.<Integer, AudioRouteInfo>builder()
@@ -78,6 +78,8 @@
                             R.drawable.ic_audio_route_speaker_activatable))
                     .build();
 
+    private InCallViewModel mInCallViewModel;
+
     private AlertDialog mAudioRouteSelectionDialog;
     private List<CarUiListItem> mAudioRouteListItems;
     private List<Integer> mAvailableRoutes;
@@ -86,8 +88,11 @@
     private View mAudioRouteView;
     private ImageView mAudioRouteButton;
     private TextView mAudioRouteText;
+    private View mMergeButton;
     private View mPauseButton;
     private LiveData<Call> mPrimaryCallLiveData;
+    private LiveData<List<Call>> mOngoingCallListLiveData;
+    private LiveData<Pair<Call, Call>> mOngoingCallPairLiveData;
     private MutableLiveData<Boolean> mDialpadState;
     private LiveData<List<Call>> mCallListLiveData;
     private int mPrimaryCallState;
@@ -137,18 +142,31 @@
 
         mAudioRouteSelectionDialog = audioRouteSelectionDialogBuilder.create();
 
-        InCallViewModel inCallViewModel = ViewModelProviders.of(getActivity()).get(
-                InCallViewModel.class);
+        mInCallViewModel = ViewModelProviders.of(getActivity()).get(InCallViewModel.class);
 
-        inCallViewModel.getPrimaryCallState().observe(this, this::setCallState);
-        mPrimaryCallLiveData = inCallViewModel.getPrimaryCall();
-        inCallViewModel.getAudioRoute().observe(this, this::updateViewBasedOnAudioRoute);
+        mInCallViewModel.getPrimaryCallState().observe(this, this::setCallState);
+        mPrimaryCallLiveData = mInCallViewModel.getPrimaryCall();
+        mOngoingCallPairLiveData = mInCallViewModel.getOngoingCallPair();
 
-        mDialpadState = inCallViewModel.getDialpadOpenState();
-        mCallAudioState = inCallViewModel.getCallAudioState();
+        mOngoingCallListLiveData = mInCallViewModel.getOngoingCallList();
+        mInCallViewModel.getAudioRoute().observe(this, this::updateViewBasedOnAudioRoute);
+        mDialpadState = mInCallViewModel.getDialpadOpenState();
+        mCallAudioState = mInCallViewModel.getCallAudioState();
 
-        mCallListLiveData = inCallViewModel.getAllCallList();
+        mCallListLiveData = mInCallViewModel.getAllCallList();
         mCallListLiveData.observe(this, v -> updatePauseButtonEnabledState());
+
+        mOngoingCallPairLiveData.observe(this, pair -> {
+            boolean isPrimaryCallConference = pair.first != null
+                    && pair.first.getDetails().hasProperty(Call.Details.PROPERTY_CONFERENCE);
+            if (!isPrimaryCallConference && pair.second != null) {
+                mPauseButton.setVisibility(View.GONE);
+                mMergeButton.setVisibility(View.VISIBLE);
+            } else {
+                mPauseButton.setVisibility(View.VISIBLE);
+                mMergeButton.setVisibility(View.GONE);
+            }
+        });
     }
 
     @Nullable
@@ -192,6 +210,11 @@
         mAudioRouteSelectionDialog.setOnDismissListener(
                 (dialog) -> mAudioRouteView.setActivated(false));
 
+        mMergeButton = fragmentView.findViewById(R.id.merge_button);
+        mMergeButton.setOnClickListener((v) -> {
+            mInCallViewModel.mergeConference();
+        });
+
         mPauseButton = fragmentView.findViewById(R.id.pause_button);
         mPauseButton.setOnClickListener((v) -> {
             if (mPrimaryCallState == Call.STATE_ACTIVE) {
@@ -202,6 +225,7 @@
                 L.i(TAG, "Pause button is clicked while call in %s state", mPrimaryCallState);
             }
         });
+
         updatePauseButtonEnabledState();
 
         return fragmentView;
@@ -244,8 +268,8 @@
     }
 
     private void updatePauseButtonEnabledState() {
-        boolean hasOnlyOneCall = mCallListLiveData.getValue() != null
-                && mCallListLiveData.getValue().size() == 1;
+        boolean hasOnlyOneCall = mOngoingCallListLiveData.getValue() != null
+                && mOngoingCallListLiveData.getValue().size() == 1;
         boolean shouldEnablePauseButton = hasOnlyOneCall && (mPrimaryCallState == Call.STATE_HOLDING
                 || mPrimaryCallState == Call.STATE_ACTIVE);
 
@@ -279,7 +303,7 @@
         }
     }
 
-    private void onSetAudioRoute(@CallAudioRoute int audioRoute) {
+    private void onSetAudioRoute(int audioRoute) {
         UiCallManager.get().setAudioRoute(audioRoute);
         mActiveRoute = audioRoute;
         updateAudioRouteListItems();
diff --git a/src/com/android/car/dialer/ui/activecall/OnHoldCallUserProfileFragment.java b/src/com/android/car/dialer/ui/activecall/OnHoldCallUserProfileFragment.java
index d86f804..673cf26 100644
--- a/src/com/android/car/dialer/ui/activecall/OnHoldCallUserProfileFragment.java
+++ b/src/com/android/car/dialer/ui/activecall/OnHoldCallUserProfileFragment.java
@@ -17,10 +17,12 @@
 package com.android.car.dialer.ui.activecall;
 
 import android.os.Bundle;
+import android.os.SystemClock;
 import android.telecom.Call;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Chronometer;
 import android.widget.ImageView;
 import android.widget.TextView;
 
@@ -47,9 +49,9 @@
     private ImageView mAvatarView;
     private View mSwapCallsView;
     private LiveData<Call> mPrimaryCallLiveData;
-    private LiveData<Call> mSecondaryCallLiveData;
     private CompletableFuture<Void> mPhoneNumberInfoFuture;
     private LetterTileDrawable mDefaultAvatar;
+    private Chronometer mTimeTextView;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -74,23 +76,43 @@
                 InCallViewModel.class);
         inCallViewModel.getSecondaryCallDetail().observe(this, this::updateProfile);
         mPrimaryCallLiveData = inCallViewModel.getPrimaryCall();
-        mSecondaryCallLiveData = inCallViewModel.getSecondaryCall();
+
+        mTimeTextView = fragmentView.findViewById(R.id.time);
+        inCallViewModel.getSecondaryCallConnectTime().observe(this, this::updateConnectTime);
 
         return fragmentView;
     }
 
+    /** Presents the onhold call duration. */
+    protected void updateConnectTime(Long connectTime) {
+        if (connectTime == null) {
+            mTimeTextView.stop();
+            mTimeTextView.setText("");
+            return;
+        }
+        mTimeTextView.setBase(connectTime
+                - System.currentTimeMillis() + SystemClock.elapsedRealtime());
+        mTimeTextView.start();
+    }
+
     private void updateProfile(@Nullable CallDetail callDetail) {
         if (callDetail == null) {
             return;
         }
 
+        mAvatarView.setImageDrawable(mDefaultAvatar);
+
         if (mPhoneNumberInfoFuture != null) {
             mPhoneNumberInfoFuture.cancel(true);
         }
 
+        if (callDetail.isConference()) {
+            mTitle.setText(getString(R.string.ongoing_conf_title));
+            return;
+        }
+
         String number = callDetail.getNumber();
         mTitle.setText(TelecomUtils.getFormattedNumber(getContext(), number));
-        mAvatarView.setImageDrawable(mDefaultAvatar);
 
         mPhoneNumberInfoFuture = TelecomUtils.getPhoneNumberInfo(getContext(), number)
                 .thenAcceptAsync((info) -> {
diff --git a/src/com/android/car/dialer/ui/activecall/OngoingCallFragment.java b/src/com/android/car/dialer/ui/activecall/OngoingCallFragment.java
index 0bb0c99..6318eb5 100644
--- a/src/com/android/car/dialer/ui/activecall/OngoingCallFragment.java
+++ b/src/com/android/car/dialer/ui/activecall/OngoingCallFragment.java
@@ -23,6 +23,7 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.Fragment;
 import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.ViewModelProviders;
@@ -30,8 +31,6 @@
 import com.android.car.apps.common.BackgroundImageView;
 import com.android.car.dialer.R;
 
-import com.google.common.annotations.VisibleForTesting;
-
 /**
  * A fragment that displays information about an on-going call with options to hang up.
  */
@@ -59,7 +58,6 @@
         inCallViewModel.getCallStateAndConnectTime().observe(this, this::updateCallDescription);
 
         mDialpadState = inCallViewModel.getDialpadOpenState();
-        mDialpadState.setValue(savedInstanceState == null ? false : !mDialpadFragment.isHidden());
         mDialpadState.observe(this, isDialpadOpen -> {
             if (isDialpadOpen) {
                 onOpenDialpad();
diff --git a/src/com/android/car/dialer/ui/activecall/OngoingConfCallFragment.java b/src/com/android/car/dialer/ui/activecall/OngoingConfCallFragment.java
new file mode 100644
index 0000000..663449f
--- /dev/null
+++ b/src/com/android/car/dialer/ui/activecall/OngoingConfCallFragment.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dialer.ui.activecall;
+
+import android.os.Bundle;
+import android.os.SystemClock;
+import android.telecom.Call;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Chronometer;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
+import androidx.core.util.Pair;
+import androidx.fragment.app.Fragment;
+import androidx.lifecycle.MutableLiveData;
+import androidx.lifecycle.ViewModelProviders;
+
+import com.android.car.dialer.R;
+import com.android.car.telephony.common.TelecomUtils;
+import com.android.car.ui.recyclerview.CarUiRecyclerView;
+
+/**
+ * A fragment that displays information about an on-going call with options to hang up.
+ */
+public class OngoingConfCallFragment extends Fragment {
+    private static final String TAG = "CD.OngoingConfCallFrag";
+
+    private Fragment mDialpadFragment;
+    private Fragment mOnholdCallFragment;
+    private View mConferenceCallProfilesView;
+    private MutableLiveData<Boolean> mDialpadState;
+    private CarUiRecyclerView mRecyclerView;
+    private Chronometer mConferenceTimeTextView;
+    private TextView mConferenceTitle;
+
+    private ConferenceProfileAdapter mConfProfileAdapter;
+
+    private String mConferenceTitleString;
+    private String mConfStrTitleFormat;
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        mConferenceTitleString = getString(R.string.ongoing_conf_title);
+        mConfStrTitleFormat = getString(R.string.ongoing_conf_title_format);
+    }
+
+    @Override
+    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
+        View fragmentView = inflater.inflate(R.layout.ongoing_conf_call_fragment,
+                container, false);
+
+        mOnholdCallFragment = getChildFragmentManager().findFragmentById(R.id.onhold_user_profile);
+        mDialpadFragment = getChildFragmentManager().findFragmentById(R.id.incall_dialpad_fragment);
+        mConferenceCallProfilesView = fragmentView.findViewById(R.id.conference_profiles);
+        mRecyclerView = mConferenceCallProfilesView.findViewById(R.id.recycler_view);
+        mConferenceTimeTextView = mConferenceCallProfilesView.findViewById(R.id.call_duration);
+        mConferenceTitle = mConferenceCallProfilesView.findViewById(R.id.conference_title);
+
+        if (mConfProfileAdapter == null) {
+            mConfProfileAdapter = new ConferenceProfileAdapter(getContext());
+        }
+        mRecyclerView.setAdapter(mConfProfileAdapter);
+
+        InCallViewModel inCallViewModel = ViewModelProviders.of(getActivity()).get(
+                InCallViewModel.class);
+
+        inCallViewModel.getCallStateAndConnectTime().observe(this,
+                this::updateCallDescription);
+
+        inCallViewModel.getConferenceCallDetailList().observe(this, list -> {
+            mConfProfileAdapter.setConferenceList(list);
+            updateTitle(list.size());
+        });
+
+        mDialpadState = inCallViewModel.getDialpadOpenState();
+        mDialpadState.observe(this, isDialpadOpen -> {
+            if (isDialpadOpen) {
+                onOpenDialpad();
+            } else {
+                onCloseDialpad();
+            }
+        });
+
+        inCallViewModel.shouldShowOnholdCall().observe(this,
+                this::updateOnholdCallFragmentVisibility);
+
+        return fragmentView;
+    }
+
+    @VisibleForTesting
+    void onOpenDialpad() {
+        getChildFragmentManager().beginTransaction()
+                .show(mDialpadFragment)
+                .commit();
+        mConferenceCallProfilesView.setVisibility(View.GONE);
+    }
+
+    @VisibleForTesting
+    void onCloseDialpad() {
+        getChildFragmentManager().beginTransaction()
+                .hide(mDialpadFragment)
+                .commit();
+        mConferenceCallProfilesView.setVisibility(View.VISIBLE);
+    }
+
+    private void updateTitle(int numParticipants) {
+        String title = String.format(mConfStrTitleFormat, mConferenceTitleString, numParticipants);
+        mConferenceTitle.setText(title);
+    }
+
+    /** Presents the call state and call duration. */
+    private void updateCallDescription(@Nullable Pair<Integer, Long> callStateAndConnectTime) {
+        if (callStateAndConnectTime == null || callStateAndConnectTime.first == null) {
+            mConferenceTimeTextView.stop();
+            mConferenceTimeTextView.setText("");
+            return;
+        }
+        if (callStateAndConnectTime.first == Call.STATE_ACTIVE) {
+            mConferenceTimeTextView.setBase(callStateAndConnectTime.second
+                    - System.currentTimeMillis() + SystemClock.elapsedRealtime());
+            mConferenceTimeTextView.start();
+        } else {
+            mConferenceTimeTextView.stop();
+            mConferenceTimeTextView.setText(TelecomUtils.callStateToUiString(getContext(),
+                    callStateAndConnectTime.first));
+        }
+    }
+
+    private void updateOnholdCallFragmentVisibility(Boolean showOnholdCall) {
+        if (showOnholdCall) {
+            getChildFragmentManager().beginTransaction().show(mOnholdCallFragment).commit();
+        } else {
+            getChildFragmentManager().beginTransaction().hide(mOnholdCallFragment).commit();
+        }
+    }
+}
diff --git a/src/com/android/car/dialer/ui/common/DialerBaseFragment.java b/src/com/android/car/dialer/ui/common/DialerBaseFragment.java
index 04afb88..21f2ff6 100644
--- a/src/com/android/car/dialer/ui/common/DialerBaseFragment.java
+++ b/src/com/android/car/dialer/ui/common/DialerBaseFragment.java
@@ -25,20 +25,20 @@
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.ViewModelProviders;
 
 import com.android.car.dialer.R;
-import com.android.car.dialer.ui.TelecomActivity;
 import com.android.car.dialer.ui.TelecomActivityViewModel;
+import com.android.car.ui.baselayout.Insets;
+import com.android.car.ui.baselayout.InsetsChangedListener;
+import com.android.car.ui.core.CarUi;
 import com.android.car.ui.toolbar.Toolbar;
+import com.android.car.ui.toolbar.ToolbarController;
 
 /**
  * The base class for top level dialer content {@link Fragment}s.
  */
-public abstract class DialerBaseFragment extends Fragment {
-
-    private MutableLiveData<Integer> mToolbarHeight;
+public abstract class DialerBaseFragment extends Fragment implements InsetsChangedListener {
 
     /**
      * Interface for Dialer top level fragment's parent to implement.
@@ -51,48 +51,38 @@
         void pushContentFragment(Fragment fragment, String fragmentTag);
     }
 
-    @Override
-    public void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mToolbarHeight = new MutableLiveData<>();
-    }
-
     @CallSuper
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        Toolbar toolbar = getActivity().findViewById(R.id.car_ui_toolbar);
+        ToolbarController toolbar = CarUi.getToolbar(requireActivity());
         // Null check for unit tests to pass
         if (toolbar != null) {
             setupToolbar(toolbar);
         }
-    }
 
-    @Override
-    public void onStart() {
-        super.onStart();
-        mToolbarHeight.observe(this, this::onToolbarHeightChange);
+        Insets insets = CarUi.getInsets(requireActivity());
+        // Null check for unit tests to pass
+        if (insets != null) {
+            onCarUiInsetsChanged(insets);
+        }
     }
 
     /**
      * Customizes the tool bar. Can be overridden in subclasses.
      */
-    protected void setupToolbar(@NonNull Toolbar toolbar) {
-        TelecomActivityViewModel viewModel = ViewModelProviders.of(getActivity()).get(
+    protected void setupToolbar(@NonNull ToolbarController toolbar) {
+        TelecomActivityViewModel viewModel = ViewModelProviders.of(requireActivity()).get(
                 TelecomActivityViewModel.class);
         LiveData<String> toolbarTitleLiveData = viewModel.getToolbarTitle();
-        toolbarTitleLiveData.observe(this,
-                toolbarTitle -> toolbar.setTitle(toolbarTitle));
+        toolbarTitleLiveData.observe(this, toolbar::setTitle);
 
         toolbar.setState(getToolbarState());
-        toolbar.setLogo(getToolbarState() == Toolbar.State.HOME ? getActivity().getDrawable(
-                R.drawable.ic_app_icon) : null);
+        toolbar.setLogo(getToolbarState() == Toolbar.State.HOME
+                ? requireActivity().getDrawable(R.drawable.ic_app_icon)
+                : null);
 
         toolbar.setMenuItems(R.xml.menuitems);
-
-        setShowToolbarBackground(true);
-
-        setToolbarHeight(toolbar);
     }
 
     /**
@@ -109,28 +99,9 @@
         return Toolbar.State.HOME;
     }
 
-    protected final void setShowToolbarBackground(boolean showBackground) {
-        Activity activity = getActivity();
-        if (activity instanceof TelecomActivity) {
-            ((TelecomActivity) activity).setShowToolbarBackground(showBackground);
-        }
+    @Override
+    public void onCarUiInsetsChanged(Insets insets) {
+        requireView().setPadding(insets.getLeft(), insets.getTop(),
+                insets.getRight(), insets.getBottom());
     }
-
-    /**
-     * Sets the toolbar height.
-     */
-    protected final void setToolbarHeight(Toolbar toolbar) {
-        int toolbarFirstRowHeight = getResources().getDimensionPixelSize(
-                R.dimen.car_ui_toolbar_first_row_height);
-        int toolbarHeight = toolbar.isTabsInSecondRow() && getToolbarState() == Toolbar.State.HOME
-                ? toolbarFirstRowHeight + getResources().getDimensionPixelSize(
-                R.dimen.car_ui_toolbar_second_row_height)
-                : toolbarFirstRowHeight;
-        mToolbarHeight.setValue(toolbarHeight);
-    }
-
-    /**
-     * Handles the toolbar height.
-     */
-    public abstract void onToolbarHeightChange(int toolbarHeight);
 }
diff --git a/src/com/android/car/dialer/ui/common/DialerListBaseFragment.java b/src/com/android/car/dialer/ui/common/DialerListBaseFragment.java
index 492d3f0..473365e 100644
--- a/src/com/android/car/dialer/ui/common/DialerListBaseFragment.java
+++ b/src/com/android/car/dialer/ui/common/DialerListBaseFragment.java
@@ -16,7 +16,6 @@
 
 package com.android.car.dialer.ui.common;
 
-import android.annotation.StringRes;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -25,11 +24,14 @@
 import androidx.annotation.DrawableRes;
 import androidx.annotation.LayoutRes;
 import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.car.dialer.R;
 import com.android.car.dialer.widget.LoadingFrameLayout;
+import com.android.car.ui.FocusArea;
+import com.android.car.ui.baselayout.Insets;
 import com.android.car.ui.recyclerview.CarUiRecyclerView;
 import com.android.car.ui.recyclerview.ContentLimiting;
 import com.android.car.uxr.LifeCycleObserverUxrContentLimiter;
@@ -48,6 +50,7 @@
 
     private LoadingFrameLayout mLoadingFrameLayout;
     private CarUiRecyclerView mRecyclerView;
+    private FocusArea mFocusArea;
     private LifeCycleObserverUxrContentLimiter mUxrContentLimiter;
 
     @Override
@@ -55,8 +58,9 @@
             Bundle savedInstanceState) {
         View view = inflater.inflate(getLayoutResource(), container, false);
         mLoadingFrameLayout = view.findViewById(R.id.loading_frame_layout);
-        mRecyclerView = view.findViewById(R.id.list_view);
+        mRecyclerView = view.requireViewById(R.id.list_view);
         mRecyclerView.setLayoutManager(createLayoutManager());
+        mFocusArea = view.requireViewById(R.id.loading_focus_area);
         mUxrContentLimiter = new LifeCycleObserverUxrContentLimiter(
                 new UxrContentLimiterImpl(getContext(), R.xml.uxr_config));
         getLifecycle().addObserver(mUxrContentLimiter);
@@ -133,13 +137,11 @@
     }
 
     @Override
-    public void onToolbarHeightChange(int toolbarHeight) {
-        int listTopPadding = getContext().getResources().getDimensionPixelSize(
+    public void onCarUiInsetsChanged(Insets insets) {
+        int listTopPadding = requireContext().getResources().getDimensionPixelSize(
                 R.dimen.list_top_padding);
-        mRecyclerView.setPaddingRelative(
-                mRecyclerView.getPaddingStart(),
-                toolbarHeight + listTopPadding,
-                mRecyclerView.getPaddingEnd(),
-                mRecyclerView.getPaddingBottom());
+        mRecyclerView.setPadding(0, insets.getTop() + listTopPadding, 0, insets.getBottom());
+        mFocusArea.setHighlightPadding(0, insets.getTop() + listTopPadding, 0, insets.getBottom());
+        requireView().setPadding(insets.getLeft(), 0, insets.getRight(), 0);
     }
 }
diff --git a/src/com/android/car/dialer/ui/contact/ContactDetailsFragment.java b/src/com/android/car/dialer/ui/contact/ContactDetailsFragment.java
index 7f33f46..be80364 100644
--- a/src/com/android/car/dialer/ui/contact/ContactDetailsFragment.java
+++ b/src/com/android/car/dialer/ui/contact/ContactDetailsFragment.java
@@ -36,7 +36,9 @@
 import com.android.car.telephony.common.Contact;
 import com.android.car.telephony.common.PhoneNumber;
 import com.android.car.telephony.common.TelecomUtils;
+import com.android.car.ui.core.CarUi;
 import com.android.car.ui.toolbar.Toolbar;
+import com.android.car.ui.toolbar.ToolbarController;
 
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.RequestOptions;
@@ -111,7 +113,7 @@
 
     private void onContactChanged(Contact contact) {
         getArguments().clear();
-        Toolbar toolbar = getActivity().findViewById(R.id.car_ui_toolbar);
+        ToolbarController toolbar = CarUi.getToolbar(getActivity());
         // Null check to have unit tests to pass.
         if (toolbar == null) {
             return;
@@ -153,25 +155,9 @@
     }
 
     @Override
-    protected void setupToolbar(@NonNull Toolbar toolbar) {
+    protected void setupToolbar(@NonNull ToolbarController toolbar) {
         toolbar.setState(getToolbarState());
         toolbar.setMenuItems(null);
-
-        // Remove the tool bar background if we don't show the action bar view.
-        if (!mShowActionBarView) {
-            setShowToolbarBackground(false);
-        }
-
-        setToolbarHeight(toolbar);
-    }
-
-    @Override
-    public void onToolbarHeightChange(int toolbarHeight) {
-        if (mShowActionBarView) {
-            super.onToolbarHeightChange(toolbarHeight);
-        } else {
-            getRecyclerView().setScrollBarPadding(toolbarHeight, 0);
-        }
     }
 
     @Override
diff --git a/src/com/android/car/dialer/ui/dialpad/DialpadFragment.java b/src/com/android/car/dialer/ui/dialpad/DialpadFragment.java
index 60c8782..d8566e5 100644
--- a/src/com/android/car/dialer/ui/dialpad/DialpadFragment.java
+++ b/src/com/android/car/dialer/ui/dialpad/DialpadFragment.java
@@ -44,7 +44,7 @@
 import com.android.car.telephony.common.PhoneNumber;
 import com.android.car.telephony.common.TelecomUtils;
 import com.android.car.ui.recyclerview.CarUiRecyclerView;
-import com.android.car.ui.toolbar.Toolbar;
+import com.android.car.ui.toolbar.ToolbarController;
 import com.android.car.uxr.LifeCycleObserverUxrContentLimiter;
 import com.android.car.uxr.UxrContentLimiterImpl;
 
@@ -95,6 +95,7 @@
     private ImageView mAvatar;
     private ImageButton mDeleteButton;
     private int mMode;
+    private boolean mHasTypeDown;
 
     private ToneGenerator mToneGenerator;
 
@@ -146,7 +147,9 @@
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
-        View rootView = inflater.inflate(R.layout.dialpad_fragment, container, false);
+        mHasTypeDown = getResources().getBoolean(R.bool.config_show_type_down_list_on_dialpad);
+        View rootView = inflater.inflate(mHasTypeDown ? R.layout.dialpad_fragment_with_type_down
+                : R.layout.dialpad_fragment_without_type_down, container, false);
 
         mTitleView = rootView.findViewById(R.id.title);
         mTitleView.setTextAppearance(
@@ -154,7 +157,9 @@
                         : R.style.TextAppearance_DialNumber);
         mDisplayName = rootView.findViewById(R.id.display_name);
         mRecyclerView = rootView.findViewById(R.id.list_view);
-        mRecyclerView.setAdapter(mAdapter);
+        if (mRecyclerView != null) {
+            mRecyclerView.setAdapter(mAdapter);
+        }
         mLabel = rootView.findViewById(R.id.label);
         mAvatar = rootView.findViewById(R.id.dialpad_contact_avatar);
         if (mAvatar != null) {
@@ -199,7 +204,7 @@
     }
 
     @Override
-    protected void setupToolbar(Toolbar toolbar) {
+    protected void setupToolbar(ToolbarController toolbar) {
         // Only setup the actionbar if we're in dial mode.
         // In all the other modes, there will be another fragment in the activity
         // at the same time, and we don't want to mess up it's action bar.
@@ -263,7 +268,7 @@
             ViewUtils.setVisible(mDeleteButton, true);
         }
 
-        if (getResources().getBoolean(R.bool.config_show_type_down_list_on_dialpad)) {
+        if (mHasTypeDown) {
             resetContactInfo();
             ViewUtils.setVisible(mRecyclerView, true);
             mTypeDownResultsViewModel.setSearchQuery(number.toString());
@@ -272,12 +277,6 @@
         }
     }
 
-    @Override
-    public void onToolbarHeightChange(int toolbarHeight) {
-        // Offset the dialpad to under the tabs in normal dial mode.
-        getView().setPadding(0, mMode == MODE_DIAL ? toolbarHeight : 0, 0, 0);
-    }
-
     private void presentContactInfo(@NonNull String number) {
         Contact contact = InMemoryPhoneBook.get().lookupContactEntry(number);
         ViewUtils.setText(mDisplayName, contact == null ? "" : contact.getDisplayName());
diff --git a/src/com/android/car/dialer/ui/dialpad/InCallDialpadFragment.java b/src/com/android/car/dialer/ui/dialpad/InCallDialpadFragment.java
index 8d8e5aa..59fb0cb 100644
--- a/src/com/android/car/dialer/ui/dialpad/InCallDialpadFragment.java
+++ b/src/com/android/car/dialer/ui/dialpad/InCallDialpadFragment.java
@@ -34,7 +34,7 @@
 import com.android.car.dialer.log.L;
 import com.android.car.dialer.ui.activecall.InCallViewModel;
 import com.android.car.telephony.common.TelecomUtils;
-import com.android.car.ui.toolbar.Toolbar;
+import com.android.car.ui.toolbar.ToolbarController;
 
 /** Dialpad fragment used in the ongoing call page. */
 public class InCallDialpadFragment extends AbstractDialpadFragment {
@@ -114,7 +114,7 @@
     }
 
     @Override
-    protected void setupToolbar(Toolbar toolbar) {
+    protected void setupToolbar(ToolbarController toolbar) {
         // No-op
     }
 
@@ -122,9 +122,4 @@
     public void onKeypadKeyLongPressed(int keycode) {
         // No-op
     }
-
-    @Override
-    public void onToolbarHeightChange(int toolbarHeight) {
-        // No-op
-    }
 }
diff --git a/src/com/android/car/dialer/ui/favorite/FavoriteAdapter.java b/src/com/android/car/dialer/ui/favorite/FavoriteAdapter.java
index ea747e1..7986f1f 100644
--- a/src/com/android/car/dialer/ui/favorite/FavoriteAdapter.java
+++ b/src/com/android/car/dialer/ui/favorite/FavoriteAdapter.java
@@ -124,6 +124,7 @@
                 Header header = (Header) mFavoriteContacts.get(position);
                 viewHolder.onBind(header);
                 viewHolder.itemView.setOnClickListener(null);
+                viewHolder.itemView.setFocusable(false);
                 break;
             case TYPE_ADD_FAVORITE:
                 viewHolder.itemView.setOnClickListener(v -> {
diff --git a/src/com/android/car/dialer/ui/search/ContactResultsFragment.java b/src/com/android/car/dialer/ui/search/ContactResultsFragment.java
index 1a44217..aa78f4f 100644
--- a/src/com/android/car/dialer/ui/search/ContactResultsFragment.java
+++ b/src/com/android/car/dialer/ui/search/ContactResultsFragment.java
@@ -32,6 +32,7 @@
 import com.android.car.dialer.ui.contact.ContactDetailsFragment;
 import com.android.car.telephony.common.Contact;
 import com.android.car.ui.toolbar.Toolbar;
+import com.android.car.ui.toolbar.ToolbarController;
 import com.android.car.uxr.LifeCycleObserverUxrContentLimiter;
 import com.android.car.uxr.UxrContentLimiterImpl;
 
@@ -65,7 +66,7 @@
     private final ContactResultsAdapter mAdapter = new ContactResultsAdapter(this);
 
     private RecyclerView.OnScrollListener mOnScrollChangeListener;
-    private Toolbar mToolbar;
+    private ToolbarController mToolbar;
 
     private LifeCycleObserverUxrContentLimiter mUxrContentLimiter;
 
@@ -111,7 +112,10 @@
             public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                 if (dy != 0) {
                     // Clear the focus to dismiss the keyboard.
-                    mToolbar.clearFocus();
+                    View focusedView = getActivity().getCurrentFocus();
+                    if (focusedView != null) {
+                        focusedView.clearFocus();
+                    }
                 }
             }
         };
@@ -128,7 +132,7 @@
     }
 
     @Override
-    protected void setupToolbar(@NonNull Toolbar toolbar) {
+    protected void setupToolbar(@NonNull ToolbarController toolbar) {
         super.setupToolbar(toolbar);
         mToolbar = toolbar;
         mToolbar.registerOnSearchListener(this);
diff --git a/src/com/android/car/dialer/ui/warning/NoHfpFragment.java b/src/com/android/car/dialer/ui/warning/NoHfpFragment.java
index 51d353b..2e4ef09 100644
--- a/src/com/android/car/dialer/ui/warning/NoHfpFragment.java
+++ b/src/com/android/car/dialer/ui/warning/NoHfpFragment.java
@@ -16,6 +16,8 @@
 
 package com.android.car.dialer.ui.warning;
 
+import android.car.Car;
+import android.car.content.pm.CarPackageManager;
 import android.car.drivingstate.CarUxRestrictions;
 import android.content.Intent;
 import android.os.Bundle;
@@ -26,15 +28,13 @@
 import android.widget.TextView;
 
 import androidx.fragment.app.Fragment;
-import androidx.lifecycle.MutableLiveData;
-import androidx.lifecycle.ViewModelProviders;
 
 import com.android.car.apps.common.UxrButton;
 import com.android.car.apps.common.util.CarPackageManagerUtils;
 import com.android.car.apps.common.util.ViewUtils;
 import com.android.car.dialer.R;
 import com.android.car.dialer.telecom.UiCallManager;
-import com.android.car.dialer.ui.TelecomActivityViewModel;
+import com.android.car.dialer.ui.dialpad.DialpadFragment;
 
 /**
  * A fragment that informs the user that there is no bluetooth device attached that can make
@@ -48,6 +48,9 @@
     private TextView mErrorMessageView;
     private String mErrorMessage;
 
+    private Car mCar;
+    private CarPackageManager mCarPackageManager;
+
     /**
      * Returns an instance of the {@link NoHfpFragment} with the given error message as the one to
      * display.
@@ -69,6 +72,14 @@
         if (args != null) {
             mErrorMessage = args.getString(ERROR_MESSAGE_KEY);
         }
+        mCar = Car.createCar(getActivity());
+        mCarPackageManager = (CarPackageManager) mCar.getCarManager(Car.PACKAGE_SERVICE);
+    }
+
+    @Override
+    public void onDestroy() {
+        mCar.disconnect();
+        super.onDestroy();
     }
 
     /**
@@ -95,21 +106,21 @@
             mErrorMessageView.setText(mErrorMessage);
         }
 
-        TelecomActivityViewModel viewModel = ViewModelProviders.of(getActivity()).get(
-                TelecomActivityViewModel.class);
-        MutableLiveData<Integer> dialerAppStateLiveData = viewModel.getDialerAppState();
         View emergencyButton = view.findViewById(R.id.emergency_call_button);
         ViewUtils.setVisible(emergencyButton, UiCallManager.get().isEmergencyCallSupported());
-        emergencyButton.setOnClickListener(v -> dialerAppStateLiveData.setValue(
-                TelecomActivityViewModel.DialerAppState.EMERGENCY_DIALPAD));
+        emergencyButton.setOnClickListener(v -> getParentFragmentManager()
+                .beginTransaction()
+                .replace(android.R.id.content, DialpadFragment.newEmergencyDialpad())
+                .addToBackStack(null)
+                .commit());
 
         Intent launchIntent = new Intent();
         launchIntent.setAction(Bluetooth_Setting_ACTION);
         launchIntent.addCategory(Bluetooth_Setting_CATEGORY);
 
         UxrButton bluetoothButton = view.findViewById(R.id.connect_bluetooth_button);
-        boolean isDistractionOptimized = CarPackageManagerUtils.getInstance(getActivity())
-                .isDistractionOptimized(getActivity().getPackageManager(), launchIntent);
+        boolean isDistractionOptimized = CarPackageManagerUtils.isDistractionOptimized(
+                mCarPackageManager, getActivity().getPackageManager(), launchIntent);
         bluetoothButton.setUxRestrictions(isDistractionOptimized
                 ? CarUxRestrictions.UX_RESTRICTIONS_BASELINE
                 : CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP);
diff --git a/src/com/android/car/dialer/widget/LoadingFrameLayout.java b/src/com/android/car/dialer/widget/LoadingFrameLayout.java
index 0f21a47..0a4a2a6 100644
--- a/src/com/android/car/dialer/widget/LoadingFrameLayout.java
+++ b/src/com/android/car/dialer/widget/LoadingFrameLayout.java
@@ -16,7 +16,6 @@
 
 package com.android.car.dialer.widget;
 
-import android.annotation.StringRes;
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.util.AttributeSet;
@@ -32,6 +31,7 @@
 import androidx.annotation.LayoutRes;
 import androidx.annotation.MainThread;
 import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
 
 import com.android.car.apps.common.util.ViewUtils;
 import com.android.car.dialer.Constants;
diff --git a/tests/Android.mk b/tests/Android.mk
deleted file mode 100644
index 0903c90..0000000
--- a/tests/Android.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (C) 2018 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-# Include all makefiles in subdirectories
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tests/instrutests/Android.bp b/tests/instrutests/Android.bp
new file mode 100644
index 0000000..1629cb0
--- /dev/null
+++ b/tests/instrutests/Android.bp
@@ -0,0 +1,16 @@
+//############################################################
+// Car Dialer Instrumented test target.                       #
+//############################################################
+android_test {
+    name: "CarDialerInstruTests",
+
+    srcs: ["src/**/*.java"],
+
+    test_suites:["device-tests"],
+
+    static_libs: [
+        "androidx.test.ext.junit",
+    ],
+
+    instrumentation_for: "CarDialerAppForTesting",
+}
diff --git a/tests/instrutests/AndroidManifest.xml b/tests/instrutests/AndroidManifest.xml
new file mode 100644
index 0000000..72c50a1
--- /dev/null
+++ b/tests/instrutests/AndroidManifest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2020 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.car.dialer.tests.instrutests">
+
+    <application>
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.car.dialer"
+                     android:label="Car Dialer Instrumented Tests">
+    </instrumentation>
+</manifest>
diff --git a/tests/instrutests/readme.md b/tests/instrutests/readme.md
new file mode 100644
index 0000000..ed71562
--- /dev/null
+++ b/tests/instrutests/readme.md
@@ -0,0 +1,23 @@
+Instrumented test suite for CarDialerApp using AndroidJUnitRunner.
+
+```
+1. Use atest
+$ atest CarDialerInstruTests
+
+If the test is new
+$ atest CarDialerInstruTests --rebuild-module-info
+
+
+2. Manually install and run the tests
+
+Run on local machine (hawk)
+$ mma && croot
+$ adb install -r out/target/product/hawk/testcases/CarDialerInstruTests/arm64/CarDialerInstruTests.apk
+$ adb shell am instrument -w com.android.car.dialer.tests.instrumentation/androidx.test.runner.AndroidJUnitRunner
+
+Run on emulator (gcar_hl_emu_x86)
+$ mma && croot
+$ adb install -r out/target/product/generic_x86/testcases/CarDialerInstruTests/x86/CarDialerInstruTests.apk
+$ adb shell am instrument -w com.android.car.dialer.tests.instrumentation/androidx.test.runner.AndroidJUnitRunner
+
+```
diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp
new file mode 100644
index 0000000..4d843df
--- /dev/null
+++ b/tests/robotests/Android.bp
@@ -0,0 +1,17 @@
+//############################################################
+// Car Dialer Robolectric test target.                       #
+//############################################################
+android_robolectric_test {
+    name: "CarDialerRoboTests",
+
+    srcs: ["src/**/*.java"],
+
+    java_resource_dirs: ["config"],
+
+    // Include the testing libraries
+    libs: [
+        "android.car",
+    ],
+
+    instrumentation_for: "CarDialerAppForTesting",
+}
diff --git a/tests/robotests/Android.mk b/tests/robotests/Android.mk
deleted file mode 100644
index 2613445..0000000
--- a/tests/robotests/Android.mk
+++ /dev/null
@@ -1,49 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-#############################################################
-# Car Dialer Robolectric test target.                       #
-#############################################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := CarDialerRoboTests
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_JAVA_RESOURCE_DIRS := config
-
-# Include the testing libraries
-LOCAL_JAVA_LIBRARIES := \
-    android.car \
-    robolectric_android-all-stub \
-    Robolectric_all-target \
-    mockito-robolectric-prebuilt \
-    truth-prebuilt
-
-LOCAL_INSTRUMENTATION_FOR := CarDialerAppForTesting
-
-LOCAL_MODULE_TAGS := optional
-
-# Generate test_config.properties
-include external/robolectric-shadows/gen_test_config.mk
-include $(BUILD_STATIC_JAVA_LIBRARY)
-
-#############################################################
-# Car Dialer runner target to run the previous target.      #
-#############################################################
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := RunCarDialerRoboTests
-
-LOCAL_JAVA_LIBRARIES := \
-    android.car \
-    CarDialerRoboTests \
-    robolectric_android-all-stub \
-    Robolectric_all-target \
-    mockito-robolectric-prebuilt \
-    truth-prebuilt
-
-LOCAL_TEST_PACKAGE := CarDialerAppForTesting
-
-LOCAL_INSTRUMENT_SOURCE_DIRS := $(dir $(LOCAL_PATH))../src
-
-include external/robolectric-shadows/run_robotests.mk
diff --git a/tests/robotests/config/robolectric.properties b/tests/robotests/config/robolectric.properties
index 41e2945..f054713 100644
--- a/tests/robotests/config/robolectric.properties
+++ b/tests/robotests/config/robolectric.properties
@@ -13,4 +13,4 @@
 # limitations under the License.
 sdk=NEWEST_SDK
 shadows=\
-   com.android.car.dialer.ShadowTypeface
+   com.android.car.dialer.ShadowTypeface,com.android.car.dialer.testutils.ShadowCar
diff --git a/tests/robotests/res/layout/test_activity.xml b/tests/robotests/res/layout/test_activity.xml
index 0bc280c..4f8192f 100644
--- a/tests/robotests/res/layout/test_activity.xml
+++ b/tests/robotests/res/layout/test_activity.xml
@@ -18,8 +18,4 @@
     android:id="@+id/test_fragment_container"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
-    <com.android.car.ui.toolbar.Toolbar
-        android:id="@+id/toolbar"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"/>
 </FrameLayout>
diff --git a/tests/robotests/src/com/android/car/dialer/TestDialerApplication.java b/tests/robotests/src/com/android/car/dialer/TestDialerApplication.java
index 21d5406..9bf1a4e 100644
--- a/tests/robotests/src/com/android/car/dialer/TestDialerApplication.java
+++ b/tests/robotests/src/com/android/car/dialer/TestDialerApplication.java
@@ -22,6 +22,10 @@
 
 import android.app.Application;
 import android.app.NotificationManager;
+import android.car.Car;
+import android.car.CarProjectionManager;
+import android.car.drivingstate.CarUxRestrictions;
+import android.car.drivingstate.CarUxRestrictionsManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.telecom.CallAudioState;
@@ -30,12 +34,18 @@
 import com.android.car.dialer.notification.MissedCallNotificationController;
 import com.android.car.dialer.telecom.InCallServiceImpl;
 import com.android.car.dialer.telecom.UiCallManager;
+import com.android.car.dialer.testutils.ShadowCar;
 
 /** Robolectric runtime application for Dialer. Must be Test + application class name. */
 public class TestDialerApplication extends Application {
 
     private InCallServiceImpl.LocalBinder mLocalBinder;
 
+    private Car mMockCar;
+    private CarUxRestrictionsManager mMockCarUxRestrictionsManager;
+    private CarUxRestrictions mMockCarUxRestrictions;
+    private CarProjectionManager mMockCarProjectionManager;
+
     @Override
     public void onCreate() {
         super.onCreate();
@@ -47,6 +57,17 @@
         mLocalBinder = mock(InCallServiceImpl.LocalBinder.class);
         shadowOf(this).setComponentNameAndServiceForBindService(
                 new ComponentName(this, InCallServiceImpl.class), mLocalBinder);
+
+        mMockCar = mock(Car.class);
+        mMockCarUxRestrictionsManager = mock(CarUxRestrictionsManager.class);
+        mMockCarUxRestrictions = mock(CarUxRestrictions.class);
+        when(mMockCarUxRestrictionsManager.getCurrentCarUxRestrictions()).thenReturn(
+                mMockCarUxRestrictions);
+        when(mMockCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE)).thenReturn(
+                mMockCarUxRestrictionsManager);
+        mMockCarProjectionManager = mock(CarProjectionManager.class);
+        when(mMockCar.getCarManager(Car.PROJECTION_SERVICE)).thenReturn(mMockCarProjectionManager);
+        ShadowCar.setCar(mMockCar);
     }
 
     public void initUiCallManager() {
@@ -70,6 +91,7 @@
         super.onTerminate();
         InCallNotificationController.tearDown();
         MissedCallNotificationController.get().tearDown();
+        ShadowCar.setCar(null);
     }
 
 }
diff --git a/tests/robotests/src/com/android/car/dialer/bluetooth/UiBluetoothMonitorTest.java b/tests/robotests/src/com/android/car/dialer/bluetooth/UiBluetoothMonitorTest.java
index eac78e5..fe43694 100644
--- a/tests/robotests/src/com/android/car/dialer/bluetooth/UiBluetoothMonitorTest.java
+++ b/tests/robotests/src/com/android/car/dialer/bluetooth/UiBluetoothMonitorTest.java
@@ -22,7 +22,6 @@
 
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
 import android.content.Context;
 
 import com.android.car.dialer.CarDialerRobolectricTestRunner;
@@ -39,8 +38,7 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.util.Collections;
 
 @RunWith(CarDialerRobolectricTestRunner.class)
 @Config(shadows = ShadowBluetoothAdapterForDialer.class)
@@ -59,16 +57,12 @@
 
         ShadowBluetoothAdapterForDialer shadowBluetoothAdapter = Shadow.extract(
                 BluetoothAdapter.getDefaultAdapter());
-        // Sets up Bluetooth Hfp state
-        shadowBluetoothAdapter.setState(BluetoothAdapter.STATE_ON);
-        shadowBluetoothAdapter.setProfileConnectionState(BluetoothProfile.HEADSET_CLIENT,
-                BluetoothProfile.STATE_CONNECTED);
         // Sets up Bluetooth pair list
-        Set<BluetoothDevice> bondedDevices = new HashSet<BluetoothDevice>();
-        bondedDevices.add(mMockbluetoothDevice);
-        shadowBluetoothAdapter.setBondedDevices(bondedDevices);
+        shadowBluetoothAdapter.setBondedDevices(Collections.singleton(mMockbluetoothDevice));
         // Sets up Bluetooth state
         shadowBluetoothAdapter.setEnabled(true);
+        // Sets up Bluetooth Hfp connected devices
+        shadowBluetoothAdapter.setHfpDevices(Collections.singletonList(mMockbluetoothDevice));
 
         mUiBluetoothMonitor = UiBluetoothMonitor.init(mContext);
     }
@@ -84,14 +78,6 @@
     }
 
     @Test
-    public void testHfpStateLiveData() {
-        assertNotNull(mUiBluetoothMonitor.getHfpStateLiveData());
-        assertThat(mUiBluetoothMonitor.getHfpStateLiveData().hasActiveObservers()).isTrue();
-        assertThat(mUiBluetoothMonitor.getHfpStateLiveData().getValue()).isEqualTo(
-                BluetoothProfile.STATE_CONNECTED);
-    }
-
-    @Test
     public void testPairListLiveData() {
         assertNotNull(mUiBluetoothMonitor.getPairListLiveData());
         assertThat(mUiBluetoothMonitor.getPairListLiveData().hasActiveObservers()).isTrue();
@@ -111,6 +97,7 @@
     public void testHfpDeviceListLiveData() {
         assertNotNull(mUiBluetoothMonitor.getHfpDeviceListLiveData());
         assertThat(mUiBluetoothMonitor.getHfpDeviceListLiveData().hasActiveObservers()).isTrue();
+        assertThat(mUiBluetoothMonitor.getHfpDeviceListLiveData().getValue()).isNotEmpty();
     }
 
     @After
diff --git a/tests/robotests/src/com/android/car/dialer/livedata/CallDetailLiveDataTest.java b/tests/robotests/src/com/android/car/dialer/livedata/CallDetailLiveDataTest.java
index 3e3ad7d..e1a886e 100644
--- a/tests/robotests/src/com/android/car/dialer/livedata/CallDetailLiveDataTest.java
+++ b/tests/robotests/src/com/android/car/dialer/livedata/CallDetailLiveDataTest.java
@@ -22,6 +22,7 @@
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -66,13 +67,15 @@
 
         doNothing().when(mMockCall).registerCallback(mCallbackCaptor.capture());
 
-        mCallDetailLiveData = new CallDetailLiveData(mMockCall);
+        mCallDetailLiveData = new CallDetailLiveData();
+        mCallDetailLiveData.setTelecomCall(mMockCall);
         mLifecycleRegistry = new LifecycleRegistry(mMockLifecycleOwner);
         when(mMockLifecycleOwner.getLifecycle()).thenReturn(mLifecycleRegistry);
     }
 
     @Test
     public void testOnActiveRegistry() {
+        reset(mMockCall);
         mCallDetailLiveData.onActive();
 
         verify(mMockCall).registerCallback(any());
@@ -85,7 +88,9 @@
         assertThat(mCallDetailLiveData.hasObservers()).isTrue();
         assertThat(mCallDetailLiveData.hasActiveObservers()).isFalse();
 
+        reset(mMockCall);
         mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
         assertThat(mCallDetailLiveData.hasActiveObservers()).isTrue();
         verify(mMockObserver).onChanged(any());
         verify(mMockCall).registerCallback(any());
@@ -123,6 +128,8 @@
     @Test
     public void testOnInactiveUnregister() {
         startObserving();
+
+        reset(mMockCall);
         mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
 
         verify(mMockCall).unregisterCallback(mCallbackCaptor.getValue());
diff --git a/tests/robotests/src/com/android/car/dialer/livedata/BluetoothHfpStateLiveDataTest.java b/tests/robotests/src/com/android/car/dialer/livedata/HfpDeviceListLiveDataTest.java
similarity index 69%
rename from tests/robotests/src/com/android/car/dialer/livedata/BluetoothHfpStateLiveDataTest.java
rename to tests/robotests/src/com/android/car/dialer/livedata/HfpDeviceListLiveDataTest.java
index 4648b28..e23cfc8 100644
--- a/tests/robotests/src/com/android/car/dialer/livedata/BluetoothHfpStateLiveDataTest.java
+++ b/tests/robotests/src/com/android/car/dialer/livedata/HfpDeviceListLiveDataTest.java
@@ -26,8 +26,8 @@
 import static org.mockito.Mockito.when;
 
 import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothHeadsetClient;
-import android.bluetooth.BluetoothProfile;
 import android.content.Context;
 import android.content.Intent;
 
@@ -50,25 +50,29 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 
+import java.util.Collections;
+
 @RunWith(CarDialerRobolectricTestRunner.class)
 @Config(shadows = ShadowBluetoothAdapterForDialer.class)
-public class BluetoothHfpStateLiveDataTest {
+public class HfpDeviceListLiveDataTest {
     private static final String INTENT_ACTION =
             BluetoothHeadsetClient.ACTION_CONNECTION_STATE_CHANGED;
 
-    private BluetoothHfpStateLiveData mBluetoothHfpStateLiveData;
+    private HfpDeviceListLiveData mHfpDeviceListLiveData;
     private LifecycleRegistry mLifecycleRegistry;
     private BroadcastReceiverVerifier mReceiverVerifier;
     @Mock
     private LifecycleOwner mMockLifecycleOwner;
     @Mock
     private LiveDataObserver<Integer> mMockObserver;
+    @Mock
+    private BluetoothDevice mMockBluetoothDevice;
 
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
 
-        mBluetoothHfpStateLiveData = new BluetoothHfpStateLiveData(RuntimeEnvironment.application);
+        mHfpDeviceListLiveData = new HfpDeviceListLiveData(RuntimeEnvironment.application);
         mLifecycleRegistry = new LifecycleRegistry(mMockLifecycleOwner);
         when(mMockLifecycleOwner.getLifecycle()).thenReturn(mLifecycleRegistry);
 
@@ -77,7 +81,7 @@
 
     @Test
     public void testOnActive() {
-        mBluetoothHfpStateLiveData.observe(mMockLifecycleOwner,
+        mHfpDeviceListLiveData.observe(mMockLifecycleOwner,
                 (value) -> mMockObserver.onChanged(value));
         verify(mMockObserver, never()).onChanged(any());
 
@@ -91,36 +95,24 @@
         ArgumentCaptor<Integer> valueCaptor = ArgumentCaptor.forClass(Integer.class);
         doNothing().when(mMockObserver).onChanged(valueCaptor.capture());
 
-        ShadowBluetoothAdapterForDialer shadowBluetoothAdapter =
-                (ShadowBluetoothAdapterForDialer) Shadow.extract(
-                        BluetoothAdapter.getDefaultAdapter());
-        shadowBluetoothAdapter.setState(BluetoothAdapter.STATE_ON);
-        shadowBluetoothAdapter.setProfileConnectionState(BluetoothProfile.HEADSET_CLIENT,
-                BluetoothProfile.STATE_CONNECTED);
+        ShadowBluetoothAdapterForDialer shadowBluetoothAdapter = Shadow.extract(
+                BluetoothAdapter.getDefaultAdapter());
 
-        mBluetoothHfpStateLiveData.observe(mMockLifecycleOwner,
+        shadowBluetoothAdapter.setHfpDevices(Collections.singletonList(mMockBluetoothDevice));
+        mHfpDeviceListLiveData.observe(mMockLifecycleOwner,
                 (value) -> mMockObserver.onChanged(value));
         mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
-        assertThat(BluetoothAdapter.getDefaultAdapter().getProfileConnectionState(
-                BluetoothProfile.HEADSET_CLIENT)).isEqualTo(BluetoothProfile.STATE_CONNECTED);
-        assertThat(mBluetoothHfpStateLiveData.getValue()).isEqualTo(
-                BluetoothProfile.STATE_CONNECTED);
-        assertThat(valueCaptor.getValue()).isEqualTo(BluetoothProfile.STATE_CONNECTED);
+        assertThat(mHfpDeviceListLiveData.getValue()).isNotEmpty();
 
-        shadowBluetoothAdapter.setProfileConnectionState(BluetoothProfile.HEADSET_CLIENT,
-                BluetoothProfile.STATE_DISCONNECTED);
+        shadowBluetoothAdapter.setHfpDevices(Collections.emptyList());
         mReceiverVerifier.getBroadcastReceiverFor(INTENT_ACTION)
                 .onReceive(mock(Context.class), mock(Intent.class));
-        assertThat(BluetoothAdapter.getDefaultAdapter().getProfileConnectionState(
-                BluetoothProfile.HEADSET_CLIENT)).isEqualTo(BluetoothProfile.STATE_DISCONNECTED);
-        assertThat(mBluetoothHfpStateLiveData.getValue()).isEqualTo(
-                BluetoothProfile.STATE_DISCONNECTED);
-        assertThat(valueCaptor.getValue()).isEqualTo(BluetoothProfile.STATE_DISCONNECTED);
+        assertThat(mHfpDeviceListLiveData.getValue()).isEmpty();
     }
 
     @Test
     public void testOnInactiveUnregister() {
-        mBluetoothHfpStateLiveData.observe(mMockLifecycleOwner,
+        mHfpDeviceListLiveData.observe(mMockLifecycleOwner,
                 (value) -> mMockObserver.onChanged(value));
         mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
         int preNumber = mReceiverVerifier.getReceiverNumber();
diff --git a/tests/robotests/src/com/android/car/dialer/telecom/InCallServiceImplTest.java b/tests/robotests/src/com/android/car/dialer/telecom/InCallServiceImplTest.java
index f4f54b9..fd21ece 100644
--- a/tests/robotests/src/com/android/car/dialer/telecom/InCallServiceImplTest.java
+++ b/tests/robotests/src/com/android/car/dialer/telecom/InCallServiceImplTest.java
@@ -28,15 +28,12 @@
 
 import android.app.Notification;
 import android.app.NotificationManager;
-import android.car.Car;
-import android.car.CarProjectionManager;
 import android.content.Context;
 import android.content.Intent;
 import android.telecom.Call;
 import android.telecom.CallAudioState;
 
 import com.android.car.dialer.CarDialerRobolectricTestRunner;
-import com.android.car.dialer.testutils.ShadowCar;
 import com.android.car.dialer.ui.activecall.InCallActivity;
 
 import org.junit.Before;
@@ -48,7 +45,6 @@
 import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ServiceController;
-import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.shadows.ShadowContextWrapper;
 import org.robolectric.shadows.ShadowIntent;
@@ -57,7 +53,6 @@
 /**
  * Tests for {@link InCallServiceImpl}.
  */
-@Config(shadows = {ShadowCar.class})
 @RunWith(CarDialerRobolectricTestRunner.class)
 public class InCallServiceImplTest {
     private static final String TELECOM_CALL_ID = "TC@1234";
@@ -66,10 +61,6 @@
     private Context mContext;
 
     @Mock
-    Car mCar;
-    @Mock
-    CarProjectionManager mCarProjectionManager;
-    @Mock
     private Call mMockTelecomCall;
     @Mock
     private Call.Details mMockCallDetails;
@@ -86,9 +77,6 @@
 
         mContext = RuntimeEnvironment.application;
 
-        when(mCar.getCarManager(Car.PROJECTION_SERVICE)).thenReturn(mCarProjectionManager);
-        ShadowCar.setCar(mCar);
-
         ServiceController<InCallServiceImpl> inCallServiceController =
                 Robolectric.buildService(InCallServiceImpl.class);
         inCallServiceController.create().bind();
diff --git a/tests/robotests/src/com/android/car/dialer/telecom/ProjectionCallHandlerTest.java b/tests/robotests/src/com/android/car/dialer/telecom/ProjectionCallHandlerTest.java
index 293c83e..0ca723b 100644
--- a/tests/robotests/src/com/android/car/dialer/telecom/ProjectionCallHandlerTest.java
+++ b/tests/robotests/src/com/android/car/dialer/telecom/ProjectionCallHandlerTest.java
@@ -26,7 +26,6 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.annotation.Nullable;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.car.CarProjectionManager;
@@ -41,6 +40,8 @@
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
 
+import androidx.annotation.Nullable;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -90,7 +91,8 @@
         mTelecomManager.registerPhoneAccount(mNonHfpAccount);
         mTelecomManager.registerPhoneAccount(mAccountWithNoAddress);
 
-        mProjectionCallHandler = new ProjectionCallHandler(mTelecomManager, mCarProjectionManager);
+        mProjectionCallHandler = new ProjectionCallHandler(mContext, mTelecomManager,
+                car -> mCarProjectionManager);
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/dialer/telecom/UiCallManagerTest.java b/tests/robotests/src/com/android/car/dialer/telecom/UiCallManagerTest.java
index 9c64a11..18c66c1 100644
--- a/tests/robotests/src/com/android/car/dialer/telecom/UiCallManagerTest.java
+++ b/tests/robotests/src/com/android/car/dialer/telecom/UiCallManagerTest.java
@@ -22,7 +22,6 @@
 import static org.junit.Assert.fail;
 import static org.mockito.Matchers.isNull;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -38,7 +37,6 @@
 import android.telecom.TelecomManager;
 
 import com.android.car.dialer.CarDialerRobolectricTestRunner;
-import com.android.car.dialer.R;
 import com.android.car.dialer.TestDialerApplication;
 import com.android.car.dialer.testutils.ShadowServiceManagerOverride;
 import com.android.internal.telephony.ITelephony;
@@ -54,7 +52,6 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowContextImpl;
-import org.robolectric.shadows.ShadowToast;
 
 import java.util.List;
 
@@ -146,29 +143,6 @@
     }
 
     @Test
-    public void testPlaceCall_invalidNumber() {
-        initUiCallManager();
-        String[] phoneNumbers = {
-                "xxxxx",
-                "51f"
-        };
-
-        for (String phoneNumber : phoneNumbers) {
-            checkPlaceCallForInvalidNumber(phoneNumber);
-        }
-    }
-
-    private void checkPlaceCallForInvalidNumber(String phoneNumber) {
-        ArgumentCaptor<Uri> uriCaptor = ArgumentCaptor.forClass(Uri.class);
-
-        assertThat(mUiCallManager.placeCall(phoneNumber)).isFalse();
-        verify(mMockTelecomManager, never()).placeCall(uriCaptor.capture(), isNull());
-
-        assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
-                mContext.getString(R.string.error_invalid_phone_number));
-    }
-
-    @Test
     public void testGetMuted_isMuted() {
         initUiCallManager();
 
diff --git a/tests/robotests/src/com/android/car/dialer/testutils/ShadowBluetoothAdapterForDialer.java b/tests/robotests/src/com/android/car/dialer/testutils/ShadowBluetoothAdapterForDialer.java
index 0686dd6..d7adcbf 100644
--- a/tests/robotests/src/com/android/car/dialer/testutils/ShadowBluetoothAdapterForDialer.java
+++ b/tests/robotests/src/com/android/car/dialer/testutils/ShadowBluetoothAdapterForDialer.java
@@ -16,8 +16,14 @@
 
 package com.android.car.dialer.testutils;
 
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothHeadsetClient;
 import android.bluetooth.BluetoothProfile;
+import android.content.Context;
 
 import androidx.annotation.Nullable;
 
@@ -26,6 +32,7 @@
 import org.robolectric.shadows.ShadowApplication;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -40,6 +47,8 @@
 
     private static boolean bluetoothAvailable = true;
     private Map<Integer, Integer> profileConnectionStateData = new HashMap<>();
+    private final BluetoothHeadsetClient mMockBluetoothHeadsetClient = mock(
+            BluetoothHeadsetClient.class);
 
     @Nullable
     @Implementation
@@ -50,10 +59,25 @@
         return (BluetoothAdapter) ShadowApplication.getInstance().getBluetoothAdapter();
     }
 
+    @Implementation
+    public boolean getProfileProxy(Context context, BluetoothProfile.ServiceListener listener,
+            int profile) {
+        if (profile == BluetoothProfile.HEADSET_CLIENT) {
+            listener.onServiceConnected(BluetoothProfile.HEADSET_CLIENT,
+                    mMockBluetoothHeadsetClient);
+            return true;
+        }
+        return false;
+    }
+
     /**
      * Sets if the default Bluetooth Adapter is null
      */
     public static void setBluetoothAvailable(boolean available) {
         bluetoothAvailable = available;
     }
+
+    public void setHfpDevices(List<BluetoothDevice> bluetoothDevices) {
+        when(mMockBluetoothHeadsetClient.getConnectedDevices()).thenReturn(bluetoothDevices);
+    }
 }
diff --git a/tests/robotests/src/com/android/car/dialer/testutils/ShadowCar.java b/tests/robotests/src/com/android/car/dialer/testutils/ShadowCar.java
index 3f7c425..5c5b16a 100644
--- a/tests/robotests/src/com/android/car/dialer/testutils/ShadowCar.java
+++ b/tests/robotests/src/com/android/car/dialer/testutils/ShadowCar.java
@@ -16,8 +16,11 @@
 
 package com.android.car.dialer.testutils;
 
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.car.Car;
 import android.content.Context;
+import android.os.Handler;
 
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
@@ -31,10 +34,31 @@
     private static Car sCar;
 
     /**
-     * Returns a mocked version of a {@link Car} object.
+     * Returns a mocked version of a {@link Car} object. If sCar is not set, returns null.
      */
     @Implementation
-    protected static Car createCar(Context context) {
+    @Nullable
+    public static Car createCar(Context context) {
+        return sCar;
+    }
+
+    /**
+     * Returns a mocked version of a {@link Car} object. If sCar is not set, returns null.
+     */
+    @Implementation
+    @Nullable
+    public static Car createCar(@NonNull Context context,
+            @Nullable Handler handler, long waitTimeoutMs,
+            @NonNull Car.CarServiceLifecycleListener statusChangeListener) {
+        return sCar;
+    }
+
+    /**
+     * Returns a mocked version of a {@link Car} object. If sCar is not set, returns null.
+     */
+    @Implementation
+    @Nullable
+    public static Car createCar(Context context, @Nullable Handler handler) {
         return sCar;
     }
 
diff --git a/tests/robotests/src/com/android/car/dialer/ui/TelecomActivityViewModelTest.java b/tests/robotests/src/com/android/car/dialer/ui/TelecomActivityViewModelTest.java
index bde1eb1..824d14c 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/TelecomActivityViewModelTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/TelecomActivityViewModelTest.java
@@ -24,16 +24,16 @@
 import android.app.Application;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
 import android.content.Context;
 
 import com.android.car.dialer.CarDialerRobolectricTestRunner;
 import com.android.car.dialer.R;
 import com.android.car.dialer.TestDialerApplication;
 import com.android.car.dialer.bluetooth.UiBluetoothMonitor;
-import com.android.car.dialer.livedata.BluetoothHfpStateLiveData;
+import com.android.car.dialer.livedata.BluetoothErrorStringLiveData;
 import com.android.car.dialer.livedata.BluetoothPairListLiveData;
 import com.android.car.dialer.livedata.BluetoothStateLiveData;
+import com.android.car.dialer.livedata.HfpDeviceListLiveData;
 import com.android.car.dialer.telecom.UiCallManager;
 import com.android.car.dialer.testutils.ShadowBluetoothAdapterForDialer;
 
@@ -43,9 +43,9 @@
 import org.junit.runner.RunWith;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
 
-import java.util.Arrays;
-import java.util.HashSet;
+import java.util.Collections;
 
 @RunWith(CarDialerRobolectricTestRunner.class)
 @Config(shadows = ShadowBluetoothAdapterForDialer.class)
@@ -53,7 +53,7 @@
 
     private TelecomActivityViewModel mTelecomActivityViewModel;
     private Context mContext;
-    private BluetoothHfpStateLiveData mHfpStateLiveData;
+    private HfpDeviceListLiveData mHfpDeviceListLiveData;
     private BluetoothPairListLiveData mPairedListLiveData;
     private BluetoothStateLiveData mBluetoothStateLiveData;
 
@@ -71,18 +71,16 @@
 
     @Test
     public void testDialerAppState_defaultBluetoothAdapterIsNull_bluetoothError() {
-        initializeBluetoothMonitor(false);
+        ShadowBluetoothAdapterForDialer.setBluetoothAvailable(false);
         initializeViewModel();
 
         assertThat(mTelecomActivityViewModel.getErrorMessage().getValue()).isEqualTo(
                 mContext.getString(R.string.bluetooth_unavailable));
-        assertThat(mTelecomActivityViewModel.getDialerAppState().getValue()).isEqualTo(
-                TelecomActivityViewModel.DialerAppState.BLUETOOTH_ERROR);
     }
 
     @Test
     public void testDialerAppState_bluetoothNotEnabled_bluetoothError() {
-        initializeBluetoothMonitor(true);
+        ShadowBluetoothAdapterForDialer.setBluetoothAvailable(true);
         ShadowBluetoothAdapterForDialer shadowBluetoothAdapter =
                 (ShadowBluetoothAdapterForDialer) shadowOf(BluetoothAdapter.getDefaultAdapter());
         shadowBluetoothAdapter.setEnabled(false);
@@ -92,17 +90,15 @@
                 BluetoothStateLiveData.BluetoothState.DISABLED);
         assertThat(mTelecomActivityViewModel.getErrorMessage().getValue()).isEqualTo(
                 mContext.getString(R.string.bluetooth_disabled));
-        assertThat(mTelecomActivityViewModel.getDialerAppState().getValue()).isEqualTo(
-                TelecomActivityViewModel.DialerAppState.BLUETOOTH_ERROR);
     }
 
     @Test
     public void testDialerAppState_noPairedDevices_bluetoothError() {
-        initializeBluetoothMonitor(true);
-        ShadowBluetoothAdapterForDialer shadowBluetoothAdapter =
-                (ShadowBluetoothAdapterForDialer) shadowOf(BluetoothAdapter.getDefaultAdapter());
+        ShadowBluetoothAdapterForDialer.setBluetoothAvailable(true);
+        ShadowBluetoothAdapterForDialer shadowBluetoothAdapter = Shadow.extract(
+                BluetoothAdapter.getDefaultAdapter());
         shadowBluetoothAdapter.setEnabled(true);
-        shadowBluetoothAdapter.setBondedDevices(new HashSet<BluetoothDevice>());
+        shadowBluetoothAdapter.setBondedDevices(Collections.emptySet());
         initializeViewModel();
 
         assertThat(mBluetoothStateLiveData.getValue()).isEqualTo(
@@ -111,66 +107,55 @@
         assertThat(mPairedListLiveData.getValue().isEmpty()).isTrue();
         assertThat(mTelecomActivityViewModel.getErrorMessage().getValue()).isEqualTo(
                 mContext.getString(R.string.bluetooth_unpaired));
-        assertThat(mTelecomActivityViewModel.getDialerAppState().getValue()).isEqualTo(
-                TelecomActivityViewModel.DialerAppState.BLUETOOTH_ERROR);
     }
 
     @Test
     public void testDialerAppState_hfpNoConnected_bluetoothError() {
-        initializeBluetoothMonitor(true);
-        ShadowBluetoothAdapterForDialer shadowBluetoothAdapter =
-                (ShadowBluetoothAdapterForDialer) shadowOf(BluetoothAdapter.getDefaultAdapter());
+        ShadowBluetoothAdapterForDialer.setBluetoothAvailable(true);
+        BluetoothDevice mockBluetoothDevice = mock(BluetoothDevice.class);
+        ShadowBluetoothAdapterForDialer shadowBluetoothAdapter = Shadow.extract(
+                BluetoothAdapter.getDefaultAdapter());
         shadowBluetoothAdapter.setEnabled(true);
-        shadowBluetoothAdapter.setBondedDevices(
-                new HashSet<>(Arrays.asList(mock(BluetoothDevice.class))));
-        shadowBluetoothAdapter.setProfileConnectionState(BluetoothProfile.HEADSET_CLIENT,
-                BluetoothProfile.STATE_DISCONNECTED);
+        shadowBluetoothAdapter.setBondedDevices(Collections.singleton(mockBluetoothDevice));
+        shadowBluetoothAdapter.setHfpDevices(Collections.emptyList());
         initializeViewModel();
 
         assertThat(mBluetoothStateLiveData.getValue()).isEqualTo(
                 BluetoothStateLiveData.BluetoothState.ENABLED);
         assertThat(mPairedListLiveData.getValue().isEmpty()).isFalse();
 
-        assertThat(mHfpStateLiveData.getValue() == BluetoothProfile.STATE_DISCONNECTED).isTrue();
+        assertThat(mHfpDeviceListLiveData.getValue().isEmpty()).isTrue();
         assertThat(mTelecomActivityViewModel.getErrorMessage().getValue()).isEqualTo(
                 mContext.getString(R.string.no_hfp));
-        assertThat(mTelecomActivityViewModel.getDialerAppState().getValue()).isEqualTo(
-                TelecomActivityViewModel.DialerAppState.BLUETOOTH_ERROR);
     }
 
     @Test
     public void testDialerAppState_bluetoothAllSet_dialerAppStateDefault() {
-        initializeBluetoothMonitor(true);
-        ShadowBluetoothAdapterForDialer shadowBluetoothAdapter =
-                (ShadowBluetoothAdapterForDialer) shadowOf(BluetoothAdapter.getDefaultAdapter());
+        ShadowBluetoothAdapterForDialer.setBluetoothAvailable(true);
+        BluetoothDevice mockBluetoothDevice = mock(BluetoothDevice.class);
+        ShadowBluetoothAdapterForDialer shadowBluetoothAdapter = Shadow.extract(
+                BluetoothAdapter.getDefaultAdapter());
+        // Sets up Bluetooth pair list
+        shadowBluetoothAdapter.setBondedDevices(Collections.singleton(mockBluetoothDevice));
+        // Sets up Bluetooth state
         shadowBluetoothAdapter.setEnabled(true);
-        shadowBluetoothAdapter.setBondedDevices(
-                new HashSet<>(Arrays.asList(mock(BluetoothDevice.class))));
-        shadowBluetoothAdapter.setProfileConnectionState(BluetoothProfile.HEADSET_CLIENT,
-                BluetoothProfile.STATE_CONNECTED);
+        // Sets up Bluetooth Hfp connected devices
+        shadowBluetoothAdapter.setHfpDevices(Collections.singletonList(mockBluetoothDevice));
+
         initializeViewModel();
 
         assertThat(mTelecomActivityViewModel.getErrorMessage().getValue()).isEqualTo(
-                TelecomActivityViewModel.NO_BT_ERROR);
-        assertThat(mTelecomActivityViewModel.getDialerAppState().getValue()).isEqualTo(
-                TelecomActivityViewModel.DialerAppState.DEFAULT);
-    }
-
-    private void initializeBluetoothMonitor(boolean availability) {
-        ShadowBluetoothAdapterForDialer.setBluetoothAvailable(availability);
-
-        UiBluetoothMonitor.init(mContext);
-        mHfpStateLiveData = UiBluetoothMonitor.get().getHfpStateLiveData();
-        mPairedListLiveData = UiBluetoothMonitor.get().getPairListLiveData();
-        mBluetoothStateLiveData = UiBluetoothMonitor.get().getBluetoothStateLiveData();
+                BluetoothErrorStringLiveData.NO_BT_ERROR);
     }
 
     private void initializeViewModel() {
+        UiBluetoothMonitor.init(mContext);
+        mHfpDeviceListLiveData = UiBluetoothMonitor.get().getHfpDeviceListLiveData();
+        mPairedListLiveData = UiBluetoothMonitor.get().getPairListLiveData();
+        mBluetoothStateLiveData = UiBluetoothMonitor.get().getBluetoothStateLiveData();
         mTelecomActivityViewModel = new TelecomActivityViewModel((Application) mContext);
         // Observers needed so that the liveData's internal initialization is triggered
         mTelecomActivityViewModel.getErrorMessage().observeForever(s -> {
         });
-        mTelecomActivityViewModel.getDialerAppState().observeForever(s -> {
-        });
     }
 }
diff --git a/tests/robotests/src/com/android/car/dialer/ui/activecall/OnGoingCallControllerBarFragmentTest.java b/tests/robotests/src/com/android/car/dialer/ui/activecall/OnGoingCallControllerBarFragmentTest.java
index 4eaafa7..263b046 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/activecall/OnGoingCallControllerBarFragmentTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/activecall/OnGoingCallControllerBarFragmentTest.java
@@ -42,6 +42,7 @@
 import com.android.car.dialer.testutils.ShadowAndroidViewModelFactory;
 import com.android.car.telephony.common.CallDetail;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -67,6 +68,7 @@
     private MutableLiveData<Boolean> mDialpadStateLiveData;
     private MutableLiveData<List<Call>> mCallListLiveData;
     private MutableLiveData<CallAudioState> mCallAudioStateLiveData;
+    private MutableLiveData<Pair<Call, Call>> mOngoingCallPairLiveData;
     private List<Call> mCallList;
     @Mock
     private Call mMockCall;
@@ -91,6 +93,7 @@
         mDialpadStateLiveData = new MutableLiveData<>();
         mCallListLiveData = new MutableLiveData<>();
         mCallAudioStateLiveData = new MutableLiveData<>();
+        mOngoingCallPairLiveData = new MutableLiveData<>();
         mCallList = new ArrayList<>();
         mCallList.add(mMockCall);
         mCallListLiveData.setValue(mCallList);
@@ -103,6 +106,11 @@
         shadowContext.setSystemService(Context.TELECOM_SERVICE, mMockTelecomManager);
     }
 
+    @After
+    public void tearDown() {
+        UiCallManager.set(null);
+    }
+
     @Test
     public void testMuteButton() {
         addFragment(Call.STATE_ACTIVE);
@@ -241,6 +249,8 @@
         when(mMockInCallViewModel.getDialpadOpenState()).thenReturn(mDialpadStateLiveData);
         when(mMockInCallViewModel.getAllCallList()).thenReturn(mCallListLiveData);
         when(mMockInCallViewModel.getCallAudioState()).thenReturn(mCallAudioStateLiveData);
+        when(mMockInCallViewModel.getOngoingCallPair()).thenReturn(mOngoingCallPairLiveData);
+        when(mMockInCallViewModel.getOngoingCallList()).thenReturn(mCallListLiveData);
 
         MutableLiveData<Integer> audioRouteLiveData = new MutableLiveData<>();
         audioRouteLiveData.setValue(CallAudioState.ROUTE_BLUETOOTH);
diff --git a/tests/robotests/src/com/android/car/dialer/ui/calllog/CallHistoryFragmentTest.java b/tests/robotests/src/com/android/car/dialer/ui/calllog/CallHistoryFragmentTest.java
index e5ca579..4402a99 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/calllog/CallHistoryFragmentTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/calllog/CallHistoryFragmentTest.java
@@ -28,6 +28,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.car.arch.common.FutureData;
+import com.android.car.arch.common.LiveDataFunctions;
 import com.android.car.dialer.CarDialerRobolectricTestRunner;
 import com.android.car.dialer.FragmentTestActivity;
 import com.android.car.dialer.R;
@@ -40,6 +41,7 @@
 import com.android.car.telephony.common.Contact;
 import com.android.car.telephony.common.InMemoryPhoneBook;
 import com.android.car.telephony.common.PhoneCallLog;
+import com.android.car.telephony.common.TelecomUtils;
 import com.android.car.ui.recyclerview.CarUiRecyclerView;
 
 import org.junit.After;
@@ -94,6 +96,8 @@
         callLog.setValue(new FutureData<>(false, Arrays.asList(HEADER, uiCallLog)));
         ShadowAndroidViewModelFactory.add(CallHistoryViewModel.class, mMockCallHistoryViewModel);
         when(mMockCallHistoryViewModel.getCallHistory()).thenReturn(callLog);
+        when(mMockCallHistoryViewModel.getSortOrderLiveData()).thenReturn(
+                LiveDataFunctions.dataOf(TelecomUtils.SORT_BY_FIRST_NAME));
 
         mCallHistoryFragment = CallHistoryFragment.newInstance();
         FragmentTestActivity mFragmentTestActivity = Robolectric.buildActivity(
@@ -110,6 +114,7 @@
 
     @After
     public void tearDown() {
+        UiCallManager.set(null);
         InMemoryPhoneBook.tearDown();
     }
 
diff --git a/tests/robotests/src/com/android/car/dialer/ui/contact/ContactDetailsFragmentTest.java b/tests/robotests/src/com/android/car/dialer/ui/contact/ContactDetailsFragmentTest.java
index 40af9a4..444a39b 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/contact/ContactDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/contact/ContactDetailsFragmentTest.java
@@ -95,6 +95,7 @@
 
     @After
     public void tearDown() {
+        UiCallManager.set(null);
         InMemoryPhoneBook.tearDown();
     }
 
diff --git a/tests/robotests/src/com/android/car/dialer/ui/contact/ContactListFragmentTest.java b/tests/robotests/src/com/android/car/dialer/ui/contact/ContactListFragmentTest.java
index 0cef19d..1361ec7 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/contact/ContactListFragmentTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/contact/ContactListFragmentTest.java
@@ -37,7 +37,6 @@
 import com.android.car.dialer.R;
 import com.android.car.dialer.telecom.UiCallManager;
 import com.android.car.dialer.testutils.ShadowAndroidViewModelFactory;
-import com.android.car.dialer.ui.common.entity.ContactSortingInfo;
 import com.android.car.dialer.ui.favorite.FavoriteViewModel;
 import com.android.car.telephony.common.Contact;
 import com.android.car.telephony.common.PhoneNumber;
@@ -45,6 +44,7 @@
 import com.android.car.telephony.common.TelecomUtils;
 import com.android.car.ui.recyclerview.CarUiRecyclerView;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -54,6 +54,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowLooper;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -107,6 +108,11 @@
         when(mMockFavoriteViewModel.getFavoriteContacts()).thenReturn(new MutableLiveData<>());
     }
 
+    @After
+    public void tearDown() {
+        UiCallManager.set(null);
+    }
+
     @Test
     public void testClickCallActionButton_ContactHasOneNumber_placeCall() {
         UiCallManager.set(mMockUiCallManager);
@@ -133,6 +139,7 @@
 
         assertThat(ShadowAlertDialog.getLatestAlertDialog()).isNull();
         View callActionView = mViewHolder.itemView.findViewById(R.id.call_action_id);
+        ShadowLooper.pauseMainLooper();
         callActionView.performClick();
 
         verify(mMockUiCallManager, never()).placeCall(any());
diff --git a/tests/robotests/src/com/android/car/dialer/ui/contact/ContactListViewHolderTest.java b/tests/robotests/src/com/android/car/dialer/ui/contact/ContactListViewHolderTest.java
index 4acc5a6..f00bcb7 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/contact/ContactListViewHolderTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/contact/ContactListViewHolderTest.java
@@ -33,12 +33,12 @@
 import com.android.car.dialer.CarDialerRobolectricTestRunner;
 import com.android.car.dialer.R;
 import com.android.car.dialer.telecom.UiCallManager;
-import com.android.car.dialer.ui.common.entity.ContactSortingInfo;
 import com.android.car.telephony.common.Contact;
 import com.android.car.telephony.common.PhoneNumber;
 import com.android.car.telephony.common.PostalAddress;
 import com.android.car.telephony.common.TelecomUtils;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -48,6 +48,7 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowAlertDialog;
+import org.robolectric.shadows.ShadowLooper;
 
 import java.util.Arrays;
 
@@ -81,8 +82,14 @@
         mContactListViewHolder = new ContactListViewHolder(mItemView, mMockListener);
     }
 
+    @After
+    public void tearDown() {
+        UiCallManager.set(null);
+    }
+
     @Test
     public void testDisplayName() {
+        when(mMockContact.getDisplayName()).thenReturn(DISPLAY_NAME);
         mContactListViewHolder.bind(mMockContact, false, "", TelecomUtils.SORT_BY_FIRST_NAME);
 
         assertThat(((TextView) mItemView.findViewById(R.id.title)).getText()).isEqualTo(
@@ -217,6 +224,7 @@
 
         assertThat(ShadowAlertDialog.getLatestAlertDialog()).isNull();
         View callActionView = mItemView.findViewById(R.id.call_action_id);
+        ShadowLooper.pauseMainLooper();
         callActionView.performClick();
 
         verify(mMockUiCallManager, never()).placeCall(any());
diff --git a/tests/robotests/src/com/android/car/dialer/ui/dialpad/DialpadFragmentTest.java b/tests/robotests/src/com/android/car/dialer/ui/dialpad/DialpadFragmentTest.java
index ae3fb08..6aa6994 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/dialpad/DialpadFragmentTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/dialpad/DialpadFragmentTest.java
@@ -30,6 +30,7 @@
 
 import androidx.lifecycle.MutableLiveData;
 
+import com.android.car.arch.common.LiveDataFunctions;
 import com.android.car.dialer.CarDialerRobolectricTestRunner;
 import com.android.car.dialer.FragmentTestActivity;
 import com.android.car.dialer.R;
@@ -39,7 +40,6 @@
 import com.android.car.dialer.testutils.ShadowCallLogCalls;
 import com.android.car.dialer.testutils.ShadowInMemoryPhoneBook;
 import com.android.car.dialer.ui.common.ContactResultsLiveData;
-import com.android.car.dialer.ui.search.ContactResultsViewModel;
 import com.android.car.telephony.common.Contact;
 import com.android.car.telephony.common.InMemoryPhoneBook;
 import com.android.car.telephony.common.PhoneNumber;
@@ -65,15 +65,15 @@
     private static final String DIAL_NUMBER = "6505551234";
     private static final String DIAL_NUMBER_LONG = "650555123465055512346505551234";
     private static final String SINGLE_DIGIT = "0";
-    private static final String SPEC_CHAR = "123=_=%^&";
+    private static final String SPEC_CHAR = "123,456";
     private static final String DISPALY_NAME = "Display Name";
 
     private Context mContext;
     private DialpadFragment mDialpadFragment;
     private MutableLiveData<List<ContactResultsLiveData.ContactResultListItem>>
-            mContactResultsLiveData;
+            mTypeDownResultsLiveData;
     @Mock
-    private ContactResultsViewModel mMockContactResultsViewModel;
+    private TypeDownResultsViewModel mTypeDownResultsViewModel;
     @Mock
     private Contact mMockContact;
 
@@ -86,11 +86,13 @@
         ((TestDialerApplication) mContext).initUiCallManager();
         InMemoryPhoneBook.init(mContext);
 
-        mContactResultsLiveData = new MutableLiveData<>();
-        when(mMockContactResultsViewModel.getContactSearchResults())
-                .thenReturn(mContactResultsLiveData);
-        ShadowAndroidViewModelFactory.add(
-                ContactResultsViewModel.class, mMockContactResultsViewModel);
+        mTypeDownResultsLiveData = new MutableLiveData<>();
+        when(mTypeDownResultsViewModel.getContactSearchResults()).thenReturn(
+                mTypeDownResultsLiveData);
+        when(mTypeDownResultsViewModel.getSortOrderLiveData()).thenReturn(
+                LiveDataFunctions.dataOf(TelecomUtils.SORT_BY_FIRST_NAME));
+        ShadowAndroidViewModelFactory.add(TypeDownResultsViewModel.class,
+                mTypeDownResultsViewModel);
     }
 
     @After
diff --git a/tests/robotests/src/com/android/car/dialer/ui/dialpad/InCallDialpadFragmentTest.java b/tests/robotests/src/com/android/car/dialer/ui/dialpad/InCallDialpadFragmentTest.java
index baa131c..55c8ccf 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/dialpad/InCallDialpadFragmentTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/dialpad/InCallDialpadFragmentTest.java
@@ -24,10 +24,12 @@
 import com.android.car.dialer.FragmentTestActivity;
 import com.android.car.dialer.R;
 import com.android.car.dialer.TestDialerApplication;
+import com.android.car.dialer.telecom.UiCallManager;
 import com.android.car.dialer.testutils.ShadowCallLogCalls;
 import com.android.car.dialer.testutils.ShadowInMemoryPhoneBook;
 import com.android.car.dialer.ui.activecall.OngoingCallFragment;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -65,4 +67,9 @@
                         .findFragmentById(R.id.incall_dialpad_fragment);
     }
 
+    @After
+    public void tearDown() {
+        UiCallManager.get().tearDown();
+    }
+
 }
diff --git a/tests/robotests/src/com/android/car/dialer/ui/favorite/FavoriteFragmentTest.java b/tests/robotests/src/com/android/car/dialer/ui/favorite/FavoriteFragmentTest.java
index e6c326e..fb6e880 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/favorite/FavoriteFragmentTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/favorite/FavoriteFragmentTest.java
@@ -27,6 +27,7 @@
 import androidx.lifecycle.MutableLiveData;
 
 import com.android.car.arch.common.FutureData;
+import com.android.car.arch.common.LiveDataFunctions;
 import com.android.car.dialer.CarDialerRobolectricTestRunner;
 import com.android.car.dialer.FragmentTestActivity;
 import com.android.car.dialer.R;
@@ -34,8 +35,10 @@
 import com.android.car.dialer.testutils.ShadowAndroidViewModelFactory;
 import com.android.car.telephony.common.Contact;
 import com.android.car.telephony.common.PhoneNumber;
+import com.android.car.telephony.common.TelecomUtils;
 import com.android.car.ui.recyclerview.CarUiRecyclerView;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -44,6 +47,7 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowLooper;
 
 import java.util.Arrays;
 import java.util.List;
@@ -75,6 +79,8 @@
         favoriteContacts.setValue(new FutureData<>(false, Arrays.asList(mMockContact)));
         ShadowAndroidViewModelFactory.add(FavoriteViewModel.class, mMockFavoriteViewModel);
         when(mMockFavoriteViewModel.getFavoriteContacts()).thenReturn(favoriteContacts);
+        when(mMockFavoriteViewModel.getSortOrderLiveData()).thenReturn(
+                LiveDataFunctions.dataOf(TelecomUtils.SORT_BY_FIRST_NAME));
 
         mFavoriteFragment = FavoriteFragment.newInstance();
         FragmentTestActivity fragmentTestActivity = Robolectric.buildActivity(
@@ -87,6 +93,11 @@
         mViewHolder = (FavoriteContactViewHolder) recyclerView.findViewHolderForLayoutPosition(0);
     }
 
+    @After
+    public void tearDown() {
+        UiCallManager.set(null);
+    }
+
     @Test
     public void testOnItemClick_contactHasPrimaryNumber_placeCall() {
         when(mMockContact.getNumbers()).thenReturn(Arrays.asList(mMockPhoneNumber));
@@ -119,6 +130,7 @@
         when(mMockContact.getNumbers()).thenReturn(
                 Arrays.asList(mMockPhoneNumber, otherMockPhoneNumber));
 
+        ShadowLooper.pauseMainLooper();
         mViewHolder.itemView.performClick();
 
         verify(mMockUiCallManager, never()).placeCall(any());
diff --git a/tests/robotests/src/com/android/car/dialer/ui/search/ContactResultsFragmentTest.java b/tests/robotests/src/com/android/car/dialer/ui/search/ContactResultsFragmentTest.java
index c6f4d1c..bf90c5b 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/search/ContactResultsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/search/ContactResultsFragmentTest.java
@@ -29,6 +29,7 @@
 import androidx.lifecycle.MutableLiveData;
 
 import com.android.car.arch.common.FutureData;
+import com.android.car.arch.common.LiveDataFunctions;
 import com.android.car.dialer.CarDialerRobolectricTestRunner;
 import com.android.car.dialer.FragmentTestActivity;
 import com.android.car.dialer.R;
@@ -39,6 +40,7 @@
 import com.android.car.telephony.common.Contact;
 import com.android.car.telephony.common.InMemoryPhoneBook;
 import com.android.car.telephony.common.PhoneNumber;
+import com.android.car.telephony.common.TelecomUtils;
 import com.android.car.ui.recyclerview.CarUiRecyclerView;
 
 import org.junit.After;
@@ -87,6 +89,8 @@
         mContactSearchResultsLiveData = new MutableLiveData<>();
         when(mMockContactResultsViewModel.getContactSearchResults())
                 .thenReturn(mContactSearchResultsLiveData);
+        when(mMockContactResultsViewModel.getSortOrderLiveData()).thenReturn(
+                LiveDataFunctions.dataOf(TelecomUtils.SORT_BY_FIRST_NAME));
         ShadowAndroidViewModelFactory.add(
                 ContactResultsViewModel.class, mMockContactResultsViewModel);
 
diff --git a/tests/robotests/src/com/android/car/dialer/ui/warning/NoHfpFragmentTest.java b/tests/robotests/src/com/android/car/dialer/ui/warning/NoHfpFragmentTest.java
index 992cefd..11c1456 100644
--- a/tests/robotests/src/com/android/car/dialer/ui/warning/NoHfpFragmentTest.java
+++ b/tests/robotests/src/com/android/car/dialer/ui/warning/NoHfpFragmentTest.java
@@ -17,12 +17,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
-import android.car.Car;
-import android.car.CarNotConnectedException;
-import android.car.drivingstate.CarUxRestrictions;
-import android.car.drivingstate.CarUxRestrictionsManager;
 import android.view.View;
 import android.widget.TextView;
 
@@ -32,20 +26,16 @@
 import com.android.car.dialer.TestDialerApplication;
 import com.android.car.dialer.bluetooth.UiBluetoothMonitor;
 import com.android.car.dialer.telecom.UiCallManager;
-import com.android.car.dialer.testutils.ShadowCar;
 
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.Robolectric;
 import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
 
 @RunWith(CarDialerRobolectricTestRunner.class)
-@Config(shadows = ShadowCar.class)
 public class NoHfpFragmentTest {
     private static final String ERROR_MSG = "ERROR!!!";
     private static final String UPDATED_ERROR_MSG = "ANOTHER ERROR!!!!";
@@ -53,26 +43,13 @@
     private NoHfpFragment mNoHfpFragment;
     private FragmentTestActivity mFragmentTestActivity;
 
-    @Mock
-    private Car mMockCar;
-    @Mock
-    private CarUxRestrictionsManager mMockCarUxRestrictionsManager;
-    @Mock
-    private CarUxRestrictions mMockCarUxRestrictions;
-
     @Before
-    public void setup() throws CarNotConnectedException {
+    public void setup() {
         MockitoAnnotations.initMocks(this);
 
         ((TestDialerApplication) RuntimeEnvironment.application).initUiCallManager();
         UiBluetoothMonitor.init(RuntimeEnvironment.application);
 
-        when(mMockCarUxRestrictionsManager.getCurrentCarUxRestrictions()).thenReturn(
-                mMockCarUxRestrictions);
-        when(mMockCar.getCarManager(Car.CAR_UX_RESTRICTION_SERVICE)).thenReturn(
-                mMockCarUxRestrictionsManager);
-        ShadowCar.setCar(mMockCar);
-
         mNoHfpFragment = NoHfpFragment.newInstance(ERROR_MSG);
         mFragmentTestActivity = Robolectric.buildActivity(
                 FragmentTestActivity.class).create().start().resume().get();
@@ -104,6 +81,5 @@
     public void tearDown() {
         UiBluetoothMonitor.get().tearDown();
         UiCallManager.get().tearDown();
-        ShadowCar.setCar(null);
     }
 }
diff --git a/tests/unittests/Android.bp b/tests/unittests/Android.bp
new file mode 100644
index 0000000..793fc8c
--- /dev/null
+++ b/tests/unittests/Android.bp
@@ -0,0 +1,16 @@
+//############################################################
+// Car Dialer unit test target.                              #
+//############################################################
+android_test {
+    name: "CarDialerUnitTests",
+
+    srcs: ["src/**/*.java"],
+
+    java_resource_dirs: ["config"],
+
+    static_libs: [
+        "androidx.test.ext.junit",
+    ],
+
+    instrumentation_for: "CarDialerAppForTesting",
+}
diff --git a/tests/unittests/AndroidManifest.xml b/tests/unittests/AndroidManifest.xml
new file mode 100644
index 0000000..70ceaa9
--- /dev/null
+++ b/tests/unittests/AndroidManifest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.android.car.dialer">
+
+    <application android:testOnly="true"
+                 android:debuggable="true">
+        <uses-library android:name="android.test.runner" />
+    </application>
+
+    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+                     android:targetPackage="com.android.car.dialer.tests.unittests"
+                     android:label="Car Dialer Unit Tests" />
+</manifest>
diff --git a/tests/unittests/readme.md b/tests/unittests/readme.md
new file mode 100644
index 0000000..46a6460
--- /dev/null
+++ b/tests/unittests/readme.md
@@ -0,0 +1,6 @@
+Unit test suite for CarDialerApp using Robolectric.
+
+```
+$ mma
+$ atest CarDialerUnitTests
+```
\ No newline at end of file
diff --git a/tests/unittests/src/com/android/car/dialer/livedata/CallStateLiveDataUnitTest.java b/tests/unittests/src/com/android/car/dialer/livedata/CallStateLiveDataUnitTest.java
new file mode 100644
index 0000000..9488040
--- /dev/null
+++ b/tests/unittests/src/com/android/car/dialer/livedata/CallStateLiveDataUnitTest.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.dialer.livedata;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class CallStateLiveDataUnitTest {
+
+    @Before
+    public void setup() {
+    }
+
+    @Test
+    public void testOnActiveRegistry() {
+    }
+}
+