merge in KQS81M
diff --git a/InCallUI/res/drawable-hdpi/business_unknown.png b/InCallUI/res/drawable-hdpi/business_unknown.png
new file mode 100644
index 0000000..b369939
--- /dev/null
+++ b/InCallUI/res/drawable-hdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/list_pressed_holo_dark.9.png b/InCallUI/res/drawable-hdpi/list_pressed_holo_dark.9.png
index 3c52029..596accb 100644
--- a/InCallUI/res/drawable-hdpi/list_pressed_holo_dark.9.png
+++ b/InCallUI/res/drawable-hdpi/list_pressed_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-hdpi/picture_unknown.png b/InCallUI/res/drawable-hdpi/picture_unknown.png
index ba46da1..26d2be1 100644
--- a/InCallUI/res/drawable-hdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-hdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/business_unknown.png b/InCallUI/res/drawable-mdpi/business_unknown.png
new file mode 100644
index 0000000..eac97a9
--- /dev/null
+++ b/InCallUI/res/drawable-mdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/list_pressed_holo_dark.9.png b/InCallUI/res/drawable-mdpi/list_pressed_holo_dark.9.png
index c231328..fd0e8d7 100644
--- a/InCallUI/res/drawable-mdpi/list_pressed_holo_dark.9.png
+++ b/InCallUI/res/drawable-mdpi/list_pressed_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-mdpi/picture_unknown.png b/InCallUI/res/drawable-mdpi/picture_unknown.png
index 995df75..1ee333c 100644
--- a/InCallUI/res/drawable-mdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-mdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/business_unknown.png b/InCallUI/res/drawable-xhdpi/business_unknown.png
new file mode 100644
index 0000000..aa84456
--- /dev/null
+++ b/InCallUI/res/drawable-xhdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/list_pressed_holo_dark.9.png b/InCallUI/res/drawable-xhdpi/list_pressed_holo_dark.9.png
index 4f85510..29037a0 100644
--- a/InCallUI/res/drawable-xhdpi/list_pressed_holo_dark.9.png
+++ b/InCallUI/res/drawable-xhdpi/list_pressed_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-xhdpi/picture_unknown.png b/InCallUI/res/drawable-xhdpi/picture_unknown.png
index b4bd366..db74fd9 100644
--- a/InCallUI/res/drawable-xhdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-xhdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/business_unknown.png b/InCallUI/res/drawable-xxhdpi/business_unknown.png
new file mode 100644
index 0000000..6273bb3
--- /dev/null
+++ b/InCallUI/res/drawable-xxhdpi/business_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/list_pressed_holo_dark.9.png b/InCallUI/res/drawable-xxhdpi/list_pressed_holo_dark.9.png
index e751a60..d4952ea 100644
--- a/InCallUI/res/drawable-xxhdpi/list_pressed_holo_dark.9.png
+++ b/InCallUI/res/drawable-xxhdpi/list_pressed_holo_dark.9.png
Binary files differ
diff --git a/InCallUI/res/drawable-xxhdpi/picture_unknown.png b/InCallUI/res/drawable-xxhdpi/picture_unknown.png
index 4127593..38bec2c 100644
--- a/InCallUI/res/drawable-xxhdpi/picture_unknown.png
+++ b/InCallUI/res/drawable-xxhdpi/picture_unknown.png
Binary files differ
diff --git a/InCallUI/res/drawable/dialpad_background.xml b/InCallUI/res/drawable/dialpad_background.xml
deleted file mode 100644
index 0e31f5e..0000000
--- a/InCallUI/res/drawable/dialpad_background.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/dial_background_texture"
-    android:tileMode="repeat" />
diff --git a/InCallUI/res/drawable/dialpad_background_opaque.xml b/InCallUI/res/drawable/dialpad_background_opaque.xml
deleted file mode 100644
index d8792f2..0000000
--- a/InCallUI/res/drawable/dialpad_background_opaque.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-
-<!-- Opaque version of dialpad_background.xml. -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <!-- An opaque black layer underneath. -->
-    <item android:drawable="@android:color/black" />
-
-    <!-- ...and the "dial_background_texture" tiled on top. -->
-    <item>
-        <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-                android:src="@drawable/dial_background_texture"
-                android:tileMode="repeat" />
-    </item>
-
-</layer-list>
diff --git a/InCallUI/res/layout/answer_fragment.xml b/InCallUI/res/layout/answer_fragment.xml
index 4f31e3f..ee2b076 100644
--- a/InCallUI/res/layout/answer_fragment.xml
+++ b/InCallUI/res/layout/answer_fragment.xml
@@ -24,6 +24,7 @@
         android:layout_height="wrap_content"
         android:focusable="true"
         android:layout_centerHorizontal="true"
+        android:gravity="center"
         android:background="@android:color/black"
         android:visibility="gone"
 
diff --git a/InCallUI/res/layout/call_button_fragment.xml b/InCallUI/res/layout/call_button_fragment.xml
index 06de6d9..420d2aa 100644
--- a/InCallUI/res/layout/call_button_fragment.xml
+++ b/InCallUI/res/layout/call_button_fragment.xml
@@ -51,6 +51,7 @@
     <ImageButton android:id="@+id/endButton"
                  style="@style/InCallEndButton"
                  android:layout_width="match_parent"
+                 android:layout_marginTop="2dp"
                  android:src="@drawable/ic_in_call_phone_hangup"
                  android:background="@drawable/end_call_background"
                  android:contentDescription="@string/onscreenEndCallText"/>
@@ -65,6 +66,7 @@
             android:layout_height="wrap_content"
             android:paddingStart="@dimen/button_cluster_side_padding"
             android:paddingEnd="@dimen/button_cluster_side_padding"
+            android:background="@color/button_background"
             >
 
         <!-- This row has either 4 or 5 buttons, depending on
diff --git a/InCallUI/res/layout/dtmf_twelve_key_dialer_view.xml b/InCallUI/res/layout/dtmf_twelve_key_dialer_view.xml
index c4fecf3..fe84010 100644
--- a/InCallUI/res/layout/dtmf_twelve_key_dialer_view.xml
+++ b/InCallUI/res/layout/dtmf_twelve_key_dialer_view.xml
@@ -60,7 +60,7 @@
         android:paddingStart="5dip"
         android:paddingEnd="5dip"
         android:paddingBottom="10dip"
-        android:background="@drawable/dialpad_background"
+        android:background="@color/dialpad_background"
         android:layoutDirection="ltr">
 
         <TableRow
