Merge "Use a special method in SmsManager to have looser permissions."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ef7a812..dd6593b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -449,7 +449,6 @@
                 <action android:name="android.intent.action.VIEW" />
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.telecom.action.SHOW_CALL_SETTINGS" />
-                <action android:name="com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
@@ -575,6 +574,10 @@
         <activity android:name="com.android.phone.settings.VoicemailSettingsActivity"
             android:label="@string/voicemail"
             android:theme="@style/DialerSettingsLight">
+            <intent-filter >
+                <!-- DO NOT RENAME. There are existing apps which use this string. -->
+                <action android:name="com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL" />
+            </intent-filter>
         </activity>
 
         <!-- BroadcastReceiver for receiving Intents from Notification mechanism. -->
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 5111d50..7fede01 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -556,6 +556,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Raak weer om oop te maak"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Kon nie die boodskap dekodeer nie."</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index a8d7419..da71fd4 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"የአደጋ ጥሪዎችን ብቻ ለማድረግ"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM ካርድ፣ ማስገቢያ ቀዳዳ፦ <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ተደራሽነት"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ገቢ የWi-Fi ጥሪ"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"የWi-Fi ጥሪ"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"ለመክፈት ዳግም ይንኩ"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"መልዕክቱን በማመሳጠር ላይ ስህተት ነበር።"</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 1ded56e..b0ec167 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -559,10 +559,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"مكالمات الطوارئ فقط"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"‏شريحة SIM، المنفذ: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"إمكانية الوصول"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"‏مكالمة واردة عبر Wi-Fi"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"‏مكالمة عبر Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"المس مرة أخرى للفتح"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"حدث خطأ أثناء فك ترميز الرسالة."</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 2bdb198..659c169 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Докоснете отново за отваряне"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"При декодирането на съобщението възникна грешка."</string>
 </resources>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 770b9d1..f521234 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"শুধুমাত্র জরুরী কলিং"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM কার্ড, স্লট: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"অ্যাক্সেসযোগ্যতা"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"আগত Wi-Fi কল"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi কল"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"খোলার জন্য আবার স্পর্শ করুন"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"বার্তাটি ডিকোড করার সময় একটি ত্রুটি ঘটেছে৷"</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 77b2d26..474f3a0 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Toca-ho de nou per obrir"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"S\'ha produït un error en descodificar el missatge."</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index b2791e2..0550ffc 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Otevřete opětovným klepnutím"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Při dekódování zprávy došlo k chybě."</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 48316d7..4d85f1d 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tryk igen for at åbne"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Der opstod en fejl under afkodning af beskeden."</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 907ad4a..79e3477 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -556,6 +556,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Zum Öffnen erneut berühren"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Beim Entschlüsseln der Nachricht ist ein Fehler aufgetreten."</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 802a0b5..f00043c 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Αγγίξτε ξανά για άνοιγμα"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Παρουσιάστηκε κάποιο σφάλμα κατά την αποκωδικοποίηση του μηνύματος."</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index d73c2f5..38b1937 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Vuelve a tocar para realizar la acción."</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Se produjo un error al decodificar el mensaje."</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 042783b..d5f1189 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -556,6 +556,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Vuelve a tocar para abrir"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Se ha producido un error al decodificar el mensaje."</string>
 </resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 56d5736..95a3530 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Avamiseks puudutage uuesti"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Sõnumi dekodeerimisel ilmnes viga."</string>
 </resources>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index d8ebd8f..beac948 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -553,11 +553,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Larrialdi-deiak soilik"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM txartela, <xliff:g id="SLOT_ID">%s</xliff:g> erretena"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Erabilerraztasuna"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Sarrerako Wi-Fi deia"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi deia"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Irekitzeko, ukitu berriro"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Errore bat gertatu mezua deskodetzean."</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index b072c26..d2ff3a2 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"فقط تماس‌های اضطراری"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"سیم‌کارت، شکاف: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"دسترس‌پذیری"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"‏تماس Wi-Fi ورودی"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"‏تماس Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"لمس دوباره برای باز کردن"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"هنگام رمزگشایی پیام، خطایی روی داد."</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 1cb207e..02733dd 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -556,6 +556,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Avaa koskettamalla uudelleen."</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Virhe purettaessa viestiä."</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 32fae1c..91190a5 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -556,6 +556,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Touchez à nouveau pour ouvrir"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Une erreur s\'est produite lors du décodage du message."</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 77ad660..bc69a29 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Appuyer à nouveau pour ouvrir"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Une erreur s\'est produite lors du décodage du message."</string>
 </resources>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 98f8529..1152a05 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Só chamadas de emerxencia"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"Tarxeta SIM, rañura: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Accesibilidade"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Chamada wifi entrante"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Chamada wifi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Toca outra vez para abrir"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Produciuse un erro durante a descodificación da mensaxe."</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 3e5ebb6..f59ce03 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"केवल आपातकालीन कॉल"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"सिम कार्ड, स्‍लॉट: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"सरल उपयोग"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"इनकमिंग वाई-फ़ाई कॉल"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"वाई-फ़ाई कॉल"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"खोलने के लिए पुन: स्पर्श करें"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"संदेश डीकोड करते समय कोई त्रुटि हुई थी."</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index fa3f9f6..9f0dfb1 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -555,6 +555,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Dodirnite ponovo da biste otvorili"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Došlo je do pogreške prilikom dekodiranja poruke."</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index a01680b..5744463 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Érintse meg ismét a megnyitáshoz"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Hiba történt az üzenet dekódolása közben."</string>
 </resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 4ac6d54..0d3143c 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Կրկին հպեք՝ բացելու համար"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Հաղորդագրությունը ապակոդավորելիս սխալ է տեղի է ունեցել:"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 5dc606e..7cbc6ae 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -547,10 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Hanya untuk panggilan darurat"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Aksesibilitas"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Panggilan Wi-Fi masuk"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Panggilan Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Sentuh lagi untuk membuka"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"Terjadi kesalahan saat melakukan dekode pesan."</string>
 </resources>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 864e35d..9450c5b 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Snertu aftur til að opna"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Villa kom upp við að afkóða skeytið."</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 4b2ca13..5d73a44 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -556,6 +556,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tocca di nuovo per aprire"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Si è verificato un errore durante la decodifica del messaggio."</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 73e5e91..4ab92c1 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -553,10 +553,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"שיחות חירום בלבד"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"‏כרטיס SIM, חריץ: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"נגישות"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"‏שיחת Wi-Fi נכנסת"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"‏שיחת Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"גע שוב כדי לפתוח"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"אירעה שגיאה בעת פענוח ההודעה."</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 8ab9eea..152f44f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"開くにはもう一度タップしてください"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"メッセージのデコード中にエラーが発生しました。"</string>
 </resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 32ac74a..e3df07d 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"შეეხეთ ისევ გასახსნელად"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"შეტყობინების გაშიფრვისას წარმოიშვა შეცდომა."</string>
 </resources>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 2eb44fe..0d08c08 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Ашу үшін қайтадан түртіңіз"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Хабарды кодтан шығару кезінде қате пайда болды."</string>
 </resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 4a4a9fd..a58061f 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"សម្រាប់ការហៅពេលអាសន្នប៉ុណ្ណោះ"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"ស៊ីមកាត រន្ធ៖ <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"លទ្ធភាពប្រើប្រាស់"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"មានការហៅចូលមកតាម Wi-Fi"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"ហៅតាម Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"ប៉ះ​ម្ដង​ទៀត​ដើម្បី​បើក"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"មានកំហុសខណៈពេលឌិកូដសារ។"</string>
 </resources>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 75c690b..8e328b8 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"ತುರ್ತು ಕರೆ ಮಾಡುವಿಕೆ ಮಾತ್ರ"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM ಕಾರ್ಡ್, ಸ್ಲಾಟ್: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ಪ್ರವೇಶಿಸುವಿಕೆ"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ಒಳಬರುವ ವೈ-ಫೈ ಕರೆ"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"ವೈ-ಫೈ ಕರೆ"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"ತೆರೆಯಲು ಮತ್ತೊಮ್ಮೆ ಸ್ಪರ್ಶಿಸಿ"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"ಸಂದೇಶವನ್ನು ಡೀಕೋಡ್ ಮಾಡುವಾಗ ದೋಷವುಂಟಾಗಿದೆ."</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 3575201..6e8e516 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"다시 터치하여 열기"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"메시지를 디코딩하는 동안 오류가 발생했습니다."</string>
 </resources>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 444cd0d..c9c1de0 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -833,6 +833,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Ачуу үчүн кайра тийиңиз"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Билдирүү дешифрленип жатканда ката кеткен."</string>
 </resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index e9c7e6b..fe6a97d 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -547,10 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"ການ​ໂທ​ສຸກ​ເສີນ​ເທົ່າ​ນັ້ນ"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"ແຜ່ນ SIM, ຊ່ອງ: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"​ການ​ຊ່ວຍ​ເຂົ້າ​ເຖິງ"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ສາຍໂທເຂົ້າ Wi-Fi"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"ການ​ໂທ Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"​ແຕະ​ອີກ​ເທື່ອ​ນຶ່ງ​ເພື່ອ​ເປີດ"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"ມີຂໍ້ຜິດພາດໃນລະຫວ່າງຖອດລະຫັດຂໍ້ຄວາມດັ່ງກ່າວ."</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index ad64d3e..6f5ef1e 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Palieskite dar kartą, kad atidarytumėte"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Iškoduojant pranešimą įvyko klaida."</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index b2a2863..7db901d 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -557,6 +557,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Lai atvērtu, pieskarieties vēlreiz."</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Atšifrējot ziņojumu, radās kļūda."</string>
 </resources>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index 71e56d1..321f680 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Допрете повторно за да отворите"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Настана грешка при дешифрирање на пораката."</string>
 </resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index b98d197..9fe121c 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"അടിയന്തിര കോൾചെയ്യൽ മാത്രം"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM കാർഡ്, സ്ലോട്ട്: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"പ്രവേശനക്ഷമത"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ഇൻകമിംഗ് Wi-Fi കോൾ"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi കോൾ"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"തുറക്കുന്നതിന് വീണ്ടും സ്‌പർശിക്കുക"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"സന്ദേശം ഡീകോഡുചെയ്യുമ്പോൾ ഒരു പിശകുണ്ടായി."</string>
 </resources>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index c985bb6..5141624 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"केवळ आणीबाणी कॉल करणे"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"सिम कार्ड, स्लॉट: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"प्रवेशयोग्यता"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"येणारा वाय-फाय कॉल"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"वाय-फाय कॉल"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"उघडण्यासाठी पुन्हा स्पर्श करा"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"संदेश डीकोड करताना एक त्रुटी आली."</string>
 </resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 99335b7..343d079 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Panggilan kecemasan sahaja"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"Kad SIM, slot: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Kebolehaksesan"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Panggilan Wi-Fi masuk"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Panggilan Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Sentuh lagi untuk membuka"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Terdapat ralat semasa menyahkodkan mesej."</string>
 </resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index 5a07782..4de03fc 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -547,10 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"အရေးပေါ် ခေါ်ဆိုမှုသာလျှင်"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM ကဒ်၊ အပေါက်: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ရယူသုံးနိုင်မှု"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ဝင်လာသော ဝိုင်ဖိုင်ခေါ်ဆိုမှု"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"ဝိုင်ဖိုင်ခေါ်ဆိုမှု"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"ဖွင့်ရန် ထပ်ပြီး ထိပါ"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"စာကို ကုဒ်ဖွင့်နေစဉ် အမှားရှိခဲ့သည်။"</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 74f5179..4d292a9 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Trykk på nytt for å åpne"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Det oppsto en feil under dekoding av meldingen."</string>
 </resources>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index 809c99c..ea36209 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"आपातकालीन कल मात्र"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM कार्ड, स्लट: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"पहुँचता"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"आगमन Wi-Fi कल"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi कल"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"खोल्न फेरि छुनुहोस्"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"सन्देश डिकोड गर्दा एउटा समस्या भयो।"</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 9ef70b9..0486e14 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tik nogmaals om te openen"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Er is een fout opgetreden tijdens het decoderen van het bericht."</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index a769f7b..1027620 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Kliknij ponownie, by otworzyć"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Podczas dekodowania wiadomości wystąpił błąd."</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index b60ecdd..a65d6c1 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tocar novamente para abrir"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Ocorreu um erro durante a descodificação da mensagem."</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 1a601d9..f273918 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Somente chamadas de emergência"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"Cartão SIM, slot: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Acessibilidade"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Chamada por Wi-Fi recebida"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Chamada por Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Toque novamente para abrir"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Ocorreu um erro ao decodificar a mensagem."</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 8c6874a..70dc5a8 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -555,6 +555,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Atingeți din nou pentru a deschide"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"A apărut o eroare la decodificarea mesajului."</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index f999607..e3f24a4 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -560,6 +560,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Нажмите ещё раз, чтобы открыть"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"При расшифровке сообщения произошла ошибка."</string>
 </resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 07e74f2..6c8a9a7 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -547,10 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"හදිස්සි ඇමතූම් පමණි"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM කාඩ්පත්, තව්ව: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ප්‍රවේශ්‍යතාව"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"පැමිණෙන Wi-Fi ඇමතුම"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi-ඇමතුම"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"විවෘත කිරීමට නැවත ස්පර්ශ කරන්න"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"පණිවිඩය විකේතනය කරන අතරතුර දෝෂයක් සිදු විය."</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index ed51079..a4f2291 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Dotaknite se znova, če želite odpreti"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Napaka pri dekodiranju sporočila."</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 11cbfd8..a229162 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -555,6 +555,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Додирните поново да бисте отворили"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Дошло је до грешке при декодирању поруке."</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 067be4f..ff56d53 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Tryck igen för att öppna"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Ett fel inträffade när meddelandet avkodades."</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 41600fa..abd2fda 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -547,10 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Simu za dharula pekee"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM kadi, nafasi: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Zana za walio na matatizo ya kuona au kusikia"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Simu ya Wi-Fi inayoingia"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Simu ya Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Gusa tena ili ufungue"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"Hitilafu imetokea wakati wa usimbuaji wa ujumbe."</string>
 </resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 8277b73..33465c0 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"அவசர அழைப்பு மட்டுமே"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"சிம் கார்டு, ஸ்லாட்: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"அணுகல் தன்மை"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"உள்வரும் வைஃபை அழைப்பு"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"வைஃபை அழைப்பு"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"திறக்க, மீண்டும் தட்டவும்"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"செய்தியைக் குறிவிலக்கும்போது பிழை ஏற்பட்டது."</string>
 </resources>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 0c150e2..590be8e 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"అత్యవసర కాలింగ్ మాత్రమే"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM కార్డ్, స్లాట్: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"ప్రాప్యత సామర్థ్యం"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"ఇన్‌కమింగ్ Wi-Fi కాల్"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi కాల్"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"తెరవడానికి మళ్లీ తాకండి"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"సందేశాన్ని డీకోడ్ చేస్తున్నప్పుడు లోపం సంభవించింది."</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index b93f8be..b72fab4 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"แตะอีกครั้งเพื่อเปิด"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"เกิดข้อผิดพลาดขณะถอดรหัสข้อความ"</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 6556863..9c7d855 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -547,11 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Emergency na pagtawag lang"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM card, slot: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Pagiging Naa-access"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Papasok na tawag sa Wi-Fi"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Tawag sa Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Pinduting muli upang buksan"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Nagkaroon ng error habang dine-decode ang mensahe."</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index aae6127..99f570a 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Açmak için tekrar dokunun"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"İletinin kodu çözülürken bir hata oluştu."</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 8ffdd95..84d9bd5 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -553,11 +553,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Лише екстрені виклики"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM-карта, роз’єм: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Спеціальні можливості"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Вхід. дзвінок через Wi-Fi"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Дзвінок через Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Торкніться знову, щоб відкрити"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Під час розшифрування повідомлення сталася помилка."</string>
 </resources>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index d8833cf..4e107b7 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"کھولنے کیلئے دوبارہ ٹچ کریں"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"پیغام کو ڈیکوڈ کرتے وقت ایک خرابی پیش آ گئی۔"</string>
 </resources>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index ace849c..3e303b4 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -547,10 +547,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Faqat favqulodda qo‘ng‘iroqlar"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM karta, teshik: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Maxsus imkoniyatlar"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Kiruvchi Wi-Fi qo‘ng‘irog‘i"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi qo‘ng‘irog‘i"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Ochish uchun yana bosing"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"Xabarni kodsizlashda xatolik yuz berdi."</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index aedc496..00fddfd 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Chạm lại để mở"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"Đã xảy ra lỗi khi giải mã thư."</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 9f5c638..3aa8ee9 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -552,6 +552,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"再次触摸即可打开"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"解码邮件时出错。"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 28e94ba..0f34b96 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -553,11 +553,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"只限緊急通話"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"SIM 卡,插槽:<xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"無障礙功能"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Wi-Fi 來電"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Wi-Fi 通話"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"再次輕觸以開啟"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"為訊息解碼時發生錯誤。"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 9195035..3a2b84a 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -558,6 +558,5 @@
     <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
     <skip />
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"再次輕觸即可開啟"</string>
-    <!-- no translation found for message_decode_error (3456481534066924855) -->
-    <skip />
+    <string name="message_decode_error" msgid="3456481534066924855">"為郵件解碼時發生錯誤。"</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index fa8f982..79bcf32 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -551,10 +551,8 @@
     <string name="sim_description_emergency_calls" msgid="7535215397212301562">"Ikholi ephuthumayo kuphela"</string>
     <string name="sim_description_default" msgid="4778679519938775515">"Ikhadi le-SIM, isilothi: <xliff:g id="SLOT_ID">%s</xliff:g>"</string>
     <string name="accessibility_settings_activity_title" msgid="8562004288733103868">"Ukufinyeleleka"</string>