diff --git a/InCallUI/res/layout/extra_button_row.xml b/InCallUI/res/layout/extra_button_row.xml
index a1600e8..ade3e4e 100644
--- a/InCallUI/res/layout/extra_button_row.xml
+++ b/InCallUI/res/layout/extra_button_row.xml
@@ -18,7 +18,7 @@
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:background="@drawable/dialpad_background_opaque">
+    android:background="@color/button_background">
     <!-- The buttons here have a text label floating off to the side
          (which is necessary because these buttons are used only in
          a few rare states, and the meaning of the icon might not be
diff --git a/InCallUI/res/layout/primary_call_info.xml b/InCallUI/res/layout/primary_call_info.xml
index f67c04a..0d37a73 100644
--- a/InCallUI/res/layout/primary_call_info.xml
+++ b/InCallUI/res/layout/primary_call_info.xml
@@ -38,77 +38,81 @@
             android:orientation="vertical">
 
         <!-- "Call Banner" for primary call, the foregound or ringing call.
-             The "call banner" is a block of info about a single call,
-             including the contact name, phone number, call time counter,
-             and other status info.  This info is shown as a "banner"
-             overlaid across the top of contact photo. -->
-        <GridLayout android:id="@+id/primary_call_banner"
-                    style="@style/PrimaryCallInfoPrimaryCallBanner"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"
-                    android:minHeight="@dimen/call_banner_height"
-                    android:background="@color/incall_call_banner_background"
-                    android:paddingStart="@dimen/call_banner_side_padding"
-                    android:paddingEnd="@dimen/call_banner_side_padding"
-                    android:paddingTop="@dimen/call_banner_top_bottom_padding"
-                    android:paddingBottom="@dimen/call_banner_top_bottom_padding">
+         The "call banner" is a block of info about a single call,
+         including the contact name, phone number, call time counter,
+         and other status info.  This info is shown as a "banner"
+         overlaid across the top of contact photo. -->
+        <RelativeLayout android:id="@+id/primary_call_banner"
+            style="@style/PrimaryCallInfoPrimaryCallBanner"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:minHeight="@dimen/call_banner_height"
+            android:paddingStart="@dimen/call_banner_side_padding"
+            android:paddingEnd="@dimen/call_banner_side_padding"
+            android:paddingTop="@dimen/call_banner_top_bottom_padding"
+            android:paddingBottom="@dimen/call_banner_top_bottom_padding"
+            android:background="@color/incall_call_banner_background">
 
             <!-- Name (or the phone number, if we don't have a name to display). -->
             <TextView android:id="@+id/name"
-                      android:textAppearance="?android:attr/textAppearanceMedium"
-                      android:textColor="@color/incall_call_banner_text_color"
-                      android:singleLine="true"
-                      android:textAlignment="viewStart"
-                      android:layout_column="0"
-                      android:layout_row="0"
-                      android:layout_columnSpan="2"
-                      android:layout_gravity="fill"/>
+                android:layout_alignParentTop="true"
+                android:layout_alignParentStart="true"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingEnd="@dimen/call_banner_name_number_right_padding"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:textColor="@color/incall_call_banner_text_color"
+                android:singleLine="true"
+                android:textAlignment="viewStart"/>
 
             <!-- Label (like "Mobile" or "Work", if present) and phone number, side by side -->
-            <TextView android:id="@+id/phoneNumber"
-                      android:textAppearance="?android:attr/textAppearanceSmall"
-                      android:textColor="@color/incall_call_banner_text_color"
-                      android:singleLine="true"
-                      android:textDirection="ltr"
-                      android:layout_column="0"
-                      android:layout_row="1"
-                      android:layout_gravity="fill"/>
+            <LinearLayout android:id="@+id/labelAndNumber"
+                android:layout_below="@id/name"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingEnd="@dimen/call_banner_name_number_right_padding"
+                android:orientation="horizontal">
+                <TextView android:id="@+id/phoneNumber"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textAppearance="?android:attr/textAppearanceSmall"
+                    android:textColor="@color/incall_call_banner_text_color"
+                    android:singleLine="true"
+                    android:textDirection="ltr" />
+                <TextView android:id="@+id/label"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textAppearance="?android:attr/textAppearanceSmall"
+                    android:textColor="@color/incall_call_banner_text_color"
+                    android:textAllCaps="true"
+                    android:singleLine="true"
+                    android:layout_marginStart="6dp" />
+            </LinearLayout>
 
-            <TextView android:id="@+id/label"
-                      android:textAppearance="?android:attr/textAppearanceSmall"
-                      android:textColor="@color/incall_call_banner_text_color"
-                      android:textAllCaps="true"
-                      android:singleLine="true"
-                      android:paddingStart="6dp"
-                      android:layout_column="1"
-                      android:layout_row="1"
-                      android:layout_gravity="fill"/>
+            <!-- Elapsed time indication for a call in progress. -->
+            <TextView android:id="@+id/elapsedTime"
+                android:layout_alignParentEnd="true"
+                android:layout_centerVertical="true"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceMedium"
+                android:textColor="@color/incall_call_banner_text_color"
+                android:singleLine="true"
+                android:visibility="invisible" />
 
             <!-- Call type indication: a special label and/or branding
                  for certain kinds of calls (like "Internet call" for a SIP call.) -->
             <TextView android:id="@+id/callTypeLabel"
-                      android:textAppearance="?android:attr/textAppearanceSmall"
-                      android:textColor="@color/incall_callTypeSip"
-                      android:maxLines="1"
-                      android:layout_column="0"
-                      android:layout_row="2"
-                      android:layout_columnSpan="2"
-                      android:ellipsize="end"
-                      android:layout_gravity="fill"/>
+                android:layout_below="@id/labelAndNumber"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:textColor="@color/incall_call_banner_text_color"
+                android:maxLines="1"
+                android:ellipsize="end" />
 
-            <!-- Elapsed time indication for a call in progress. -->
-            <TextView android:id="@+id/elapsedTime"
-                      android:textAppearance="?android:attr/textAppearanceMedium"
-                      android:textColor="@color/incall_call_banner_text_color"
-                      android:singleLine="true"
-                      android:visibility="invisible"
-                      android:layout_column="2"
-                      android:layout_row="0"
-                      android:layout_rowSpan="3"
-                      android:layout_gravity="fill"
-                      android:gravity="end|center_vertical"/>
-        </GridLayout>
-        <!-- End of call_banner -->
+        </RelativeLayout>  <!-- End of call_banner -->
+
 
         <LinearLayout android:id="@+id/supplementary_info_container"
             style="@style/PrimaryCallInfoSupplementaryInfoContainer"
diff --git a/InCallUI/res/layout/secondary_call_info.xml b/InCallUI/res/layout/secondary_call_info.xml
index 97bc0bf..787dc59 100644
--- a/InCallUI/res/layout/secondary_call_info.xml
+++ b/InCallUI/res/layout/secondary_call_info.xml
@@ -43,18 +43,19 @@
         android:layout_width="match_parent"
         android:layout_height="@dimen/call_banner_height"
         android:paddingStart="@dimen/call_banner_side_padding"
-        android:paddingEnd="@dimen/call_banner_side_padding"
+        android:paddingEnd="@dimen/secondary_call_banner_right_padding"
         android:paddingTop="@dimen/call_banner_top_bottom_padding"
         android:paddingBottom="@dimen/call_banner_top_bottom_padding"
         android:background="@color/incall_call_banner_background">
         <!-- Name (or the phone number, if we don't have a name to display). -->
         <TextView android:id="@+id/secondaryCallName"
             style="@style/SecondaryCallInfoSecondaryCallName"
-            android:layout_gravity="top|start"
+            android:layout_gravity="bottom|start"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:textAppearance="?android:attr/textAppearanceMedium"
             android:textColor="@color/incall_call_banner_text_color"
+            android:ellipsize="marquee"
             android:singleLine="true"/>
     </FrameLayout>
 
@@ -63,7 +64,7 @@
         style="@style/SecondaryCallInfoSecondaryCallStatus"
         android:layout_width="wrap_content"
         android:layout_height="@dimen/call_banner_height"
-        android:gravity="top|end"
+        android:gravity="bottom|end"
         android:layout_gravity="end"
         android:paddingStart="@dimen/call_banner_side_padding"
         android:paddingEnd="@dimen/call_banner_side_padding"
diff --git a/InCallUI/res/values-af/strings.xml b/InCallUI/res/values-af/strings.xml
index 4cf802b..3a423c8 100644
--- a/InCallUI/res/values-af/strings.xml
+++ b/InCallUI/res/values-af/strings.xml
@@ -589,6 +589,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ek bel jou later."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan nie nou praat nie. Bel my later?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skryf jou eie..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Vinnige antwoorde"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Redigeer vinnige antwoorde"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-am/strings.xml b/InCallUI/res/values-am/strings.xml
index 236feb5..9c63e82 100644
--- a/InCallUI/res/values-am/strings.xml
+++ b/InCallUI/res/values-am/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ኋላ እደውላለሁ።"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"አሁን ማውራት አልችልም። ትንሽ ቆይተው ይደውሉ?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"የእራስዎን ይጻፉ..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ፈጣን ምላሾች"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ፈጣን ምላሾች አርትዕ"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ar/strings.xml b/InCallUI/res/values-ar/strings.xml
index 3627fcd..b69714b 100644
--- a/InCallUI/res/values-ar/strings.xml
+++ b/InCallUI/res/values-ar/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"سأتصل بك لاحقًا."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"لا يمكنني التحدث الآن. اتصل بي لاحقًا."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"اكتب ردك..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"الردود السريعة"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"تعديل الردود السريعة"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-be/strings.xml b/InCallUI/res/values-be/strings.xml
index b1e691c..d41b780 100644
--- a/InCallUI/res/values-be/strings.xml
+++ b/InCallUI/res/values-be/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Я патэлефаную пазней."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Не магу размаўляць. Набяры пазней."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напiшыце сваё..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Хуткія адказы"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Рэдагаваць хуткія адказы"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-bg/strings.xml b/InCallUI/res/values-bg/strings.xml
index 49116b5..3477f92 100644
--- a/InCallUI/res/values-bg/strings.xml
+++ b/InCallUI/res/values-bg/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ще ви се обадя по-късно."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Сега не мога да говоря. По-късно?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напишете свой собствен..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Бързи отговори"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Редактиране на бързи отговори"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ca/strings.xml b/InCallUI/res/values-ca/strings.xml
index f7a3c38..638fb32 100644
--- a/InCallUI/res/values-ca/strings.xml
+++ b/InCallUI/res/values-ca/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Et truco més tard."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ara no puc parlar. Truques després?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escriu la teva…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respostes ràpides"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edita les respostes ràpides"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-cs/strings.xml b/InCallUI/res/values-cs/strings.xml
index 85f4f42..2fe3141 100644
--- a/InCallUI/res/values-cs/strings.xml
+++ b/InCallUI/res/values-cs/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Zavolám později."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nemůžu telefonovat, volejte jindy."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napsat vlastní odpověď..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Rychlé odpovědi"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Upravit rychlé odpovědi"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-da/strings.xml b/InCallUI/res/values-da/strings.xml
index abba97d..a12972a 100644
--- a/InCallUI/res/values-da/strings.xml
+++ b/InCallUI/res/values-da/strings.xml
@@ -68,7 +68,7 @@
     <string name="labelCDMAMore" msgid="1630676740428229339">"Indstillinger for CDMA-opkald"</string>
     <string name="apn_settings" msgid="9043423184895642077">"Navn på adgangspunkt"</string>
     <string name="settings_label" msgid="3876743539816984008">"Indstillinger for netværk"</string>
-    <string name="voicemail" msgid="8693759337917898954">"Voicemail"</string>
+    <string name="voicemail" msgid="8693759337917898954">"Telefonsvarer"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM:"</string>
     <string name="networks" msgid="8873030692174541976">"Netværksudbydere"</string>
     <string name="call_settings" msgid="6112441768261754562">"Indstillinger for opkald"</string>
@@ -131,7 +131,7 @@
     <string name="fw_change_failed" msgid="5298103228470214665">"Telefonsvarernummeret kunne ikke ændres.\nKontakt dit mobilselskab, hvis problemet vedbliver."</string>
     <string name="fw_get_in_vm_failed" msgid="8862896836093833973">"De aktuelle indstillinger til viderestillingsnummer kunne ikke hentes og gemmes.\nVil du skifte til den nye udbyder alligevel?"</string>
     <string name="no_change" msgid="3186040086622435212">"Der blev ikke foretaget nogen ændringer."</string>
-    <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Vælg voicemail-tjeneste"</string>
+    <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Vælg telefonsvarertjeneste"</string>
     <string name="voicemail_default" msgid="5902099213882352338">"Min udbyder"</string>
     <string name="mobile_networks" msgid="5540397602919106177">"Indstillinger for mobilnetværk"</string>
     <string name="label_available" msgid="1181658289009300430">"Tilgængelige netværk"</string>
@@ -407,8 +407,8 @@
     <string name="notification_ongoing_call" msgid="7068688957273482989">"Igangværende opkald"</string>
     <string name="notification_on_hold" msgid="3480694969511790465">"Ventende"</string>
     <string name="notification_incoming_call" msgid="2820429205043529642">"Indgående opkald"</string>
-    <string name="notification_voicemail_title" msgid="8933468752045550523">"Ny voicemail"</string>
-    <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Ny voicemail (<xliff:g id="COUNT">%d</xliff:g>)"</string>
+    <string name="notification_voicemail_title" msgid="8933468752045550523">"Ny telefonsvarerbesked"</string>
+    <string name="notification_voicemail_title_count" msgid="4366360747660929916">"Nye telefonsvarerbeskeder (<xliff:g id="COUNT">%d</xliff:g>)"</string>
     <string name="notification_voicemail_text_format" msgid="4447323569453981685">"Ring til <xliff:g id="VOICEMAIL_NUMBER">%s</xliff:g>"</string>
     <string name="notification_voicemail_no_vm_number" msgid="760963466895609716">"Voicemailnummeret er ukendt"</string>
     <string name="notification_network_selection_title" msgid="4224455487793492772">"Ingen dækning"</string>
@@ -591,6 +591,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Jeg ringer til dig senere."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan ikke tale nu. Ringer du senere?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skriv dit eget..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Hurtige svar"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Rediger hurtige svar"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-de/strings.xml b/InCallUI/res/values-de/strings.xml
index c3776aa..ece9de5 100644
--- a/InCallUI/res/values-de/strings.xml
+++ b/InCallUI/res/values-de/strings.xml
@@ -589,6 +589,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ich rufe später zurück."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kann jetzt nicht sprechen. Später?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Eigene Antwort schreiben..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Kurzantworten"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Kurzantworten bearbeiten"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-el/strings.xml b/InCallUI/res/values-el/strings.xml
index ed22979..127702a 100644
--- a/InCallUI/res/values-el/strings.xml
+++ b/InCallUI/res/values-el/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Θα σου τηλεφωνήσω αργότερα."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Δεν μπορώ τώρα. Πάρε με αργότερα."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Συντάξτε τη δική σας…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Γρήγορες απαντήσεις"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Επεξεργασία γρήγορων απαντήσεων"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-en-rGB/strings.xml b/InCallUI/res/values-en-rGB/strings.xml
index 55abb56..1b0de27 100644
--- a/InCallUI/res/values-en-rGB/strings.xml
+++ b/InCallUI/res/values-en-rGB/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"I\'ll call you later."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Can\'t talk now. Call me later?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Write your own..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Quick responses"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edit quick responses"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-en-rIN/strings.xml b/InCallUI/res/values-en-rIN/strings.xml
index 55abb56..1b0de27 100644
--- a/InCallUI/res/values-en-rIN/strings.xml
+++ b/InCallUI/res/values-en-rIN/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"I\'ll call you later."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Can\'t talk now. Call me later?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Write your own..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Quick responses"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edit quick responses"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-es-rUS/strings.xml b/InCallUI/res/values-es-rUS/strings.xml
index b3c162f..4bf82cf 100644
--- a/InCallUI/res/values-es-rUS/strings.xml
+++ b/InCallUI/res/values-es-rUS/strings.xml
@@ -86,7 +86,7 @@
     <string name="sum_cw_enabled" msgid="8083061901633671397">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
     <string name="sum_cw_disabled" msgid="3648693907300104575">"Durante una llamada, notificarme sobre las llamadas entrantes"</string>
     <string name="call_forwarding_settings" msgid="3378927671091537173">"Configuración de reenvío de llamadas"</string>
-    <string name="labelCF" msgid="2574386948026924737">"Reenvío de llamada"</string>
+    <string name="labelCF" msgid="2574386948026924737">"Desvío de llamadas"</string>
     <string name="labelCFU" msgid="8147177368148660600">"Reenviar siempre"</string>
     <string name="messageCFU" msgid="3560082430662923687">"Usar siempre este número"</string>
     <string name="sum_cfu_enabled_indicator" msgid="4014187342724130197">"Reenviar todas las llamadas"</string>
@@ -369,7 +369,7 @@
     <string name="pin_changed" msgid="4365538014588501049">"El PIN de la tarjeta SIM se modificó correctamente."</string>
     <string name="puk_requested" msgid="3898394204193202803">"Contraseña incorrecta. La tarjeta SIM está bloqueada. Se solicitó PUK2."</string>
     <string name="enter_pin2_text" msgid="8339444124477720345">"PIN2"</string>
-    <string name="oldPin2Label" msgid="8559146795026261502">"Reenviar cuando está ocupado"</string>
+    <string name="oldPin2Label" msgid="8559146795026261502">"PIN2 viejo"</string>
     <string name="newPin2Label" msgid="4573956902204349054">"PIN2 nuevo"</string>
     <string name="confirmPin2Label" msgid="8100319484454787708">"Confirmar PIN2 nuevo"</string>
     <string name="badPuk2" msgid="4851734468010000418">"El PUK2 que ingresaste es incorrecto. Vuelve a intentarlo."</string>
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Te llamo más tarde."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"No puedo hablar ahora. ¿Me llamas más tarde?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escribe tu propia respuesta..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respuestas rápidas"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respuestas rápidas"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-es/strings.xml b/InCallUI/res/values-es/strings.xml
index 381d577..66577a9 100644
--- a/InCallUI/res/values-es/strings.xml
+++ b/InCallUI/res/values-es/strings.xml
@@ -589,6 +589,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Te llamo más tarde."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"No puedo hablar. Llámame luego."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escribe tu propia respuesta..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respuestas rápidas"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respuestas rápidas"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-et-rEE/strings.xml b/InCallUI/res/values-et-rEE/strings.xml
index 8c44da7..4f03b6d 100644
--- a/InCallUI/res/values-et-rEE/strings.xml
+++ b/InCallUI/res/values-et-rEE/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Helistan sulle hiljem."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ei saa rääkida. Helistad hiljem?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Kirjutage ise …"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Kiirvastused"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Kiirvastuste muutmine"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-fa/strings.xml b/InCallUI/res/values-fa/strings.xml
index f80f6eb..71d6c84 100644
--- a/InCallUI/res/values-fa/strings.xml
+++ b/InCallUI/res/values-fa/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"بعداً با شما تماس می‌گیرم."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"اکنون نمی‌توانم صحبت کنم. بعداً به من زنگ می‌زنید؟"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"نوشتن پاسخ خود…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"پاسخ‌های سریع"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ویرایش پاسخ‌های سریع"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-fi/strings.xml b/InCallUI/res/values-fi/strings.xml
index d900183..dfa12b1 100644
--- a/InCallUI/res/values-fi/strings.xml
+++ b/InCallUI/res/values-fi/strings.xml
@@ -589,6 +589,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Soitan sinulle myöhemmin."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"En voi puhua nyt. Soita myöhemmin?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Kirjoita oma…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Pikavastaukset"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Muokkaa pikavastausta"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-fr-rCA/strings.xml b/InCallUI/res/values-fr-rCA/strings.xml
index 79c41c9..e18ec6d 100644
--- a/InCallUI/res/values-fr-rCA/strings.xml
+++ b/InCallUI/res/values-fr-rCA/strings.xml
@@ -589,6 +589,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Je t\'appellerai plus tard."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Peux pas parler. On se rappelle?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Réponse personnalisée..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Réponses rapides"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Modif. rép. rapides"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-fr/strings.xml b/InCallUI/res/values-fr/strings.xml
index b3dd8c8..06c1320 100644
--- a/InCallUI/res/values-fr/strings.xml
+++ b/InCallUI/res/values-fr/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Je t\'appellerai plus tard."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Peux pas parler. On se rappelle ?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Réponse personnalisée..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Réponses rapides"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Modifier les réponses rapides"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-hi/strings.xml b/InCallUI/res/values-hi/strings.xml
index 110a201..48fefe4 100644
--- a/InCallUI/res/values-hi/strings.xml
+++ b/InCallUI/res/values-hi/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"मैं आपको बाद में कॉल करूंगा/करूंगी."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"अभी बात नहीं हो सकती. बाद में कॉल करें?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"अपना स्वयं का लिखें..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"त्वरित प्रतिसाद"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"त्वरित प्रतिसाद संपादित करें"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-hr/strings.xml b/InCallUI/res/values-hr/strings.xml
index 6ee1cbe..d87d49e 100644
--- a/InCallUI/res/values-hr/strings.xml
+++ b/InCallUI/res/values-hr/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Zvat ću vas kasnije."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Sada ne mogu razgovarati. Nazovite me kasnije?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napišite odgovor..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Brzi odgovori"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Uređivanje brzih odgovora"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-hu/strings.xml b/InCallUI/res/values-hu/strings.xml
index 07790e2..79e9c92 100644
--- a/InCallUI/res/values-hu/strings.xml
+++ b/InCallUI/res/values-hu/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Később visszahívom."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Most nem alkalmas. Hívna később?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Saját válasz írása..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Gyors válaszok"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Gyors válaszok szerkesztése"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-hy-rAM/strings.xml b/InCallUI/res/values-hy-rAM/strings.xml
index 8cae8d9..172bd83 100644
--- a/InCallUI/res/values-hy-rAM/strings.xml
+++ b/InCallUI/res/values-hy-rAM/strings.xml
@@ -581,7 +581,7 @@
     <string name="no_internet_available_title" msgid="3327109242858406165">"Ինտերնետ կապ չկա"</string>
     <string name="no_wifi_available_title" msgid="747881033089378758">"Wi-Fi կապ չկա"</string>
     <string name="no_internet_available" msgid="7877142631803238549">"Ինտերնետային զանգի կատարման համար նախ ստուգեք ձեր ինտերնետ կապը:"</string>
-    <string name="no_wifi_available" msgid="1225073547318465713">"Ինտերնետային զանգերի համար դուք պետք է միացված լինեք Wi-Fi ցանցին (օգտագործեք Անլար &amp; Ցանցային կարգավորումները):"</string>
+    <string name="no_wifi_available" msgid="1225073547318465713">"Ինտերնետային զանգերի համար դուք պետք է միացված լինեք Wi-Fi ցանցին (օգտագործեք Անլար կապ և Ցանցեր կարգավորումները):"</string>
     <string name="no_voip" msgid="8901474054537199865">"Ինտերնետային զանգերը չեն սպասարկվում"</string>
     <string name="sip_system_decide" msgid="368030746310423471">"Ավտոմատ"</string>
     <string name="sip_always_send_keepalive" msgid="8192080724632877132">"Միշտ ուղարկել"</string>
@@ -591,6 +591,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ես ձեր մի փոքր ուշ կզանգեմ:"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Չեմ կարող խոսել հիմա: Զանգե՞մ ձեզ մի փոքր ուշ:"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Գրեք ձեր սեփականը..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Արագ պատասխաններ"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Խմբագրել արագ պատասխանները"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-in/strings.xml b/InCallUI/res/values-in/strings.xml
index c87bee3..0136b35 100644
--- a/InCallUI/res/values-in/strings.xml
+++ b/InCallUI/res/values-in/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Nanti saya telepon balik."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Tak bisa bicara skrg. Tlp lg nanti?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Tulis respons Anda sendiri…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Tanggapan cepat"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edit tanggapan cepat"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-it/strings.xml b/InCallUI/res/values-it/strings.xml
index 5e2b144..85875b6 100644
--- a/InCallUI/res/values-it/strings.xml
+++ b/InCallUI/res/values-it/strings.xml
@@ -589,6 +589,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ti chiamo dopo."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Non posso parlare ora. Mi chiami dopo?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Scrivi risposta personale..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Risposte rapide"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Modifica risposte rapide"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-iw/strings.xml b/InCallUI/res/values-iw/strings.xml
index 89060a8..c55a1c1 100644
--- a/InCallUI/res/values-iw/strings.xml
+++ b/InCallUI/res/values-iw/strings.xml
@@ -115,7 +115,7 @@
     <string name="reverting_settings" msgid="4752151682666912828">"מאחזר הגדרות הקודמות…"</string>
     <string name="response_error" msgid="6674110501330139405">"תגובה לא צפויה מהרשת."</string>
     <string name="exception_error" msgid="7027667130619518211">"שגיאת רשת או שגיאה של כרטיס SIM."</string>
-    <string name="fdn_check_failure" msgid="18200614306525434">"הגדרת מספרי החיוג הקבועים של יישום הטלפון שלך מופעלת. כתוצאה מכך, חלק מהתכונות הקשורות לשיחות לא פועלות."</string>
+    <string name="fdn_check_failure" msgid="18200614306525434">"הגדרת מספרי החיוג הקבועים של אפליקציית הטלפון שלך מופעלת. כתוצאה מכך, חלק מהתכונות הקשורות לשיחות לא פועלות."</string>
     <string name="radio_off_error" msgid="2304459933248513376">"הפעל את הרדיו לפני ההצגה של הגדרות אלה."</string>
     <string name="close_dialog" msgid="2365884406356986917">"אישור"</string>
     <string name="enable" msgid="1059008390636773574">"הפעל"</string>
@@ -487,8 +487,8 @@
     <item quantity="other" msgid="3122217344579273583">"אין חיבור נתונים במשך <xliff:g id="COUNT">%s</xliff:g> דקות"</item>
   </plurals>
   <plurals name="alert_dialog_exit_ecm">
-    <item quantity="one" msgid="8060210887681426682">"הטלפון יהיה במצב התקשרות חזרה בחירום למשך דקה <xliff:g id="COUNT">%s</xliff:g>. במצב זה לא ניתן להשתמש ביישומים המשתמשים בחיבור נתונים. האם אתה רוצה לצאת כעת?"</item>
-    <item quantity="other" msgid="8617116564023933114">"הטלפון יהיה במצב התקשרות חזרה בחירום למשך <xliff:g id="COUNT">%s</xliff:g> דקות. במצב זה לא ניתן להשתמש ביישומים המשתמשים בחיבור נתונים. האם אתה רוצה לצאת כעת?"</item>
+    <item quantity="one" msgid="8060210887681426682">"הטלפון יהיה במצב התקשרות חזרה בחירום למשך דקה <xliff:g id="COUNT">%s</xliff:g>. במצב זה לא ניתן להשתמש באפליקציות המשתמשות בחיבור נתונים. האם אתה רוצה לצאת כעת?"</item>
+    <item quantity="other" msgid="8617116564023933114">"הטלפון יהיה במצב התקשרות חזרה בחירום למשך <xliff:g id="COUNT">%s</xliff:g> דקות. במצב זה לא ניתן להשתמש באפליקציות המשתמשים בחיבור נתונים. האם אתה רוצה לצאת כעת?"</item>
   </plurals>
   <plurals name="alert_dialog_not_avaialble_in_ecm">
     <item quantity="one" msgid="2585506997024726599">"הפעולה שנבחרה אינה זמינה במצב התקשרות חזרה בחירום. הטלפון יהיה במצב זה במשך <xliff:g id="COUNT">%s</xliff:g> דקות. האם אתה רוצה לצאת כעת?"</item>
@@ -549,7 +549,7 @@
     <string name="registration_status_failed_try_later" msgid="5214474354451220581">"הרשמת החשבון נכשלה: (<xliff:g id="REGISTRATION_ERROR_MESSAGE">%s</xliff:g>); יתבצע ניסיון חוזר מאוחר יותר"</string>
     <string name="registration_status_invalid_credentials" msgid="4908446367559341757">"רישום החשבון נכשל: שם המשתמש או הסיסמה שגויים."</string>
     <string name="registration_status_server_unreachable" msgid="5733421582468991276">"רישום החשבון נכשל: בדוק את שם השרת."</string>
-    <string name="third_party_account_summary" msgid="2532526738862533028">"היישום <xliff:g id="ACCOUNT_OWNER">%s</xliff:g> משתמש כרגע בחשבון זה."</string>
+    <string name="third_party_account_summary" msgid="2532526738862533028">"האפליקציה <xliff:g id="ACCOUNT_OWNER">%s</xliff:g> משתמש כרגע בחשבון זה."</string>
     <string name="sip_edit_title" msgid="489288416435014385">"פרטי חשבון SIP"</string>
     <string name="sip_edit_new_title" msgid="3659149255856520385">"פרטי חשבון SIP"</string>
     <string name="domain_address_title" msgid="9071787581316160480">"שרת"</string>
@@ -585,11 +585,15 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"אני אתקשר אליך יותר מאוחר."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"אני לא יכול לדבר עכשיו. תתקשר אלי מאוחר יותר?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"כתוב אחת משלך..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"תגובות מהירות"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ערוך תגובות מהירות"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
     <string name="respond_via_sms_edittext_dialog_title" msgid="20379890418289778">"תגובה מהירה"</string>
-    <string name="respond_via_sms_menu_reset_default_activity" msgid="1461742052902053466">"אפס את היישום המוגדר כברירת מחדל"</string>
+    <string name="respond_via_sms_menu_reset_default_activity" msgid="1461742052902053466">"אפס את האפליקציה המוגדר כברירת מחדל"</string>
     <string name="respond_via_sms_confirmation_format" msgid="7229149977515784269">"הודעה נשלחה אל <xliff:g id="PHONE_NUMBER">%s</xliff:g>."</string>
     <string name="description_image_button_one" msgid="5502718871331943463">"אחת"</string>
     <string name="description_image_button_two" msgid="4903738528222924522">"שתיים"</string>
diff --git a/InCallUI/res/values-ja/strings.xml b/InCallUI/res/values-ja/strings.xml
index 9e16a39..a7db5d6 100644
--- a/InCallUI/res/values-ja/strings.xml
+++ b/InCallUI/res/values-ja/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ただいま電話に出られません。後ほど折り返しご連絡いたします。"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ただいま電話に出られません。後ほどご連絡をお願いいたします。"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"カスタム返信を作成..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"クイック返信"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"クイック返信の編集"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ka-rGE/strings.xml b/InCallUI/res/values-ka-rGE/strings.xml
index a049ba6..658180d 100644
--- a/InCallUI/res/values-ka-rGE/strings.xml
+++ b/InCallUI/res/values-ka-rGE/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"მოგვიანებით გადმოვრეკავ."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ვერ ვპასუხობ. მოგვიანებით დამირეკე."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"ჩაწერეთ საკუთარი..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"სწრაფი პასუხი"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"სწრაფი პასუხის რედაქტირება"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-km-rKH/strings.xml b/InCallUI/res/values-km-rKH/strings.xml
index cea0a6c..39b4ea2 100644
--- a/InCallUI/res/values-km-rKH/strings.xml
+++ b/InCallUI/res/values-km-rKH/strings.xml
@@ -350,7 +350,7 @@
     <string name="simContacts_emptyLoading" msgid="2203331234764498011">"កំពុង​អាន​ពី​ស៊ីមកាត…"</string>
     <string name="simContacts_empty" msgid="5270660846489561932">"គ្មាន​ទំនាក់ទំនង​នៅ​លើ​ស៊ីមកាត​របស់​អ្នក​ទេ។"</string>
     <string name="simContacts_title" msgid="1861472842524839921">"ជ្រើស​ទំនាក់​ទំនង​ដើម្បី​នាំចូល"</string>
-    <string name="simContacts_airplaneMode" msgid="1846161429087789936">"ដើម្បី​នាំចូល​ទំនាក់ទំនង​ពី​ស៊ី​ម​កាត​ ដំបូង​បិទ​របៀប​ពេល​ជិះ​​យន្តហោះ​។"</string>
+    <string name="simContacts_airplaneMode" msgid="1846161429087789936">"ដើម្បី​នាំចូល​ទំនាក់ទំនង​ពី​ស៊ី​ម​កាត​ ដំបូង​ត្រូវបិទ​របៀប​ពេល​ជិះ​​យន្តហោះ​។"</string>
     <string name="enable_pin" msgid="5422767284133234860">"បិទ/បើក​កូដ PIN ស៊ីមកាត"</string>
     <string name="change_pin" msgid="9174186126330785343">"ប្ដូរ​កូដ​ PIN ស៊ីមកាត"</string>
     <string name="enter_pin_text" msgid="8532615714751931951">"កូដ PIN ស៊ីមកាត៖"</string>
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ខ្ញុំ​នឹង​ហៅ​ទៅ​អ្នក​នៅ​ពេល​ក្រោយ។"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"មិន​អាច​និយាយ​បាន​ទេ​ឥឡូវ​នេះ។ ហៅ​​​​មក​ខ្ញុំ​ពេល​ក្រោយ?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"សរសេរ​ផ្ទាល់​ខ្លួន​របស់​អ្នក"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ការ​ឆ្លើយតប​រហ័ស"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"កែ​ការ​ឆ្លើយតប​រហ័ស"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ko/strings.xml b/InCallUI/res/values-ko/strings.xml
index 3eb6214..cc795b8 100644
--- a/InCallUI/res/values-ko/strings.xml
+++ b/InCallUI/res/values-ko/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"나중에 전화드리겠습니다."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"통화 불가. 나중에 전화주세요."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"나만의 응답 작성…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"빠른 응답"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"빠른 응답 수정"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-lo-rLA/strings.xml b/InCallUI/res/values-lo-rLA/strings.xml
index 4cd2961..b09ab35 100644
--- a/InCallUI/res/values-lo-rLA/strings.xml
+++ b/InCallUI/res/values-lo-rLA/strings.xml
@@ -66,7 +66,7 @@
     <string name="unlock_success" msgid="6770085622238180152">"ການປົດລັອກເຄືອຂ່າຍບໍ່ສຳເລັດ."</string>
     <string name="labelGSMMore" msgid="5930842194056092106">"ການຕັ້ງຄ່າການໂທ GSM"</string>
     <string name="labelCDMAMore" msgid="1630676740428229339">"ການຕັ້ງຄ່າໂທ CDMA"</string>
-    <string name="apn_settings" msgid="9043423184895642077">"ຊື່ຂອງຈຸດການເຂົ້າເຖິງ"</string>
+    <string name="apn_settings" msgid="9043423184895642077">"ຊື່ຂອງຈຸດການເຂົ້າເຖິງ (APN)"</string>
     <string name="settings_label" msgid="3876743539816984008">"ການຕັ້ງຄ່າເຄືອຂ່າຍ"</string>
     <string name="voicemail" msgid="8693759337917898954">"ຂໍ້ຄວາມສຽງ"</string>
     <string name="voicemail_abbreviated" msgid="2215592488517217448">"VM​:"</string>
@@ -180,7 +180,7 @@
     <item msgid="1524224863879435516">"GSM ເທົ່ານັ້ນ"</item>
     <item msgid="3817924849415716259">"ຕ້ອງການ GSM/WCDMA"</item>
   </string-array>
-    <string name="data_enabled" msgid="5972538663568715366">"ເປີດໃຊ້ຂໍ້ມູນແລ້ວ"</string>
+    <string name="data_enabled" msgid="5972538663568715366">"ເປີດໃຊ້ເດຕາ"</string>
     <string name="data_enable_summary" msgid="5022018967714633874">"ເປີດໃຊ້ການເຂົ້າເຖິງຂໍ້ມູນຜ່ານເຄືອຂ່າຍມືຖື"</string>
     <string name="roaming" msgid="8871412572928323707">"ການໂຣມມິງຂໍ້ມູນ"</string>
     <string name="roaming_enable" msgid="7331106985174381987">"ເຊື່ອມຕໍ່ບໍລິການຂໍ້ມູນເມື່ອໂຣມມິງ"</string>
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"ຂ້ອຍຈະໂທຫາເຈົ້ານຳຫຼັງ."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ຕອນນີ້ລົມບໍ່ໄດ້ເທື່ອ. ເຈົ້າຄ່ອຍໂທຫາຂ້ອຍໃໝ່ໄດ້ບໍ່?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"ຂຽນຂໍ້ຄວາມຂອງທ່ານເອງ..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"ຕອບກັບດ່ວນ"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"ແກ້ໄຂຂໍ້ຄວາມຕອບກັບດ່ວນ"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-lt/strings.xml b/InCallUI/res/values-lt/strings.xml
index eaee183..d73194b 100644
--- a/InCallUI/res/values-lt/strings.xml
+++ b/InCallUI/res/values-lt/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Paskambinsiu vėliau."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Dabar negaliu kalb. Pask. vėliau."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Sukurkite patys..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Greiti atsakai"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Redaguoti greitus atsakus"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-lv/strings.xml b/InCallUI/res/values-lv/strings.xml
index cd36e8a..9e316ac 100644
--- a/InCallUI/res/values-lv/strings.xml
+++ b/InCallUI/res/values-lv/strings.xml
@@ -587,6 +587,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Piezvanīšu vēlāk."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nevaru runāt. Vai piezvanīsi vēlāk?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Rakstīt savu…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Ātrās atbildes"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Ātro atbilžu rediģēšana"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-mn-rMN/strings.xml b/InCallUI/res/values-mn-rMN/strings.xml
index a3b4a75..26f3eeb 100644
--- a/InCallUI/res/values-mn-rMN/strings.xml
+++ b/InCallUI/res/values-mn-rMN/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Би тань руу дараа залгана."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Одоо ярих боломжгүй байна. Дараа надруу залгах уу?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Өөрийн гэснийг бичээрэй..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Шуурхай хариунууд"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Шуурхай хариунуудыг засах"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ms-rMY/strings.xml b/InCallUI/res/values-ms-rMY/strings.xml
index ba61a2c..2813fb3 100644
--- a/InCallUI/res/values-ms-rMY/strings.xml
+++ b/InCallUI/res/values-ms-rMY/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Saya akan hubungi awak kemudian."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Tdk blh berckp skg. Tel saya nanti?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Tulis sendiri…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respons pantas"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edit respons pantas"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-nb/strings.xml b/InCallUI/res/values-nb/strings.xml
index 2a574fc..f7f7be0 100644
--- a/InCallUI/res/values-nb/strings.xml
+++ b/InCallUI/res/values-nb/strings.xml
@@ -591,6 +591,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Jeg ringer deg senere."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Ikke nå. Ringer du meg senere?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skriv ditt eget"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Hurtigsvar"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Rediger hurtigsvar"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-nl/strings.xml b/InCallUI/res/values-nl/strings.xml
index e8d0efa..8e557f7 100644
--- a/InCallUI/res/values-nl/strings.xml
+++ b/InCallUI/res/values-nl/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ik bel je later."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan nu niet opnemen. Bel me later."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Eigen reactie opstellen..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Snelle reacties"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Snelle reacties bewerken"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-pl/strings.xml b/InCallUI/res/values-pl/strings.xml
index 461439f..b0da245 100644
--- a/InCallUI/res/values-pl/strings.xml
+++ b/InCallUI/res/values-pl/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Zadzwonię do Ciebie później."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nie mogę rozmawiać. Zadzwonisz później?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napisz własną..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Szybkie odpowiedzi"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Edytuj szybkie odpowiedzi"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-pt-rPT/strings.xml b/InCallUI/res/values-pt-rPT/strings.xml
index e183fa9..9ac0ac6 100644
--- a/InCallUI/res/values-pt-rPT/strings.xml
+++ b/InCallUI/res/values-pt-rPT/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Telefono-lhe mais tarde."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Pode telefonar-me mais tarde?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escrever a sua própria..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respostas rápidas"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respostas rápidas"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-pt/strings.xml b/InCallUI/res/values-pt/strings.xml
index 01e88c3..09057a4 100644
--- a/InCallUI/res/values-pt/strings.xml
+++ b/InCallUI/res/values-pt/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Eu te ligo mais tarde."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Não posso falar agora. Liga depois, por favor?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Escreva sua resposta..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Respostas rápidas"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editar respostas rápidas"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ro/strings.xml b/InCallUI/res/values-ro/strings.xml
index d2acb06..0fb3911 100644
--- a/InCallUI/res/values-ro/strings.xml
+++ b/InCallUI/res/values-ro/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Te sun mai târziu."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Nu pot acum. Vorbim mai târziu?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Scrieți propriul răspuns…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Răspunsuri rapide"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Editaţi răspunsurile rapide"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-ru/strings.xml b/InCallUI/res/values-ru/strings.xml
index 6594d42..7897e54 100644
--- a/InCallUI/res/values-ru/strings.xml
+++ b/InCallUI/res/values-ru/strings.xml
@@ -587,6 +587,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Я перезвоню вам позже."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Не могу говорить. Позвоните позже."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Ваш ответ…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Быстрые ответы"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Быстрые ответы"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-sk/strings.xml b/InCallUI/res/values-sk/strings.xml
index c8f8b90..27a994f 100644
--- a/InCallUI/res/values-sk/strings.xml
+++ b/InCallUI/res/values-sk/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Zavolám neskôr."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Teraz nemôžem, zavolajte inokedy."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napísať vlastnú..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Rýchle odpovede"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Upraviť rýchle odpovede"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-sl/strings.xml b/InCallUI/res/values-sl/strings.xml
index 8aec816..7079213 100644
--- a/InCallUI/res/values-sl/strings.xml
+++ b/InCallUI/res/values-sl/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Poklical bom pozneje."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Zdaj ne morem govoriti. Pozneje?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Napišite svoje besedilo …"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Hitri odgovori"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Urejanje hitrih odgovorov"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-sr/strings.xml b/InCallUI/res/values-sr/strings.xml
index 1edd80c..67b4677 100644
--- a/InCallUI/res/values-sr/strings.xml
+++ b/InCallUI/res/values-sr/strings.xml
@@ -129,7 +129,7 @@
     <string name="vm_changed" msgid="380744030726254139">"Промењен је број говорне поште."</string>
     <string name="vm_change_failed" msgid="3352934863246208918">"Није могуће променити број говорне поште.\nКонтактирајте мобилног оператера ако се овај проблем настави."</string>
     <string name="fw_change_failed" msgid="5298103228470214665">"Није могуће променити број за преусмеравање.\nКонтактирајте мобилног оператера ако се овај проблем настави."</string>
-    <string name="fw_get_in_vm_failed" msgid="8862896836093833973">"Није било могуће преузети и сачувати тренутна подешавања броја за прослеђивање.\nЖелите ли да ипак пређете на новог добављача?"</string>
+    <string name="fw_get_in_vm_failed" msgid="8862896836093833973">"Није могуће преузети и сачувати тренутна подешавања броја за прослеђивање.\nЖелите ли да ипак пређете на новог добављача?"</string>
     <string name="no_change" msgid="3186040086622435212">"Нису начињене промене."</string>
     <string name="sum_voicemail_choose_provider" msgid="59911196126278922">"Одаберите услугу говорне поште"</string>
     <string name="voicemail_default" msgid="5902099213882352338">" Мој мобилни оператер"</string>
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Позваћу те касније."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"У гужви сам. Да се чујемо касније?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напишите сами…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Брзи одговори"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Измена брзих одговора"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-sv/strings.xml b/InCallUI/res/values-sv/strings.xml
index 3539477..1910e1e 100644
--- a/InCallUI/res/values-sv/strings.xml
+++ b/InCallUI/res/values-sv/strings.xml
@@ -591,6 +591,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Jag ringer dig senare."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Kan inte prata nu. Ring senare!"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Skriv ett eget svar ..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Snabbsvar"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Redigera snabbsvar"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-sw/strings.xml b/InCallUI/res/values-sw/strings.xml
index 392bace..931c08d 100644
--- a/InCallUI/res/values-sw/strings.xml
+++ b/InCallUI/res/values-sw/strings.xml
@@ -48,7 +48,7 @@
     <string name="audio_mode_earpiece" msgid="4156527186373869107">"Kipaza sauti cha kichwani"</string>
     <string name="audio_mode_wired_headset" msgid="1465350758489175975">"Viskizi vya maskio pasiwaya"</string>
     <string name="audio_mode_bluetooth" msgid="3047641300848211128">"Bluetooth"</string>
-    <string name="wait_prompt_str" msgid="7601815427707856238">"Tuma toni zinazofuata? \n"</string>
+    <string name="wait_prompt_str" msgid="7601815427707856238">"Ungependa kutuma toni zifuatazo? \n"</string>
     <string name="pause_prompt_str" msgid="1789964702154314806">"Inatuma toni\n"</string>
     <string name="send_button" msgid="4106860097497818751">"Tuma"</string>
     <string name="pause_prompt_yes" msgid="3564467212025151797">"Ndiyo"</string>
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Nitakupigia baadaye."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Siwezi kuongea sasa. Nipigie baadaye"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Andika yako binafsi..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Majibu ya haraka"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Hariri majibu ya haraka"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-th/strings.xml b/InCallUI/res/values-th/strings.xml
index 7f902f2..fc8e9bf 100644
--- a/InCallUI/res/values-th/strings.xml
+++ b/InCallUI/res/values-th/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"เดี๋ยวจะโทรหาทีหลัง"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"ตอนนี้คุยไม่ได้ โทรมาใหม่ได้ไหม"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"เขียนคำตอบของคุณเอง..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"คำตอบด่วน"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"แก้ไขคำตอบด่วน"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-tl/strings.xml b/InCallUI/res/values-tl/strings.xml
index fc74466..b03f75b 100644
--- a/InCallUI/res/values-tl/strings.xml
+++ b/InCallUI/res/values-tl/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Tawagan kita mamaya."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Di masagot ngayon. Tawag ka mamaya?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Sumulat ng sarili mong tugon…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Mga mabilisang tugon"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"I-edit ang mga mabilisang tugon"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-tr/strings.xml b/InCallUI/res/values-tr/strings.xml
index 5f0398f..da790d2 100644
--- a/InCallUI/res/values-tr/strings.xml
+++ b/InCallUI/res/values-tr/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Seni daha sonra ararım."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Şimdi konuşamam. Daha sonra arar mısın?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Kendi yanıtınızı oluşturun…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Hızlı yanıtlar"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Hızlı yanıtları düzenle"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-uk/strings.xml b/InCallUI/res/values-uk/strings.xml
index 596df5d..9b00439 100644
--- a/InCallUI/res/values-uk/strings.xml
+++ b/InCallUI/res/values-uk/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Я передзвоню пізніше."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Не можу говорити. Передзвоніть."</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Напишіть власну відповідь..."</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Швидкі відповіді"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Редагувати швидкі відповіді"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-vi/strings.xml b/InCallUI/res/values-vi/strings.xml
index 656bf09..ce6b8af 100644
--- a/InCallUI/res/values-vi/strings.xml
+++ b/InCallUI/res/values-vi/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Tôi sẽ gọi lại sau."</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Giờ tôi ko thể nói chuyện. Gọi sau nhé?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Viết trả lời của riêng bạn…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Trả lời nhanh"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Chỉnh sửa trả lời nhanh"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-zh-rCN/strings.xml b/InCallUI/res/values-zh-rCN/strings.xml
index 5b8a938..674e7ad 100644
--- a/InCallUI/res/values-zh-rCN/strings.xml
+++ b/InCallUI/res/values-zh-rCN/strings.xml
@@ -585,6 +585,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"我稍后会再打给你。"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"现在无法接听。能稍后再打给我吗?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"自行撰写回复…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"快速回复"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"修改快速回复"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-zh-rHK/strings.xml b/InCallUI/res/values-zh-rHK/strings.xml
index b353680..de26ecc 100644
--- a/InCallUI/res/values-zh-rHK/strings.xml
+++ b/InCallUI/res/values-zh-rHK/strings.xml
@@ -591,6 +591,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"我晚點打電話給你。"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"我現在不方便通話,晚點再打來好嗎?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"自行撰寫回覆…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"快速回應"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"編輯快速回應"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-zh-rTW/strings.xml b/InCallUI/res/values-zh-rTW/strings.xml
index 6940a3a..702d0ef 100644
--- a/InCallUI/res/values-zh-rTW/strings.xml
+++ b/InCallUI/res/values-zh-rTW/strings.xml
@@ -591,6 +591,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"我晚點回電。"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"我現在不方便通話,晚點再打來好嗎?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"自行撰寫回應…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"快速回應"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"編輯快速回應"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values-zu/strings.xml b/InCallUI/res/values-zu/strings.xml
index e204e89..2959d4e 100644
--- a/InCallUI/res/values-zu/strings.xml
+++ b/InCallUI/res/values-zu/strings.xml
@@ -589,6 +589,10 @@
     <string name="respond_via_sms_canned_response_3" msgid="3496079065723960450">"Ngizokushayela ucingo emva kwesikhathi"</string>
     <string name="respond_via_sms_canned_response_4" msgid="1698989243040062190">"Angikwazi ukukhuluma okwamanje. Ngicela uphinde ungishayele ucingo kamuva?"</string>
     <string name="respond_via_sms_custom_message" msgid="6158880869935281078">"Bhala okwakho…"</string>
+    <!-- no translation found for custom_message_cancel (7516406059429609296) -->
+    <skip />
+    <!-- no translation found for custom_message_send (5795754217085747742) -->
+    <skip />
     <string name="respond_via_sms_setting_title" msgid="3754000371039709383">"Izimpendulo ezisheshayo"</string>
     <string name="respond_via_sms_setting_title_2" msgid="6104662227299493906">"Hlela izimpendulo ezisheshayo"</string>
     <string name="respond_via_sms_setting_summary" msgid="9150281183930613065"></string>
diff --git a/InCallUI/res/values/colors.xml b/InCallUI/res/values/colors.xml
index 9d149a4..6080e91 100644
--- a/InCallUI/res/values/colors.xml
+++ b/InCallUI/res/values/colors.xml
@@ -42,5 +42,11 @@
     <drawable name="end_call_pressed_state">#ff4e4e</drawable>
 
     <!-- Used when the End Call button is disabled -->
-    <drawable name="end_call_disabled_state">#00000000</drawable>
+    <drawable name="end_call_disabled_state">#303030</drawable>
+
+    <!-- Dialpad background -->
+    <color name="dialpad_background">#000000</color>
+
+    <!-- Button background -->
+    <color name="button_background">#000000</color>
 </resources>
diff --git a/InCallUI/res/values/dimens.xml b/InCallUI/res/values/dimens.xml
index 1d94971..204657b 100644
--- a/InCallUI/res/values/dimens.xml
+++ b/InCallUI/res/values/dimens.xml
@@ -28,6 +28,8 @@
 
     <!-- Padding at the left and right edges of the "call banner". -->
     <dimen name="call_banner_side_padding">24dp</dimen>
+    <!-- Padding at the right edges of the secondary call banner. -->
+    <dimen name="secondary_call_banner_right_padding">100dp</dimen>
     <!-- Padding at the top and bottom edges of the "call banner". -->
     <dimen name="call_banner_top_bottom_padding">16dp</dimen>
 
diff --git a/InCallUI/res/values/strings.xml b/InCallUI/res/values/strings.xml
index e7049e5..7c588b3 100755
--- a/InCallUI/res/values/strings.xml
+++ b/InCallUI/res/values/strings.xml
@@ -1280,6 +1280,10 @@
     <string name="respond_via_sms_canned_response_4">Can\'t talk now. Call me later?</string>
     <!-- "Respond via SMS" option that lets you compose a custom response. [CHAR LIMIT=30] -->
     <string name="respond_via_sms_custom_message">Write your own...</string>
+    <!-- "Custom Message" Cancel alert dialog button -->
+    <string name="custom_message_cancel">Cancel</string>
+    <!-- "Custom Message" Send alert dialog button -->
+    <string name="custom_message_send">Send</string>
 
     <!-- Title of settings screen for managing the "Respond via SMS" feature. [CHAR LIMIT=30] -->
     <string name="respond_via_sms_setting_title">Quick responses</string>
diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java
index 324d522..1b249f2 100644
--- a/InCallUI/src/com/android/incallui/AnswerFragment.java
+++ b/InCallUI/src/com/android/incallui/AnswerFragment.java
@@ -18,12 +18,18 @@
 
 import android.app.AlertDialog;
 import android.app.Dialog;
+import android.content.DialogInterface;
 import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.WindowManager;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
 import android.widget.ListView;
 
 import com.google.common.base.Preconditions;
@@ -45,6 +51,11 @@
      */
     private Dialog mCannedResponsePopup = null;
 
+    /**
+     * The popup showing a text field for users to type in their custom message.
+     */
+    private AlertDialog mCustomMessagePopup = null;
+
     private ArrayAdapter<String> mTextResponsesAdapter = null;
 
     private GlowPadWrapper mGlowpad;
@@ -106,12 +117,7 @@
     }
 
     @Override
-    public boolean isMessageDialogueShowing() {
-        return mCannedResponsePopup != null && mCannedResponsePopup.isShowing();
-    }
-
-    @Override
-    public void showMessageDialogue() {
+    public void showMessageDialog() {
         final ListView lv = new ListView(getActivity());
 
         Preconditions.checkNotNull(mTextResponsesAdapter);
@@ -124,22 +130,117 @@
         mCannedResponsePopup.show();
     }
 
+    private boolean isCannedResponsePopupShowing() {
+        if (mCannedResponsePopup != null) {
+            return mCannedResponsePopup.isShowing();
+        }
+        return false;
+    }
+
+    private boolean isCustomMessagePopupShowing() {
+        if (mCustomMessagePopup != null) {
+            return mCustomMessagePopup.isShowing();
+        }
+        return false;
+    }
+
     /**
-     * Dismiss currently visible popups.
+     * Dismiss the canned response list popup.
      *
      * This is safe to call even if the popup is already dismissed, and even if you never called
      * showRespondViaSmsPopup() in the first place.
      */
-    @Override
-    public void dismissPopup() {
+    private void dismissCannedResponsePopup() {
         if (mCannedResponsePopup != null) {
             mCannedResponsePopup.dismiss();  // safe even if already dismissed
             mCannedResponsePopup = null;
         }
     }
 
+    /**
+     * Dismiss the custom compose message popup.
+     */
+    private void dismissCustomMessagePopup() {
+       if (mCustomMessagePopup != null) {
+           mCustomMessagePopup.dismiss();
+           mCustomMessagePopup = null;
+       }
+    }
+
+    public void dismissPendingDialogues() {
+        if (isCannedResponsePopupShowing()) {
+            dismissCannedResponsePopup();
+        }
+
+        if (isCustomMessagePopupShowing()) {
+            dismissCustomMessagePopup();
+        }
+    }
+
+    public boolean hasPendingDialogs() {
+        return !(mCannedResponsePopup == null && mCustomMessagePopup == null);
+    }
+
+    /**
+     * Shows the custom message entry dialog.
+     */
+    public void showCustomMessageDialog() {
+        // Create an alert dialog containing an EditText
+        final EditText et = new EditText(getActivity());
+        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setCancelable(
+                true).setView(et)
+                .setPositiveButton(R.string.custom_message_send,
+                        new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        // The order is arranged in a way that the popup will be destroyed when the
+                        // InCallActivity is about to finish.
+                        final String textMessage = et.getText().toString().trim();
+                        dismissCustomMessagePopup();
+                        getPresenter().rejectCallWithMessage(textMessage);
+                    }
+                })
+                .setNegativeButton(R.string.custom_message_cancel,
+                        new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        dismissCustomMessagePopup();
+                        getPresenter().onDismissDialog();
+                    }
+                })
+                .setTitle(R.string.respond_via_sms_custom_message);
+        mCustomMessagePopup = builder.create();
+
+        // Enable/disable the send button based on whether there is a message in the EditText
+        et.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                final Button sendButton = mCustomMessagePopup.getButton(
+                        DialogInterface.BUTTON_POSITIVE);
+                sendButton.setEnabled(s != null && s.toString().trim().length() != 0);
+            }
+        });
+
+        // Keyboard up, show the dialog
+        mCustomMessagePopup.getWindow().setSoftInputMode(
+                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
+        mCustomMessagePopup.show();
+
+        // Send button starts out disabled
+        final Button sendButton = mCustomMessagePopup.getButton(DialogInterface.BUTTON_POSITIVE);
+        sendButton.setEnabled(false);
+    }
+
     @Override
-    public void configureMessageDialogue(ArrayList<String> textResponses) {
+    public void configureMessageDialog(ArrayList<String> textResponses) {
         final ArrayList<String> textResponsesForDisplay = new ArrayList<String>(textResponses);
 
         textResponsesForDisplay.add(getResources().getString(
@@ -178,12 +279,13 @@
             Log.d(this, "RespondViaSmsItemClickListener.onItemClick(" + position + ")...");
             final String message = (String) parent.getItemAtPosition(position);
             Log.v(this, "- message: '" + message + "'");
+            dismissCannedResponsePopup();
 
             // The "Custom" choice is a special case.
             // (For now, it's guaranteed to be the last item.)
             if (position == (parent.getCount() - 1)) {
-                // Take the user to the standard SMS compose UI.
-                getPresenter().rejectCallWithMessage(null);
+                // Show the custom message dialog
+                showCustomMessageDialog();
             } else {
                 getPresenter().rejectCallWithMessage(message);
             }
diff --git a/InCallUI/src/com/android/incallui/AnswerPresenter.java b/InCallUI/src/com/android/incallui/AnswerPresenter.java
index e820929..bfe8405 100644
--- a/InCallUI/src/com/android/incallui/AnswerPresenter.java
+++ b/InCallUI/src/com/android/incallui/AnswerPresenter.java
@@ -29,6 +29,7 @@
     private static final String TAG = AnswerPresenter.class.getSimpleName();
 
     private int mCallId = Call.INVALID_CALL_ID;
+    private Call mCall = null;
 
     @Override
     public void onUiReady(AnswerUi ui) {
@@ -64,6 +65,11 @@
     }
 
     @Override
+    public void onDisconnect(Call call) {
+        // no-op
+    }
+
+    @Override
     public void onIncomingCall(Call call) {
         // TODO: Ui is being destroyed when the fragment detaches.  Need clean up step to stop
         // getting updates here.
@@ -77,6 +83,7 @@
 
     private void processIncomingCall(Call call) {
         mCallId = call.getCallId();
+        mCall = call;
 
         // Listen for call updates for the current call.
         CallList.getInstance().addCallUpdateListener(mCallId, this);
@@ -88,7 +95,7 @@
 
         if (call.can(Call.Capabilities.RESPOND_VIA_TEXT) && textMsgs != null) {
             getUi().showTextButton(true);
-            getUi().configureMessageDialogue(textMsgs);
+            getUi().configureMessageDialog(textMsgs);
         } else {
             getUi().showTextButton(false);
         }
@@ -103,6 +110,9 @@
             CallList.getInstance().removeCallUpdateListener(mCallId, this);
 
             getUi().showAnswerUi(false);
+
+            // mCallId will hold the state of the call. We don't clear the mCall variable here as
+            // it may be useful for sending text messages after phone disconnects.
             mCallId = Call.INVALID_CALL_ID;
         }
     }
@@ -118,35 +128,33 @@
     }
 
     public void onDecline() {
-        if (mCallId == Call.INVALID_CALL_ID) {
-            return;
-        }
-
         Log.d(this, "onDecline " + mCallId);
 
-        CallCommandClient.getInstance().rejectCall(mCallId, false, null);
+        CallCommandClient.getInstance().rejectCall(mCall, false, null);
     }
 
     public void onText() {
         if (getUi() != null) {
-            getUi().showMessageDialogue();
+            getUi().showMessageDialog();
         }
     }
 
     public void rejectCallWithMessage(String message) {
         Log.d(this, "sendTextToDefaultActivity()...");
-        if (getUi() != null) {
-            getUi().dismissPopup();
-        }
-        CallCommandClient.getInstance().rejectCall(mCallId, true, message);
+
+        CallCommandClient.getInstance().rejectCall(mCall, true, message);
+
+        onDismissDialog();
+    }
+
+    public void onDismissDialog() {
+        InCallPresenter.getInstance().onDismissDialog();
     }
 
     interface AnswerUi extends Ui {
         public void showAnswerUi(boolean show);
         public void showTextButton(boolean show);
-        public boolean isMessageDialogueShowing();
-        public void showMessageDialogue();
-        public void dismissPopup();
-        public void configureMessageDialogue(ArrayList<String> textResponses);
+        public void showMessageDialog();
+        public void configureMessageDialog(ArrayList<String> textResponses);
     }
 }
diff --git a/InCallUI/src/com/android/incallui/CallButtonFragment.java b/InCallUI/src/com/android/incallui/CallButtonFragment.java
index a508312..b0fdda1 100644
--- a/InCallUI/src/com/android/incallui/CallButtonFragment.java
+++ b/InCallUI/src/com/android/incallui/CallButtonFragment.java
@@ -103,6 +103,10 @@
             }
         });
 