-    <!-- no translation found for status_hint_label_incoming_wifi_call (8772915926382037499) -->
-    <skip />
-    <!-- no translation found for status_hint_label_wifi_call (8900805254974653903) -->
-    <skip />
+    <string name="status_hint_label_incoming_wifi_call" msgid="8772915926382037499">"Ikholi ye-Wi-Fi engenayo"</string>
+    <string name="status_hint_label_wifi_call" msgid="8900805254974653903">"Ikholi ye-Wi-Fi"</string>
     <string name="emergency_action_launch_hint" msgid="5841511849007540970">"Thinta futhi ukuze uvule"</string>
     <string name="message_decode_error" msgid="3456481534066924855">"Kube nephutha ngenkathi kukhishwa ikhodi kumlayezo."</string>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ab56faf..e49310d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -171,6 +171,8 @@
     <string name="connection_service_default_label">Built-in connection service</string>
     <!-- Call settings screen, setting option name -->
     <string name="voicemail">Voicemail</string>
+    <!-- Title of the "Voicemail" settings screen, with a text label identifying which SIM the settings are for. -->
+    <string name="voicemail_settings_with_label">Voicemail (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
     <!-- Call forwarding dialog box, voicemail number prefix -->
     <string name="voicemail_abbreviated">VM:</string>
     <!-- Mobile network settings screen, setting option name -->
@@ -182,7 +184,7 @@
     <!-- GSM Call settings screen, setting option name -->
     <string name="additional_gsm_call_settings">Additional settings</string>
     <!-- GSM Call settings screen, setting option name, with label identifying the SIM the settings are for. -->
-    <string name="additional_gsm_call_settings_with_label">Additional settings (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+    <string name="additional_gsm_call_settings_with_label">Additional settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
     <!-- GSM-only Call settings screen, setting option name-->
     <string name="sum_gsm_call_settings">Additional GSM only call settings</string>
     <!-- CDMA Call settings screen, setting option name -->
@@ -210,7 +212,7 @@
     <!-- Call forwarding settings screen, section heading -->
     <string name="call_forwarding_settings">Call forwarding settings</string>
     <!-- Call forwarding settings screen, section heading, with a label identifying the SIM the settings are for. -->
-    <string name="call_forwarding_settings_with_label">Call forwarding settings (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+    <string name="call_forwarding_settings_with_label">Call forwarding settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
     <!-- Call settings screen, setting option name -->
     <string name="labelCF">Call forwarding</string>
 
@@ -266,7 +268,7 @@
     <!-- Toast in Call settings when asked to launch settings for a secondary user -->
     <string name="call_settings_primary_user_only">Call settings can only be changed by the primary user.</string>
     <!-- Title of the "Call settings" settings screen, with a text label identifying which SIM the settings are for. -->
-    <string name="call_settings_with_label">Call settings (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+    <string name="call_settings_with_label">Call settings (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
     <!-- Title of the alert dialog displayed if an error occurs while updating Call settings -->
     <string name="error_updating_title">Call settings error</string>
     <!-- Toast in Call settings dialog while settings are being read -->
@@ -720,13 +722,13 @@
     <string name="fdn">Fixed Dialing Numbers</string>
     <!-- Title for "Fixed Dialing Number" settings, with a label to identify the SIM the settings
         apply to. -->
-    <string name="fdn_with_label">Fixed Dialing Numbers (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+    <string name="fdn_with_label">Fixed Dialing Numbers (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
 
     <!-- Call settings screen, button label that takes you to the Fixed Dialing Number management screen -->
     <string name="manage_fdn_list">FDN list</string>
     <!-- Title for settings screen to manage Fixed Dialing Number contacts, with a label to identify
          the SIM the settings apply to. -->
-    <string name="fdn_list_with_label">FDN list (<xliff:g id="subscriptionlabel" example="Verizon">%s</xliff:g>)</string>
+    <string name="fdn_list_with_label">FDN list (<xliff:g id="subscriptionlabel" example="Mock Carrier">%s</xliff:g>)</string>
     <!-- Call settings screen, preference item label -->
     <string name="fdn_activation">FDN activation</string>
     <!-- Call settings setting option name when FDN is enabled -->
diff --git a/res/xml/call_feature_setting.xml b/res/xml/call_feature_setting.xml
index 714f994..f696e2c 100644
--- a/res/xml/call_feature_setting.xml
+++ b/res/xml/call_feature_setting.xml
@@ -29,53 +29,7 @@
 
     <PreferenceScreen
         android:key="button_voicemail_category_key"
-        android:title="@string/voicemail"
-        android:persistent="false">
-
-        <com.android.phone.settings.VoicemailProviderListPreference
-            android:key="button_voicemail_provider_key"
-            android:title="@string/voicemail_provider"
-            android:summary="@string/sum_voicemail_choose_provider"
-            android:defaultValue=""
-            android:persistent="true" />
-
-        <PreferenceScreen
-            android:key="button_voicemail_setting_key"
-            android:title="@string/voicemail_settings"
-            android:persistent="false">
-
-            <!-- Note for all com.android.phone.EditPhoneNumberPreference objects
-
-                 The last several attributes are for use with the EditText field
-                 in the dialog.  These attributes are forwarded to that field
-                 when the edittext is created.  The attributes include:
-                 1. android:singleLine
-                 2. android:autoText
-                 3. android:background -->
-
-            <com.android.phone.EditPhoneNumberPreference
-                android:key="button_voicemail_key"
-                android:title="@string/voicemail_settings_number_label"
-                android:persistent="false"
-                android:dialogTitle="@string/voicemail"
-                phone:confirmMode="confirm"
-                android:singleLine="true"
-                android:autoText="false" />
-
-        </PreferenceScreen>
-
-        <com.android.phone.settings.VoicemailRingtonePreference
-            android:key="@string/voicemail_notification_ringtone_key"
-            android:title="@string/voicemail_notification_ringtone_title"
-            android:persistent="false"
-            android:ringtoneType="notification" />
-
-        <CheckBoxPreference
-            android:key="@string/voicemail_notification_vibrate_key"
-            android:title="@string/voicemail_notification_vibrate_when_title"
-            android:persistent="true" />
-
-    </PreferenceScreen>
+        android:title="@string/voicemail" />
 
     <PreferenceScreen
         android:key="button_fdn_key"
diff --git a/res/xml/voicemail_settings.xml b/res/xml/voicemail_settings.xml
index f4679e5..a7d5fb4 100644
--- a/res/xml/voicemail_settings.xml
+++ b/res/xml/voicemail_settings.xml
@@ -15,9 +15,50 @@
 -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:phone="http://schemas.android.com/apk/res/com.android.phone"
     android:title="@string/voicemail">
 
-    <!-- Temporary placeholder until prefs are migrated from Call Settings. -->
-    <Preference android:title="@string/voicemail" />
+    <com.android.phone.settings.VoicemailProviderListPreference
+        android:key="button_voicemail_provider_key"
+        android:title="@string/voicemail_provider"
+        android:summary="@string/sum_voicemail_choose_provider"
+        android:defaultValue=""
+        android:persistent="true" />
+
+    <PreferenceScreen
+        android:key="button_voicemail_setting_key"
+        android:title="@string/voicemail_settings"
+        android:persistent="false">
+
+        <!-- Note for all com.android.phone.EditPhoneNumberPreference objects
+
+             The last several attributes are for use with the EditText field
+             in the dialog.  These attributes are forwarded to that field
+             when the edittext is created.  The attributes include:
+             1. android:singleLine
+             2. android:autoText
+             3. android:background -->
+
+        <com.android.phone.EditPhoneNumberPreference
+            android:key="button_voicemail_key"
+            android:title="@string/voicemail_settings_number_label"
+            android:persistent="false"
+            android:dialogTitle="@string/voicemail"
+            phone:confirmMode="confirm"
+            android:singleLine="true"
+            android:autoText="false" />
+
+    </PreferenceScreen>
+
+    <com.android.phone.settings.VoicemailRingtonePreference
+        android:key="@string/voicemail_notification_ringtone_key"
+        android:title="@string/voicemail_notification_ringtone_title"
+        android:persistent="false"
+        android:ringtoneType="notification" />
+
+    <CheckBoxPreference
+        android:key="@string/voicemail_notification_vibrate_key"
+        android:title="@string/voicemail_notification_vibrate_when_title"
+        android:persistent="true" />
 
 </PreferenceScreen>
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index a3270e8..81781cb 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -25,18 +25,13 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.database.Cursor;
-import android.os.AsyncResult;
 import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
 import android.os.UserHandle;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
-import android.provider.ContactsContract.CommonDataKinds;
 import android.provider.Settings;
 import android.telecom.PhoneAccountHandle;
 import android.telecom.TelecomManager;
@@ -44,7 +39,6 @@
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.MenuItem;
-import android.widget.ListAdapter;
 import android.widget.Toast;
 
 import com.android.ims.ImsConfig;
@@ -54,26 +48,13 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.phone.common.util.SettingsUtil;
 import com.android.phone.settings.AccountSelectionPreference;
-import com.android.phone.settings.CallForwardInfoUtil;
-import com.android.phone.settings.SettingsConstants;
-import com.android.phone.settings.VoicemailDialogUtil;
-import com.android.phone.settings.VoicemailNotificationSettingsUtil;
-import com.android.phone.settings.VoicemailProviderListPreference;
-import com.android.phone.settings.VoicemailProviderListPreference.VoicemailProvider;
-import com.android.phone.settings.VoicemailProviderSettings;
-import com.android.phone.settings.VoicemailProviderSettingsUtil;
-import com.android.phone.settings.VoicemailRingtonePreference;
+import com.android.phone.settings.VoicemailSettingsActivity;
 import com.android.phone.settings.fdn.FdnSetting;
 import com.android.services.telephony.sip.SipUtil;
 
 import java.lang.String;
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
 /**
  * Top level "Call settings" UI; see res/xml/call_feature_setting.xml
@@ -90,57 +71,15 @@
  * For the "Mobile network settings" screen under the main Settings app,
  * See {@link MobileNetworkSettings}.
  *
- * TODO: Settings should be split into PreferenceFragments where possible (ie. voicemail).
- *
  * @see com.android.phone.MobileNetworkSettings
  */
 public class CallFeaturesSetting extends PreferenceActivity
-        implements DialogInterface.OnClickListener,
-                Preference.OnPreferenceChangeListener,
-                EditPhoneNumberPreference.OnDialogClosedListener,
-                EditPhoneNumberPreference.GetDefaultNumberListener {
+        implements Preference.OnPreferenceChangeListener {
     private static final String LOG_TAG = "CallFeaturesSetting";
     private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
     // STOPSHIP if true. Flag to override behavior default behavior to hide VT setting.
     private static final boolean ENABLE_VT_FLAG = false;
 
-    /**
-     * Intent action to bring up Voicemail Provider settings.
-     *
-     * @see #IGNORE_PROVIDER_EXTRA
-     */
-    public static final String ACTION_ADD_VOICEMAIL =
-            "com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL";
-    // intent action sent by this activity to a voice mail provider
-    // to trigger its configuration UI
-    public static final String ACTION_CONFIGURE_VOICEMAIL =
-            "com.android.phone.CallFeaturesSetting.CONFIGURE_VOICEMAIL";
-    // Extra put in the return from VM provider config containing voicemail number to set
-    public static final String VM_NUMBER_EXTRA = "com.android.phone.VoicemailNumber";
-    // Extra put in the return from VM provider config containing call forwarding number to set
-    public static final String FWD_NUMBER_EXTRA = "com.android.phone.ForwardingNumber";
-    // Extra put in the return from VM provider config containing call forwarding number to set
-    public static final String FWD_NUMBER_TIME_EXTRA = "com.android.phone.ForwardingNumberTime";
-    // If the VM provider returns non null value in this extra we will force the user to
-    // choose another VM provider
-    public static final String SIGNOUT_EXTRA = "com.android.phone.Signout";
-
-    /**
-     * String Extra put into ACTION_ADD_VOICEMAIL call to indicate which provider should be hidden
-     * in the list of providers presented to the user. This allows a provider which is being
-     * disabled (e.g. GV user logging out) to force the user to pick some other provider.
-     */
-    public static final String IGNORE_PROVIDER_EXTRA = "com.android.phone.ProviderToIgnore";
-
-    /**
-     * String Extra put into ACTION_ADD_VOICEMAIL to indicate that the voicemail setup screen should
-     * be opened.
-     */
-    public static final String SETUP_VOICEMAIL_EXTRA = "com.android.phone.SetupVoicemail";
-
-    // string constants
-    private static final String NUM_PROJECTION[] = {CommonDataKinds.Phone.NUMBER};
-
     // String keys for preference lookup
     // TODO: Naming these "BUTTON_*" is confusing since they're not actually buttons(!)
     // TODO: Consider moving these strings to strings.xml, so that they are not duplicated here and
@@ -148,13 +87,8 @@
     // persistent, they are used as the key to store shared preferences and the name should not be
     // changed unless the settings are also migrated.
     private static final String VOICEMAIL_SETTING_SCREEN_PREF_KEY = "button_voicemail_category_key";
-    private static final String BUTTON_VOICEMAIL_KEY = "button_voicemail_key";
-    private static final String BUTTON_VOICEMAIL_PROVIDER_KEY = "button_voicemail_provider_key";
-    private static final String BUTTON_VOICEMAIL_SETTING_KEY = "button_voicemail_setting_key";
     private static final String BUTTON_FDN_KEY   = "button_fdn_key";
-
     private static final String BUTTON_RETRY_KEY       = "button_auto_retry_key";
-
     private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key";
     private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key";
     private static final String CALL_FORWARDING_KEY = "call_forwarding_key";
@@ -165,119 +99,13 @@
 
     private static final String ENABLE_VIDEO_CALLING_KEY = "button_enable_video_calling";
 
-    /** Event for Async voicemail change call */
-    private static final int EVENT_VOICEMAIL_CHANGED        = 500;
-    private static final int EVENT_FORWARDING_CHANGED       = 501;
-    private static final int EVENT_FORWARDING_GET_COMPLETED = 502;
-
-    /** Handle to voicemail pref */
-    private static final int VOICEMAIL_PREF_ID = 1;
-    private static final int VOICEMAIL_PROVIDER_CFG_ID = 2;
-
     private Phone mPhone;
-
     private SubscriptionInfoHelper mSubscriptionInfoHelper;
 
-    private EditPhoneNumberPreference mSubMenuVoicemailSettings;
-
     private CheckBoxPreference mButtonAutoRetry;
-    private VoicemailProviderListPreference mVoicemailProviders;
     private PreferenceScreen mVoicemailSettingsScreen;
-    private PreferenceScreen mVoicemailSettings;
-    private VoicemailRingtonePreference mVoicemailNotificationRingtone;
-    private CheckBoxPreference mVoicemailNotificationVibrate;
     private CheckBoxPreference mEnableVideoCalling;
 
-    /**
-     * Results of reading forwarding settings
-     */
-    private CallForwardInfo[] mForwardingReadResults = null;
-
-    /**
-     * Result of forwarding number change.
-     * Keys are reasons (eg. unconditional forwarding).
-     */
-    private Map<Integer, AsyncResult> mForwardingChangeResults = null;
-
-    /**
-     * Expected CF read result types.
-     * This set keeps track of the CF types for which we've issued change
-     * commands so we can tell when we've received all of the responses.
-     */
-    private Collection<Integer> mExpectedChangeResultReasons = null;
-
-    /**
-     * Result of vm number change
-     */
-    private AsyncResult mVoicemailChangeResult = null;
-
-    /**
-     * Previous VM provider setting so we can return to it in case of failure.
-     */
-    private String mPreviousVMProviderKey = null;
-
-    /**
-     * Id of the dialog being currently shown.
-     */
-    private int mCurrentDialogId = 0;
-
-    /**
-     * Flag indicating that we are invoking settings for the voicemail provider programmatically
-     * due to vm provider change.
-     */
-    private boolean mVMProviderSettingsForced = false;
-
-    /**
-     * Flag indicating that we are making changes to vm or fwd numbers
-     * due to vm provider change.
-     */
-    private boolean mChangingVMorFwdDueToProviderChange = false;
-
-    /**
-     * True if we are in the process of vm & fwd number change and vm has already been changed.
-     * This is used to decide what to do in case of rollback.
-     */
-    private boolean mVMChangeCompletedSuccessfully = false;
-
-    /**
-     * True if we had full or partial failure setting forwarding numbers and so need to roll them
-     * back.
-     */
-    private boolean mFwdChangesRequireRollback = false;
-
-    /**
-     * Id of error msg to display to user once we are done reverting the VM provider to the previous
-     * one.
-     */
-    private int mVMOrFwdSetError = 0;
-
-    /** string to hold old voicemail number as it is being updated. */
-    private String mOldVmNumber;
-
-    // New call forwarding settings and vm number we will be setting
-    // Need to save these since before we get to saving we need to asynchronously
-    // query the existing forwarding settings.
-    private CallForwardInfo[] mNewFwdSettings;
-    private String mNewVMNumber;
-
-    private boolean mForeground;
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mForeground = false;
-    }
-
-    /**
-     * Used to indicate that the voicemail preference should be shown.
-     */
-    private boolean mShowVoicemailPreference = false;
-
-    /**
-     * Used to indicate that the voicemail setup screen should be shown.
-     */
-    private boolean mSetupVoicemail = false;
-
     /*
      * Click Listeners, handle click based on objects attached to UI.
      */
@@ -285,44 +113,11 @@
     // Click listener for all toggle events
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-        if (preference == mSubMenuVoicemailSettings) {
-            return true;
-        } else if (preference == mButtonAutoRetry) {
+        if (preference == mButtonAutoRetry) {
             android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(),
                     android.provider.Settings.Global.CALL_AUTO_RETRY,
                     mButtonAutoRetry.isChecked() ? 1 : 0);
             return true;
-        } else if (preference.getKey().equals(mVoicemailSettings.getKey())) {
-            // Check key instead of comparing reference because closing the voicemail notification
-            // ringtone dialog invokes onResume(), but leaves the old preference screen up,
-            // TODO: Revert to checking reference after migrating voicemail to its own activity.
-            if (DBG) log("onPreferenceTreeClick: Voicemail Settings Preference is clicked.");
-
-            final Dialog dialog = ((PreferenceScreen) preference).getDialog();
-            if (dialog != null) {
-                dialog.getActionBar().setDisplayHomeAsUpEnabled(false);
-            }
-
-            if (preference.getIntent() != null) {
-                if (DBG) log("Invoking cfg intent " + preference.getIntent().getPackage());
-
-                // onActivityResult() will be responsible for resetting some of variables.
-                this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
-                return true;
-            } else {
-                if (DBG) log("onPreferenceTreeClick(). No intent; use default behavior in xml.");
-
-                // onActivityResult() will not be called, so reset variables here.
-                mPreviousVMProviderKey = VoicemailProviderListPreference.DEFAULT_KEY;
-                mVMProviderSettingsForced = false;
-                return false;
-            }
-        } else if (preference == mVoicemailSettingsScreen) {
-            final Dialog dialog = mVoicemailSettingsScreen.getDialog();
-            if (dialog != null) {
-                dialog.getActionBar().setDisplayHomeAsUpEnabled(false);
-            }
-            return false;
         }
         return false;
     }
@@ -339,40 +134,7 @@
     public boolean onPreferenceChange(Preference preference, Object objValue) {
         if (DBG) log("onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\"");
 
-        if (preference == mVoicemailProviders) {
-            final String newProviderKey = (String) objValue;
-
-            // If previous provider key and the new one is same, we don't need to handle it.
-            if (mPreviousVMProviderKey.equals(newProviderKey)) {
-                if (DBG) log("No change is made to the VM provider setting.");
-                return true;
-            }
-            updateVMPreferenceWidgets(newProviderKey);
-
-            final VoicemailProviderSettings newProviderSettings =
-                    VoicemailProviderSettingsUtil.load(this, newProviderKey);
-
-            // If the user switches to a voice mail provider and we have numbers stored for it we
-            // will automatically change the phone's voice mail and forwarding number to the stored
-            // ones. Otherwise we will bring up provider's configuration UI.
-            if (newProviderSettings == null) {
-                // Force the user into a configuration of the chosen provider
-                Log.w(LOG_TAG, "Saved preferences not found - invoking config");
-                mVMProviderSettingsForced = true;
-                simulatePreferenceClick(mVoicemailSettings);
-            } else {
-                if (DBG) log("Saved preferences found - switching to them");
-                // Set this flag so if we get a failure we revert to previous provider
-                mChangingVMorFwdDueToProviderChange = true;
-                saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
-            }
-        } else if (preference.getKey().equals(mVoicemailNotificationVibrate.getKey())) {
-            // Check key instead of comparing reference because closing the voicemail notification
-            // ringtone dialog invokes onResume(), but leaves the old preference screen up,
-            // TODO: Revert to checking reference after migrating voicemail to its own activity.
-            VoicemailNotificationSettingsUtil.setVibrationEnabled(
-                    mPhone, Boolean.TRUE.equals(objValue));
-        } else if (preference == mEnableVideoCalling) {
+        if (preference == mEnableVideoCalling) {
             if (ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())) {
                 PhoneGlobals.getInstance().phoneMgr.enableVideoCalling((boolean) objValue);
             } else {
@@ -401,667 +163,6 @@
     }
 
     @Override
-    public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
-        if (DBG) log("onDialogClosed: Button clicked is " + buttonClicked);
-
-        if (buttonClicked == DialogInterface.BUTTON_NEGATIVE) {
-            return;
-        }
-
-        if (preference == mSubMenuVoicemailSettings) {
-            VoicemailProviderSettings newSettings = new VoicemailProviderSettings(
-                    mSubMenuVoicemailSettings.getPhoneNumber(),
-                    VoicemailProviderSettings.NO_FORWARDING);
-            saveVoiceMailAndForwardingNumber(mVoicemailProviders.getKey(), newSettings);
-        }
-    }
-
-    /**
-     * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
-     * This method set the default values for the various
-     * EditPhoneNumberPreference dialogs.
-     */
-    @Override
-    public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
-        if (preference == mSubMenuVoicemailSettings) {
-            // update the voicemail number field, which takes care of the
-            // mSubMenuVoicemailSettings itself, so we should return null.
-            if (DBG) log("updating default for voicemail dialog");
-            updateVoiceNumberField();
-            return null;
-        }
-
-        String vmDisplay = mPhone.getVoiceMailNumber();
-        if (TextUtils.isEmpty(vmDisplay)) {
-            // if there is no voicemail number, we just return null to
-            // indicate no contribution.
-            return null;
-        }
-
-        // Return the voicemail number prepended with "VM: "
-        if (DBG) log("updating default for call forwarding dialogs");
-        return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
-    }
-
-    private void switchToPreviousVoicemailProvider() {
-        if (DBG) log("switchToPreviousVoicemailProvider " + mPreviousVMProviderKey);
-
-        if (mPreviousVMProviderKey == null) {
-            return;
-        }
-
-        if (mVMChangeCompletedSuccessfully || mFwdChangesRequireRollback) {
-            showDialogIfForeground(VoicemailDialogUtil.VM_REVERTING_DIALOG);
-            final VoicemailProviderSettings prevSettings =
-                    VoicemailProviderSettingsUtil.load(this, mPreviousVMProviderKey);
-            if (prevSettings == null) {
-                Log.e(LOG_TAG, "VoicemailProviderSettings for the key \""
-                        + mPreviousVMProviderKey + "\" is null but should be loaded.");
-            }
-
-            if (mVMChangeCompletedSuccessfully) {
-                mNewVMNumber = prevSettings.getVoicemailNumber();
-                Log.i(LOG_TAG, "VM change is already completed successfully."
-                        + "Have to revert VM back to " + mNewVMNumber + " again.");
-                mPhone.setVoiceMailNumber(
-                        mPhone.getVoiceMailAlphaTag().toString(),
-                        mNewVMNumber,
-                        Message.obtain(mRevertOptionComplete, EVENT_VOICEMAIL_CHANGED));
-            }
-
-            if (mFwdChangesRequireRollback) {
-                Log.i(LOG_TAG, "Requested to rollback forwarding changes.");
-
-                final CallForwardInfo[] prevFwdSettings = prevSettings.getForwardingSettings();
-                if (prevFwdSettings != null) {
-                    Map<Integer, AsyncResult> results = mForwardingChangeResults;
-                    resetForwardingChangeState();
-                    for (int i = 0; i < prevFwdSettings.length; i++) {
-                        CallForwardInfo fi = prevFwdSettings[i];
-                        if (DBG) log("Reverting fwd #: " + i + ": " + fi.toString());
-                        // Only revert the settings for which the update succeeded.
-                        AsyncResult result = results.get(fi.reason);
-                        if (result != null && result.exception == null) {
-                            mExpectedChangeResultReasons.add(fi.reason);
-                            CallForwardInfoUtil.setCallForwardingOption(mPhone, fi,
-                                    mRevertOptionComplete.obtainMessage(
-                                            EVENT_FORWARDING_CHANGED, i, 0));
-                        }
-                    }
-                }
-            }
-        } else {
-            if (DBG) log("No need to revert");
-            onRevertDone();
-        }
-    }
-
-    private void onRevertDone() {
-        if (DBG) log("onRevertDone: Changing provider key back to " + mPreviousVMProviderKey);
-
-        updateVMPreferenceWidgets(mPreviousVMProviderKey);
-        updateVoiceNumberField();
-        if (mVMOrFwdSetError != 0) {
-            showDialogIfForeground(mVMOrFwdSetError);
-            mVMOrFwdSetError = 0;
-        }
-    }
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (DBG) {
-            log("onActivityResult: requestCode: " + requestCode
-                    + ", resultCode: " + resultCode
-                    + ", data: " + data);
-        }
-
-        // there are cases where the contact picker may end up sending us more than one
-        // request.  We want to ignore the request if we're not in the correct state.
-        if (requestCode == VOICEMAIL_PROVIDER_CFG_ID) {
-            boolean failure = false;
-
-            // No matter how the processing of result goes lets clear the flag
-            if (DBG) log("mVMProviderSettingsForced: " + mVMProviderSettingsForced);
-            final boolean isVMProviderSettingsForced = mVMProviderSettingsForced;
-            mVMProviderSettingsForced = false;
-
-            String vmNum = null;
-            if (resultCode != RESULT_OK) {
-                if (DBG) log("onActivityResult: vm provider cfg result not OK.");
-                failure = true;
-            } else {
-                if (data == null) {
-                    if (DBG) log("onActivityResult: vm provider cfg result has no data");
-                    failure = true;
-                } else {
-                    if (data.getBooleanExtra(SIGNOUT_EXTRA, false)) {
-                        if (DBG) log("Provider requested signout");
-                        if (isVMProviderSettingsForced) {
-                            if (DBG) log("Going back to previous provider on signout");
-                            switchToPreviousVoicemailProvider();
-                        } else {
-                            final String victim = mVoicemailProviders.getKey();
-                            if (DBG) log("Relaunching activity and ignoring " + victim);
-                            Intent i = new Intent(ACTION_ADD_VOICEMAIL);
-                            i.putExtra(IGNORE_PROVIDER_EXTRA, victim);
-                            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-                            this.startActivity(i);
-                        }
-                        return;
-                    }
-                    vmNum = data.getStringExtra(VM_NUMBER_EXTRA);
-                    if (vmNum == null || vmNum.length() == 0) {
-                        if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
-                        failure = true;
-                    }
-                }
-            }
-            if (failure) {
-                if (DBG) log("Failure in return from voicemail provider.");
-                if (isVMProviderSettingsForced) {
-                    switchToPreviousVoicemailProvider();
-                }
-
-                return;
-            }
-            mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
-            final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
-
-            // TODO: It would be nice to load the current network setting for this and
-            // send it to the provider when it's config is invoked so it can use this as default
-            final int fwdNumTime = data.getIntExtra(FWD_NUMBER_TIME_EXTRA, 20);
-
-            if (DBG) log("onActivityResult: cfg result has forwarding number " + fwdNum);
-            saveVoiceMailAndForwardingNumber(mVoicemailProviders.getKey(),
-                    new VoicemailProviderSettings(vmNum, fwdNum, fwdNumTime));
-            return;
-        }
-
-        if (requestCode == VOICEMAIL_PREF_ID) {
-            if (resultCode != RESULT_OK) {
-                if (DBG) log("onActivityResult: contact picker result not OK.");
-                return;
-            }
-
-            Cursor cursor = null;
-            try {
-                cursor = getContentResolver().query(data.getData(),
-                    NUM_PROJECTION, null, null, null);
-                if ((cursor == null) || (!cursor.moveToFirst())) {
-                    if (DBG) log("onActivityResult: bad contact data, no results found.");
-                    return;
-                }
-                mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
-                return;
-            } finally {
-                if (cursor != null) {
-                    cursor.close();
-                }
-            }
-        }
-
-        super.onActivityResult(requestCode, resultCode, data);
-    }
-
-    /**
-     * Wrapper around showDialog() that will silently do nothing if we're
-     * not in the foreground.
-     *
-     * This is useful here because most of the dialogs we display from
-     * this class are triggered by asynchronous events (like
-     * success/failure messages from the telephony layer) and it's
-     * possible for those events to come in even after the user has gone
-     * to a different screen.
-     */
-    // TODO: this is too brittle: it's still easy to accidentally add new
-    // code here that calls showDialog() directly (which will result in a
-    // WindowManager$BadTokenException if called after the activity has
-    // been stopped.)
-    //
-    // It would be cleaner to do the "if (mForeground)" check in one
-    // central place, maybe by using a single Handler for all asynchronous
-    // events (and have *that* discard events if we're not in the
-    // foreground.)
-    //
-    // Unfortunately it's not that simple, since we sometimes need to do
-    // actual work to handle these events whether or not we're in the
-    // foreground (see the Handler code in mSetOptionComplete for
-    // example.)
-    //
-    // TODO: It's a bit worrisome that we don't do anything in error cases when we're not in the
-    // foreground. Consider displaying a toast instead.
-    private void showDialogIfForeground(int id) {
-        if (mForeground) {
-            showDialog(id);
-        }
-    }
-
-    private void dismissDialogSafely(int id) {
-        try {
-            dismissDialog(id);
-        } catch (IllegalArgumentException e) {
-            // This is expected in the case where we were in the background
-            // at the time we would normally have shown the dialog, so we didn't
-            // show it.
-        }
-    }
-
-    /**
-     * TODO: Refactor to make it easier to understand what's done in the different stages.
-     */
-    private void saveVoiceMailAndForwardingNumber(
-            String key, VoicemailProviderSettings newSettings) {
-        if (DBG) log("saveVoiceMailAndForwardingNumber: " + newSettings.toString());
-        mNewVMNumber = newSettings.getVoicemailNumber();
-        mNewVMNumber = (mNewVMNumber == null) ? "" : mNewVMNumber;
-        mNewFwdSettings = newSettings.getForwardingSettings();
-
-        // Call forwarding is not suppported on CDMA.
-        if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
-            if (DBG) log("Ignoring forwarding setting since this is CDMA phone");
-            mNewFwdSettings = VoicemailProviderSettings.NO_FORWARDING;
-        }
-
-        // Throw a warning if the voicemail is the same and we did not change forwarding.
-        if (mNewVMNumber.equals(mOldVmNumber)
-                && mNewFwdSettings == VoicemailProviderSettings.NO_FORWARDING) {
-            showDialogIfForeground(VoicemailDialogUtil.VM_NOCHANGE_ERROR_DIALOG);
-            return;
-        }
-
-        VoicemailProviderSettingsUtil.save(this, key, newSettings);
-        mVMChangeCompletedSuccessfully = false;
-        mFwdChangesRequireRollback = false;
-        mVMOrFwdSetError = 0;
-
-        if (mNewFwdSettings == VoicemailProviderSettings.NO_FORWARDING
-                || key.equals(mPreviousVMProviderKey)) {
-            if (DBG) log("Set voicemail number. No changes to forwarding number.");
-            setVoicemailNumberWithCarrier();
-        } else {
-            if (DBG) log("Reading current forwarding settings.");
-            int numSettingsReasons = VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS.length;
-            mForwardingReadResults = new CallForwardInfo[numSettingsReasons];
-            for (int i = 0; i < mForwardingReadResults.length; i++) {
-                mPhone.getCallForwardingOption(
-                        VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS[i],
-                        mGetOptionComplete.obtainMessage(EVENT_FORWARDING_GET_COMPLETED, i, 0));
-            }
-            showDialogIfForeground(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
-        }
-
-        PhoneGlobals.getInstance().refreshMwiIndicator(mSubscriptionInfoHelper.getSubId());
-    }
-
-    private final Handler mGetOptionComplete = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            AsyncResult result = (AsyncResult) msg.obj;
-            switch (msg.what) {
-                case EVENT_FORWARDING_GET_COMPLETED:
-                    handleForwardingSettingsReadResult(result, msg.arg1);
-                    break;
-            }
-        }
-    };
-
-    private void handleForwardingSettingsReadResult(AsyncResult ar, int idx) {
-        if (DBG) Log.d(LOG_TAG, "handleForwardingSettingsReadResult: " + idx);
-
-        Throwable error = null;
-        if (ar.exception != null) {
-            error = ar.exception;
-            if (DBG) Log.d(LOG_TAG, "FwdRead: ar.exception=" + error.getMessage());
-        }
-        if (ar.userObj instanceof Throwable) {
-            error = (Throwable) ar.userObj;
-            if (DBG) Log.d(LOG_TAG, "FwdRead: userObj=" + error.getMessage());
-        }
-
-        // We may have already gotten an error and decided to ignore the other results.
-        if (mForwardingReadResults == null) {
-            if (DBG) Log.d(LOG_TAG, "Ignoring fwd reading result: " + idx);
-            return;
-        }
-
-        // In case of error ignore other results, show an error dialog
-        if (error != null) {
-            if (DBG) Log.d(LOG_TAG, "Error discovered for fwd read : " + idx);
-            mForwardingReadResults = null;
-            dismissDialogSafely(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
-            showDialogIfForeground(VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG);
-            return;
-        }
-
-        // Get the forwarding info.
-        mForwardingReadResults[idx] = CallForwardInfoUtil.getCallForwardInfo(
-                (CallForwardInfo[]) ar.result,
-                VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS[idx]);
-
-        // Check if we got all the results already
-        boolean done = true;
-        for (int i = 0; i < mForwardingReadResults.length; i++) {
-            if (mForwardingReadResults[i] == null) {
-                done = false;
-                break;
-            }
-        }
-
-        if (done) {
-            if (DBG) Log.d(LOG_TAG, "Done receiving fwd info");
-            dismissDialogSafely(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
-
-            if (mPreviousVMProviderKey.equals(VoicemailProviderListPreference.DEFAULT_KEY)) {
-                VoicemailProviderSettingsUtil.save(mPhone.getContext(),
-                        VoicemailProviderListPreference.DEFAULT_KEY,
-                        new VoicemailProviderSettings(mOldVmNumber, mForwardingReadResults));
-            }
-            saveVoiceMailAndForwardingNumberStage2();
-        }
-    }
-
-    private void resetForwardingChangeState() {
-        mForwardingChangeResults = new HashMap<Integer, AsyncResult>();
-        mExpectedChangeResultReasons = new HashSet<Integer>();
-    }
-
-    // Called after we are done saving the previous forwarding settings if we needed.
-    private void saveVoiceMailAndForwardingNumberStage2() {
-        mForwardingChangeResults = null;
-        mVoicemailChangeResult = null;
-
-        resetForwardingChangeState();
-        for (int i = 0; i < mNewFwdSettings.length; i++) {
-            CallForwardInfo fi = mNewFwdSettings[i];
-            CallForwardInfo fiForReason =
-                    CallForwardInfoUtil.infoForReason(mForwardingReadResults, fi.reason);
-            final boolean doUpdate = CallForwardInfoUtil.isUpdateRequired(fiForReason, fi);
-
-            if (doUpdate) {
-                if (DBG) log("Setting fwd #: " + i + ": " + fi.toString());
-                mExpectedChangeResultReasons.add(i);
-
-                CallForwardInfoUtil.setCallForwardingOption(mPhone, fi,
-                        mSetOptionComplete.obtainMessage(
-                                EVENT_FORWARDING_CHANGED, fi.reason, 0));
-            }
-        }
-        showDialogIfForeground(VoicemailDialogUtil.VM_FWD_SAVING_DIALOG);
-    }
-
-    private void setVoicemailNumberWithCarrier() {
-        if (DBG) log("save voicemail #: " + mNewVMNumber);
-
-        mVoicemailChangeResult = null;
-        mPhone.setVoiceMailNumber(
-                mPhone.getVoiceMailAlphaTag().toString(),
-                mNewVMNumber,
-                Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
-    }
-
-    /**
-     * Callback to handle option update completions
-     */
-    private final Handler mSetOptionComplete = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            AsyncResult result = (AsyncResult) msg.obj;
-            boolean done = false;
-            switch (msg.what) {
-                case EVENT_VOICEMAIL_CHANGED:
-                    mVoicemailChangeResult = result;
-                    mVMChangeCompletedSuccessfully = isVmChangeSuccess();
-                    done = true;
-                    break;
-                case EVENT_FORWARDING_CHANGED:
-                    mForwardingChangeResults.put(msg.arg1, result);
-                    if (result.exception != null) {
-                        Log.w(LOG_TAG, "Error in setting fwd# " + msg.arg1 + ": " +
-                                result.exception.getMessage());
-                    }
-                    if (isForwardingCompleted()) {
-                        if (isFwdChangeSuccess()) {
-                            if (DBG) log("Overall fwd changes completed ok, starting vm change");
-                            setVoicemailNumberWithCarrier();
-                        } else {
-                            Log.w(LOG_TAG, "Overall fwd changes completed in failure. " +
-                                    "Check if we need to try rollback for some settings.");
-                            mFwdChangesRequireRollback = false;
-                            Iterator<Map.Entry<Integer,AsyncResult>> it =
-                                mForwardingChangeResults.entrySet().iterator();
-                            while (it.hasNext()) {
-                                Map.Entry<Integer,AsyncResult> entry = it.next();
-                                if (entry.getValue().exception == null) {
-                                    // If at least one succeeded we have to revert
-                                    Log.i(LOG_TAG, "Rollback will be required");
-                                    mFwdChangesRequireRollback = true;
-                                    break;
-                                }
-                            }
-                            if (!mFwdChangesRequireRollback) {
-                                Log.i(LOG_TAG, "No rollback needed.");
-                            }
-                            done = true;
-                        }
-                    }
-                    break;
-                default:
-                    // TODO: should never reach this, may want to throw exception
-            }
-
-            if (done) {
-                if (DBG) log("All VM provider related changes done");
-                if (mForwardingChangeResults != null) {
-                    dismissDialogSafely(VoicemailDialogUtil.VM_FWD_SAVING_DIALOG);
-                }
-                handleSetVmOrFwdMessage();
-            }
-        }
-    };
-
-    /**
-     * Callback to handle option revert completions
-     */
-    private final Handler mRevertOptionComplete = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            AsyncResult result = (AsyncResult) msg.obj;
-            switch (msg.what) {
-                case EVENT_VOICEMAIL_CHANGED:
-                    if (DBG) log("VM revert complete msg");
-                    mVoicemailChangeResult = result;
-                    break;
-
-                case EVENT_FORWARDING_CHANGED:
-                    if (DBG) log("FWD revert complete msg ");
-                    mForwardingChangeResults.put(msg.arg1, result);
-                    if (result.exception != null) {
-                        if (DBG) log("Error in reverting fwd# " + msg.arg1 + ": " +
-                                result.exception.getMessage());
-                    }
-                    break;
-
-                default:
-                    // TODO: should never reach this, may want to throw exception
-            }
-
-            final boolean done = (!mVMChangeCompletedSuccessfully || mVoicemailChangeResult != null)
-                    && (!mFwdChangesRequireRollback || isForwardingCompleted());
-            if (done) {
-                if (DBG) log("All VM reverts done");
-                dismissDialogSafely(VoicemailDialogUtil.VM_REVERTING_DIALOG);
-                onRevertDone();
-            }
-        }
-    };
-
-    /**
-     * Return true if there is a change result for every reason for which we expect a result.
-     */
-    private boolean isForwardingCompleted() {
-        if (mForwardingChangeResults == null) {
-            return true;
-        }
-
-        for (Integer reason : mExpectedChangeResultReasons) {
-            if (mForwardingChangeResults.get(reason) == null) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    private boolean isFwdChangeSuccess() {
-        if (mForwardingChangeResults == null) {
-            return true;
-        }
-
-        for (AsyncResult result : mForwardingChangeResults.values()) {
-            Throwable exception = result.exception;
-            if (exception != null) {
-                String msg = exception.getMessage();
-                msg = (msg != null) ? msg : "";
-                Log.w(LOG_TAG, "Failed to change forwarding setting. Reason: " + msg);
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean isVmChangeSuccess() {
-        if (mVoicemailChangeResult.exception != null) {
-            String msg = mVoicemailChangeResult.exception.getMessage();
-            msg = (msg != null) ? msg : "";
-            Log.w(LOG_TAG, "Failed to change voicemail. Reason: " + msg);
-            return false;
-        }
-        return true;
-    }
-
-    private void handleSetVmOrFwdMessage() {
-        if (DBG) log("handleSetVMMessage: set VM request complete");
-
-        if (!isFwdChangeSuccess()) {
-            handleVmOrFwdSetError(VoicemailDialogUtil.FWD_SET_RESPONSE_ERROR_DIALOG);
-        } else if (!isVmChangeSuccess()) {
-            handleVmOrFwdSetError(VoicemailDialogUtil.VM_RESPONSE_ERROR_DIALOG);
-        } else {
-            handleVmAndFwdSetSuccess(VoicemailDialogUtil.VM_CONFIRM_DIALOG);
-        }
-    }
-
-    /**
-     * Called when Voicemail Provider or its forwarding settings failed. Rolls back partly made
-     * changes to those settings and show "failure" dialog.
-     *
-     * @param dialogId ID of the dialog to show for the specific error case. Either
-     *     {@link #FWD_SET_RESPONSE_ERROR_DIALOG} or {@link #VM_RESPONSE_ERROR_DIALOG}
-     */
-    private void handleVmOrFwdSetError(int dialogId) {
-        if (mChangingVMorFwdDueToProviderChange) {
-            mVMOrFwdSetError = dialogId;
-            mChangingVMorFwdDueToProviderChange = false;
-            switchToPreviousVoicemailProvider();
-            return;
-        }
-        mChangingVMorFwdDueToProviderChange = false;
-        showDialogIfForeground(dialogId);
-        updateVoiceNumberField();
-    }
-
-    /**
-     * Called when Voicemail Provider and its forwarding settings were successfully finished.
-     * This updates a bunch of variables and show "success" dialog.
-     */
-    private void handleVmAndFwdSetSuccess(int dialogId) {
-        if (DBG) log("handleVmAndFwdSetSuccess: key is " + mVoicemailProviders.getKey());
-
-        mPreviousVMProviderKey = mVoicemailProviders.getKey();
-        mChangingVMorFwdDueToProviderChange = false;
-        showDialogIfForeground(dialogId);
-        updateVoiceNumberField();
-    }
-
-    /**
-     * Update the voicemail number from what we've recorded on the sim.
-     */
-    private void updateVoiceNumberField() {
-        if (DBG) log("updateVoiceNumberField()");
-
-        mOldVmNumber = mPhone.getVoiceMailNumber();
-        if (TextUtils.isEmpty(mOldVmNumber)) {
-            mSubMenuVoicemailSettings.setPhoneNumber("");
-            mSubMenuVoicemailSettings.setSummary(getString(R.string.voicemail_number_not_set));
-        } else {
-            mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
-            mSubMenuVoicemailSettings.setSummary(mOldVmNumber);
-        }
-    }
-
-    /*
-     * Helper Methods for Activity class.
-     * The initial query commands are split into two pieces now
-     * for individual expansion.  This combined with the ability
-     * to cancel queries allows for a much better user experience,
-     * and also ensures that the user only waits to update the
-     * data that is relevant.
-     */
-
-    @Override
-    protected void onPrepareDialog(int id, Dialog dialog) {
-        super.onPrepareDialog(id, dialog);
-        mCurrentDialogId = id;
-    }
-
-    // dialog creation method, called by showDialog()
-    @Override
-    protected Dialog onCreateDialog(int dialogId) {
-        return VoicemailDialogUtil.getDialog(this, dialogId);
-    }
-
-    // This is a method implemented for DialogInterface.OnClickListener.
-    // Used with the error dialog to close the app, voicemail dialog to just dismiss.
-    // Close button is mapped to BUTTON_POSITIVE for the errors that close the activity,
-    // while those that are mapped to BUTTON_NEUTRAL only move the preference focus.
-    public void onClick(DialogInterface dialog, int which) {
-        if (DBG) log("onClick: button clicked is " + which);
-
-        dialog.dismiss();
-        switch (which){
-            case DialogInterface.BUTTON_NEGATIVE:
-                if (mCurrentDialogId == VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG) {
-                    // We failed to get current forwarding settings and the user
-                    // does not wish to continue.
-                    switchToPreviousVoicemailProvider();
-                }
-                break;
-            case DialogInterface.BUTTON_POSITIVE:
-                if (mCurrentDialogId == VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG) {
-                    // We failed to get current forwarding settings but the user
-                    // wishes to continue changing settings to the new vm provider
-                    setVoicemailNumberWithCarrier();
-                } else {
-                    finish();
-                }
-                return;
-            default:
-                // just let the dialog close and go back to the input
-        }
-
-        // In all dialogs, all buttons except BUTTON_POSITIVE lead to the end of user interaction
-        // with settings UI. If we were called to explicitly configure voice mail then
-        // we finish the settings activity here to come back to whatever the user was doing.
-        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
-            finish();
-        }
-    }
-
-    /*
-     * Activity class methods
-     */
-
-    @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         if (DBG) log("onCreate: Intent is " + getIntent());
@@ -1074,13 +175,6 @@
             return;
         }
 
-        // Show the voicemail preference in onResume if the calling intent specifies the
-        // ACTION_ADD_VOICEMAIL action.
-        mShowVoicemailPreference = (icicle == null) &&
-                TextUtils.equals(getIntent().getAction(), ACTION_ADD_VOICEMAIL);
-        mSetupVoicemail = mShowVoicemailPreference &&
-                getIntent().getBooleanExtra(SETUP_VOICEMAIL_EXTRA, false);
-
         mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent());
         mSubscriptionInfoHelper.setActionBarTitle(
                 getActionBar(), getResources(), R.string.call_settings_with_label);
@@ -1090,7 +184,6 @@
     @Override
     protected void onResume() {
         super.onResume();
-        mForeground = true;
 
         PreferenceScreen preferenceScreen = getPreferenceScreen();
         if (preferenceScreen != null) {
@@ -1110,32 +203,12 @@
         }
 
         PreferenceScreen prefSet = getPreferenceScreen();
-        mSubMenuVoicemailSettings = (EditPhoneNumberPreference) findPreference(BUTTON_VOICEMAIL_KEY);
-        mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
-        mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
-        mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
-
-        mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
-
-        mVoicemailProviders = (VoicemailProviderListPreference) findPreference(
-                BUTTON_VOICEMAIL_PROVIDER_KEY);
-        mVoicemailProviders.init(mPhone, getIntent());
-        mVoicemailProviders.setOnPreferenceChangeListener(this);
-        mPreviousVMProviderKey = mVoicemailProviders.getValue();
-
         mVoicemailSettingsScreen =
                 (PreferenceScreen) findPreference(VOICEMAIL_SETTING_SCREEN_PREF_KEY);
-        mVoicemailSettings = (PreferenceScreen) findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
+        mVoicemailSettingsScreen.setIntent(mSubscriptionInfoHelper.getIntent(
+                VoicemailSettingsActivity.class));
 
-        mVoicemailNotificationRingtone = (VoicemailRingtonePreference) findPreference(
-                getResources().getString(R.string.voicemail_notification_ringtone_key));
-        mVoicemailNotificationRingtone.init(mPhone);
-
-        mVoicemailNotificationVibrate = (CheckBoxPreference) findPreference(
-                getResources().getString(R.string.voicemail_notification_vibrate_key));
-        mVoicemailNotificationVibrate.setOnPreferenceChangeListener(this);
-
-        updateVMPreferenceWidgets(mVoicemailProviders.getValue());
+        mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY);
 
         mEnableVideoCalling = (CheckBoxPreference) findPreference(ENABLE_VIDEO_CALLING_KEY);
 
@@ -1191,32 +264,6 @@
             }
         }
 
-        // check the intent that started this activity and pop up the voicemail
-        // dialog if we've been asked to.
-        // If we have at least one non default VM provider registered then bring up
-        // the selection for the VM provider, otherwise bring up a VM number dialog.
-        // We only bring up the dialog the first time we are called (not after orientation change)
-        if (mShowVoicemailPreference) {
-            if (DBG) log("ACTION_ADD_VOICEMAIL Intent is thrown");
-            if (mSetupVoicemail) {
-                simulatePreferenceClick(mVoicemailSettingsScreen);
-                mSetupVoicemail = false;
-            } else if (mVoicemailProviders.hasMoreThanOneVoicemailProvider()) {
-                if (DBG) log("Voicemail data has more than one provider.");
-                simulatePreferenceClick(mVoicemailProviders);
-            } else {
-                onPreferenceChange(mVoicemailProviders, VoicemailProviderListPreference.DEFAULT_KEY);
-                mVoicemailProviders.setValue(VoicemailProviderListPreference.DEFAULT_KEY);
-            }
-            mShowVoicemailPreference = false;
-        }
-
-        updateVoiceNumberField();
-        mVMProviderSettingsForced = false;
-
-        mVoicemailNotificationVibrate.setChecked(
-                VoicemailNotificationSettingsUtil.isVibrationEnabled(mPhone));
-
         if (ImsManager.isVtEnabledByPlatform(mPhone.getContext()) && ENABLE_VT_FLAG) {
             boolean currentValue =
                     ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())
@@ -1274,58 +321,6 @@
         Log.d(LOG_TAG, msg);
     }
 
-    /**
-     * Updates the look of the VM preference widgets based on current VM provider settings.
-     * Note that the provider name is loaded fxrorm the found activity via loadLabel in
-     * {@link VoicemailProviderListPreference#initVoiceMailProviders()} in order for it to be
-     * localizable.
-     */
-    private void updateVMPreferenceWidgets(String currentProviderSetting) {
-        final String key = currentProviderSetting;
-        final VoicemailProvider provider = mVoicemailProviders.getVoicemailProvider(key);
-
-        /* This is the case when we are coming up on a freshly wiped phone and there is no
-         persisted value for the list preference mVoicemailProviders.
-         In this case we want to show the UI asking the user to select a voicemail provider as
-         opposed to silently falling back to default one. */
-        if (provider == null) {
-            if (DBG) log("updateVMPreferenceWidget: key: " + key + " -> null.");
-
-            mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
-            mVoicemailSettings.setEnabled(false);
-            mVoicemailSettings.setIntent(null);
-            mVoicemailNotificationVibrate.setEnabled(false);
-        } else {
-            if (DBG) log("updateVMPreferenceWidget: key: " + key + " -> " + provider.toString());
-
-            final String providerName = provider.name;
-            mVoicemailProviders.setSummary(providerName);
-            mVoicemailSettings.setEnabled(true);
-            mVoicemailSettings.setIntent(provider.intent);
-            mVoicemailNotificationVibrate.setEnabled(true);
-        }
-    }
-
-
-    /**
-     * Simulates user clicking on a passed preference.
-     * Usually needed when the preference is a dialog preference and we want to invoke
-     * a dialog for this preference programmatically.
-     * TODO: figure out if there is a cleaner way to cause preference dlg to come up
-     */
-    private void simulatePreferenceClick(Preference preference) {
-        // Go through settings until we find our setting
-        // and then simulate a click on it to bring up the dialog
-        final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
-        for (int idx = 0; idx < adapter.getCount(); idx++) {
-            if (adapter.getItem(idx) == preference) {
-                getPreferenceScreen().onItemClick(this.getListView(),
-                        null, idx, adapter.getItemId(idx));
-                break;
-            }
-        }
-    }
-
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         final int itemId = item.getItemId();
diff --git a/src/com/android/phone/EditPhoneNumberPreference.java b/src/com/android/phone/EditPhoneNumberPreference.java
index 86671a8..8a672f1 100644
--- a/src/com/android/phone/EditPhoneNumberPreference.java
+++ b/src/com/android/phone/EditPhoneNumberPreference.java
@@ -94,7 +94,7 @@
      * DialogPreference.onDialogClosed(), except we also pass in a buttonClicked
      * value indicating which of the three possible buttons were pressed.
      */
-    interface OnDialogClosedListener {
+    public interface OnDialogClosedListener {
         void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked);
     }
 
@@ -102,7 +102,7 @@
      * Interface for the default number setting listener.  Handles requests for
      * the default display number for the dialog.
      */
-    interface GetDefaultNumberListener {
+    public interface GetDefaultNumberListener {
         /**
          * Notify that we are looking for a default display value.
          * @return null if there is no contribution from this interface,
diff --git a/src/com/android/phone/ErrorDialogActivity.java b/src/com/android/phone/ErrorDialogActivity.java
index 4635f86..bf09376 100644
--- a/src/com/android/phone/ErrorDialogActivity.java
+++ b/src/com/android/phone/ErrorDialogActivity.java
@@ -23,6 +23,8 @@
 import android.os.Bundle;
 import android.util.Log;
 
+import com.android.phone.settings.VoicemailSettingsActivity;
+
 /**
  * Used to display an error dialog from within the Telephony service when an outgoing call fails
  */
@@ -105,8 +107,8 @@
         }
 
         // navigate to the Voicemail setting in the Call Settings activity.
-        Intent intent = new Intent(CallFeaturesSetting.ACTION_ADD_VOICEMAIL);
-        intent.setClass(this, CallFeaturesSetting.class);
+        Intent intent = new Intent(VoicemailSettingsActivity.ACTION_ADD_VOICEMAIL);
+        intent.setClass(this, VoicemailSettingsActivity.class);
         startActivity(intent);
         finish();
     }
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index d308a28..1460d63 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -49,6 +49,7 @@
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneBase;
 import com.android.internal.telephony.TelephonyCapabilities;
+import com.android.phone.settings.VoicemailSettingsActivity;
 import com.android.phone.settings.VoicemailNotificationSettingsUtil;
 import com.android.phone.settings.VoicemailProviderSettingsUtil;
 
@@ -358,10 +359,9 @@
                 // to the voicemail settings.
                 notificationText = mContext.getString(
                         R.string.notification_voicemail_no_vm_number);
-                intent = new Intent(CallFeaturesSetting.ACTION_ADD_VOICEMAIL);
-                intent.putExtra(CallFeaturesSetting.SETUP_VOICEMAIL_EXTRA, true);
+                intent = new Intent(VoicemailSettingsActivity.ACTION_ADD_VOICEMAIL);
                 intent.putExtra(SubscriptionInfoHelper.SUB_ID_EXTRA, subId);
-                intent.setClass(mContext, CallFeaturesSetting.class);
+                intent.setClass(mContext, VoicemailSettingsActivity.class);
             } else {
                 if (mTelephonyManager.getPhoneCount() > 1) {
                     notificationText = subInfo.getDisplayName().toString();
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index d3e8829..6c658d3 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -66,6 +66,7 @@
 import com.android.phone.common.CallLogAsync;
 import com.android.phone.settings.SettingsConstants;
 import com.android.server.sip.SipService;
+import com.android.services.telephony.activation.SimActivationManager;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -145,6 +146,7 @@
     CallerInfoCache callerInfoCache;
     NotificationMgr notificationMgr;
     public PhoneInterfaceManager phoneMgr;
+    public SimActivationManager simActivationManager;
 
     private BluetoothManager bluetoothManager;
     private CallGatewayManager callGatewayManager;
@@ -441,6 +443,8 @@
         cdmaOtaScreenState = new OtaUtils.CdmaOtaScreenState();
         cdmaOtaInCallScreenUiState = new OtaUtils.CdmaOtaInCallScreenUiState();
 
+        simActivationManager = new SimActivationManager();
+
         // XXX pre-load the SimProvider so that it's ready
         resolver.getType(Uri.parse("content://icc/adn"));
 
diff --git a/src/com/android/phone/settings/VoicemailDialogUtil.java b/src/com/android/phone/settings/VoicemailDialogUtil.java
index 0a9e4bc..26bc227 100644
--- a/src/com/android/phone/settings/VoicemailDialogUtil.java
+++ b/src/com/android/phone/settings/VoicemailDialogUtil.java
@@ -21,7 +21,6 @@
 import android.app.ProgressDialog;
 import android.view.WindowManager;
 
-import com.android.phone.CallFeaturesSetting;
 import com.android.phone.R;
 
 public class VoicemailDialogUtil {
@@ -36,7 +35,7 @@
     public static final int VM_FWD_READING_DIALOG = 602;
     public static final int VM_REVERTING_DIALOG = 603;
 
-    public static Dialog getDialog(CallFeaturesSetting parent, int id) {
+    public static Dialog getDialog(VoicemailSettingsActivity parent, int id) {
         if ((id == VM_RESPONSE_ERROR_DIALOG) || (id == VM_NOCHANGE_ERROR_DIALOG) ||
             (id == FWD_SET_RESPONSE_ERROR_DIALOG) || (id == FWD_GET_RESPONSE_ERROR_DIALOG) ||
                 (id == VM_CONFIRM_DIALOG)) {
diff --git a/src/com/android/phone/settings/VoicemailProviderListPreference.java b/src/com/android/phone/settings/VoicemailProviderListPreference.java
index 44a1c7c..d9f1a55 100644
--- a/src/com/android/phone/settings/VoicemailProviderListPreference.java
+++ b/src/com/android/phone/settings/VoicemailProviderListPreference.java
@@ -30,7 +30,6 @@
 import android.util.Log;
 
 import com.android.internal.telephony.Phone;
-import com.android.phone.CallFeaturesSetting;
 import com.android.phone.PhoneGlobals;
 import com.android.phone.R;
 
@@ -95,12 +94,14 @@
         if (DBG) log("initVoicemailProviders()");
 
         String providerToIgnore = null;
-        if (activityIntent.getAction().equals(CallFeaturesSetting.ACTION_ADD_VOICEMAIL)
-                && activityIntent.hasExtra(CallFeaturesSetting.IGNORE_PROVIDER_EXTRA)) {
+        String action = activityIntent.getAction();
+        if (!TextUtils.isEmpty(action)
+                && action.equals(VoicemailSettingsActivity.ACTION_ADD_VOICEMAIL)
+                && activityIntent.hasExtra(VoicemailSettingsActivity.IGNORE_PROVIDER_EXTRA)) {
             // Remove this provider from the list.
             if (DBG) log("Found ACTION_ADD_VOICEMAIL.");
             providerToIgnore =
-                    activityIntent.getStringExtra(CallFeaturesSetting.IGNORE_PROVIDER_EXTRA);
+                    activityIntent.getStringExtra(VoicemailSettingsActivity.IGNORE_PROVIDER_EXTRA);
             VoicemailProviderSettingsUtil.delete(mPhone.getContext(), providerToIgnore);
         }
 
@@ -119,7 +120,7 @@
 
         // Add other voicemail providers.
         PackageManager pm = mPhone.getContext().getPackageManager();
-        Intent intent = new Intent(CallFeaturesSetting.ACTION_CONFIGURE_VOICEMAIL);
+        Intent intent = new Intent(VoicemailSettingsActivity.ACTION_CONFIGURE_VOICEMAIL);
         List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
         for (int i = 0; i < resolveInfos.size(); i++) {
             final ResolveInfo ri= resolveInfos.get(i);
@@ -137,7 +138,7 @@
             }
             String nameForDisplay = (label != null) ? label.toString() : "";
             Intent providerIntent = new Intent();
-            providerIntent.setAction(CallFeaturesSetting.ACTION_CONFIGURE_VOICEMAIL);
+            providerIntent.setAction(VoicemailSettingsActivity.ACTION_CONFIGURE_VOICEMAIL);
             providerIntent.setClassName(currentActivityInfo.packageName, currentActivityInfo.name);
             VoicemailProvider vmProvider = new VoicemailProvider(nameForDisplay, providerIntent);
 
diff --git a/src/com/android/phone/settings/VoicemailSettingsActivity.java b/src/com/android/phone/settings/VoicemailSettingsActivity.java
index a94c27a..27349fe 100644
--- a/src/com/android/phone/settings/VoicemailSettingsActivity.java
+++ b/src/com/android/phone/settings/VoicemailSettingsActivity.java
@@ -16,21 +16,268 @@
 
 package com.android.phone.settings;
 
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.Cursor;
+import android.os.AsyncResult;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
 import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.ContactsContract.CommonDataKinds;
+import android.text.TextUtils;
+import android.util.Log;
 import android.view.MenuItem;
+import android.widget.ListAdapter;
 
+import com.android.internal.telephony.CallForwardInfo;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
 import com.android.phone.R;
+import com.android.phone.EditPhoneNumberPreference;
+import com.android.phone.PhoneGlobals;
+import com.android.phone.SubscriptionInfoHelper;
 
-public class VoicemailSettingsActivity extends PreferenceActivity {
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+
+public class VoicemailSettingsActivity extends PreferenceActivity
+        implements DialogInterface.OnClickListener,
+                Preference.OnPreferenceChangeListener,
+                EditPhoneNumberPreference.OnDialogClosedListener,
+                EditPhoneNumberPreference.GetDefaultNumberListener {
+    private static final String LOG_TAG = VoicemailSettingsActivity.class.getSimpleName();
+    private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
+
+    /**
+     * Intent action to bring up Voicemail Provider settings
+     * DO NOT RENAME. There are existing apps which use this intent value.
+     */
+    public static final String ACTION_ADD_VOICEMAIL =
+            "com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL";
+
+    /**
+     * Intent action to bring up the {@code VoicemailSettingsActivity}.
+     * DO NOT RENAME. There are existing apps which use this intent value.
+     */
+    public static final String ACTION_CONFIGURE_VOICEMAIL =
+            "com.android.phone.CallFeaturesSetting.CONFIGURE_VOICEMAIL";
+
+    // Extra put in the return from VM provider config containing voicemail number to set
+    public static final String VM_NUMBER_EXTRA = "com.android.phone.VoicemailNumber";
+    // Extra put in the return from VM provider config containing call forwarding number to set
+    public static final String FWD_NUMBER_EXTRA = "com.android.phone.ForwardingNumber";
+    // Extra put in the return from VM provider config containing call forwarding number to set
+    public static final String FWD_NUMBER_TIME_EXTRA = "com.android.phone.ForwardingNumberTime";
+    // If the VM provider returns non null value in this extra we will force the user to
+    // choose another VM provider
+    public static final String SIGNOUT_EXTRA = "com.android.phone.Signout";
+
+    /**
+     * String Extra put into ACTION_ADD_VOICEMAIL call to indicate which provider should be hidden
+     * in the list of providers presented to the user. This allows a provider which is being
+     * disabled (e.g. GV user logging out) to force the user to pick some other provider.
+     */
+    public static final String IGNORE_PROVIDER_EXTRA = "com.android.phone.ProviderToIgnore";
+
+    /**
+     * String Extra put into ACTION_ADD_VOICEMAIL to indicate that the voicemail setup screen should
+     * be opened.
+     */
+    public static final String SETUP_VOICEMAIL_EXTRA = "com.android.phone.SetupVoicemail";
+
+    // TODO: Define these preference keys in XML.
+    private static final String BUTTON_VOICEMAIL_KEY = "button_voicemail_key";
+    private static final String BUTTON_VOICEMAIL_PROVIDER_KEY = "button_voicemail_provider_key";
+    private static final String BUTTON_VOICEMAIL_SETTING_KEY = "button_voicemail_setting_key";
+
+    /** Event for Async voicemail change call */
+    private static final int EVENT_VOICEMAIL_CHANGED        = 500;
+    private static final int EVENT_FORWARDING_CHANGED       = 501;
+    private static final int EVENT_FORWARDING_GET_COMPLETED = 502;
+
+    /** Handle to voicemail pref */
+    private static final int VOICEMAIL_PREF_ID = 1;
+    private static final int VOICEMAIL_PROVIDER_CFG_ID = 2;
+
+    /**
+     * Results of reading forwarding settings
+     */
+    private CallForwardInfo[] mForwardingReadResults = null;
+
+    /**
+     * Result of forwarding number change.
+     * Keys are reasons (eg. unconditional forwarding).
+     */
+    private Map<Integer, AsyncResult> mForwardingChangeResults = null;
+
+    /**
+     * Expected CF read result types.
+     * This set keeps track of the CF types for which we've issued change
+     * commands so we can tell when we've received all of the responses.
+     */
+    private Collection<Integer> mExpectedChangeResultReasons = null;
+
+    /**
+     * Result of vm number change
+     */
+    private AsyncResult mVoicemailChangeResult = null;
+
+    /**
+     * Previous VM provider setting so we can return to it in case of failure.
+     */
+    private String mPreviousVMProviderKey = null;
+
+    /**
+     * Id of the dialog being currently shown.
+     */
+    private int mCurrentDialogId = 0;
+
+    /**
+     * Flag indicating that we are invoking settings for the voicemail provider programmatically
+     * due to vm provider change.
+     */
+    private boolean mVMProviderSettingsForced = false;
+
+    /**
+     * Flag indicating that we are making changes to vm or fwd numbers
+     * due to vm provider change.
+     */
+    private boolean mChangingVMorFwdDueToProviderChange = false;
+
+    /**
+     * True if we are in the process of vm & fwd number change and vm has already been changed.
+     * This is used to decide what to do in case of rollback.
+     */
+    private boolean mVMChangeCompletedSuccessfully = false;
+
+    /**
+     * True if we had full or partial failure setting forwarding numbers and so need to roll them
+     * back.
+     */
+    private boolean mFwdChangesRequireRollback = false;
+
+    /**
+     * Id of error msg to display to user once we are done reverting the VM provider to the previous
+     * one.
+     */
+    private int mVMOrFwdSetError = 0;
+
+    /** string to hold old voicemail number as it is being updated. */
+    private String mOldVmNumber;
+
+    // New call forwarding settings and vm number we will be setting
+    // Need to save these since before we get to saving we need to asynchronously
+    // query the existing forwarding settings.
+    private CallForwardInfo[] mNewFwdSettings;
+    private String mNewVMNumber;
+
+    /**
+     * Used to indicate that the voicemail preference should be shown.
+     */
+    private boolean mShowVoicemailPreference = false;
+
+    private boolean mForeground;
+    private Phone mPhone;
+    private SubscriptionInfoHelper mSubscriptionInfoHelper;
+
+    private EditPhoneNumberPreference mSubMenuVoicemailSettings;
+    private VoicemailProviderListPreference mVoicemailProviders;
+    private PreferenceScreen mVoicemailSettings;
+    private VoicemailRingtonePreference mVoicemailNotificationRingtone;
+    private CheckBoxPreference mVoicemailNotificationVibrate;
+
+
+    //*********************************************************************************************
+    // Preference Activity Methods
+    //*********************************************************************************************
 
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
-        getActionBar().setTitle(R.string.voicemail);
-        getFragmentManager().beginTransaction().replace(
-                android.R.id.content, new VoicemailSettingsFragment()).commit();
+        // Show the voicemail preference in onResume if the calling intent specifies the
+        // ACTION_ADD_VOICEMAIL action.
+        mShowVoicemailPreference = (icicle == null) &&
+                TextUtils.equals(getIntent().getAction(), ACTION_ADD_VOICEMAIL);
+
+        mSubscriptionInfoHelper = new SubscriptionInfoHelper(this, getIntent());
+        mSubscriptionInfoHelper.setActionBarTitle(
+                getActionBar(), getResources(), R.string.voicemail_settings_with_label);
+        mPhone = mSubscriptionInfoHelper.getPhone();
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mForeground = true;
+
+        PreferenceScreen preferenceScreen = getPreferenceScreen();
+        if (preferenceScreen != null) {
+            preferenceScreen.removeAll();
+        }
+
+        addPreferencesFromResource(R.xml.voicemail_settings);
+
+        PreferenceScreen prefSet = getPreferenceScreen();
+        mSubMenuVoicemailSettings = (EditPhoneNumberPreference) findPreference(BUTTON_VOICEMAIL_KEY);
+        mSubMenuVoicemailSettings.setParentActivity(this, VOICEMAIL_PREF_ID, this);
+        mSubMenuVoicemailSettings.setDialogOnClosedListener(this);
+        mSubMenuVoicemailSettings.setDialogTitle(R.string.voicemail_settings_number_label);
+
+        mVoicemailProviders = (VoicemailProviderListPreference) findPreference(
+                BUTTON_VOICEMAIL_PROVIDER_KEY);
+        mVoicemailProviders.init(mPhone, getIntent());
+        mVoicemailProviders.setOnPreferenceChangeListener(this);
+        mPreviousVMProviderKey = mVoicemailProviders.getValue();
+
+        mVoicemailSettings = (PreferenceScreen) findPreference(BUTTON_VOICEMAIL_SETTING_KEY);
+
+        mVoicemailNotificationRingtone = (VoicemailRingtonePreference) findPreference(
+                getResources().getString(R.string.voicemail_notification_ringtone_key));
+        mVoicemailNotificationRingtone.init(mPhone);
+
+        mVoicemailNotificationVibrate = (CheckBoxPreference) findPreference(
+                getResources().getString(R.string.voicemail_notification_vibrate_key));
+        mVoicemailNotificationVibrate.setOnPreferenceChangeListener(this);
+
+        updateVMPreferenceWidgets(mVoicemailProviders.getValue());
+
+        // check the intent that started this activity and pop up the voicemail
+        // dialog if we've been asked to.
+        // If we have at least one non default VM provider registered then bring up
+        // the selection for the VM provider, otherwise bring up a VM number dialog.
+        // We only bring up the dialog the first time we are called (not after orientation change)
+        if (mShowVoicemailPreference) {
+            if (DBG) log("ACTION_ADD_VOICEMAIL Intent is thrown");
+            if (mVoicemailProviders.hasMoreThanOneVoicemailProvider()) {
+                if (DBG) log("Voicemail data has more than one provider.");
+                simulatePreferenceClick(mVoicemailProviders);
+            } else {
+                onPreferenceChange(mVoicemailProviders, VoicemailProviderListPreference.DEFAULT_KEY);
+                mVoicemailProviders.setValue(VoicemailProviderListPreference.DEFAULT_KEY);
+            }
+            mShowVoicemailPreference = false;
+        }
+
+        updateVoiceNumberField();
+        mVMProviderSettingsForced = false;
+
+        mVoicemailNotificationVibrate.setChecked(
+                VoicemailNotificationSettingsUtil.isVibrationEnabled(mPhone));
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        mForeground = false;
     }
 
     @Override
@@ -41,4 +288,812 @@
         }
         return super.onOptionsItemSelected(item);
     }
+
+    @Override
+    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+        if (preference == mSubMenuVoicemailSettings) {
+            return true;
+        } else if (preference.getKey().equals(mVoicemailSettings.getKey())) {
+            // Check key instead of comparing reference because closing the voicemail notification
+            // ringtone dialog invokes onResume(), but leaves the old preference screen up,
+            // TODO: Revert to checking reference after migrating voicemail to its own activity.
+            if (DBG) log("onPreferenceTreeClick: Voicemail Settings Preference is clicked.");
+
+            final Dialog dialog = ((PreferenceScreen) preference).getDialog();
+            if (dialog != null) {
+                dialog.getActionBar().setDisplayHomeAsUpEnabled(false);
+            }
+
+            if (preference.getIntent() != null) {
+                if (DBG) log("Invoking cfg intent " + preference.getIntent().getPackage());
+
+                // onActivityResult() will be responsible for resetting some of variables.
+                this.startActivityForResult(preference.getIntent(), VOICEMAIL_PROVIDER_CFG_ID);
+                return true;
+            } else {
+                if (DBG) log("onPreferenceTreeClick(). No intent; use default behavior in xml.");
+
+                // onActivityResult() will not be called, so reset variables here.
+                mPreviousVMProviderKey = VoicemailProviderListPreference.DEFAULT_KEY;
+                mVMProviderSettingsForced = false;
+                return false;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Implemented to support onPreferenceChangeListener to look for preference changes.
+     *
+     * @param preference is the preference to be changed
+     * @param objValue should be the value of the selection, NOT its localized
+     * display value.
+     */
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object objValue) {
+        if (DBG) log("onPreferenceChange: \"" + preference + "\" changed to \"" + objValue + "\"");
+
+        if (preference == mVoicemailProviders) {
+            final String newProviderKey = (String) objValue;
+
+            // If previous provider key and the new one is same, we don't need to handle it.
+            if (mPreviousVMProviderKey.equals(newProviderKey)) {
+                if (DBG) log("No change is made to the VM provider setting.");
+                return true;
+            }
+            updateVMPreferenceWidgets(newProviderKey);
+
+            final VoicemailProviderSettings newProviderSettings =
+                    VoicemailProviderSettingsUtil.load(this, newProviderKey);
+
+            // If the user switches to a voice mail provider and we have numbers stored for it we
+            // will automatically change the phone's voice mail and forwarding number to the stored
+            // ones. Otherwise we will bring up provider's configuration UI.
+            if (newProviderSettings == null) {
+                // Force the user into a configuration of the chosen provider
+                Log.w(LOG_TAG, "Saved preferences not found - invoking config");
+                mVMProviderSettingsForced = true;
+                simulatePreferenceClick(mVoicemailSettings);
+            } else {
+                if (DBG) log("Saved preferences found - switching to them");
+                // Set this flag so if we get a failure we revert to previous provider
+                mChangingVMorFwdDueToProviderChange = true;
+                saveVoiceMailAndForwardingNumber(newProviderKey, newProviderSettings);
+            }
+        } else if (preference.getKey().equals(mVoicemailNotificationVibrate.getKey())) {
+            // Check key instead of comparing reference because closing the voicemail notification
+            // ringtone dialog invokes onResume(), but leaves the old preference screen up,
+            // TODO: Revert to checking reference after migrating voicemail to its own activity.
+            VoicemailNotificationSettingsUtil.setVibrationEnabled(
+                    mPhone, Boolean.TRUE.equals(objValue));
+        }
+
+        // Always let the preference setting proceed.
+        return true;
+    }
+
+    /**
+     * Implemented for EditPhoneNumberPreference.GetDefaultNumberListener.
+     * This method set the default values for the various
+     * EditPhoneNumberPreference dialogs.
+     */
+    @Override
+    public String onGetDefaultNumber(EditPhoneNumberPreference preference) {
+        if (preference == mSubMenuVoicemailSettings) {
+            // update the voicemail number field, which takes care of the
+            // mSubMenuVoicemailSettings itself, so we should return null.
+            if (DBG) log("updating default for voicemail dialog");
+            updateVoiceNumberField();
+            return null;
+        }
+
+        String vmDisplay = mPhone.getVoiceMailNumber();
+        if (TextUtils.isEmpty(vmDisplay)) {
+            // if there is no voicemail number, we just return null to
+            // indicate no contribution.
+            return null;
+        }
+
+        // Return the voicemail number prepended with "VM: "
+        if (DBG) log("updating default for call forwarding dialogs");
+        return getString(R.string.voicemail_abbreviated) + " " + vmDisplay;
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (DBG) {
+            log("onActivityResult: requestCode: " + requestCode
+                    + ", resultCode: " + resultCode
+                    + ", data: " + data);
+        }
+
+        // there are cases where the contact picker may end up sending us more than one
+        // request.  We want to ignore the request if we're not in the correct state.
+        if (requestCode == VOICEMAIL_PROVIDER_CFG_ID) {
+            boolean failure = false;
+
+            // No matter how the processing of result goes lets clear the flag
+            if (DBG) log("mVMProviderSettingsForced: " + mVMProviderSettingsForced);
+            final boolean isVMProviderSettingsForced = mVMProviderSettingsForced;
+            mVMProviderSettingsForced = false;
+
+            String vmNum = null;
+            if (resultCode != RESULT_OK) {
+                if (DBG) log("onActivityResult: vm provider cfg result not OK.");
+                failure = true;
+            } else {
+                if (data == null) {
+                    if (DBG) log("onActivityResult: vm provider cfg result has no data");
+                    failure = true;
+                } else {
+                    if (data.getBooleanExtra(SIGNOUT_EXTRA, false)) {
+                        if (DBG) log("Provider requested signout");
+                        if (isVMProviderSettingsForced) {
+                            if (DBG) log("Going back to previous provider on signout");
+                            switchToPreviousVoicemailProvider();
+                        } else {
+                            final String victim = mVoicemailProviders.getKey();
+                            if (DBG) log("Relaunching activity and ignoring " + victim);
+                            Intent i = new Intent(ACTION_ADD_VOICEMAIL);
+                            i.putExtra(IGNORE_PROVIDER_EXTRA, victim);
+                            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+                            this.startActivity(i);
+                        }
+                        return;
+                    }
+                    vmNum = data.getStringExtra(VM_NUMBER_EXTRA);
+                    if (vmNum == null || vmNum.length() == 0) {
+                        if (DBG) log("onActivityResult: vm provider cfg result has no vmnum");
+                        failure = true;
+                    }
+                }
+            }
+            if (failure) {
+                if (DBG) log("Failure in return from voicemail provider.");
+                if (isVMProviderSettingsForced) {
+                    switchToPreviousVoicemailProvider();
+                }
+
+                return;
+            }
+            mChangingVMorFwdDueToProviderChange = isVMProviderSettingsForced;
+            final String fwdNum = data.getStringExtra(FWD_NUMBER_EXTRA);
+
+            // TODO: It would be nice to load the current network setting for this and
+            // send it to the provider when it's config is invoked so it can use this as default
+            final int fwdNumTime = data.getIntExtra(FWD_NUMBER_TIME_EXTRA, 20);
+
+            if (DBG) log("onActivityResult: cfg result has forwarding number " + fwdNum);
+            saveVoiceMailAndForwardingNumber(mVoicemailProviders.getKey(),
+                    new VoicemailProviderSettings(vmNum, fwdNum, fwdNumTime));
+            return;
+        }
+
+        if (requestCode == VOICEMAIL_PREF_ID) {
+            if (resultCode != RESULT_OK) {
+                if (DBG) log("onActivityResult: contact picker result not OK.");
+                return;
+            }
+
+            Cursor cursor = null;
+            try {
+                cursor = getContentResolver().query(data.getData(),
+                    new String[] { CommonDataKinds.Phone.NUMBER }, null, null, null);
+                if ((cursor == null) || (!cursor.moveToFirst())) {
+                    if (DBG) log("onActivityResult: bad contact data, no results found.");
+                    return;
+                }
+                mSubMenuVoicemailSettings.onPickActivityResult(cursor.getString(0));
+                return;
+            } finally {
+                if (cursor != null) {
+                    cursor.close();
+                }
+            }
+        }
+
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
+    /**
+     * Simulates user clicking on a passed preference.
+     * Usually needed when the preference is a dialog preference and we want to invoke
+     * a dialog for this preference programmatically.
+     * TODO: figure out if there is a cleaner way to cause preference dlg to come up
+     */
+    private void simulatePreferenceClick(Preference preference) {
+        // Go through settings until we find our setting
+        // and then simulate a click on it to bring up the dialog
+        final ListAdapter adapter = getPreferenceScreen().getRootAdapter();
+        for (int idx = 0; idx < adapter.getCount(); idx++) {
+            if (adapter.getItem(idx) == preference) {
+                getPreferenceScreen().onItemClick(this.getListView(),
+                        null, idx, adapter.getItemId(idx));
+                break;
+            }
+        }
+    }
+
+
+    //*********************************************************************************************
+    // Activity Dialog Methods
+    //*********************************************************************************************
+
+    @Override
+    protected void onPrepareDialog(int id, Dialog dialog) {
+        super.onPrepareDialog(id, dialog);
+        mCurrentDialogId = id;
+    }
+
+    // dialog creation method, called by showDialog()
+    @Override
+    protected Dialog onCreateDialog(int dialogId) {
+        return VoicemailDialogUtil.getDialog(this, dialogId);
+    }
+
+    @Override
+    public void onDialogClosed(EditPhoneNumberPreference preference, int buttonClicked) {
+        if (DBG) log("onDialogClosed: Button clicked is " + buttonClicked);
+
+        if (buttonClicked == DialogInterface.BUTTON_NEGATIVE) {
+            return;
+        }
+
+        if (preference == mSubMenuVoicemailSettings) {
+            VoicemailProviderSettings newSettings = new VoicemailProviderSettings(
+                    mSubMenuVoicemailSettings.getPhoneNumber(),
+                    VoicemailProviderSettings.NO_FORWARDING);
+            saveVoiceMailAndForwardingNumber(mVoicemailProviders.getKey(), newSettings);
+        }
+    }
+
+    /**
+     * Wrapper around showDialog() that will silently do nothing if we're
+     * not in the foreground.
+     *
+     * This is useful here because most of the dialogs we display from
+     * this class are triggered by asynchronous events (like
+     * success/failure messages from the telephony layer) and it's
+     * possible for those events to come in even after the user has gone
+     * to a different screen.
+     */
+    // TODO: this is too brittle: it's still easy to accidentally add new
+    // code here that calls showDialog() directly (which will result in a
+    // WindowManager$BadTokenException if called after the activity has
+    // been stopped.)
+    //
+    // It would be cleaner to do the "if (mForeground)" check in one
+    // central place, maybe by using a single Handler for all asynchronous
+    // events (and have *that* discard events if we're not in the
+    // foreground.)
+    //
+    // Unfortunately it's not that simple, since we sometimes need to do
+    // actual work to handle these events whether or not we're in the
+    // foreground (see the Handler code in mSetOptionComplete for
+    // example.)
+    //
+    // TODO: It's a bit worrisome that we don't do anything in error cases when we're not in the
+    // foreground. Consider displaying a toast instead.
+    private void showDialogIfForeground(int id) {
+        if (mForeground) {
+            showDialog(id);
+        }
+    }
+
+    private void dismissDialogSafely(int id) {
+        try {
+            dismissDialog(id);
+        } catch (IllegalArgumentException e) {
+            // This is expected in the case where we were in the background
+            // at the time we would normally have shown the dialog, so we didn't
+            // show it.
+        }
+    }
+
+    // This is a method implemented for DialogInterface.OnClickListener.
+    // Used with the error dialog to close the app, voicemail dialog to just dismiss.
+    // Close button is mapped to BUTTON_POSITIVE for the errors that close the activity,
+    // while those that are mapped to BUTTON_NEUTRAL only move the preference focus.
+    public void onClick(DialogInterface dialog, int which) {
+        if (DBG) log("onClick: button clicked is " + which);
+
+        dialog.dismiss();
+        switch (which){
+            case DialogInterface.BUTTON_NEGATIVE:
+                if (mCurrentDialogId == VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG) {
+                    // We failed to get current forwarding settings and the user
+                    // does not wish to continue.
+                    switchToPreviousVoicemailProvider();
+                }
+                break;
+            case DialogInterface.BUTTON_POSITIVE:
+                if (mCurrentDialogId == VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG) {
+                    // We failed to get current forwarding settings but the user
+                    // wishes to continue changing settings to the new vm provider
+                    setVoicemailNumberWithCarrier();
+                } else {
+                    finish();
+                }
+                return;
+            default:
+                // just let the dialog close and go back to the input
+        }
+
+        // In all dialogs, all buttons except BUTTON_POSITIVE lead to the end of user interaction
+        // with settings UI. If we were called to explicitly configure voice mail then
+        // we finish the settings activity here to come back to whatever the user was doing.
+        if (getIntent().getAction().equals(ACTION_ADD_VOICEMAIL)) {
+            finish();
+        }
+    }
+
+
+    //*********************************************************************************************
+    // Voicemail Methods
+    //*********************************************************************************************
+
+    /**
+     * TODO: Refactor to make it easier to understand what's done in the different stages.
+     */
+    private void saveVoiceMailAndForwardingNumber(
+            String key, VoicemailProviderSettings newSettings) {
+        if (DBG) log("saveVoiceMailAndForwardingNumber: " + newSettings.toString());
+        mNewVMNumber = newSettings.getVoicemailNumber();
+        mNewVMNumber = (mNewVMNumber == null) ? "" : mNewVMNumber;
+        mNewFwdSettings = newSettings.getForwardingSettings();
+
+        // Call forwarding is not suppported on CDMA.
+        if (mPhone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) {
+            if (DBG) log("Ignoring forwarding setting since this is CDMA phone");
+            mNewFwdSettings = VoicemailProviderSettings.NO_FORWARDING;
+        }
+
+        // Throw a warning if the voicemail is the same and we did not change forwarding.
+        if (mNewVMNumber.equals(mOldVmNumber)
+                && mNewFwdSettings == VoicemailProviderSettings.NO_FORWARDING) {
+            showDialogIfForeground(VoicemailDialogUtil.VM_NOCHANGE_ERROR_DIALOG);
+            return;
+        }
+
+        VoicemailProviderSettingsUtil.save(this, key, newSettings);
+        mVMChangeCompletedSuccessfully = false;
+        mFwdChangesRequireRollback = false;
+        mVMOrFwdSetError = 0;
+
+        if (mNewFwdSettings == VoicemailProviderSettings.NO_FORWARDING
+                || key.equals(mPreviousVMProviderKey)) {
+            if (DBG) log("Set voicemail number. No changes to forwarding number.");
+            setVoicemailNumberWithCarrier();
+        } else {
+            if (DBG) log("Reading current forwarding settings.");
+            int numSettingsReasons = VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS.length;
+            mForwardingReadResults = new CallForwardInfo[numSettingsReasons];
+            for (int i = 0; i < mForwardingReadResults.length; i++) {
+                mPhone.getCallForwardingOption(
+                        VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS[i],
+                        mGetOptionComplete.obtainMessage(EVENT_FORWARDING_GET_COMPLETED, i, 0));
+            }
+            showDialogIfForeground(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
+        }
+
+        PhoneGlobals.getInstance().refreshMwiIndicator(mSubscriptionInfoHelper.getSubId());
+    }
+
+    private final Handler mGetOptionComplete = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            AsyncResult result = (AsyncResult) msg.obj;
+            switch (msg.what) {
+                case EVENT_FORWARDING_GET_COMPLETED:
+                    handleForwardingSettingsReadResult(result, msg.arg1);
+                    break;
+            }
+        }
+    };
+
+    private void handleForwardingSettingsReadResult(AsyncResult ar, int idx) {
+        if (DBG) Log.d(LOG_TAG, "handleForwardingSettingsReadResult: " + idx);
+
+        Throwable error = null;
+        if (ar.exception != null) {
+            error = ar.exception;
+            if (DBG) Log.d(LOG_TAG, "FwdRead: ar.exception=" + error.getMessage());
+        }
+        if (ar.userObj instanceof Throwable) {
+            error = (Throwable) ar.userObj;
+            if (DBG) Log.d(LOG_TAG, "FwdRead: userObj=" + error.getMessage());
+        }
+
+        // We may have already gotten an error and decided to ignore the other results.
+        if (mForwardingReadResults == null) {
+            if (DBG) Log.d(LOG_TAG, "Ignoring fwd reading result: " + idx);
+            return;
+        }
+
+        // In case of error ignore other results, show an error dialog
+        if (error != null) {
+            if (DBG) Log.d(LOG_TAG, "Error discovered for fwd read : " + idx);
+            mForwardingReadResults = null;
+            dismissDialogSafely(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
+            showDialogIfForeground(VoicemailDialogUtil.FWD_GET_RESPONSE_ERROR_DIALOG);
+            return;
+        }
+
+        // Get the forwarding info.
+        mForwardingReadResults[idx] = CallForwardInfoUtil.getCallForwardInfo(
+                (CallForwardInfo[]) ar.result,
+                VoicemailProviderSettings.FORWARDING_SETTINGS_REASONS[idx]);
+
+        // Check if we got all the results already
+        boolean done = true;
+        for (int i = 0; i < mForwardingReadResults.length; i++) {
+            if (mForwardingReadResults[i] == null) {
+                done = false;
+                break;
+            }
+        }
+
+        if (done) {
+            if (DBG) Log.d(LOG_TAG, "Done receiving fwd info");
+            dismissDialogSafely(VoicemailDialogUtil.VM_FWD_READING_DIALOG);
+
+            if (mPreviousVMProviderKey.equals(VoicemailProviderListPreference.DEFAULT_KEY)) {
+                VoicemailProviderSettingsUtil.save(mPhone.getContext(),
+                        VoicemailProviderListPreference.DEFAULT_KEY,
+                        new VoicemailProviderSettings(mOldVmNumber, mForwardingReadResults));
+            }
+            saveVoiceMailAndForwardingNumberStage2();
+        }
+    }
+
+    private void resetForwardingChangeState() {
+        mForwardingChangeResults = new HashMap<Integer, AsyncResult>();
+        mExpectedChangeResultReasons = new HashSet<Integer>();
+    }
+
+    // Called after we are done saving the previous forwarding settings if we needed.
+    private void saveVoiceMailAndForwardingNumberStage2() {
+        mForwardingChangeResults = null;
+        mVoicemailChangeResult = null;
+
+        resetForwardingChangeState();
+        for (int i = 0; i < mNewFwdSettings.length; i++) {
+            CallForwardInfo fi = mNewFwdSettings[i];
+            CallForwardInfo fiForReason =
+                    CallForwardInfoUtil.infoForReason(mForwardingReadResults, fi.reason);
+            final boolean doUpdate = CallForwardInfoUtil.isUpdateRequired(fiForReason, fi);
+
+            if (doUpdate) {
+                if (DBG) log("Setting fwd #: " + i + ": " + fi.toString());
+                mExpectedChangeResultReasons.add(i);
+
+                CallForwardInfoUtil.setCallForwardingOption(mPhone, fi,
+                        mSetOptionComplete.obtainMessage(
+                                EVENT_FORWARDING_CHANGED, fi.reason, 0));
+            }
+        }
+        showDialogIfForeground(VoicemailDialogUtil.VM_FWD_SAVING_DIALOG);
+    }
+
+
+    /**
+     * Callback to handle option update completions
+     */
+    private final Handler mSetOptionComplete = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            AsyncResult result = (AsyncResult) msg.obj;
+            boolean done = false;
+            switch (msg.what) {
+                case EVENT_VOICEMAIL_CHANGED:
+                    mVoicemailChangeResult = result;
+                    mVMChangeCompletedSuccessfully = isVmChangeSuccess();
+                    done = true;
+                    break;
+                case EVENT_FORWARDING_CHANGED:
+                    mForwardingChangeResults.put(msg.arg1, result);
+                    if (result.exception != null) {
+                        Log.w(LOG_TAG, "Error in setting fwd# " + msg.arg1 + ": " +
+                                result.exception.getMessage());
+                    }
+                    if (isForwardingCompleted()) {
+                        if (isFwdChangeSuccess()) {
+                            if (DBG) log("Overall fwd changes completed ok, starting vm change");
+                            setVoicemailNumberWithCarrier();
+                        } else {
+                            Log.w(LOG_TAG, "Overall fwd changes completed in failure. " +
+                                    "Check if we need to try rollback for some settings.");
+                            mFwdChangesRequireRollback = false;
+                            Iterator<Map.Entry<Integer,AsyncResult>> it =
+                                mForwardingChangeResults.entrySet().iterator();
+                            while (it.hasNext()) {
+                                Map.Entry<Integer,AsyncResult> entry = it.next();
+                                if (entry.getValue().exception == null) {
+                                    // If at least one succeeded we have to revert
+                                    Log.i(LOG_TAG, "Rollback will be required");
+                                    mFwdChangesRequireRollback = true;
+                                    break;
+                                }
+                            }
+                            if (!mFwdChangesRequireRollback) {
+                                Log.i(LOG_TAG, "No rollback needed.");
+                            }
+                            done = true;
+                        }
+                    }
+                    break;
+                default:
+                    // TODO: should never reach this, may want to throw exception
+            }
+
+            if (done) {
+                if (DBG) log("All VM provider related changes done");
+                if (mForwardingChangeResults != null) {
+                    dismissDialogSafely(VoicemailDialogUtil.VM_FWD_SAVING_DIALOG);
+                }
+                handleSetVmOrFwdMessage();
+            }
+        }
+    };
+
+    /**
+     * Callback to handle option revert completions
+     */
+    private final Handler mRevertOptionComplete = new Handler() {
+        @Override
+        public void handleMessage(Message msg) {
+            AsyncResult result = (AsyncResult) msg.obj;
+            switch (msg.what) {
+                case EVENT_VOICEMAIL_CHANGED:
+                    if (DBG) log("VM revert complete msg");
+                    mVoicemailChangeResult = result;
+                    break;
+
+                case EVENT_FORWARDING_CHANGED:
+                    if (DBG) log("FWD revert complete msg ");
+                    mForwardingChangeResults.put(msg.arg1, result);
+                    if (result.exception != null) {
+                        if (DBG) log("Error in reverting fwd# " + msg.arg1 + ": " +
+                                result.exception.getMessage());
+                    }
+                    break;
+
+                default:
+                    // TODO: should never reach this, may want to throw exception
+            }
+
+            final boolean done = (!mVMChangeCompletedSuccessfully || mVoicemailChangeResult != null)
+                    && (!mFwdChangesRequireRollback || isForwardingCompleted());
+            if (done) {
+                if (DBG) log("All VM reverts done");
+                dismissDialogSafely(VoicemailDialogUtil.VM_REVERTING_DIALOG);
+                onRevertDone();
+            }
+        }
+    };
+
+    private void setVoicemailNumberWithCarrier() {
+        if (DBG) log("save voicemail #: " + mNewVMNumber);
+
+        mVoicemailChangeResult = null;
+        mPhone.setVoiceMailNumber(
+                mPhone.getVoiceMailAlphaTag().toString(),
+                mNewVMNumber,
+                Message.obtain(mSetOptionComplete, EVENT_VOICEMAIL_CHANGED));
+    }
+
+    private void switchToPreviousVoicemailProvider() {
+        if (DBG) log("switchToPreviousVoicemailProvider " + mPreviousVMProviderKey);
+
+        if (mPreviousVMProviderKey == null) {
+            return;
+        }
+
+        if (mVMChangeCompletedSuccessfully || mFwdChangesRequireRollback) {
+            showDialogIfForeground(VoicemailDialogUtil.VM_REVERTING_DIALOG);
+            final VoicemailProviderSettings prevSettings =
+                    VoicemailProviderSettingsUtil.load(this, mPreviousVMProviderKey);
+            if (prevSettings == null) {
+                Log.e(LOG_TAG, "VoicemailProviderSettings for the key \""
+                        + mPreviousVMProviderKey + "\" is null but should be loaded.");
+            }
+
+            if (mVMChangeCompletedSuccessfully) {
+                mNewVMNumber = prevSettings.getVoicemailNumber();
+                Log.i(LOG_TAG, "VM change is already completed successfully."
+                        + "Have to revert VM back to " + mNewVMNumber + " again.");
+                mPhone.setVoiceMailNumber(
+                        mPhone.getVoiceMailAlphaTag().toString(),
+                        mNewVMNumber,
+                        Message.obtain(mRevertOptionComplete, EVENT_VOICEMAIL_CHANGED));
+            }
+
+            if (mFwdChangesRequireRollback) {
+                Log.i(LOG_TAG, "Requested to rollback forwarding changes.");
+
+                final CallForwardInfo[] prevFwdSettings = prevSettings.getForwardingSettings();
+                if (prevFwdSettings != null) {
+                    Map<Integer, AsyncResult> results = mForwardingChangeResults;
+                    resetForwardingChangeState();
+                    for (int i = 0; i < prevFwdSettings.length; i++) {
+                        CallForwardInfo fi = prevFwdSettings[i];
+                        if (DBG) log("Reverting fwd #: " + i + ": " + fi.toString());
+                        // Only revert the settings for which the update succeeded.
+                        AsyncResult result = results.get(fi.reason);
+                        if (result != null && result.exception == null) {
+                            mExpectedChangeResultReasons.add(fi.reason);
+                            CallForwardInfoUtil.setCallForwardingOption(mPhone, fi,
+                                    mRevertOptionComplete.obtainMessage(
+                                            EVENT_FORWARDING_CHANGED, i, 0));
+                        }
+                    }
+                }
+            }
+        } else {
+            if (DBG) log("No need to revert");
+            onRevertDone();
+        }
+    }
+
+
+    //*********************************************************************************************
+    // Voicemail Handler Helpers
+    //*********************************************************************************************
+
+    /**
+     * Updates the look of the VM preference widgets based on current VM provider settings.
+     * Note that the provider name is loaded fxrorm the found activity via loadLabel in
+     * {@link VoicemailProviderListPreference#initVoiceMailProviders()} in order for it to be
+     * localizable.
+     */
+    private void updateVMPreferenceWidgets(String currentProviderSetting) {
+        final String key = currentProviderSetting;
+        final VoicemailProviderListPreference.VoicemailProvider provider =
+                mVoicemailProviders.getVoicemailProvider(key);
+
+        /* This is the case when we are coming up on a freshly wiped phone and there is no
+         persisted value for the list preference mVoicemailProviders.
+         In this case we want to show the UI asking the user to select a voicemail provider as
+         opposed to silently falling back to default one. */
+        if (provider == null) {
+            if (DBG) log("updateVMPreferenceWidget: key: " + key + " -> null.");
+
+            mVoicemailProviders.setSummary(getString(R.string.sum_voicemail_choose_provider));
+            mVoicemailSettings.setEnabled(false);
+            mVoicemailSettings.setIntent(null);
+            mVoicemailNotificationVibrate.setEnabled(false);
+        } else {
+            if (DBG) log("updateVMPreferenceWidget: key: " + key + " -> " + provider.toString());
+
+            final String providerName = provider.name;
+            mVoicemailProviders.setSummary(providerName);
+            mVoicemailSettings.setEnabled(true);
+            mVoicemailSettings.setIntent(provider.intent);
+            mVoicemailNotificationVibrate.setEnabled(true);
+        }
+    }
+
+    /**
+     * Update the voicemail number from what we've recorded on the sim.
+     */
+    private void updateVoiceNumberField() {
+        if (DBG) log("updateVoiceNumberField()");
+
+        mOldVmNumber = mPhone.getVoiceMailNumber();
+        if (TextUtils.isEmpty(mOldVmNumber)) {
+            mSubMenuVoicemailSettings.setPhoneNumber("");
+            mSubMenuVoicemailSettings.setSummary(getString(R.string.voicemail_number_not_set));
+        } else {
+            mSubMenuVoicemailSettings.setPhoneNumber(mOldVmNumber);
+            mSubMenuVoicemailSettings.setSummary(mOldVmNumber);
+        }
+    }
+
+    private void handleSetVmOrFwdMessage() {
+        if (DBG) log("handleSetVMMessage: set VM request complete");
+
+        if (!isFwdChangeSuccess()) {
+            handleVmOrFwdSetError(VoicemailDialogUtil.FWD_SET_RESPONSE_ERROR_DIALOG);
+        } else if (!isVmChangeSuccess()) {
+            handleVmOrFwdSetError(VoicemailDialogUtil.VM_RESPONSE_ERROR_DIALOG);
+        } else {
+            handleVmAndFwdSetSuccess(VoicemailDialogUtil.VM_CONFIRM_DIALOG);
+        }
+    }
+
+    /**
+     * Called when Voicemail Provider or its forwarding settings failed. Rolls back partly made
+     * changes to those settings and show "failure" dialog.
+     *
+     * @param dialogId ID of the dialog to show for the specific error case. Either
+     *     {@link #FWD_SET_RESPONSE_ERROR_DIALOG} or {@link #VM_RESPONSE_ERROR_DIALOG}
+     */
+    private void handleVmOrFwdSetError(int dialogId) {
+        if (mChangingVMorFwdDueToProviderChange) {
+            mVMOrFwdSetError = dialogId;
+            mChangingVMorFwdDueToProviderChange = false;
+            switchToPreviousVoicemailProvider();
+            return;
+        }
+        mChangingVMorFwdDueToProviderChange = false;
+        showDialogIfForeground(dialogId);
+        updateVoiceNumberField();
+    }
+
+    /**
+     * Called when Voicemail Provider and its forwarding settings were successfully finished.
+     * This updates a bunch of variables and show "success" dialog.
+     */
+    private void handleVmAndFwdSetSuccess(int dialogId) {
+        if (DBG) log("handleVmAndFwdSetSuccess: key is " + mVoicemailProviders.getKey());
+
+        mPreviousVMProviderKey = mVoicemailProviders.getKey();
+        mChangingVMorFwdDueToProviderChange = false;
+        showDialogIfForeground(dialogId);
+        updateVoiceNumberField();
+    }
+
+    private void onRevertDone() {
+        if (DBG) log("onRevertDone: Changing provider key back to " + mPreviousVMProviderKey);
+
+        updateVMPreferenceWidgets(mPreviousVMProviderKey);
+        updateVoiceNumberField();
+        if (mVMOrFwdSetError != 0) {
+            showDialogIfForeground(mVMOrFwdSetError);
+            mVMOrFwdSetError = 0;
+        }
+    }
+
+
+    //*********************************************************************************************
+    // Voicemail State Helpers
+    //*********************************************************************************************
+
+    /**
+     * Return true if there is a change result for every reason for which we expect a result.
+     */
+    private boolean isForwardingCompleted() {
+        if (mForwardingChangeResults == null) {
+            return true;
+        }
+
+        for (Integer reason : mExpectedChangeResultReasons) {
+            if (mForwardingChangeResults.get(reason) == null) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private boolean isFwdChangeSuccess() {
+        if (mForwardingChangeResults == null) {
+            return true;
+        }
+
+        for (AsyncResult result : mForwardingChangeResults.values()) {
+            Throwable exception = result.exception;
+            if (exception != null) {
+                String msg = exception.getMessage();
+                msg = (msg != null) ? msg : "";
+                Log.w(LOG_TAG, "Failed to change forwarding setting. Reason: " + msg);
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean isVmChangeSuccess() {
+        if (mVoicemailChangeResult.exception != null) {
+            String msg = mVoicemailChangeResult.exception.getMessage();
+            msg = (msg != null) ? msg : "";
+            Log.w(LOG_TAG, "Failed to change voicemail. Reason: " + msg);
+            return false;
+        }
+        return true;
+    }
+
+    private static void log(String msg) {
+        Log.d(LOG_TAG, msg);
+    }
 }
diff --git a/src/com/android/phone/settings/VoicemailSettingsFragment.java b/src/com/android/phone/settings/VoicemailSettingsFragment.java
deleted file mode 100644
index fef3e8c..0000000
--- a/src/com/android/phone/settings/VoicemailSettingsFragment.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/**
- * Copyright (C) 2014 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.phone.settings;
-
-import android.os.Bundle;
-import android.preference.PreferenceFragment;
-
-import com.android.phone.R;
-
-public class VoicemailSettingsFragment extends PreferenceFragment {
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        addPreferencesFromResource(R.xml.voicemail_settings);
-    }
-}
diff --git a/src/com/android/phone/vvm/omtp/imap/ImapHelper.java b/src/com/android/phone/vvm/omtp/imap/ImapHelper.java
index 3a260d7..eae6cac 100644
--- a/src/com/android/phone/vvm/omtp/imap/ImapHelper.java
+++ b/src/com/android/phone/vvm/omtp/imap/ImapHelper.java
@@ -71,8 +71,7 @@
                     accountManager.getUserData(account, OmtpConstants.IMAP_PORT));
             // TODO: determine the security protocol (e.g. ssl, tls, none, etc.)
             mImapStore = new ImapStore(
-                    context, username, password, port, serverName,
-                    ImapStore.FLAG_NONE);
+                    context, username, password, port, serverName, ImapStore.FLAG_NONE);
         } catch (NumberFormatException e) {
             LogUtils.e(TAG, e, "Could not parse port number");
         }
diff --git a/src/com/android/phone/vvm/omtp/sms/OmtpMessageReceiver.java b/src/com/android/phone/vvm/omtp/sms/OmtpMessageReceiver.java
index 07cdafa..57979ff 100644
--- a/src/com/android/phone/vvm/omtp/sms/OmtpMessageReceiver.java
+++ b/src/com/android/phone/vvm/omtp/sms/OmtpMessageReceiver.java
@@ -52,12 +52,10 @@
                 intent.getExtras().getInt(PhoneConstants.PHONE_KEY));
 
         SmsMessage[] messages = Telephony.Sms.Intents.getMessagesFromIntent(intent);
-        StringBuilder userData = new StringBuilder();
         StringBuilder messageBody = new StringBuilder();
 
         for (int i = 0; i < messages.length; i++) {
             messageBody.append(messages[i].getMessageBody());
-            userData.append(extractUserData(messages[i]));
         }
 
         WrappedMessageData messageData = OmtpSmsParser.parse(messageBody.toString());
@@ -75,16 +73,6 @@
         // Let this fall through: this is not a message we're interested in.
     }
 
-    private String extractUserData(SmsMessage sms) {
-        try {
-            // OMTP spec does not tell about the encoding. We assume ASCII.
-            // UTF-8 sounds safer as it can handle ascii as well as other charsets.
-            return new String(sms.getUserData(), "UTF-8");
-        } catch (UnsupportedEncodingException e) {
-            throw new IllegalStateException("This should have never happened", e);
-        }
-    }
-
     /**
      * A sync message has two purposes: to signal a new voicemail message, and to indicate the
      * voicemails on the server have changed remotely (usually through the TUI). Save the new
@@ -107,9 +95,11 @@
                 break;
             case OmtpConstants.MAILBOX_UPDATE:
                 // Needs a total resync
+                Bundle bundle = new Bundle();
+                bundle.putBoolean(OmtpVvmSyncAdapter.SYNC_EXTRAS_CLEAR_AND_RELOAD, true);
                 ContentResolver.requestSync(
                         new Account(mPhoneAccount.getId(), OmtpVvmSyncAccountManager.ACCOUNT_TYPE),
-                        VoicemailContract.AUTHORITY, new Bundle());
+                        VoicemailContract.AUTHORITY, bundle);
                 break;
             case OmtpConstants.GREETINGS_UPDATE:
                 // Not implemented in V1
diff --git a/src/com/android/services/telephony/activation/Activator.java b/src/com/android/services/telephony/activation/Activator.java
new file mode 100644
index 0000000..7dee5b3
--- /dev/null
+++ b/src/com/android/services/telephony/activation/Activator.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+/**
+ * SIM Activation implementation generic interface.
+ */
+public interface Activator {
+    void onActivate();
+}
diff --git a/src/com/android/services/telephony/activation/OtaspActivator.java b/src/com/android/services/telephony/activation/OtaspActivator.java
new file mode 100644
index 0000000..11ba726
--- /dev/null
+++ b/src/com/android/services/telephony/activation/OtaspActivator.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+/**
+ * Over-The-Air SIM Provisioning (OTASP) activation implementation.
+ *
+ * Handles OTASP activation requests and returns status updates as activation progresses.
+ */
+public class OtaspActivator implements Activator {
+    @Override
+    public void onActivate() {
+        // TODO: handle otasp activation
+    }
+}
diff --git a/src/com/android/services/telephony/activation/SimActivationActivity.java b/src/com/android/services/telephony/activation/SimActivationActivity.java
index acc0cdf..ae11a3f 100644
--- a/src/com/android/services/telephony/activation/SimActivationActivity.java
+++ b/src/com/android/services/telephony/activation/SimActivationActivity.java
@@ -17,9 +17,13 @@
 package com.android.services.telephony.activation;
 
 import android.app.Activity;
+import android.app.PendingIntent;
+import android.app.PendingIntent.CanceledException;
 import android.content.Intent;
 import android.os.Bundle;
+import android.telephony.TelephonyManager;
 
+import com.android.phone.PhoneGlobals;
 import com.android.services.telephony.Log;
 
 /**
@@ -30,11 +34,40 @@
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
+        Log.i(this, "onCreate");
 
         Intent intent = getIntent();
         if (Intent.ACTION_SIM_ACTIVATION_REQUEST.equals(intent.getAction())) {
             Log.i(this, "Activation requested " + intent);
+
+            runActivation(intent);
         }
         finish();
     }
+
+    private void runActivation(Intent intent) {
+        final PendingIntent response =
+                intent.getParcelableExtra(Intent.EXTRA_SIM_ACTIVATION_RESPONSE);
+
+        Log.i(this, "Running activation w/ response " + response);
+
+        PhoneGlobals app = PhoneGlobals.getInstance();
+        app.simActivationManager.runActivation(SimActivationManager.Triggers.EXPLICIT_REQUEST,
+                new SimActivationManager.Response() {
+                    @Override
+                    public void onResponse(int status) {
+                        if (response != null) {
+                            try {
+                                response.send();
+                            } catch (CanceledException e) {
+                                Log.w(this, "Could not respond to SIM Activation.");
+                            }
+                        }
+                    }
+                });
+
+        // TODO: Set this status to the return value of runActivation
+        // Return the response as an activity result and the pending intent.
+        setResult(TelephonyManager.SIM_ACTIVATION_RESULT_IN_PROGRESS);
+    }
 }
diff --git a/src/com/android/services/telephony/activation/SimActivationManager.java b/src/com/android/services/telephony/activation/SimActivationManager.java
new file mode 100644
index 0000000..ce9e508
--- /dev/null
+++ b/src/com/android/services/telephony/activation/SimActivationManager.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+import android.app.PendingIntent;
+import android.telephony.TelephonyManager;
+
+/**
+ * Handles SIM activation requests and runs the appropriate activation process until it completes
+ * or fails. When done, sends back a response if needed.
+ */
+public class SimActivationManager {
+    public static final class Triggers {
+        public static final int SYSTEM_START = 1;
+        public static final int EXPLICIT_REQUEST = 2;
+    }
+
+    public interface Response {
+        /**
+         * @param status See {@link android.telephony.TelephonyManager} for SIM_ACTIVATION_RESULT_*
+         *               constants.
+         */
+        void onResponse(int status);
+    }
+
+    public void runActivation(int trigger, Response response) {
+        Activator activator = selectActivator(trigger);
+
+        activator.onActivate();
+
+        // TODO: Specify some way to determine if activation is even necessary.
+
+        // TODO: specify some way to return the result.
+
+        if (response != null) {
+            response.onResponse(TelephonyManager.SIM_ACTIVATION_RESULT_COMPLETE);
+        }
+    }
+
+    private Activator selectActivator(int trigger) {
+        // TODO: Select among all activator types
+
+        // For now, pick a do-nothing activator
+        return new Activator() {
+
+            /** ${inheritDoc} */
+                @Override
+            public void onActivate() {
+                // do something
+            }
+        };
+    }
+}
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index af3f7e4..8900568 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -19,6 +19,7 @@
 
     <uses-permission android:name="android.permission.CALL_PHONE" />
     <uses-permission android:name="android.permission.PERFORM_CDMA_PROVISIONING" />
+    <uses-permission android:name="android.permission.PERFORM_SIM_ACTIVATION" />
 
     <application android:label="@string/app_name">
         <uses-library android:name="android.test.runner" />
@@ -56,6 +57,8 @@
                 <data android:scheme="smsto" />
             </intent-filter>
         </service>
+
+        <receiver android:name="com.android.services.telephony.activation.ResponseReceiver" />
     </application>
 
     <!--
diff --git a/tests/src/com/android/services/telephony/activation/ResponseReceiver.java b/tests/src/com/android/services/telephony/activation/ResponseReceiver.java
new file mode 100644
index 0000000..33e7f00
--- /dev/null
+++ b/tests/src/com/android/services/telephony/activation/ResponseReceiver.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import com.android.services.telephony.Log;
+
+public class ResponseReceiver extends BroadcastReceiver {
+    volatile public static boolean responseReceived = false;
+    public static final String ACTION_ACTIVATION_RESPONSE =
+            "com.android.services.telephony.ACTIVATION_RESPONSE";
+
+    private final Object mLock;
+    private Context mContext;
+
+    ResponseReceiver(Object lock) {
+        mLock = lock;
+    }
+
+    /** ${inheritDoc} */
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (!ACTION_ACTIVATION_RESPONSE.equals(intent.getAction())) {
+            Log.e(this, null, "Unexpected intent: " + intent.getAction());
+            return;
+        }
+
+        responseReceived = true;
+        Log.i(this, "received intent");
+
+        if (mLock != null) {
+            synchronized(mLock) {
+                Log.i(this, "notifying");
+                mLock.notify();
+            }
+        }
+    }
+
+    void register(Context context) {
+        context.registerReceiver(this, new IntentFilter(ACTION_ACTIVATION_RESPONSE));
+        mContext = context;
+    }
+
+    void unregister() {
+        mContext.unregisterReceiver(this);
+    }
+}
diff --git a/tests/src/com/android/services/telephony/activation/SimActivationTest.java b/tests/src/com/android/services/telephony/activation/SimActivationTest.java
new file mode 100644
index 0000000..f6060dc
--- /dev/null
+++ b/tests/src/com/android/services/telephony/activation/SimActivationTest.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.services.telephony.activation;
+
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.services.telephony.Log;
+
+public class SimActivationTest extends AndroidTestCase {
+
+    private static Object mActivationLock = new Object();
+    private ResponseReceiver mResponseReceiver;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mResponseReceiver = new ResponseReceiver(mActivationLock);
+        mResponseReceiver.register(context());
+    }
+
+    /** ${inheritDoc} */
+    @Override
+    protected void tearDown() throws Exception {
+        mResponseReceiver.unregister();
+        super.tearDown();
+    }
+
+    @SmallTest
+    public void testSimActivationResponse() throws Exception {
+        Log.i(this, "Running activation test");
+
+        Intent responseIntent = new Intent(ResponseReceiver.ACTION_ACTIVATION_RESPONSE);
+        responseIntent.setPackage(context().getPackageName());
+        PendingIntent pendingResponse = PendingIntent.getBroadcast(
+                context(), 0, responseIntent, 0);
+
+        Intent intent = new Intent(Intent.ACTION_SIM_ACTIVATION_REQUEST);
+        intent.putExtra(Intent.EXTRA_SIM_ACTIVATION_RESPONSE, pendingResponse);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        Log.i(this, "sent intent");
+        context().startActivity(intent);
+        synchronized (mActivationLock) {
+            Log.i(this, "waiting ");
+            mActivationLock.wait(5000);
+            Log.i(this, "unwaiting");
+        }
+        assertTrue(ResponseReceiver.responseReceived);
+    }
+
+    private Context context() {
+        return getContext();
+    }
+}