+        // make the hit target smaller for the end button so that is creates a deadzone
+        // along the inside perimeter of the button.
+        mEndCallButton.setOnTouchListener(new SmallerHitTargetTouchListener());
+
         mMuteButton = (ToggleButton) parent.findViewById(R.id.muteButton);
         mMuteButton.setOnClickListener(new OnClickListener() {
             @Override
@@ -185,12 +189,23 @@
     }
 
     @Override
-    public void setVisible(boolean on) {
-        if (on) {
-            getView().setVisibility(View.VISIBLE);
-        } else {
-            getView().setVisibility(View.INVISIBLE);
+    public void setEnabled(boolean isEnabled) {
+        View view = getView();
+        if (view.getVisibility() != View.VISIBLE) {
+            view.setVisibility(View.VISIBLE);
         }
+
+        // The main end-call button spanning across the screen.
+        mEndCallButton.setEnabled(isEnabled);
+
+        // The smaller buttons laid out horizontally just below the end-call button.
+        mMuteButton.setEnabled(isEnabled);
+        mAudioButton.setEnabled(isEnabled);
+        mHoldButton.setEnabled(isEnabled);
+        mShowDialpadButton.setEnabled(isEnabled);
+        mMergeButton.setEnabled(isEnabled);
+        mAddCallButton.setEnabled(isEnabled);
+        mSwapButton.setEnabled(isEnabled);
     }
 
     @Override
diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
index 4de129d..3642630 100644
--- a/InCallUI/src/com/android/incallui/CallButtonPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
@@ -19,6 +19,7 @@
 import com.android.incallui.AudioModeProvider.AudioModeListener;
 import com.android.incallui.InCallPresenter.InCallState;
 import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.incallui.InCallPresenter.IncomingCallListener;
 import com.android.services.telephony.common.AudioMode;
 import com.android.services.telephony.common.Call;
 import com.android.services.telephony.common.Call.Capabilities;
@@ -29,13 +30,16 @@
  * Logic for call buttons.
  */
 public class CallButtonPresenter extends Presenter<CallButtonPresenter.CallButtonUi>
-        implements InCallStateListener, AudioModeListener {
+        implements InCallStateListener, AudioModeListener, IncomingCallListener {
 
     private Call mCall;
     private ProximitySensor mProximitySensor;
     private boolean mAutomaticallyMuted = false;
     private boolean mPreviousMuteState = false;
 
+    private boolean mShowGenericMerge = false;
+    private boolean mShowManageConference = false;
+
     private InCallState mPreviousState = null;
 
     public CallButtonPresenter() {
@@ -50,6 +54,7 @@
 
         // register for call state changes last
         InCallPresenter.getInstance().addListener(this);
+        InCallPresenter.getInstance().addIncomingCallListener(this);
     }
 
     @Override
@@ -58,6 +63,7 @@
 
         InCallPresenter.getInstance().removeListener(this);
         AudioModeProvider.getInstance().removeListener(this);
+        InCallPresenter.getInstance().removeIncomingCallListener(this);
 
         mProximitySensor = null;
     }
@@ -77,16 +83,23 @@
                     && mCall != null && PhoneNumberUtils.isVoiceMailNumber(mCall.getNumber())) {
                 getUi().displayDialpad(true);
             }
+        } else if (state == InCallState.INCOMING) {
+            getUi().displayDialpad(false);
+            mCall = null;
         } else {
             mCall = null;
         }
-
         updateUi(state, mCall);
 
         mPreviousState = state;
     }
 
     @Override
+    public void onIncomingCall(InCallState state, Call call) {
+        onStateChange(state, CallList.getInstance());
+    }
+
+    @Override
     public void onAudioMode(int mode) {
         if (getUi() != null) {
             getUi().setAudio(mode);
@@ -198,6 +211,8 @@
         Log.v(this, "Show dialpad " + String.valueOf(checked));
         getUi().displayDialpad(checked);
         mProximitySensor.onDialpadVisible(checked);
+
+        updateExtraButtonRow();
     }
 
     private void updateUi(InCallState state, Call call) {
@@ -206,14 +221,14 @@
             return;
         }
 
-        final boolean isVisible = state.isConnectingOrConnected() &&
+        final boolean isEnabled = state.isConnectingOrConnected() &&
                 !state.isIncoming() && call != null;
 
-        ui.setVisible(isVisible);
+        ui.setEnabled(isEnabled);
 
         Log.d(this, "Updating call UI for call: ", call);
 
-        if (isVisible) {
+        if (isEnabled) {
             Log.v(this, "Show hold ", call.can(Capabilities.SUPPORT_HOLD));
             Log.v(this, "Enable hold", call.can(Capabilities.HOLD));
             Log.v(this, "Show merge ", call.can(Capabilities.MERGE_CALLS));
@@ -225,7 +240,7 @@
             final boolean canAdd = call.can(Capabilities.ADD_CALL);
             final boolean isGenericConference = call.can(Capabilities.GENERIC_CONFERENCE);
 
-            final boolean showGenericMerge = isGenericConference && canMerge;
+
             final boolean showMerge = !isGenericConference && canMerge;
 
             if (showMerge) {
@@ -282,22 +297,28 @@
             // - "Manage conference" (used only on GSM devices)
             // - "Merge" button (used only on CDMA devices)
 
-            final boolean showManageConference = (call.isConferenceCall() && !isGenericConference);
-            final boolean showExtraButtonRow = (showGenericMerge || showManageConference) &&
-                    !getUi().isDialpadVisible();
+            mShowGenericMerge = isGenericConference && canMerge;
+            mShowManageConference = (call.isConferenceCall() && !isGenericConference);
 
-            Log.i(this, "isGeneric: " + isGenericConference);
-            Log.i(this, "showManageConference : " + showManageConference);
-            Log.i(this, "showGenericMerge: " + showGenericMerge);
-            if (showExtraButtonRow) {
-                if (showGenericMerge) {
-                    getUi().showGenericMergeButton();
-                } else if (showManageConference) {
-                    getUi().showManageConferenceCallButton();
-                }
-            } else {
-                getUi().hideExtraRow();
+            updateExtraButtonRow();
+        }
+    }
+
+    private void updateExtraButtonRow() {
+        final boolean showExtraButtonRow = (mShowGenericMerge || mShowManageConference) &&
+                !getUi().isDialpadVisible();
+
+        Log.d(this, "isGeneric: " + mShowGenericMerge);
+        Log.d(this, "mShowManageConference : " + mShowManageConference);
+        Log.d(this, "mShowGenericMerge: " + mShowGenericMerge);
+        if (showExtraButtonRow) {
+            if (mShowGenericMerge) {
+                getUi().showGenericMergeButton();
+            } else if (mShowManageConference) {
+                getUi().showManageConferenceCallButton();
             }
+        } else {
+            getUi().hideExtraRow();
         }
     }
 
@@ -314,7 +335,7 @@
     }
 
     public interface CallButtonUi extends Ui {
-        void setVisible(boolean on);
+        void setEnabled(boolean on);
         void setMute(boolean on);
         void enableMute(boolean enabled);
         void setHold(boolean on);
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index 49ee786..0d26b82 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -29,11 +29,14 @@
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.view.ViewStub;
+import android.view.accessibility.AccessibilityEvent;
 import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.android.services.telephony.common.Call;
 
+import java.util.List;
+
 /**
  * Fragment for call card.
  */
@@ -75,6 +78,12 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+    }
+
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
 
         final CallList calls = CallList.getInstance();
         final Call call = calls.getFirstCall();
@@ -231,15 +240,15 @@
         // States other than disconnected not yet supported
         callStateLabel = getCallStateLabelFromState(state, cause);
 
-        Log.v(this, "setCallState ", callStateLabel);
-        Log.v(this, "DisconnectCause ", cause);
-        Log.v(this, "bluetooth on ", bluetoothOn);
+        Log.v(this, "setCallState " + callStateLabel);
+        Log.v(this, "DisconnectCause " + cause);
+        Log.v(this, "bluetooth on " + bluetoothOn);
         Log.v(this, "gateway " + gatewayLabel + gatewayNumber);
 
         // There are cases where we totally skip the animation, in which case remove the transition
         // animation here and restore it afterwards.
-        final boolean skipAnimation = (state == Call.State.DIALING
-                || state == Call.State.DISCONNECTED);
+        final boolean skipAnimation = (Call.State.isDialing(state)
+                || state == Call.State.DISCONNECTED || state == Call.State.DISCONNECTING);
         LayoutTransition transition = null;
         if (skipAnimation) {
             transition = mSupplementaryInfoContainer.getLayoutTransition();
@@ -364,22 +373,21 @@
 
         } else if (Call.State.ONHOLD == state) {
             callStateLabel = context.getString(R.string.card_title_on_hold);
-
         } else if (Call.State.DIALING == state) {
             callStateLabel = context.getString(R.string.card_title_dialing);
-
+        } else if (Call.State.REDIALING == state) {
+            callStateLabel = context.getString(R.string.card_title_redialing);
         } else if (Call.State.INCOMING == state || Call.State.CALL_WAITING == state) {
             callStateLabel = context.getString(R.string.card_title_incoming_call);
 
-        // TODO(klp): Add a disconnecting state
-        //} else if (Call.State.DISCONNECTING) {
-                // While in the DISCONNECTING state we display a "Hanging up"
-                // message in order to make the UI feel more responsive.  (In
-                // GSM it's normal to see a delay of a couple of seconds while
-                // negotiating the disconnect with the network, so the "Hanging
-                // up" state at least lets the user know that we're doing
-                // something.  This state is currently not used with CDMA.)
-                //callStateLabel = context.getString(R.string.card_title_hanging_up);
+        } else if (Call.State.DISCONNECTING == state) {
+            // While in the DISCONNECTING state we display a "Hanging up"
+            // message in order to make the UI feel more responsive.  (In
+            // GSM it's normal to see a delay of a couple of seconds while
+            // negotiating the disconnect with the network, so the "Hanging
+            // up" state at least lets the user know that we're doing
+            // something.  This state is currently not used with CDMA.)
+            callStateLabel = context.getString(R.string.card_title_hanging_up);
 
         } else if (Call.State.DISCONNECTED == state) {
             callStateLabel = getCallFailedString(cause);
@@ -487,6 +495,33 @@
                     getPresenter().secondaryPhotoClicked();
                 }
             });
+            mSecondaryPhotoOverlay.setOnTouchListener(new SmallerHitTargetTouchListener());
+        }
+    }
+
+    public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+        if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
+            dispatchPopulateAccessibilityEvent(event, mPrimaryName);
+            dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+            return;
+        }
+        dispatchPopulateAccessibilityEvent(event, mCallStateLabel);
+        dispatchPopulateAccessibilityEvent(event, mPrimaryName);
+        dispatchPopulateAccessibilityEvent(event, mPhoneNumber);
+        dispatchPopulateAccessibilityEvent(event, mCallTypeLabel);
+        dispatchPopulateAccessibilityEvent(event, mSecondaryCallName);
+
+        return;
+    }
+
+    private void dispatchPopulateAccessibilityEvent(AccessibilityEvent event, View view) {
+        if (view == null) return;
+        final List<CharSequence> eventText = event.getText();
+        int size = eventText.size();
+        view.dispatchPopulateAccessibilityEvent(event);
+        // if no text added write null to keep relative position
+        if (size == eventText.size()) {
+            eventText.add(null);
         }
     }
 }
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 1830f05..949d718 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -261,6 +261,9 @@
                     if (entry.name != null) {
                         Log.d(TAG, "Contact found: " + entry);
                     }
+                    if (entry.personUri != null) {
+                        CallerInfoUtils.sendViewNotification(mContext, entry.personUri);
+                    }
                 }
 
                 @Override
@@ -318,6 +321,10 @@
         // to let user know quickly what call has disconnected. Disconnected
         // calls are very short lived.
         if (!skipDisconnected) {
+            retval = callList.getDisconnectingCall();
+            if (retval != null && retval != ignore) {
+                return retval;
+            }
             retval = callList.getDisconnectedCall();
             if (retval != null && retval != ignore) {
                 return retval;
@@ -417,7 +424,7 @@
         if (mPrimary == null) {
             return false;
         }
-        return (mPrimary.getState() == Call.State.DIALING &&
+        return (Call.State.isDialing(mPrimary.getState()) &&
                 !TextUtils.isEmpty(mPrimary.getGatewayNumber()) &&
                 !TextUtils.isEmpty(mPrimary.getGatewayPackage()));
     }
diff --git a/InCallUI/src/com/android/incallui/CallCommandClient.java b/InCallUI/src/com/android/incallui/CallCommandClient.java
index cb49dca..52d2100 100644
--- a/InCallUI/src/com/android/incallui/CallCommandClient.java
+++ b/InCallUI/src/com/android/incallui/CallCommandClient.java
@@ -18,8 +18,10 @@
 
 import android.os.RemoteException;
 
+
 import com.android.services.telephony.common.AudioMode;
 import com.android.services.telephony.common.ICallCommandService;
+import com.android.services.telephony.common.Call;
 
 /**
  * Main interface for phone related commands.
@@ -57,14 +59,15 @@
         }
     }
 
-    public void rejectCall(int callId, boolean rejectWithMessage, String message) {
-        Log.i(this, "rejectCall: " + callId + ", with rejectMessage? " + rejectWithMessage);
+    public void rejectCall(Call call, boolean rejectWithMessage, String message) {
+        Log.i(this, "rejectCall: " + call.getCallId() +
+                ", with rejectMessage? " + rejectWithMessage);
         if (mCommandService == null) {
             Log.e(this, "Cannot reject call; CallCommandService == null");
             return;
         }
         try {
-            mCommandService.rejectCall(callId, rejectWithMessage, message);
+            mCommandService.rejectCall(call, rejectWithMessage, message);
         } catch (RemoteException e) {
             Log.e(this, "Error rejecting call.", e);
         }
@@ -227,4 +230,17 @@
         }
     }
 
+    public void setSystemBarNavigationEnabled(boolean enable) {
+        if (mCommandService == null) {
+            Log.e(this, "Cannot setSystemBarNavigationEnabled(); CallCommandService == null");
+            return;
+        }
+        try {
+            Log.v(this, "setSystemBarNavigationEnabled() enabled = " + enable);
+            mCommandService.setSystemBarNavigationEnabled(enable);
+        } catch (RemoteException e) {
+            Log.d(this, "Error on setSystemBarNavigationEnabled().");
+        }
+    }
+
 }
diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java
index 8249fd4..ba123b0 100644
--- a/InCallUI/src/com/android/incallui/CallList.java
+++ b/InCallUI/src/com/android/incallui/CallList.java
@@ -83,10 +83,15 @@
     public void onDisconnect(Call call) {
         Log.d(this, "onDisconnect: ", call);
 
-        updateCallInMap(call);
+        boolean updated = updateCallInMap(call);
 
-        notifyCallUpdateListeners(call);
-        notifyListenersOfChange();
+        if (updated) {
+            // notify those listening for changes on this specific change
+            notifyCallUpdateListeners(call);
+
+            // notify those listening for all disconnects
+            notifyListenersOfDisconnect(call);
+        }
     }
 
     /**
@@ -187,7 +192,11 @@
     }
 
     public Call getOutgoingCall() {
-        return getFirstCallWithState(Call.State.DIALING);
+        Call call = getFirstCallWithState(Call.State.DIALING);
+        if (call == null) {
+            call = getFirstCallWithState(Call.State.REDIALING);
+        }
+        return call;
     }
 
     public Call getActiveCall() {
@@ -202,6 +211,10 @@
         return getFirstCallWithState(Call.State.DISCONNECTED);
     }
 
+    public Call getDisconnectingCall() {
+        return getFirstCallWithState(Call.State.DISCONNECTING);
+    }
+
     public Call getSecondBackgroundCall() {
         return getCallWithState(Call.State.ONHOLD, 1);
     }
@@ -223,16 +236,20 @@
         return call;
     }
 
-
     public Call getFirstCall() {
-        // TODO: should we switch to a simple list and pull the first one?
         Call result = getIncomingCall();
         if (result == null) {
-            result = getFirstCallWithState(Call.State.DIALING);
+            result = getOutgoingCall();
         }
         if (result == null) {
             result = getFirstCallWithState(Call.State.ACTIVE);
         }
+        if (result == null) {
+            result = getDisconnectingCall();
+        }
+        if (result == null) {
+            result = getDisconnectedCall();
+        }
         return result;
     }
 
@@ -310,13 +327,24 @@
         }
     }
 
-    private void updateCallInMap(Call call) {
+    private void notifyListenersOfDisconnect(Call call) {
+        for (Listener listener : mListeners) {
+            listener.onDisconnect(call);
+        }
+    }
+
+    /**
+     * Updates the call entry in the local map.
+     * @return false if no call previously existed and no call was added, otherwise true.
+     */
+    private boolean updateCallInMap(Call call) {
         Preconditions.checkNotNull(call);
 
+        boolean updated = false;
+
         final Integer id = new Integer(call.getCallId());
 
         if (call.getState() == Call.State.DISCONNECTED) {
-
             // update existing (but do not add!!) disconnected calls
             if (mCallMap.containsKey(id)) {
 
@@ -328,12 +356,17 @@
                 mHandler.sendMessageDelayed(msg, getDelayForDisconnect(call));
 
                 mCallMap.put(id, call);
+                updated = true;
             }
         } else if (!isCallDead(call)) {
             mCallMap.put(id, call);
+            updated = true;
         } else if (mCallMap.containsKey(id)) {
             mCallMap.remove(id);
+            updated = true;
         }
+
+        return updated;
     }
 
     private int getDelayForDisconnect(Call call) {
@@ -413,8 +446,28 @@
      * to the call list.
      */
     public interface Listener {
-        public void onCallListChange(CallList callList);
+        /**
+         * Called when a new incoming call comes in.
+         * This is the only method that gets called for incoming calls. Listeners
+         * that want to perform an action on incoming call should respond in this method
+         * because {@link #onCallListChange} does not automatically get called for
+         * incoming calls.
+         */
         public void onIncomingCall(Call call);
+
+        /**
+         * Called anytime there are changes to the call list.  The change can be switching call
+         * states, updating information, etc. This method will NOT be called for new incoming
+         * calls and for calls that switch to disconnected state. Listeners must add actions
+         * to those method implementations if they want to deal with those actions.
+         */
+        public void onCallListChange(CallList callList);
+
+        /**
+         * Called when a call switches to the disconnected state.  This is the only method
+         * that will get called upon disconnection.
+         */
+        public void onDisconnect(Call call);
     }
 
     public interface CallUpdateListener {
diff --git a/InCallUI/src/com/android/incallui/CallerInfoUtils.java b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
index e282d50..3d2c5c4 100644
--- a/InCallUI/src/com/android/incallui/CallerInfoUtils.java
+++ b/InCallUI/src/com/android/incallui/CallerInfoUtils.java
@@ -1,6 +1,8 @@
 package com.android.incallui;
 
 import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
 import android.text.TextUtils;
 
 import com.android.services.telephony.common.Call;
@@ -9,7 +11,7 @@
 import java.util.Arrays;
 
 /**
- * TODO: Insert description here. (generated by yorkelee)
+ * Utility methods for contact and caller info related functionality
  */
 public class CallerInfoUtils {
 
@@ -18,6 +20,12 @@
     /** Define for not a special CNAP string */
     private static final int CNAP_SPECIAL_CASE_NO = -1;
 
+    private static final String VIEW_NOTIFICATION_ACTION =
+            "com.android.contacts.VIEW_NOTIFICATION";
+    private static final String VIEW_NOTIFICATION_PACKAGE = "com.android.contacts";
+    private static final String VIEW_NOTIFICATION_CLASS =
+            "com.android.contacts.ViewNotificationService";
+
     public CallerInfoUtils() {
     }
 
@@ -153,7 +161,7 @@
             return "";
         }
 
-        // Todo (klp): Figure out an equivalent for VDBG
+        // Todo: Figure out an equivalent for VDBG
         if (false) {
             // When VDBG is true we emit PII.
             return number;
@@ -172,4 +180,14 @@
         }
         return builder.toString();
     }
+
+    /**
+     * Send a notification that that we are viewing a particular contact, so that the high-res
+     * photo is downloaded by the sync adapter.
+     */
+    public static void sendViewNotification(Context context, Uri contactUri) {
+        final Intent intent = new Intent(VIEW_NOTIFICATION_ACTION, contactUri);
+        intent.setClassName(VIEW_NOTIFICATION_PACKAGE, VIEW_NOTIFICATION_CLASS);
+        context.startService(intent);
+    }
 }
diff --git a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
index 041614d..1ba88cb 100644
--- a/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
+++ b/InCallUI/src/com/android/incallui/ConferenceManagerPresenter.java
@@ -21,6 +21,7 @@
 import com.android.incallui.ContactInfoCache.ContactCacheEntry;
 import com.android.incallui.InCallPresenter.InCallState;
 import com.android.incallui.InCallPresenter.InCallStateListener;
+import com.android.services.telephony.common.Call;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSortedSet;
@@ -57,11 +58,15 @@
     public void onStateChange(InCallState state, CallList callList) {
         if (getUi().isFragmentVisible()) {
             Log.v(this, "onStateChange" + state);
-            if (state == InCallState.INCALL && callList.getActiveOrBackgroundCall() != null &&
-                    callList.getActiveOrBackgroundCall().isConferenceCall()) {
-                Log.v(this, "Number of existing calls is " +
-                        String.valueOf(callList.getActiveCall().getChildCallIds().size()));
-                update(callList);
+            if (state == InCallState.INCALL) {
+                final Call call = callList.getActiveOrBackgroundCall();
+                if (call != null && call.isConferenceCall()) {
+                    Log.v(this, "Number of existing calls is " +
+                            String.valueOf(call.getChildCallIds().size()));
+                    update(callList);
+                } else {
+                    getUi().setVisible(false);
+                }
             } else {
                 getUi().setVisible(false);
             }
diff --git a/InCallUI/src/com/android/incallui/ContactInfoCache.java b/InCallUI/src/com/android/incallui/ContactInfoCache.java
index 6c05650..4b482cb 100644
--- a/InCallUI/src/com/android/incallui/ContactInfoCache.java
+++ b/InCallUI/src/com/android/incallui/ContactInfoCache.java
@@ -234,6 +234,12 @@
                 entry.location = oldEntry.location;
             }
 
+            // If no image and it's a business, switch to using the default business avatar.
+            if (info.getImageUrl() == null && info.isBusiness()) {
+                Log.d(TAG, "Business has no image. Using default.");
+                entry.photo = mContext.getResources().getDrawable(R.drawable.business_unknown);
+            }
+
             // Add the contact info to the cache.
             mInfoMap.put(mCallId, entry);
             sendInfoNotifications(mCallId, entry);
@@ -330,12 +336,6 @@
                 photo = context.getResources().getDrawable(R.drawable.picture_unknown);
             } else {
                 cce.personUri = personUri;
-
-                // If the image load is too slow, we show a default avatar icon afterward.
-                // If it is fast enough, this message will be canceled on onImageLoadComplete().
-                // TODO (klp): Figure out if this handler is still needed.
-                // mHandler.removeMessages(MESSAGE_SHOW_UNKNOWN_PHOTO);
-                // mHandler.sendEmptyMessageDelayed(MESSAGE_SHOW_UNKNOWN_PHOTO, MESSAGE_DELAY);
             }
         }
 
diff --git a/InCallUI/src/com/android/incallui/DialpadFragment.java b/InCallUI/src/com/android/incallui/DialpadFragment.java
index 428750d..5087561 100644
--- a/InCallUI/src/com/android/incallui/DialpadFragment.java
+++ b/InCallUI/src/com/android/incallui/DialpadFragment.java
@@ -18,6 +18,8 @@
 
 import android.content.Context;
 import android.os.Bundle;
+import android.text.Editable;
+import android.text.method.DialerKeyListener;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -58,6 +60,198 @@
         mDisplayMap.put(R.id.star, '*');
     }
 
+    // KeyListener used with the "dialpad digits" EditText widget.
+    private DTMFKeyListener mDialerKeyListener;
+
+    /**
+     * Our own key listener, specialized for dealing with DTMF codes.
+     *   1. Ignore the backspace since it is irrelevant.
+     *   2. Allow ONLY valid DTMF characters to generate a tone and be
+     *      sent as a DTMF code.
+     *   3. All other remaining characters are handled by the superclass.
+     *
+     * This code is purely here to handle events from the hardware keyboard
+     * while the DTMF dialpad is up.
+     */
+    private class DTMFKeyListener extends DialerKeyListener {
+
+        private DTMFKeyListener() {
+            super();
+        }
+
+        /**
+         * Overriden to return correct DTMF-dialable characters.
+         */
+        @Override
+        protected char[] getAcceptedChars(){
+            return DTMF_CHARACTERS;
+        }
+
+        /** special key listener ignores backspace. */
+        @Override
+        public boolean backspace(View view, Editable content, int keyCode,
+                KeyEvent event) {
+            return false;
+        }
+
+        /**
+         * Return true if the keyCode is an accepted modifier key for the
+         * dialer (ALT or SHIFT).
+         */
+        private boolean isAcceptableModifierKey(int keyCode) {
+            switch (keyCode) {
+                case KeyEvent.KEYCODE_ALT_LEFT:
+                case KeyEvent.KEYCODE_ALT_RIGHT:
+                case KeyEvent.KEYCODE_SHIFT_LEFT:
+                case KeyEvent.KEYCODE_SHIFT_RIGHT:
+                    return true;
+                default:
+                    return false;
+            }
+        }
+
+        /**
+         * Overriden so that with each valid button press, we start sending
+         * a dtmf code and play a local dtmf tone.
+         */
+        @Override
+        public boolean onKeyDown(View view, Editable content,
+                                 int keyCode, KeyEvent event) {
+            // if (DBG) log("DTMFKeyListener.onKeyDown, keyCode " + keyCode + ", view " + view);
+
+            // find the character
+            char c = (char) lookup(event, content);
+
+            // if not a long press, and parent onKeyDown accepts the input
+            if (event.getRepeatCount() == 0 && super.onKeyDown(view, content, keyCode, event)) {
+
+                boolean keyOK = ok(getAcceptedChars(), c);
+
+                // if the character is a valid dtmf code, start playing the tone and send the
+                // code.
+                if (keyOK) {
+                    Log.d(this, "DTMFKeyListener reading '" + c + "' from input.");
+                    getPresenter().processDtmf(c);
+                } else {
+                    Log.d(this, "DTMFKeyListener rejecting '" + c + "' from input.");
+                }
+                return true;
+            }
+            return false;
+        }
+
+        /**
+         * Overriden so that with each valid button up, we stop sending
+         * a dtmf code and the dtmf tone.
+         */
+        @Override
+        public boolean onKeyUp(View view, Editable content,
+                                 int keyCode, KeyEvent event) {
+            // if (DBG) log("DTMFKeyListener.onKeyUp, keyCode " + keyCode + ", view " + view);
+
+            super.onKeyUp(view, content, keyCode, event);
+
+            // find the character
+            char c = (char) lookup(event, content);
+
+            boolean keyOK = ok(getAcceptedChars(), c);
+
+            if (keyOK) {
+                Log.d(this, "Stopping the tone for '" + c + "'");
+                getPresenter().stopTone();
+                return true;
+            }
+
+            return false;
+        }
+
+        /**
+         * Handle individual keydown events when we DO NOT have an Editable handy.
+         */
+        public boolean onKeyDown(KeyEvent event) {
+            char c = lookup(event);
+            Log.d(this, "DTMFKeyListener.onKeyDown: event '" + c + "'");
+
+            // if not a long press, and parent onKeyDown accepts the input
+            if (event.getRepeatCount() == 0 && c != 0) {
+                // if the character is a valid dtmf code, start playing the tone and send the
+                // code.
+                if (ok(getAcceptedChars(), c)) {
+                    Log.d(this, "DTMFKeyListener reading '" + c + "' from input.");
+                    getPresenter().processDtmf(c);
+                    return true;
+                } else {
+                    Log.d(this, "DTMFKeyListener rejecting '" + c + "' from input.");
+                }
+            }
+            return false;
+        }
+
+        /**
+         * Handle individual keyup events.
+         *
+         * @param event is the event we are trying to stop.  If this is null,
+         * then we just force-stop the last tone without checking if the event
+         * is an acceptable dialer event.
+         */
+        public boolean onKeyUp(KeyEvent event) {
+            if (event == null) {
+                //the below piece of code sends stopDTMF event unnecessarily even when a null event
+                //is received, hence commenting it.
+                /*if (DBG) log("Stopping the last played tone.");
+                stopTone();*/
+                return true;
+            }
+
+            char c = lookup(event);
+            Log.d(this, "DTMFKeyListener.onKeyUp: event '" + c + "'");
+
+            // TODO: stopTone does not take in character input, we may want to
+            // consider checking for this ourselves.
+            if (ok(getAcceptedChars(), c)) {
+                Log.d(this, "Stopping the tone for '" + c + "'");
+                getPresenter().stopTone();
+                return true;
+            }
+
+            return false;
+        }
+
+        /**
+         * Find the Dialer Key mapped to this event.
+         *
+         * @return The char value of the input event, otherwise
+         * 0 if no matching character was found.
+         */
+        private char lookup(KeyEvent event) {
+            // This code is similar to {@link DialerKeyListener#lookup(KeyEvent, Spannable) lookup}
+            int meta = event.getMetaState();
+            int number = event.getNumber();
+
+            if (!((meta & (KeyEvent.META_ALT_ON | KeyEvent.META_SHIFT_ON)) == 0) || (number == 0)) {
+                int match = event.getMatch(getAcceptedChars(), meta);
+                number = (match != 0) ? match : number;
+            }
+
+            return (char) number;
+        }
+
+        /**
+         * Check to see if the keyEvent is dialable.
+         */
+        boolean isKeyEventAcceptable (KeyEvent event) {
+            return (ok(getAcceptedChars(), lookup(event)));
+        }
+
+        /**
+         * Overrides the characters used in {@link DialerKeyListener#CHARACTERS}
+         * These are the valid dtmf characters.
+         */
+        public final char[] DTMF_CHARACTERS = new char[] {
+            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '#', '*'
+        };
+    }
+
     @Override
     public void onClick(View v) {
         Log.d(this, "onClick");
@@ -180,6 +374,8 @@
                 com.android.incallui.R.layout.dtmf_twelve_key_dialer_view, container, false);
         mDtmfDialerField = (EditText) parent.findViewById(R.id.dtmfDialerField);
         if (mDtmfDialerField != null) {
+            mDialerKeyListener = new DTMFKeyListener();
+            mDtmfDialerField.setKeyListener(mDialerKeyListener);
             // remove the long-press context menus that support
             // the edit (copy / paste / select) functions.
             mDtmfDialerField.setLongClickable(false);
@@ -190,6 +386,12 @@
     }
 
     @Override
+    public void onDestroyView() {
+        mDialerKeyListener = null;
+        super.onDestroyView();
+    }
+
+    @Override
     public void setVisible(boolean on) {
         if (on) {
             getView().setVisibility(View.VISIBLE);
@@ -215,6 +417,30 @@
     }
 
     /**
+     * Called externally (from InCallScreen) to play a DTMF Tone.
+     */
+    /* package */ boolean onDialerKeyDown(KeyEvent event) {
+        Log.d(this, "Notifying dtmf key down.");
+        if (mDialerKeyListener != null) {
+            return mDialerKeyListener.onKeyDown(event);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Called externally (from InCallScreen) to cancel the last DTMF Tone played.
+     */
+    public boolean onDialerKeyUp(KeyEvent event) {
+        Log.d(this, "Notifying dtmf key up.");
+        if (mDialerKeyListener != null) {
+            return mDialerKeyListener.onKeyUp(event);
+        } else {
+            return false;
+        }
+    }
+
+    /**
      * setup the keys on the dialer activity, using the keymaps.
      */
     private void setupKeypad(View parent) {
diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java
index 15e48c5..ac21d52 100644
--- a/InCallUI/src/com/android/incallui/InCallActivity.java
+++ b/InCallUI/src/com/android/incallui/InCallActivity.java
@@ -20,6 +20,10 @@
 import com.android.services.telephony.common.Call.State;
 
 import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.DialogInterface.OnCancelListener;
 import android.content.Intent;
 import android.content.res.Configuration;
 import android.os.Bundle;
@@ -27,6 +31,7 @@
 import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
+import android.view.accessibility.AccessibilityEvent;
 import android.widget.Toast;
 
 /**
@@ -36,12 +41,15 @@
 
     public static final String SHOW_DIALPAD_EXTRA = "InCallActivity.show_dialpad";
 
+    private static final int INVALID_RES_ID = -1;
+
     private CallButtonFragment mCallButtonFragment;
     private CallCardFragment mCallCardFragment;
     private AnswerFragment mAnswerFragment;
     private DialpadFragment mDialpadFragment;
     private ConferenceManagerFragment mConferenceManagerFragment;
     private boolean mIsForegroundActivity;
+    private AlertDialog mDialog;
 
     /** Use to pass 'showDialpad' from {@link #onNewIntent} to {@link #onResume} */
     private boolean mShowDialpadRequested;
@@ -82,7 +90,7 @@
 
     @Override
     protected void onResume() {
-        Log.d(this, "onResume()...");
+        Log.i(this, "onResume()...");
         super.onResume();
 
         mIsForegroundActivity = true;
@@ -102,6 +110,9 @@
         super.onPause();
 
         mIsForegroundActivity = false;
+
+        mDialpadFragment.onDialerKeyUp(null);
+
         InCallPresenter.getInstance().onUiShowing(false);
     }
 
@@ -127,6 +138,9 @@
         return mIsForegroundActivity;
     }
 
+    private boolean hasPendingErrorDialog() {
+        return mDialog != null;
+    }
     /**
      * Dismisses the in-call screen.
      *
@@ -144,8 +158,12 @@
      */
     @Override
     public void finish() {
-        Log.d(this, "finish()...");
-        super.finish();
+        Log.i(this, "finish().  Dialog showing: " + (mDialog != null));
+
+        // skip finish if we are still showing a dialog.
+        if (!hasPendingErrorDialog() && !mAnswerFragment.hasPendingDialogs()) {
+            super.finish();
+        }
     }
 
     @Override
@@ -171,7 +189,6 @@
 
     @Override
     public void onBackPressed() {
-        // TODO(klp): implement fully
         Log.d(this, "onBackPressed()...");
 
         // BACK is also used to exit out of any "special modes" of the
@@ -190,10 +207,25 @@
     }
 
     @Override
+    public boolean onKeyUp(int keyCode, KeyEvent event) {
+        // push input to the dialer.
+        if ((mDialpadFragment.isVisible()) && (mDialpadFragment.onDialerKeyUp(event))){
+            return true;
+        } else if (keyCode == KeyEvent.KEYCODE_CALL) {
+            // Always consume CALL to be sure the PhoneWindow won't do anything with it
+            return true;
+        }
+        return super.onKeyUp(keyCode, event);
+    }
+
+    @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
             case KeyEvent.KEYCODE_CALL:
-                // TODO(klp): handle call key
+                boolean handled = InCallPresenter.getInstance().handleCallKey();
+                if (!handled) {
+                    Log.w(this, "InCallActivity should always handle KEYCODE_CALL in onKeyDown");
+                }
                 // Always consume CALL to be sure the PhoneWindow won't do anything with it
                 return true;
 
@@ -212,11 +244,12 @@
             case KeyEvent.KEYCODE_VOLUME_UP:
             case KeyEvent.KEYCODE_VOLUME_DOWN:
             case KeyEvent.KEYCODE_VOLUME_MUTE:
-                // Not sure if needed. If so, silence ringer.
+                // Ringer silencing handled by PhoneWindowManager.
                 break;
 
             case KeyEvent.KEYCODE_MUTE:
-                toast("mute");
+                // toggle mute
+                CallCommandClient.getInstance().mute(!AudioModeProvider.getInstance().getMute());
                 return true;
 
             // Various testing/debugging features, enabled ONLY when VERBOSE == true.
@@ -231,14 +264,37 @@
                 }
                 break;
             case KeyEvent.KEYCODE_EQUALS:
-                // TODO(klp): Dump phone state?
+                // TODO: Dump phone state?
                 break;
         }
 
-        // TODO(klp) Adds hardware keyboard support
+        if (event.getRepeatCount() == 0 && handleDialerKeyDown(keyCode, event)) {
+            return true;
+        }
+
         return super.onKeyDown(keyCode, event);
     }
 
+    private boolean handleDialerKeyDown(int keyCode, KeyEvent event) {
+        Log.v(this, "handleDialerKeyDown: keyCode " + keyCode + ", event " + event + "...");
+
+        // As soon as the user starts typing valid dialable keys on the
+        // keyboard (presumably to type DTMF tones) we start passing the
+        // key events to the DTMFDialer's onDialerKeyDown.
+        if (mDialpadFragment.isVisible()) {
+            return mDialpadFragment.onDialerKeyDown(event);
+
+            // TODO: If the dialpad isn't currently visible, maybe
+            // consider automatically bringing it up right now?
+            // (Just to make sure the user sees the digits widget...)
+            // But this probably isn't too critical since it's awkward to
+            // use the hard keyboard while in-call in the first place,
+            // especially now that the in-call UI is portrait-only...
+        }
+
+        return false;
+    }
+
     @Override
     public void onConfigurationChanged(Configuration config) {
         InCallPresenter.getInstance().getProximitySensor().onConfigurationChanged(config);
@@ -317,6 +373,14 @@
         toast.show();
     }
 
+    /**
+     * Simulates a user click to hide the dialpad. This will update the UI to show the call card,
+     * update the checked state of the dialpad button, and update the proximity sensor state.
+     */
+    public void hideDialpadForDisconnect() {
+        mCallButtonFragment.displayDialpad(false);
+    }
+
     public void displayDialpad(boolean showDialpad) {
         if (showDialpad) {
             mDialpadFragment.setVisible(true);
@@ -341,4 +405,81 @@
         final PostCharDialogFragment fragment = new PostCharDialogFragment(callId,  chars);
         fragment.show(getFragmentManager(), "postCharWait");
     }
+
+    @Override
+    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+        if (mCallCardFragment != null) {
+            mCallCardFragment.dispatchPopulateAccessibilityEvent(event);
+        }
+        return super.dispatchPopulateAccessibilityEvent(event);
+    }
+
+    public void maybeShowErrorDialogOnDisconnect(Call.DisconnectCause cause) {
+        Log.d(this, "maybeShowErrorDialogOnDisconnect");
+
+        if (!isFinishing()) {
+            final int resId = getResIdForDisconnectCause(cause);
+            if (resId != INVALID_RES_ID) {
+                showErrorDialog(resId);
+            }
+        }
+    }
+
+    public void dismissPendingDialogs() {
+        if (mDialog != null) {
+            mDialog.dismiss();
+            mDialog = null;
+        }
+        mAnswerFragment.dismissPendingDialogues();
+    }
+
+    /**
+     * Utility function to bring up a generic "error" dialog.
+     */
+    private void showErrorDialog(int resId) {
+        final CharSequence msg = getResources().getText(resId);
+        Log.i(this, "Show Dialog: " + msg);
+
+        dismissPendingDialogs();
+
+        mDialog = new AlertDialog.Builder(this)
+            .setMessage(msg)
+            .setPositiveButton(R.string.ok, new OnClickListener() {
+                @Override
+                public void onClick(DialogInterface dialog, int which) {
+                    onDialogDismissed();
+                }})
+            .setOnCancelListener(new OnCancelListener() {
+                @Override
+                public void onCancel(DialogInterface dialog) {
+                    onDialogDismissed();
+                }})
+            .create();
+
+        mDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
+        mDialog.show();
+    }
+
+    private int getResIdForDisconnectCause(Call.DisconnectCause cause) {
+        int resId = INVALID_RES_ID;
+
+        if (cause == Call.DisconnectCause.CALL_BARRED) {
+            resId = R.string.callFailed_cb_enabled;
+        } else if (cause == Call.DisconnectCause.FDN_BLOCKED) {
+            resId = R.string.callFailed_fdn_only;
+        } else if (cause == Call.DisconnectCause.CS_RESTRICTED) {
+            resId = R.string.callFailed_dsac_restricted;
+        } else if (cause == Call.DisconnectCause.CS_RESTRICTED_EMERGENCY) {
+            resId = R.string.callFailed_dsac_restricted_emergency;
+        } else if (cause == Call.DisconnectCause.CS_RESTRICTED_NORMAL) {
+            resId = R.string.callFailed_dsac_restricted_normal;
+        }
+
+        return resId;
+    }
+
+    private void onDialogDismissed() {
+        mDialog = null;
+        InCallPresenter.getInstance().onDismissDialog();
+    }
 }
diff --git a/InCallUI/src/com/android/incallui/InCallApp.java b/InCallUI/src/com/android/incallui/InCallApp.java
index 02f07b8..dcc7848 100644
--- a/InCallUI/src/com/android/incallui/InCallApp.java
+++ b/InCallUI/src/com/android/incallui/InCallApp.java
@@ -44,7 +44,6 @@
 
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
-        // TODO(klp): See what configuration changes we need for klp
         super.onConfigurationChanged(newConfig);
     }
 
@@ -58,7 +57,7 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             final String action = intent.getAction();
-            Log.v(this, "Broadcast from Notification: ", action);
+            Log.i(this, "Broadcast from Notification: " + action);
 
             if (action.equals(ACTION_HANG_UP_ONGOING_CALL)) {
                 // TODO: Commands of this nature should exist in the CallList or a
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
index 7678372..1b9f60c 100644
--- a/InCallUI/src/com/android/incallui/InCallPresenter.java
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -23,6 +23,7 @@
 import android.content.Intent;
 
 import com.android.services.telephony.common.Call;
+import com.android.services.telephony.common.Call.Capabilities;
 import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
@@ -118,6 +119,15 @@
         attemptCleanup();
     }
 
+    private void attemptFinishActivity() {
+        final boolean doFinish = (mInCallActivity != null && isActivityStarted());
+        Log.i(this, "Hide in call UI: " + doFinish);
+
+        if (doFinish) {
+            mInCallActivity.finish();
+        }
+    }
+
     /**
      * Called when the UI begins or ends. Starts the callstate callbacks if the UI just began.
      * Attempts to tear down everything if the UI just ended. See #tearDown for more insight on
@@ -127,16 +137,6 @@
         boolean updateListeners = false;
 
         if (inCallActivity != null) {
-            // When the UI comes up, we need to first check the state of the Service.
-            // If the service is not attached, that means that a call probably connected and
-            // then immediately disconnected before the UI was able to come up.  A disconnected
-            // service means we dont have calls, so start tearing down the UI instead.
-            if (mServiceConnected == false) {
-                inCallActivity.finish();
-                attemptCleanup();
-                return;
-            }
-
             if (mInCallActivity == null) {
                 updateListeners = true;
                 Log.i(this, "UI Initialized");
@@ -149,6 +149,24 @@
             }
 
             mInCallActivity = inCallActivity;
+
+            // By the time the UI finally comes up, the call may already be disconnected.
+            // If that's the case, we may need to show an error dialog.
+            if (mCallList != null && mCallList.getDisconnectedCall() != null) {
+                maybeShowErrorDialogOnDisconnect(mCallList.getDisconnectedCall());
+            }
+
+            // When the UI comes up, we need to first check the in-call state.
+            // If we are showing NO_CALLS, that means that a call probably connected and
+            // then immediately disconnected before the UI was able to come up.
+            // If we dont have any calls, start tearing down the UI instead.
+            // NOTE: This code relies on {@link #mInCallActivity} being set so we run it after
+            // it has been set.
+            if (mInCallState == InCallState.NO_CALLS) {
+                Log.i(this, "UI Intialized, but no calls left.  shut down.");
+                attemptFinishActivity();
+                return;
+            }
         } else {
             Log.i(this, "UI Destroyed)");
             updateListeners = true;
@@ -183,6 +201,12 @@
         InCallState newState = getPotentialStateFromCallList(callList);
         newState = startOrFinishUi(newState);
 
+        // Renable notification shade and soft navigation buttons, if we are no longer in the
+        // incoming call screen
+        if (!newState.isIncoming()) {
+            CallCommandClient.getInstance().setSystemBarNavigationEnabled(true);
+        }
+
         // Set the new state before announcing it to the world
         Log.i(this, "Phone switching state: " + mInCallState + " -> " + newState);
         mInCallState = newState;
@@ -206,12 +230,30 @@
         Log.i(this, "Phone switching state: " + mInCallState + " -> " + newState);
         mInCallState = newState;
 
+        // Disable notification shade and soft navigation buttons
+        if (newState.isIncoming()) {
+            CallCommandClient.getInstance().setSystemBarNavigationEnabled(false);
+        }
+
         for (IncomingCallListener listener : mIncomingCallListeners) {
             listener.onIncomingCall(mInCallState, call);
         }
     }
 
     /**
+     * Called when a call becomes disconnected. Called everytime an existing call
+     * changes from being connected (incoming/outgoing/active) to disconnected.
+     */
+    @Override
+    public void onDisconnect(Call call) {
+        hideDialpadForDisconnect();
+        maybeShowErrorDialogOnDisconnect(call);
+
+        // We need to do the run the same code as onCallListChange.
+        onCallListChange(CallList.getInstance());
+    }
+
+    /**
      * Given the call list, return the state in which the in-call screen should be.
      */
     public static InCallState getPotentialStateFromCallList(CallList callList) {
@@ -223,7 +265,8 @@
             newState = InCallState.OUTGOING;
         } else if (callList.getActiveCall() != null ||
                 callList.getBackgroundCall() != null ||
-                callList.getDisconnectedCall() != null) {
+                callList.getDisconnectedCall() != null ||
+                callList.getDisconnectingCall() != null) {
             newState = InCallState.INCALL;
         }
 
@@ -266,6 +309,12 @@
      * Hangs up any active or outgoing calls.
      */
     public void hangUpOngoingCall() {
+        // By the time we receive this intent, we could be shut down and call list
+        // could be null.  Bail in those cases.
+        if (mCallList == null) {
+            return;
+        }
+
         Call call = mCallList.getOutgoingCall();
         if (call == null) {
             call = mCallList.getActiveOrBackgroundCall();
@@ -336,6 +385,117 @@
     }
 
     /**
+     * Handles the green CALL key while in-call.
+     * @return true if we consumed the event.
+     */
+    public boolean handleCallKey() {
+        Log.v(this, "handleCallKey");
+
+        // The green CALL button means either "Answer", "Unhold", or
+        // "Swap calls", or can be a no-op, depending on the current state
+        // of the Phone.
+
+        /**
+         * INCOMING CALL
+         */
+        final CallList calls = CallList.getInstance();
+        final Call incomingCall = calls.getIncomingCall();
+        Log.v(this, "incomingCall: " + incomingCall);
+
+        // (1) Attempt to answer a call
+        if (incomingCall != null) {
+            CallCommandClient.getInstance().answerCall(incomingCall.getCallId());
+            return true;
+        }
+
+        /**
+         * ACTIVE CALL
+         */
+        final Call activeCall = calls.getActiveCall();
+        if (activeCall != null) {
+            // TODO: This logic is repeated from CallButtonPresenter.java. We should
+            // consolidate this logic.
+            final boolean isGeneric = activeCall.can(Capabilities.GENERIC_CONFERENCE);
+            final boolean canMerge = activeCall.can(Capabilities.MERGE_CALLS);
+            final boolean canSwap = activeCall.can(Capabilities.SWAP_CALLS);
+
+            Log.v(this, "activeCall: " + activeCall + ", isGeneric: " + isGeneric + ", canMerge: " +
+                    canMerge + ", canSwap: " + canSwap);
+
+            // (2) Attempt actions on Generic conference calls
+            if (activeCall.isConferenceCall() && isGeneric) {
+                if (canMerge) {
+                    CallCommandClient.getInstance().merge();
+                    return true;
+                } else if (canSwap) {
+                    CallCommandClient.getInstance().swap();
+                    return true;
+                }
+            }
+
+            // (3) Swap calls
+            if (canSwap) {
+                CallCommandClient.getInstance().swap();
+                return true;
+            }
+        }
+
+        /**
+         * BACKGROUND CALL
+         */
+        final Call heldCall = calls.getBackgroundCall();
+        if (heldCall != null) {
+            // We have a hold call so presumeable it will always support HOLD...but
+            // there is no harm in double checking.
+            final boolean canHold = heldCall.can(Capabilities.HOLD);
+
+            Log.v(this, "heldCall: " + heldCall + ", canHold: " + canHold);
+
+            // (4) unhold call
+            if (heldCall.getState() == Call.State.ONHOLD && canHold) {
+                CallCommandClient.getInstance().hold(heldCall.getCallId(), false);
+                return true;
+            }
+        }
+
+        // Always consume hard keys
+        return true;
+    }
+
+    /**
+     * A dialog could have prevented in-call screen from being previously finished.
+     * This function checks to see if there should be any UI left and if not attempts
+     * to tear down the UI.
+     */
+    public void onDismissDialog() {
+        Log.i(this, "Dialog dismissed");
+        if (mInCallState == InCallState.NO_CALLS) {
+            attemptFinishActivity();
+            attemptCleanup();
+        }
+    }
+
+    /**
+     * For some disconnected causes, we show a dialog.  This calls into the activity to show
+     * the dialog if appropriate for the call.
+     */
+    private void maybeShowErrorDialogOnDisconnect(Call call) {
+        // For newly disconnected calls, we may want to show a dialog on specific error conditions
+        if (isActivityStarted() && call.getState() == Call.State.DISCONNECTED) {
+            mInCallActivity.maybeShowErrorDialogOnDisconnect(call.getDisconnectCause());
+        }
+    }
+
+    /**
+     * Hides the dialpad.  Called when a call is disconnected (Requires hiding dialpad).
+     */
+    private void hideDialpadForDisconnect() {
+        if (isActivityStarted()) {
+            mInCallActivity.hideDialpadForDisconnect();
+        }
+    }
+
+    /**
      * When the state of in-call changes, this is the first method to get called. It determines if
      * the UI needs to be started or finished depending on the new state and does it.
      */
@@ -402,27 +562,49 @@
             showInCall(false);
         } else if (startStartupSequence) {
             Log.i(this, "Start Full Screen in call UI");
-            mStatusBarNotifier.updateNotificationAndLaunchIncomingCallUi(newState, mCallList);
-        } else if (newState == InCallState.NO_CALLS) {
-            Log.i(this, "Hide in call UI");
 
-            // The new state is the no calls state.  Tear everything down.
-            if (mInCallActivity != null) {
-                if (isActivityStarted()) {
-                    mInCallActivity.finish();
-                }
+            // We're about the bring up the in-call UI for an incoming call. If we still have
+            // dialogs up, we need to clear them out before showing incoming screen.
+            if (isActivityStarted()) {
+                mInCallActivity.dismissPendingDialogs();
             }
+            startUi(newState);
+        } else if (newState == InCallState.NO_CALLS) {
+            // The new state is the no calls state.  Tear everything down.
+            attemptFinishActivity();
         }
 
         return newState;
     }
 
+    private void startUi(InCallState inCallState) {
+        final Call incomingCall = mCallList.getIncomingCall();
+        final boolean isCallWaiting = (incomingCall != null &&
+                incomingCall.getState() == Call.State.CALL_WAITING);
+
+        // If the screen is off, we need to make sure it gets turned on for incoming calls.
+        // This normally works just fine thanks to FLAG_TURN_SCREEN_ON but that only works
+        // when the activity is first created. Therefore, to ensure the screen is turned on
+        // for the call waiting case, we finish() the current activity and start a new one.
+        // There should be no jank from this since the screen is already off and will remain so
+        // until our new activity is up.
+        if (mProximitySensor.isScreenReallyOff() && isCallWaiting) {
+            if (isActivityStarted()) {
+                mInCallActivity.finish();
+            }
+            mInCallActivity = null;
+        }
+
+        mStatusBarNotifier.updateNotificationAndLaunchIncomingCallUi(inCallState, mCallList);
+    }
+
     /**
      * Checks to see if both the UI is gone and the service is disconnected. If so, tear it all
      * down.
      */
     private void attemptCleanup() {
-        boolean shouldCleanup = (mInCallActivity == null && !mServiceConnected);
+        boolean shouldCleanup = (mInCallActivity == null && !mServiceConnected &&
+                mInCallState == InCallState.NO_CALLS);
         Log.i(this, "attemptCleanup? " + shouldCleanup);
 
         if (shouldCleanup) {
diff --git a/InCallUI/src/com/android/incallui/ProximitySensor.java b/InCallUI/src/com/android/incallui/ProximitySensor.java
index 5895c29..5776b56 100644
--- a/InCallUI/src/com/android/incallui/ProximitySensor.java
+++ b/InCallUI/src/com/android/incallui/ProximitySensor.java
@@ -154,11 +154,20 @@
     }
 
     /**
+     * TODO: There is no way to determine if a screen is off due to proximity or if it is
+     * legitimately off, but if ever we can do that in the future, it would be useful here.
+     * Until then, this function will simply return true of the screen is off.
+     */
+    public boolean isScreenReallyOff() {
+        return !mPowerManager.isScreenOn();
+    }
+
+    /**
      * @return true if this device supports the "proximity sensor
      * auto-lock" feature while in-call (see updateProximitySensorMode()).
      */
     private boolean proximitySensorModeEnabled() {
-        // TODO(klp): Do we disable notification's expanded view when app is in foreground and
+        // TODO: Do we disable notification's expanded view when app is in foreground and
         // proximity sensor is on? Is it even possible to do this any more?
         return (mProximityWakeLock != null);
     }
@@ -216,8 +225,9 @@
                         .add("keybrd", mIsHardKeyboardOpen ? 1 : 0)
                         .add("dpad", mDialpadVisible ? 1 : 0)
                         .add("offhook", mIsPhoneOffhook ? 1 : 0)
-                        .add("aud", audioMode)
-                        .add("hor", horizontal ? 1 : 0).toString());
+                        .add("hor", horizontal ? 1 : 0)
+                        .add("ui", mUiShowing ? 1 : 0)
+                        .add("aud", AudioMode.toString(audioMode)).toString());
 
                 if (mIsPhoneOffhook && !screenOnImmediately) {
                     final String logStr = "turning on proximity sensor: ";
diff --git a/InCallUI/src/com/android/incallui/SmallerHitTargetTouchListener.java b/InCallUI/src/com/android/incallui/SmallerHitTargetTouchListener.java
new file mode 100644
index 0000000..83feaf5
--- /dev/null
+++ b/InCallUI/src/com/android/incallui/SmallerHitTargetTouchListener.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2012 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.incallui;
+
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * OnTouchListener used to shrink the "hit target" of some onscreen buttons.
+ *
+ * We do this for a few specific buttons which are vulnerable to
+ * "false touches" because either (1) they're near the edge of the
+ * screen and might be unintentionally touched while holding the
+ * device in your hand, (2) they're in the upper corners and might
+ * be touched by the user's ear before the prox sensor has a chance to
+ * kick in, or (3) they are close to other buttons.
+ */
+public class SmallerHitTargetTouchListener implements View.OnTouchListener {
+    private static final String TAG = "SmallerHitTargetTouchListener";
+
+    /**
+     * Edge dimensions where a touch does not register an action (in DIP).
+     */
+    private static final int HIT_TARGET_EDGE_IGNORE_DP_X = 30;
+    private static final int HIT_TARGET_EDGE_IGNORE_DP_Y = 10;
+    private static final int HIT_TARGET_MIN_SIZE_DP_X = HIT_TARGET_EDGE_IGNORE_DP_X * 3;
+    private static final int HIT_TARGET_MIN_SIZE_DP_Y = HIT_TARGET_EDGE_IGNORE_DP_Y * 3;
+
+    // True if the most recent DOWN event was a "hit".
+    boolean mDownEventHit;
+
+    /**
+     * Called when a touch event is dispatched to a view. This allows listeners to
+     * get a chance to respond before the target view.
+     *
+     * @return True if the listener has consumed the event, false otherwise.
+     *         (In other words, we return true when the touch is *outside*
+     *         the "smaller hit target", which will prevent the actual
+     *         button from handling these events.)
+     */
+    @Override
+    public boolean onTouch(View v, MotionEvent event) {
+        // if (DBG) log("SmallerHitTargetTouchListener: " + v + ", event " + event);
+
+        if (event.getAction() == MotionEvent.ACTION_DOWN) {
+            // Note that event.getX() and event.getY() are already
+            // translated into the View's coordinates.  (In other words,
+            // "0,0" is a touch on the upper-left-most corner of the view.)
+            final int touchX = (int) event.getX();
+            final int touchY = (int) event.getY();
+
+            final int viewWidth = v.getWidth();
+            final int viewHeight = v.getHeight();
+
+            final float pixelDensity = v.getResources().getDisplayMetrics().density;
+            final int targetMinSizeX = (int) (HIT_TARGET_MIN_SIZE_DP_X * pixelDensity);
+            final int targetMinSizeY = (int) (HIT_TARGET_MIN_SIZE_DP_Y * pixelDensity);
+
+            int edgeIgnoreX = (int) (HIT_TARGET_EDGE_IGNORE_DP_X * pixelDensity);
+            int edgeIgnoreY = (int) (HIT_TARGET_EDGE_IGNORE_DP_Y * pixelDensity);
+
+            // If we are dealing with smaller buttons where the dead zone defined by
+            // HIT_TARGET_EDGE_IGNORE_DP_[X|Y] is too large.
+            if (viewWidth < targetMinSizeX || viewHeight < targetMinSizeY) {
+                // This really should not happen given our two use cases (as of this writing)
+                // in the call edge button and secondary calling card. However, we leave
+                // this is as a precautionary measure.
+                Log.w(TAG, "onTouch: view is too small for SmallerHitTargetTouchListener");
+                edgeIgnoreX = 0;
+                edgeIgnoreY = 0;
+            }
+
+            final int minTouchX = edgeIgnoreX;
+            final int maxTouchX = viewWidth - edgeIgnoreX;
+            final int minTouchY = edgeIgnoreY;
+            final int maxTouchY = viewHeight - edgeIgnoreY;
+
+            if (touchX < minTouchX || touchX > maxTouchX ||
+                    touchY < minTouchY || touchY > maxTouchY) {
+                // Missed!
+                // if (DBG) log("  -> MISSED!");
+                mDownEventHit = false;
+                return true;  // Consume this event; don't let the button see it
+            } else {
+                // Hit!
+                // if (DBG) log("  -> HIT!");
+                mDownEventHit = true;
+                return false;  // Let this event through to the actual button
+            }
+        } else {
+            // This is a MOVE, UP or CANCEL event.
+            //
+            // We only do the "smaller hit target" check on DOWN events.
+            // For the subsequent MOVE/UP/CANCEL events, we let them
+            // through to the actual button IFF the previous DOWN event
+            // got through to the actual button (i.e. it was a "hit".)
+            return !mDownEventHit;
+        }
+    }
+}
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index b2593f9..1690c54 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -205,7 +205,7 @@
         // back. However, it can happen much later. Before we continue, we need to make sure that
         // the call being passed in is still the one we want to show in the notification.
         final Call call = getCallToShow(CallList.getInstance());
-        if (call.getCallId() != originalCall.getCallId()) {
+        if (call == null || call.getCallId() != originalCall.getCallId()) {
             return;
         }
 
@@ -251,8 +251,8 @@
 
         // Add hang up option for any active calls (active | onhold), outgoing calls (dialing).
         if (state == Call.State.ACTIVE ||
-                state == Call.State.DIALING ||
-                state == Call.State.ONHOLD) {
+                state == Call.State.ONHOLD ||
+                Call.State.isDialing(state)) {
             addHangupAction(builder);
         }
 
@@ -329,15 +329,24 @@
      * Gets a large icon from the contact info object to display in the notification.
      */
     private Bitmap getLargeIconToDisplay(ContactCacheEntry contactInfo, boolean isConference) {
+        Bitmap largeIcon = null;
         if (isConference) {
-            return BitmapFactory.decodeResource(mContext.getResources(),
+            largeIcon = BitmapFactory.decodeResource(mContext.getResources(),
                     R.drawable.picture_conference);
         }
         if (contactInfo.photo != null && (contactInfo.photo instanceof BitmapDrawable)) {
-            return ((BitmapDrawable) contactInfo.photo).getBitmap();
+            largeIcon = ((BitmapDrawable) contactInfo.photo).getBitmap();
         }
 
-        return null;
+        if (largeIcon != null) {
+            final int height = (int) mContext.getResources().getDimension(
+                    android.R.dimen.notification_large_icon_height);
+            final int width = (int) mContext.getResources().getDimension(
+                    android.R.dimen.notification_large_icon_width);
+            largeIcon = Bitmap.createScaledBitmap(largeIcon, width, height, false);
+        }
+
+        return largeIcon;
     }
 
     /**
@@ -370,7 +379,7 @@
         } else if (call.getState() == Call.State.ONHOLD) {
             resId = R.string.notification_on_hold;
 
-        } else if (call.getState() == Call.State.DIALING) {
+        } else if (Call.State.isDialing(call.getState())) {
             resId = R.string.notification_dialing;
         }
 
diff --git a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
index 942bf42..24303cd 100644
--- a/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
+++ b/InCallUI/src/com/android/incallui/service/PhoneNumberService.java
@@ -67,5 +67,6 @@
         public String getPhoneLabel();
         public String getNormalizedNumber();
         public String getImageUrl();
+        public boolean isBusiness();
     }
 }
diff --git a/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java b/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
index 3fc978a..a346ba5 100644
--- a/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
+++ b/InCallUI/src/com/android/incallui/widget/multiwaveview/GlowPadView.java
@@ -48,7 +48,7 @@
 /**
  * This is a copy of com.android.internal.widget.multiwaveview.GlowPadView with minor changes
  * to remove dependencies on private api's.
- * 
+ *
  * Incoporated the scaling functionality.
  *
  * A re-usable widget containing a center, outer ring and wave animation.
@@ -1114,9 +1114,9 @@
         final float placementWidth = getRingWidth();
         final float placementHeight = getRingHeight();
         float newWaveCenterX = mHorizontalInset
-                + Math.max(width, mMaxTargetWidth + placementWidth) / 2;
+                + (mMaxTargetWidth + placementWidth) / 2;
         float newWaveCenterY = mVerticalInset
-                + Math.max(height, + mMaxTargetHeight + placementHeight) / 2;
+                + (mMaxTargetHeight + placementHeight) / 2;
 
         if (mInitialLayout) {
             stopAndHideWaveAnimation();