Merge tag android-5.1.0_r1 into AOSP_5.1_MERGE

Change-Id: Id25e58facce91bd9c22ba5e6658db8ba93ac51c0
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4ff88cf..bb4983b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -21,6 +21,8 @@
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.MANAGE_USERS" />
+    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
+    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
     <uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
     <uses-permission android:name="android.permission.DELETE_PACKAGES"/>
     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
@@ -48,6 +50,7 @@
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
 
     <uses-permission android:name="android.permission.PERFORM_CDMA_PROVISIONING" />
+    <uses-permission android:name="android.permission.ACCESS_PDB_STATE" />
 
     <application
         android:allowClearUserData="false"
@@ -64,54 +67,58 @@
             android:excludeFromRecents="true"
             android:immersive="true"
             android:launchMode="singleTop"
-            android:theme="@style/SetupWorkSpaceTheme"
-            android:screenOrientation="locked">
-            <intent-filter>
+            android:theme="@style/SetupWorkSpaceTheme">
+            <intent-filter android:priority="10">
                 <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <data android:mimeType="application/com.android.managedprovisioning" />
             </intent-filter>
             <!-- Do not change the following action. -->
-            <intent-filter>
+            <intent-filter android:priority="10">
                 <action android:name="com.android.managedprovisioning.ACTION_PROVISION_MANAGED_DEVICE" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
         <activity
-            android:name="ManagedProvisioningActivity"
+            android:name="ProfileOwnerPreProvisioningActivity"
             android:excludeFromRecents="true"
             android:immersive="true"
             android:launchMode="singleTop"
-            android:theme="@style/SetupWorkSpaceTheme"
-            android:screenOrientation="locked">
-            <intent-filter>
+            android:theme="@style/SetupWorkSpaceTheme">
+            <intent-filter android:priority="10">
                 <action android:name="android.app.action.PROVISION_MANAGED_PROFILE" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
         </activity>
+        <activity
+            android:name="ProfileOwnerProvisioningActivity"
+            android:excludeFromRecents="true"
+            android:immersive="true"
+            android:launchMode="singleTop"
+            android:theme="@style/SetupWorkSpaceTheme">
+        </activity>
         <activity-alias
-            android:name="ManagedProvisioningActivityNoCallerCheck"
-            android:targetActivity="ManagedProvisioningActivity"
+            android:name="ProfileOwnerProvisioningActivityNoCallerCheck"
+            android:targetActivity="ProfileOwnerPreProvisioningActivity"
             android:permission="android.permission.MANAGE_USERS"
             android:exported="true">
         </activity-alias>
         <activity
-            android:name="UserConsentActivity"
-            android:immersive="true"
-            android:launchMode="singleTop"
-            android:theme="@style/SetupWorkSpaceTheme"
-            android:screenOrientation="locked">
-        </activity>
-        <activity
             android:name="EncryptDeviceActivity"
             android:immersive="true"
             android:launchMode="singleTop"
-            android:theme="@style/SetupWorkSpaceTheme"
-            android:screenOrientation="locked">
+            android:theme="@style/SetupWorkSpaceTheme">
+        </activity>
+
+        <activity
+            android:name="WebActivity"
+            android:immersive="true"
+            android:launchMode="singleTop"
+            android:theme="@style/SetupWorkSpaceTheme">
         </activity>
 
         <service
-            android:name="ManagedProvisioningService" >
+            android:name="ProfileOwnerProvisioningService" >
         </service>
         <service
             android:name="DeviceOwnerProvisioningService" >
diff --git a/res/layout-large-land/user_consent.xml b/res/layout-large-land/user_consent.xml
index ca568e1..b3d7c43 100644
--- a/res/layout-large-land/user_consent.xml
+++ b/res/layout-large-land/user_consent.xml
@@ -29,21 +29,6 @@
             android:layout_weight="6"
             android:layout_width="0dp"
             android:layout_height="fill_parent"/>
-        <!-- Progress indicator that replaces main view during provisioning. -->
-        <LinearLayout
-            android:id="@+id/progress_container"
-            android:layout_weight="8"
-            android:layout_width="0dp"
-            android:layout_height="fill_parent"
-            android:visibility="gone"
-            style="@style/MainTextContainer" >
-            <TextView
-                android:text="@string/setting_up_workspace"
-                style="@style/MainText"/>
-            <ProgressBar
-                style="@style/ProgressBar"/>
-        </LinearLayout>
-        <!-- Main view -->
         <include layout="@layout/user_consent_main_text"
             android:layout_weight="8"
             android:layout_width="0dp"
diff --git a/res/layout/learn_more_dialog.xml b/res/layout/learn_more_dialog.xml
index 576edfa..f8d5676 100644
--- a/res/layout/learn_more_dialog.xml
+++ b/res/layout/learn_more_dialog.xml
@@ -16,24 +16,38 @@
  * limitations under the License.
  */
 -->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    style="@style/DialogFragmentTextContainer">
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    style="@style/MainTextContainer">
+    <ScrollView
+        android:layout_weight="1"
+        android:layout_height="0dp"
+        style="@style/ScrollView">
 
-    <TextView
-        android:id="@+id/learn_more_text1"
-        style="@style/MainText"/>
+        <LinearLayout
+            android:layout_height="wrap_content"
+            android:layout_width="fill_parent"
+            android:orientation="vertical">
 
-    <TextView
-        android:id="@+id/learn_more_text2"
-        android:text="@string/contact_your_admin_for_more_info"
-        style="@style/MainText"/>
+            <TextView
+                android:id="@+id/learn_more_text1"
+                style="@style/MainText"/>
 
-    <TextView
-        android:id="@+id/learn_more_link"
-        android:textColor="@color/colored_button"
-        android:text="@string/learn_more_link"
-        style="@style/MainText"/>
+            <TextView
+                android:id="@+id/learn_more_text2"
+                android:text="@string/contact_your_admin_for_more_info"
+                style="@style/MainText"/>
+
+            <TextView
+                android:id="@+id/learn_more_link"
+                android:textColor="@color/colored_button"
+                android:text="@string/learn_more_link"
+                style="@style/MainText"/>
+
+        </LinearLayout>
+
+    </ScrollView>
 
     <RelativeLayout
         android:layout_width="fill_parent"
diff --git a/res/layout/progress.xml b/res/layout/progress.xml
index 802bdab..34d25e3 100644
--- a/res/layout/progress.xml
+++ b/res/layout/progress.xml
@@ -18,9 +18,7 @@
 -->
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:orientation="vertical">
+    style="@style/Container" >
     <include layout="@layout/header_and_title"/>
     <LinearLayout
         style="@style/MainTextContainer">
diff --git a/res/layout/user_consent.xml b/res/layout/user_consent.xml
index 2b09712..2ccdfa5 100644
--- a/res/layout/user_consent.xml
+++ b/res/layout/user_consent.xml
@@ -20,19 +20,5 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     style="@style/Container" >
     <include layout="@layout/header_and_title"/>
-
-    <!-- Progress indicator that replaces main view during provisioning. -->
-    <LinearLayout
-        android:id="@+id/progress_container"
-        style="@style/MainTextContainer"
-        android:visibility="gone" >
-        <TextView
-            android:text="@string/setting_up_workspace"
-            style="@style/MainText"/>
-        <ProgressBar
-            style="@style/ProgressBar"/>
-    </LinearLayout>
-
-    <!-- Main view -->
     <include layout="@layout/user_consent_main_text"/>
 </LinearLayout>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 6e95b87..847317a 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Kan nie die administrasieprogram gebruik nie. Komponente ontbreek of dit is korrup. Kontak jou IT-afdeling."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Kon nie die administrasieprogram installeer nie"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Die administrasieprogram is nie op jou toestel geïnstalleer nie"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Hou op om op te stel?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Is jy seker jy wil ophou om op te stel?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nee"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Kanselleer tans …"</string>
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index b5eb423..41a546c 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"የአስተዳዳሪ መተግበሪያውን መጠቀም አይቻልም። ክፍሎች ይጎድሉታል ወይም ተበላሽቷል። የአይቲ መምሪያዎን ያነጋግሩ።"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"የአስተዳዳሪ መተግበሪያውን መጫን አልተቻለም"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"የአስተዳዳር መተግበሪያው በመሣሪያዎ ላይ አልተጫነም"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"ማዋቀር ይቁም?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"እርግጠኛ ነዎት ማዋቀር ማቆም ይፈልጋሉ?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"አይ"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"አዎ"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"በመሰረዝ ላይ..."</string>
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 7938e03..ff3c98a 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"يتعذر استخدام تطبيق المشرف. بعض المكونات مفقودة أو تالفة. يمكنك الاتصال بقسم تكنولوجيا المعلومات."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"يتعذر تثبيت التطبيق الإداري"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"لم يتم تثبيت التطبيق الإداري على جهازك"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"هل تريد إيقاف الإعداد؟"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"هل تريد بالتأكيد إيقاف الإعداد؟"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"لا"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"نعم"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"جارٍ الإلغاء..."</string>
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 11f2476..7bbac2d 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Приложението за администриране не може да се използва. В него липсват компоненти или то е повредено. Свържете се с отдела си за информационни технологии."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Приложението за администриране не можа да се инсталира"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Приложението за администриране не е инсталирано на устройството ви"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Да се спре ли настройването?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Наистина ли искате да спрете настройването?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Не"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Да"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Анулира се..."</string>
 </resources>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index 7dc931f..9c29940 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"প্রশাসক অ্যাপ্লিকেশান ব্যবহার করা যাচ্ছে না। এতে কিছু উপাদান অনুপস্থিত আছে বা এটি ক্ষতিগ্রস্ত হয়েছে। আপনার IT বিভাগের সাথে যোগাযোগ করুন।"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"প্রশাসক অ্যাপ্লিকেশান ইনস্টল করা যায়নি।"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"আপনার ডিভাইসে প্রশাসক অ্যাপ্লিকেশানটি ইনস্টল করা নেই"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"সেটআপ করা বন্ধ করবেন?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"আপনি কি সেটআপ প্রক্রিয়া বন্ধ করার বিষয়ে নিশ্চিত?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"না"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"হ্যাঁ"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"বাতিল হচ্ছে..."</string>
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 0324031..3a72f3e 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"No es pot fer servir l\'aplicació d\'administració perquè està malmesa o hi falten components. Contacta amb el departament de TI."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"No s\'ha pogut instal·lar l\'aplicació d\'administració."</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"L\'aplicació d\'administració no està instal·lada al dispositiu."</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vols aturar la configuració?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Confirmes que vols aturar la configuració?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sí"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"S\'està cancel·lant..."</string>
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index b99083d..1a68889 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Aplikaci pro správu nelze použít. Buď v ní chybí některé komponenty, nebo je poškozená. Obraťte se na oddělení IT."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Instalace aplikace pro správu se nezdařila."</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Ve vašem zařízení není nainstalována aplikace pro správu."</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Zastavit nastavování?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Opravdu chcete nastavování zastavit?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ne"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ano"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Rušení..."</string>
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 31f0085..157923f 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administrationsappen kan ikke bruges. Den mangler komponenter eller er beskadiget. Kontakt din it-afdeling."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Administrationsappen kunne ikke installeres"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administrationsappen er ikke installeret på din enhed"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vil du standse konfigurationen?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Er du sikker på, at du vil stoppe konfigurationen?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nej"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annullerer..."</string>
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 743e83e..9eddaa9 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Die Admin-App kann nicht genutzt werden. Sie wurde beschädigt oder es fehlen Komponenten. Bitte wenden Sie sich an Ihre IT-Abteilung."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Die Admin-App konnte nicht installiert werden."</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Die Admin-App ist nicht auf Ihrem Gerät installiert."</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Einrichtung abbrechen?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Möchten Sie die Einrichtung wirklich beenden?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nein"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Abbrechen..."</string>
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index ee1080d..8665b84 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Δεν ήταν δυνατή η χρήση της εφαρμογής διαχείρισης. Λείπουν στοιχεία ή είναι κατεστραμμένα. Επικοινωνήστε με το τμήμα πληροφορικής υποστήριξης."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Δεν ήταν δυνατή η εγκατάσταση της εφαρμογής διαχείρισης"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Η εφαρμογή διαχείρισης δεν είναι εγκατεστημένη στη συσκευή σας"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Διακοπή ρύθμισης;"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Είστε βέβαιοι ότι θέλετε να διακόψετε τη ρύθμιση;"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Όχι"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ναι"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Γίνεται ακύρωση…"</string>
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index c5519eb..fc3379f 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Can\'t use the admin app. It\'s missing components or corrupted. Contact your IT department."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Couldn\'t install the admin app"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"The admin app isn\'t installed on your device"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Stop setting up?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Are you sure that you want to stop setting up?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Yes"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelling ..."</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index c5519eb..fc3379f 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Can\'t use the admin app. It\'s missing components or corrupted. Contact your IT department."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Couldn\'t install the admin app"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"The admin app isn\'t installed on your device"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Stop setting up?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Are you sure that you want to stop setting up?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Yes"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelling ..."</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index abaf7a9..0716516 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"No se puede usar la aplicación de administración. Hay componentes que faltan o que están dañados. Comunícate con el Departamento de TI."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"No se pudo instalar la aplicación de administración."</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"La aplicación de administración no está instalada en el dispositivo."</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"¿Detener la configuración?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"¿Confirmas que quieres detener la configuración?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sí"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelando…"</string>
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 51ac446..c2491b1 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"No se puede utilizar la aplicación de administración porque faltan componentes o está dañada. Ponte en contacto con el administrador de TI."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"No se ha podido instalar la aplicación de administración"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"La aplicación de administración no está instalada en tu dispositivo"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"¿Detener configuración?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"¿Seguro que quieres detener la configuración?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sí"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelando..."</string>
 </resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index be2e2ab..720af3f 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administraatori rakendust ei saa kasutada. See ei sisalda kõiki komponente või on rikutud. Võtke ühendust oma IT-osakonnaga."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Administraatorirakendust ei õnnestunud installida"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administraatorirakendus ei ole sellesse seadmesse installitud"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Kas peatada seadistamine?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Kas soovite kindlasti seadistamise peatada?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ei"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Jah"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Tühistamine …"</string>
 </resources>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 1f2863c..714f763 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Ezin da erabili administrazio-aplikazioa. Osagaiak falta zaizkio edo hondatuta dago. Jarri informatika-sailarekin harremanetan."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Ezin izan da administrazio-aplikazioa instalatu"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administrazio-aplikazioa ez dago gailuan instalatuta"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Konfiguratzeari utzi nahi diozu?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ziur konfiguratzeari utzi nahi diozula?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ez"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Bai"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Bertan behera uzten…"</string>
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 4bcf447..17b92a2 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"برنامه سرپرست استفاده نمی‌شود. مؤلفه‌های آن وجود ندارند یا خراب هستند. با بخش فناوری اطلاعات مربوط به خودتان تماس بگیرید."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"برنامه سرپرستی نصب نشد"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"برنامه سرپرستی روی دستگاهتان نصب نشده است"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"راه‌اندازی متوقف شود؟"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"آیا مطمئنید که می‌خواهید راه‌اندازی را متوقف کنید؟"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"خیر"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"بله"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"در حال لغو..."</string>
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 10ff0ff..73cab78 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Hallintasovellusta ei voi käyttää. Sovellus on vioittunut tai siitä puuttuu komponentteja. Ota yhteyttä yrityksesi IT-osastoon."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Hallintasovelluksen asentaminen epäonnistui"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Hallintasovellusta ei ole asennettu laitteeseen"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Keskeytetäänkö määrittäminen?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Haluatko varmasti keskeyttää määrittämisen?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ei"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Kyllä"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Peruutetaan..."</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 49e779f..e982065 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Impossible d\'utiliser l\'application d\'administration. Des composants sont manquants ou corrompus. Communiquez avec votre service informatique."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Impossible d\'installer l\'application d\'administration"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"L\'application d\'administration n\'est pas installée sur votre appareil"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Arrêter la configuration?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Voulez-vous vraiment arrêter la configuration?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Non"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Oui"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annulation en cours…"</string>
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index c935df7..bcab1e1 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Impossible d\'utiliser l\'application d\'administration. Des composants sont manquants ou corrompus. Contactez votre service informatique."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Impossible d\'installer l\'application d\'administration."</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"L\'application d\'administration n\'est pas installée sur votre appareil."</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Arrêter la configuration ?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Voulez-vous vraiment arrêter la configuration ?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Non"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Oui"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annulation en cours..."</string>
 </resources>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index 678a334..b7a6a01 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Non se pode utilizar a aplicación de administración. Fáltanlle compoñentes ou está danada. Ponte en contacto co departamento de TI."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Non se puido instalar a aplicación de administración"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"A aplicación de administración non está instalada no teu dispositivo"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Queres deter a configuración?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Estás seguro de que queres deter a configuración?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Non"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Si"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelando..."</string>
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 0f0d3c7..3456e6c 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"व्यवस्थापक ऐप्स का उपयोग नहीं किया जा सकता. उसमें घटक अनुपलब्ध हैं या वे दूषित हैं. अपने IT विभाग से संपर्क करें."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"व्यवस्थापक ऐप्स इंस्टॉल नहीं किया जा सका"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"व्यवस्थापक ऐप्स आपके डिवाइस पर इंस्टॉल नहीं है"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"सेट करना रोकें?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"क्या आप वाकई सेट किए जाने को रोकना चाहते हैं?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"नहीं"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"हां"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"रोका जा रहा है..."</string>
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 66834a5..ef5cd86 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administratorska aplikacija ne može se upotrebljavati. Nedostaju joj neke komponente ili je oštećena. Obratite se IT odjelu."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Instaliranje administratorske aplikacije nije uspjelo"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Na uređaju nije instalirana administratorska aplikacija"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Želite li prekinuti postavljanje?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Jeste li sigurni da želite prekinuti postavljanje?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ne"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Da"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Otkazivanje..."</string>
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 2724d68..dfea90e 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"A rendszergazda-alkalmazás nem használható, mivel egyes elemei hiányoznak vagy sérültek. Forduljon az informatikai részleghez."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Nem lehetett telepíteni a rendszergazdai alkalmazást"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"A rendszergazdai alkalmazás nincs telepítve eszközén"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Megszakítja a beállítást?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Biztosan megszakítja a beállítást?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nem"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Igen"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Megszakítás…"</string>
 </resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 43bfbac..205a3a2 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Հնարավոր չէ օգտագործել ադմինիստրատորի ծրագիրը: Դրանում բացակայում են բաղադրիչներ կամ այն թերի է: Դիմեք ձեր տեխնիկական սպասարկման բաժին:"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Չհաջողվեց տեղադրել ադմինիստրատորի հավելվածը"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Ադմինիստրատորի հավելվածը տեղադրված չէ ձեր սարքում"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Դադարեցնե՞լ կարգավորումը:"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Դադարեցնե՞լ կարգավորումը:"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ոչ"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Այո"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Չեղարկում..."</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index be5795a..1b2879c 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Tidak dapat menggunakan aplikasi admin. Komponen hilang atau rusak. Hubungi departemen TI Anda."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Tidak dapat memasang aplikasi admin"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Aplikasi admin belum terpasang di perangkat Anda"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Berhenti menyiapkan?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Yakin ingin berhenti menyiapkan?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Tidak"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ya"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Membatalkan..."</string>
 </resources>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 9cc7f72..a645b23 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Ekki er hægt að nota stjórnforritið. Það skortir íhluti eða er skemmt. Hafðu samband við upplýsingatæknisvið."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Ekki tókst að setja stjórnunarforritið upp"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Stjórnunarforritið er ekki uppsett á tækinu þínu"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Hætta uppsetningu?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ertu viss um að þú viljir hætta uppsetningu?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nei"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Já"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Hættir við..."</string>
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 65dfccb..d40b2a5 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Impossibile utilizzare l\'app dell\'amministratore per componenti mancanti o danneggiati. Contatta il tuo reparto IT."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Impossibile installare l\'app di amministrazione"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"L\'app di amministrazione non è stata installata sul tuo dispositivo"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Interrompere la configurazione?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Vuoi interrompere la configurazione?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"No"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sì"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annullamento in corso..."</string>
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 5aaf5fb..37d73de 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"‏לא ניתן להשתמש באפליקציית הניהול. חסרים בה מרכיבים או שהיא פגומה. צור קשר עם מחלקת ה-IT שלך."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"לא ניתן להתקין את אפליקציית הניהול"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"אפליקציית הניהול לא מותקנת במכשיר שלך"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"האם להפסיק את תהליך ההגדרה?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"האם אתה בטוח שברצונך להפסיק את תהליך ההגדרה?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"לא"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"כן"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"מבטל..."</string>
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9584d5b..68ec04c 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"管理アプリを使用できません。このアプリはコンポーネントがないか、破損しています。IT部門にお問い合わせください。"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"管理アプリをインストールできませんでした"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"管理アプリが端末にインストールされていません"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"セットアップを中止しますか?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"セットアップを中止してもよろしいですか?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"いいえ"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"はい"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"キャンセル中..."</string>
 </resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 5bdc265..8e1daf6 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"ადმინისტრატორის აპის გამოყენება ვერ მოხერხდა. მას აკლია კომპონენტები, ან დაზიანებულია. დაუკავშირდით თქვენს IT განყოფილებას."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"ადმინისტრატორის აპი ვერ დაინსტალირდა."</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"ადმინისტრატორის აპი არ არის დაინსტალირებული თქვენს მოწყობილობაზე."</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"გსურთ, მომართვის შეჩერება?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"დარწმუნებული ხართ, რომ მომართვის შეწყვეტა გსურთ?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"არა"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"კი"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"უქმდება..."</string>
 </resources>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index f0fcce6..4486b12 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Әкімші қолданбасын пайдалану мүмкін емес. Оның құрамдастары жетіспейді немесе ол бүлінген. АТ бөліміне хабарласыңыз."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Әкімші қолданбасын орнату мүмкін болмады"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Құрылғыңызда әкімші қолданбасы орнатылмаған"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Реттеуді тоқтату керек пе?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Реттеуді тоқтату керек пе?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Жоқ"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Иә"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Бас тартылуда…"</string>
 </resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index e203151..09081ff 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"មិន​អាច​ប្រើ​កម្មវិធី​របស់​អ្នក​គ្រប់គ្រង។ វា​បាត់​សមាសធាតុ ឬ​ក៏​ខូច។ ទាក់ទង​ផ្នែក​បច្ចេកវិទ្យា​ព័ត៌មាន​របស់​អ្នក។"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"មិន​អាច​ដំឡើង​កម្មវិធី​គ្រប់គ្រង"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"កម្មវិធី​គ្រប់គ្រង​មិន​ត្រូវ​បាន​ដំឡើង​នៅ​លើ​ឧបករណ៍​របស់​អ្នក"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"បញ្ឈប់​ការ​រៀបចំ?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"តើ​អ្នក​ប្រាកដ​ជា​ចង់​បញ្ឈប់​ការ​រៀបចំ​?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"ទេ"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"បាទ/ចាស"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"កំពុង​​បោះបង់..."</string>
 </resources>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index b20a7c3..a05f044 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಇದರಲ್ಲಿ ಕಾಂಪೊನೆಂಟ್‌ಗಳು ಕಾಣೆಯಾಗಿವೆ ಅಥವಾ ದೋಷಪೂರಿತವಾಗಿವೆ, ನಿಮ್ಮ IT ವಿಭಾಗವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್‌ ಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"ನಿರ್ವಹಣೆ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"ಹೊಂದಿಸುವುದನ್ನು ನಿಲ್ಲಿಸುವುದೇ?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"ಹೊಂದಿಸುವುದನ್ನು ನೀವು ನಿಲ್ಲಿಸಲು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"ಇಲ್ಲ"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ಹೌದು"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"ರದ್ದುಗೊಳಿಸಲಾಗುತ್ತಿದೆ..."</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 8dbe718..44f6f47 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"관리 앱을 사용할 수 없습니다. 구성요소가 없거나 손상되었습니다. IT 부서에 문의해 주시기 바랍니다."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"관리 앱을 설치할 수 없습니다."</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"기기에 관리 앱이 설치되어 있지 않습니다."</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"설정을 중지하시겠습니까?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"설정을 중지하시겠습니까?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"아니요"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"예"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"취소 중..."</string>
 </resources>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index 9fe6713..0d3fcef 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Администратор колдонмосу иштебей жатат. Анын айрым курамдык бөлүктөрү жок же бузук. IT бөлүмүңүзгө кайрылыңыз."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Администратор колдонмосу орнотулган жок"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Түзмөгүңүздө администратор колдонмосу орнотулган эмес"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Орнотуу токтотулсунбу?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Орнотуу чын эле токтотулсунбу?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Жок"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ооба"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Жокко чыгарылууда…"</string>
 </resources>
diff --git a/res/values-large/dimens.xml b/res/values-large/dimens.xml
index 5389172..5a6a7f7 100644
--- a/res/values-large/dimens.xml
+++ b/res/values-large/dimens.xml
@@ -20,8 +20,8 @@
 
     <!-- Main text -->
     <dimen name="main_text_padding_left_right">40dp</dimen>
+    <dimen name="main_text_padding_top">16dp</dimen>
     <dimen name="main_text_margins_left_right">64dp</dimen>
-    <dimen name="main_text_container_padding_top">16dp</dimen>
 
     <!-- Title -->
     <dimen name="title_height">80dp</dimen>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index 67a42b9..3905c22 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -35,7 +35,7 @@
     <string name="default_managed_profile_name" msgid="5370257687074907055">"​ໂປຣ​ໄຟລ໌​ບ່ອນ​ເຮັດ​ວຽກ"</string>
     <string name="managed_profile_already_present" msgid="888277922880582498">"ທ່ານ​ມີ​ໂ​ປຣ​ໄຟລ໌​ບ່ອນ​ເຮັດ​ວຽກ​ໃນ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ຢູ່​ແລ້ວ. ທ່ານ​​ຕ້ອງ​ການ​ລຶບ​ອອກບໍ່?"</string>
     <string name="sure_you_want_to_delete_profile" msgid="3612824117836349973">"​ທ່ານ​ແນ່​ໃຈ​ບໍ່​ວ່າ​​ຕ້ອງ​ການ​ລຶບ​ໂປຣ​ໄຟລ໌​ບ່ອນ​ເຮັດ​ວຽກ​ນີ້​ອອກ? ຂໍ້​ມູ​ນ​ທັງ​ໝົດ​ຂອງ​ມັນ​ຈະ​ຖືກ​ລຶບ​ອອກ."</string>
-    <string name="delete_profile" msgid="7107020982626129151">"ລຶບ​"</string>
+    <string name="delete_profile" msgid="7107020982626129151">"ລຶບ"</string>
     <string name="cancel_delete_profile" msgid="5155447537894046036">"​ຍົກ​ເລີກ"</string>
     <string name="encrypt_device_text" msgid="6762208577171389053">"​ເພື່ອ​ສືບ​ຕໍ່​ຕັ້ງ​ຄ່າ​ໂປຣ​ໄຟລ໌​ບ່ອນ​ເຮັດ​ວຽກ​ຂອງ​ທ່ານ, ທ່ານ​ຈະ​ຕ້ອງ​ເຂົ້າ​ລະ​ຫັດ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ​ກ່ອນ. ຂັ້ນ​ຕອນ​ນີ້​ຈະ​ໃຊ້​ເວ​ລາ​ໄລ​ຍະ​ນຶ່ງ."</string>
     <string name="encrypt_device_cancel" msgid="5644516574936584926">"​ຍົກ​ເລີກ"</string>
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"ບໍ່​ສາ​ມາດ​ໃຊ້​ແອັບຯ​ຜູ່​ເບິ່ງ​ແຍງ​ລະ​ບົບ​ໄດ້. ມັນ​ຂາດ​ອົງ​ປະ​ກອບທີ່​ຕ້ອງ​ໃຊ້ ຫຼື​​ໄຟລ໌​ມີ​ບັນ​ຫາ. ໃຫ້​ຕິດ​ຕໍ່​ພະ​ແນກ​ຂອງ​ທ່ານ."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"ບໍ່​ສາ​ມາດ​ຕິດ​ຕັ້ງ​ແອັບຯ​ຜູ່​ເບິ່ງ​ແຍງ​ລະ​ບົບ​ໄດ້"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"​​ບໍ່​ມີ​ແອັບຯ​ຜູ່​ເບ​ິ່ງ​ແຍງ​ລະ​ບົບ​ຕິດ​ຕັ້ງ​ໃນ​ອຸ​ປະ​ກອນ​ຂອງ​ທ່ານ"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"ຢຸດ​ການ​ຕິດ​ຕັ້ງ​ຫຼື​ບໍ່?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"​ທ່ານ​ແນ່​ໃຈ​ບໍ່​ວ່າ​ທ່ານ​ຕ້ອງ​ການ​ຢຸດ​ການ​ຕິດ​ຕັ້ງ?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"ບໍ່"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"​ແມ່ນ​ແລ້ວ"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"​ກຳ​ລັງ​ຍົກ​ເລີກ..."</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index db5dc10..959f877 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Negalima naudoti administratoriaus programos. Trūksta jos komponentų arba ji sugadinta. Susisiekite su IT skyriumi."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Nepavyko įdiegti administratoriaus programos"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administratoriaus programa neįdiegta įrenginyje"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Stabdyti sąranką?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ar tikrai norite sustabdyti sąranką?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ne"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Taip"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Atšaukiama..."</string>
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index e2ec4c5..9af6037 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Nevar izmantot administratora lietotni. Tajā trūkst komponentu, vai tā ir bojāta. Sazinieties ar IT nodaļu."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Neizdevās instalēt administratora lietotni"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administratora lietotne nav instalēta ierīcē"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vai apturēt iestatīšanu?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Vai tiešām vēlaties apturēt iestatīšanu?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nē"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Jā"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Notiek atcelšana..."</string>
 </resources>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index e3c721e..97f143a 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Не може да се користи администраторската апликација. Ѝ недостасуваат компоненти или е оштетена. Контактирајте со одделот за ИТ."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Не можеше да се инсталира апликацијата за администратор"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Апликацијата за администратор не е инсталирана на уредот"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Да прекине поставувањето?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Дали сигурно сакате да го прекинете поставувањето?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Не"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Да"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Се откажува..."</string>
 </resources>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index 98f1b49..34b4f9e 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"അഡ്‌മിൻ അപ്ലിക്കേഷൻ ഉപയോഗിക്കാനാവില്ല. അതിന്റെ ഘടകഭാഗങ്ങൾ നഷ്‌ടപ്പെട്ടതോ കേടായതോ ആണ്. നിങ്ങളുടെ ഐടി വിഭാഗവുമായി ബന്ധപ്പെടുക."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"അഡ്‌മിൻ അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളുചെയ്യാനായില്ല"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"നിങ്ങളുടെ ഉപകരണത്തിൽ അഡ്‌മിൻ അപ്ലിക്കേഷൻ ഇൻസ്‌റ്റാളുചെയ്‌തിട്ടില്ല"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"സജ്ജീകരിക്കൽ നിർത്തണോ?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"സജ്ജീകരിക്കൽ നിർത്തണമെന്ന് തീർച്ചയാണോ?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"അല്ല"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"അതെ"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"റദ്ദാക്കുന്നു..."</string>
 </resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index 58e0a27..37de573 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Админ апп-г ашиглах боломжгүй. Бүрдэл дутагдсан эсхүл гэмтсэн байна. МТ хэлтэстэй холбогдоно уу."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Админ апп-г суулгаж чадсангүй"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Таны төхөөрөмж дээр админ апп суугаагүй байна"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Тохируулгыг зогсоох уу?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Та тохируулгыг зогсоохдоо итгэлтэй байна уу?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Үгүй"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Тийм"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Цуцлаж байна..."</string>
 </resources>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index 400785a..857e74c 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -51,7 +51,7 @@
     <string name="default_owned_device_username" msgid="3915120202811807955">"कार्य डिव्‍हाइसचा वापरकर्ता"</string>
     <string name="setup_device" msgid="6725265673245816366">"आपले डिव्हाइस सेट करा"</string>
     <string name="progress_data_process" msgid="7099462614425874283">"सेटअप डेटावर प्रक्रिया करत आहे..."</string>
-    <string name="progress_connect_to_wifi" msgid="9214694010080838763">"Wi-Fi शी कनेक्ट करत आहे..."</string>
+    <string name="progress_connect_to_wifi" msgid="9214694010080838763">"वाय-फाय शी कनेक्ट करत आहे..."</string>
     <string name="progress_download" msgid="4995057798189799156">"प्रशासन अॅप डाउनलोड करत आहे..."</string>
     <string name="progress_install" msgid="9169411715762296097">"प्रशासन अॅप स्थापित करत आहे..."</string>
     <string name="progress_set_owner" msgid="1292946927202510987">"डिव्हाइस मालक सेट करत आहे..."</string>
@@ -62,10 +62,15 @@
     <string name="device_owner_error_reset" msgid="1609782972753569267">"रीसेट करा"</string>
     <string name="device_owner_error_general" msgid="5962462955470123776">"आपले डिव्हाइस सेट करणे शक्य झाले नाही. आपल्या IT विभागाशी संपर्क साधा."</string>
     <string name="device_owner_error_already_provisioned" msgid="1902305486832057049">"हे डिव्‍हाइस आधीपासून सेट केले आहे"</string>
-    <string name="device_owner_error_wifi" msgid="4256310285761332378">"Wi-Fi ला कनेक्ट करू शकलो नाही"</string>
+    <string name="device_owner_error_wifi" msgid="4256310285761332378">"वाय-फाय ला कनेक्ट करू शकलो नाही"</string>
     <string name="device_owner_error_hash_mismatch" msgid="184518450016295596">"एका checksum त्रुटीमुळे प्रशासन अॅप वापरणे शक्य झाले नाही. आपल्या IT विभागाशी संपर्क साधा."</string>
     <string name="device_owner_error_download_failed" msgid="4520111971592657116">"प्रशासक अ‍ॅप डाउनलोड करणे शक्य झाले नाही"</string>
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"प्रशासन अॅप वापरणे शक्य नाही. ते गहाळ घटक किंवा दूषित आहेत. आपल्या IT विभागाशी संपर्क साधा."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"प्रशासक अ‍ॅप स्‍थापित करणे शक्य झाले नाही"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"आपल्‍या डिव्‍हाइसवर प्रशासक अ‍ॅप स्‍थापित केला नाही"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"सेट करणे थांबवायचे?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"आपल्याला खात्री आहे की आपण सेट करणे थांबवू इच्छिता?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"नाही"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"होय"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"रद्द करत आहे..."</string>
 </resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index c105e51..4b251bc 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Tidak dapat menggunakan apl pentadbir. Apl ketiadaan komponen atau rosak. Hubungi jabatan IT anda."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Tidak dapat memasang apl pentadbir"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Apl pentadbir tidak dipasang pada peranti anda"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Berhenti menyediakan?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Adakah anda pasti anda ingin menghentikan penyediaan?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Tidak"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ya"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Membatalkan..."</string>
 </resources>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index e1456ab..396de3d 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -21,14 +21,14 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_name" msgid="4699090302771328296">"ကိရိယာကို စီမံဆောင်ရွက်ပေးသူ"</string>
     <string name="provisioning_error_title" msgid="6320515739861578118">"အူးပ်စ်!"</string>
-    <string name="setup_work_space" msgid="6539913744903244870">"သင်၏ ပရိုဖိုင်ကို စဖွင့်သတ်မှတ်ရန်"</string>
-    <string name="company_controls_workspace" msgid="2808025277267917221">"သင်၏ အဖွဲ့အစည်းက ဒီပရိုဖိုင်ကို ထိန်းချုပ်လျက် လုံခြုံအောင် ထားရှိပါသည်။ သင်သည် သင့် ကိရိယာ ထဲက ကျန်အရာများကို ထိန်းချုပ်ပါသည်။"</string>
+    <string name="setup_work_space" msgid="6539913744903244870">"သင်၏ ပရိုဖိုင်ကို စဖွင့်သတ်မှတ်ရန်"</string>
+    <string name="company_controls_workspace" msgid="2808025277267917221">"သင်၏ အဖွဲ့အစည်းက ဒီပရိုဖိုင်ကို ထိန်းချုပ်လျက် လုံခြုံအောင် ထားရှိပါသည်။ သင်သည် သင့် ကိရိယာ ထဲက ကျန်အရာများကို ထိန်းချုပ်ပါသည်။"</string>
     <string name="the_following_is_your_mdm" msgid="6613658218262376404">"အောက်ပါ appက ဒီပရိုဖိုင်ကို ရယူသုံးရန် လိုအပ်မည်:"</string>
-    <string name="set_up" msgid="7012862095553564169">"စဖွင့်သတ်မှတ်ရန်"</string>
-    <string name="setting_up_workspace" msgid="6116976629983614927">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်စီစဉ်နေ..."</string>
-    <string name="admin_has_ability_to_monitor_profile" msgid="8782160676037188061">"သင်၏ စီမံအုပ်ချုပ်သူသည် ပရိုဖိုင်နှင့် ဆက်နွှယ်နေသည့် ဆက်တင်များ၊ လုပ်ငန်းဆိုင်ရာ ရယူသုံးမှုများ၊ appများ နှင့် ဒေတာများကို၊ ကွန်ရက် လှုပ်ရှားမှုများ နှင့် သင့် ကိရိယာ တည်နေရာ အချက်အလက်များ အပါအဝင်ကို၊ စောင့်ကြပ် စီမံကွပ်ကဲနိုင်စွမ်း ရှိပါသည်။"</string>
-    <string name="admin_has_ability_to_monitor_device" msgid="4534011355086694158">"ဆက်တင်များ၊ လုပ်ငန်းဆိုင်ရာ အသုံးပြုမှုများ၊ appများ၊ ဒီကိရိယာနှင့် ဆက်စပ်နေသည့် ဒေတာကို၊ ကွန်ရက် လှုပ်ရှားမှု နှင့် သင့်ကိရိယာ၏ တည်နေရာ အချက်အလက်များအပါအဝင်ကို၊ သင်၏ စီမံအုပ်ချုပ်သူက စောင့်ကြည့်ပြီး စီမံကွပ်ကဲနိုင်သည်။"</string>
-    <string name="contact_your_admin_for_more_info" msgid="6870084889394621288">"သင့်အဖွဲ့အစည်း၏ ကိုယ်ရေးမူဝါဒများ အပါအဝင်၊ တစ်ခြား အချက်အလက်များ အတွက် သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
+    <string name="set_up" msgid="7012862095553564169">"စဖွင့်သတ်မှတ်ရန်"</string>
+    <string name="setting_up_workspace" msgid="6116976629983614927">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်စီစဉ်နေ..."</string>
+    <string name="admin_has_ability_to_monitor_profile" msgid="8782160676037188061">"သင်၏ စီမံအုပ်ချုပ်သူသည် ပရိုဖိုင်နှင့် ဆက်နွှယ်နေသည့် ဆက်တင်များ၊ လုပ်ငန်းဆိုင်ရာ ရယူသုံးမှုများ၊ appများ နှင့် ဒေတာများကို၊ ကွန်ရက် လှုပ်ရှားမှုများ နှင့် သင့် ကိရိယာ တည်နေရာ အချက်အလက်များ အပါအဝင်ကို၊ စောင့်ကြပ် စီမံကွပ်ကဲနိုင်စွမ်း ရှိပါသည်။"</string>
+    <string name="admin_has_ability_to_monitor_device" msgid="4534011355086694158">"ဆက်တင်များ၊ လုပ်ငန်းဆိုင်ရာ အသုံးပြုမှုများ၊ appများ၊ ဒီကိရိယာနှင့် ဆက်စပ်နေသည့် ဒေတာကို၊ ကွန်ရက် လှုပ်ရှားမှု နှင့် သင့်ကိရိယာ၏ တည်နေရာ အချက်အလက်များအပါအဝင်ကို၊ သင်၏ စီမံအုပ်ချုပ်သူက စောင့်ကြည့်ပြီး စီမံကွပ်ကဲနိုင်သည်။"</string>
+    <string name="contact_your_admin_for_more_info" msgid="6870084889394621288">"သင့်အဖွဲ့အစည်း၏ ကိုယ်ရေးမူဝါဒများ အပါအဝင်၊ တစ်ခြား အချက်အလက်များ အတွက် သင့်စီမံအုပ်ချုပ်သူကို ဆက်သွယ်ပါ။"</string>
     <string name="learn_more_link" msgid="3012495805919550043">"ပိုမိုသိလိုလျှင်"</string>
     <string name="cancel_setup" msgid="2949928239276274745">"ထားတော့"</string>
     <string name="ok_setup" msgid="5148111905838329307">"အိုကေ"</string>
@@ -41,31 +41,36 @@
     <string name="encrypt_device_cancel" msgid="5644516574936584926">"ထားတော့"</string>
     <string name="encrypt_device_launch_settings" msgid="826115154646195837">"လျှို့ဝှက်ကုဒ်သွင်း"</string>
     <string name="continue_provisioning_notify_title" msgid="5191449100153186648">"လျှို့ဝှက်ကုဒ် သွင်းမှု ပြီးဆုံးသွားပြီ"</string>
-    <string name="continue_provisioning_notify_text" msgid="3027317630111909095">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်သတ်မှတ်မှု ဆက်လုပ်ကိုင်ရန် ထိပါ"</string>
-    <string name="managed_provisioning_error_text" msgid="7063621174570680890">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်စီစဉ် မရခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ သို့မဟုတ် နောက်မှာ ထပ်စမ်းပါ။"</string>
-    <string name="managed_provisioning_not_supported" msgid="6582227325719911795">"သင့်စက်က အလုပ်ပရိုဖိုင်များကို မပံ့ပိုးပါ။"</string>
+    <string name="continue_provisioning_notify_text" msgid="3027317630111909095">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်သတ်မှတ်မှု ဆက်လုပ်ကိုင်ရန် ထိပါ"</string>
+    <string name="managed_provisioning_error_text" msgid="7063621174570680890">"သင်၏ အလုပ် ပရိုဖိုင်ကို စဖွင့်စီစဉ် မရခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ သို့မဟုတ် နောက်မှာ ထပ်စမ်းပါ။"</string>
+    <string name="managed_provisioning_not_supported" msgid="6582227325719911795">"သင့်စက်က အလုပ်ပရိုဖိုင်များကို မပံ့ပိုးပါ။"</string>
     <string name="user_is_not_owner" msgid="4358772243716976929">"စက်ပိုင်ရှင်မှ အလုပ်ပရိုဖိုင်များကို စတင်သတ်မှတ်ရန်လိုသည်။"</string>
-    <string name="managed_provisioning_not_supported_by_launcher" msgid="8710138269807942163">"သင့် အလုပ် ပရိုဖိုင်ကို ဒီဖွင့်တင်ရေး appမှ မပံ့ပိုးပါ။ သင်သည် လိုက်ဖက်သည့် ဖွင့်တင်ရေးစက်သို့ ပြောင်းရန် လိုသည်။"</string>
+    <string name="managed_provisioning_not_supported_by_launcher" msgid="8710138269807942163">"သင့် အလုပ် ပရိုဖိုင်ကို ဒီဖွင့်တင်ရေး appမှ မပံ့ပိုးပါ။ သင်သည် လိုက်ဖက်သည့် ဖွင့်တင်ရေးစက်သို့ ပြောင်းရန် လိုသည်။"</string>
     <string name="cancel_provisioning" msgid="3408069559452653724">"ထားတော့"</string>
     <string name="pick_launcher" msgid="4257084827403983845">"အိုကေ"</string>
     <string name="default_owned_device_username" msgid="3915120202811807955">"အလုပ်စက်ပစ္စည်း အသုံးပြုသူ"</string>
-    <string name="setup_device" msgid="6725265673245816366">"သင်၏ ကိရိယာကို စဖွင့်သတ်မှတ်ရန်"</string>
-    <string name="progress_data_process" msgid="7099462614425874283">"စဖွင့်စီစဉ်ရေး ဒေတာကို စီမံဆောင်ရွက်နေ..."</string>
+    <string name="setup_device" msgid="6725265673245816366">"သင်၏ ကိရိယာကို စဖွင့်သတ်မှတ်ရန်"</string>
+    <string name="progress_data_process" msgid="7099462614425874283">"စဖွင့်စီစဉ်ရေး ဒေတာကို စီမံဆောင်ရွက်နေ..."</string>
     <string name="progress_connect_to_wifi" msgid="9214694010080838763">"ကြိုးမဲ့သို့ ချိတ်ဆက်နေ..."</string>
     <string name="progress_download" msgid="4995057798189799156">"စီမံအုပ်ချုပ်သူ appကို ဒေါင်းလုဒ် လုပ်နေ..."</string>
     <string name="progress_install" msgid="9169411715762296097">"စီမံအုပ်ချုပ်သူ appကို တပ်ဆင်နေ..."</string>
-    <string name="progress_set_owner" msgid="1292946927202510987">"ကိရိယာ ပိုင်ရှင်ကို စဖွင့်သတ်မှတ်နေ..."</string>
+    <string name="progress_set_owner" msgid="1292946927202510987">"ကိရိယာ ပိုင်ရှင်ကို စဖွင့်သတ်မှတ်နေ..."</string>
     <string name="device_owner_cancel_title" msgid="7909285135975063120">"စဖွင့်သတ်မှတ်ခြင်း မလုပ်တော့ဘူးလား?"</string>
-    <string name="device_owner_cancel_message" msgid="7928007377743469904">"သင်သည် စဖွင့်စီစဉ်မှုကို ရပ်စဲလိုက်ကာ သင့် ကိရိယာ၏ ဒေတာကို ဖျက်ပစ်လိုတာ သေချာသလား?"</string>
+    <string name="device_owner_cancel_message" msgid="7928007377743469904">"သင်သည် စဖွင့်စီစဉ်မှုကို ရပ်စဲလိုက်ကာ သင့် ကိရိယာ၏ ဒေတာကို ဖျက်ပစ်လိုတာ သေချာသလား?"</string>
     <string name="device_owner_cancel_cancel" msgid="1052951540909389275">"ထားတော့"</string>
     <string name="device_owner_error_ok" msgid="2556654993515978854">"အိုကေ"</string>
     <string name="device_owner_error_reset" msgid="1609782972753569267">"ပြန်ညှိရန်"</string>
-    <string name="device_owner_error_general" msgid="5962462955470123776">"သင်၏ ကိရိယာကို စဖွင့်စီစဉ် မပေးနိုင်ခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
+    <string name="device_owner_error_general" msgid="5962462955470123776">"သင်၏ ကိရိယာကို စဖွင့်စီစဉ် မပေးနိုင်ခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
     <string name="device_owner_error_already_provisioned" msgid="1902305486832057049">"ဤစက်အား ပြင်ဆင်သတ်မှတ်ပြီး"</string>
     <string name="device_owner_error_wifi" msgid="4256310285761332378">"ဝိုင်−ဖိုင်ကို ချိတ်ဆက်မရပါ"</string>
-    <string name="device_owner_error_hash_mismatch" msgid="184518450016295596">"checksum အမှားကြောင့် စီမံအုပ်ချုပ်သူ appကို မသုံးနိုင်ခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
+    <string name="device_owner_error_hash_mismatch" msgid="184518450016295596">"checksum အမှားကြောင့် စီမံအုပ်ချုပ်သူ appကို မသုံးနိုင်ခဲ့ပါ။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
     <string name="device_owner_error_download_failed" msgid="4520111971592657116">"အက်ဒမင် appကို ဒေါင်းလုဒ် မလုပ်နိုင်ခဲ့ပါ။"</string>
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"စီမံအုပ်ချုပ်သူ appကို မသုံးနိုင်ခဲ့ပါ။ ၎င်းထဲက အစိတ်အပိုင်းများ ​ပျောက်နေ သို့မဟုတ် ပျက်စီးနေသည်။ သင်၏ IT ဌာနကို ဆက်သွယ်ပါ။"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"အက်ဒမင် appကို မတပ်ဆင်နိုင်ပါ။"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"သင့်စက်တွင် အက်ဒမင် app မတပ်ဆင်ရသေးပါ။"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"စဖွင့်သတ်မှတ်ခြင်း ရပ်စဲမလား?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"သင်သည် စဖွင့်သတ်မှတ်မှုကို ရပ်စဲချင်တာ သေချာသလား?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"မလို"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ဟုတ်"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"ဖျက်နေ..."</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index d39e24f..cbc1074 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Kan ikke bruke admin-appen. Den mangler komponenter eller er korrupt. Ta kontakt med IT-avdelingen."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Kan ikke installere administratorappen"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administratorappen er ikke installert på enheten din"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vil du stoppe konfigureringen?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Er du sikker på at du vil stoppe konfigureringen?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nei"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Avbryter ..."</string>
 </resources>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index f44bc95..b0dc284 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"प्रशासन अनुप्रयोग प्रयोग गर्न सकिएन। यो अवयवहरू हराइरहेका वा भ्रष्ट हुन्। तपाईँको आईटी विभागमा सम्पर्क गर्नुहोस्।"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"प्रशासक अनुप्रयोग स्थापना गर्न सकिएन"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"प्रशासन अनुप्रयोग तपाईँको उपकरणमा स्थापना गरिएको छैन"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"सेट अप गर्न रोक्नुहुन्छ?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"तपाईँ सेटअप गर्न रोक्न निश्चित हुनुहुन्छ?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"होइन"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"हो"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"रद्द गरिँदै..."</string>
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index f216ff0..49c753b 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Kan de beheer-app niet gebruiken. Er ontbreken onderdelen of de app is beschadigd. Neem contact op met uw IT-afdeling."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Kan de beheer-app niet installeren"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"De beheer-app is niet geïnstalleerd op uw apparaat"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Configureren stoppen?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Weet u zeker dat u het configureren wilt stoppen?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nee"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Annuleren..."</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index c5bb1b4..6fb37c2 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Nie można użyć aplikacji administratora. Brak elementów lub są one uszkodzone. Skontaktuj się z działem IT."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Nie udało się zainstalować aplikacji administratora"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Aplikacja administratora nie jest zainstalowana na urządzeniu"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Przerwać konfigurację?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Czy na pewno chcesz przerwać konfigurację?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nie"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Tak"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Anuluję..."</string>
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 0bfc46e..cdf77fc 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Não é possível utilizar a aplicação de administração. Faltam componentes ou está danificada. Contacte o departamento de TI."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Não foi possível instalar a aplicação de administração"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"A aplicação de administração não está instalada no dispositivo"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Pretende parar a configuração?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Tem a certeza de que pretende parar a configuração?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Não"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sim"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"A cancelar..."</string>
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 2f910e8..a1aaf6f 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Não é possível usar o app para administrador. Alguns componentes estão ausentes ou corrompidos. Entre em contato com o departamento de TI."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Não foi possível instalar o app para administrador"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"O app para administrador não foi instalado no dispositivo"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Interromper configuração?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Tem certeza de que deseja interromper a configuração?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Não"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Sim"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Cancelando..."</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index e2e2047..f9810bb 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Nu se poate utiliza aplicația de administrare. Este deteriorată sau lipsesc componente. Contactați departamentul IT."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Eroare la instalarea aplicației de administrare"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Aplicația de administrare nu este instalată pe dispozitiv"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Opriți configurarea?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Sigur doriți să opriți configurarea?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nu"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Da"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Se anulează..."</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index ec17d2e..8011fa5 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Нельзя использовать приложение для администрирования, так как в нем не хватает компонентов или они повреждены. Обратитесь в отдел технической поддержки вашей компании."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Не удалось установить приложение для администрирования"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"На вашем устройстве не установлено приложение для администрирования"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Подтвердите действие"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Прервать настройку?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Нет"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Да"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Отмена..."</string>
 </resources>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index 85f99ae..5e57b16 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"පරිපාලක යෙදුම භාවිතා කළ නොහැක. එහි අංශ නැත හෝ විකෘති වී ඇත. ඔබගේ IT අංශය සම්බන්ධ කරගන්න."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"පරිපාලක යෙදුම ස්ථාපනය කළ නොහැක."</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"ඔබගේ උපාංගය මත පරිපාලක යෙදුම ස්ථාපනය කර නොමැත."</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"සැකසීම නැවත් වන්නද?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"සකස් කිරීම නැවත් වීමට ඔබට අවශ්‍ය බව ඔබට සහතිකද?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"නැත"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ඔව්"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"අවලංගු කරමින්…"</string>
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 0025d98..27cde1e 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Aplikácia na správu sa nedá použiť. Buď v nej chýbajú niektoré komponenty, alebo je poškodená. Kontaktujte oddelenie IT."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Aplikáciu na správu sa nepodarilo nainštalovať"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Na vašom zariadení nie je nainštalovaná aplikácia na správu"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Zastaviť nastavovanie?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Naozaj chcete zrušiť nastavovanie?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nie"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Áno"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Ruší sa..."</string>
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index fc7c081..8fa209d 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Skrbniške aplikacije ni mogoče uporabljati. Manjkajo ji komponente ali pa je poškodovana. Obrnite se na oddelek za IT."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Skrbniške aplikacije ni bilo mogoče namestiti"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Skrbniška aplikacija ni nameščena v napravi"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Želite ustaviti namestitev?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ali res želite ustaviti namestitev?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ne"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Da"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Preklic ..."</string>
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index f486d6c..3cbb52a 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Није могуће користити апликацију за администраторе. Недостају јој компоненте или је оштећена. Контактирајте ИТ сектор."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Инсталирање апликације за администраторе није успело"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Апликација за администраторе није инсталирана на уређају"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Желите ли да зауставите подешавање?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Желите ли стварно да зауставите подешавање?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Не"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Да"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Отказује се..."</string>
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 4425be5..eea5d03 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administrationsappen kan inte användas. Komponenter saknas eller appen har skadats. Kontakta IT-avdelningen."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Det gick inte att installera administrationsappen"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Administrationsappen har inte installerats på enheten"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Vill du avsluta konfigurationen?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Vill du avsluta konfigurationen?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Nej"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ja"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Avslutar ..."</string>
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 4294429..ec4bd23 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Haiwezi kutumia programu ya msimamizi. Inakosa vipengele au ina hitilafu. Wasiliana na idara yako ya Teknolojia ya Habari."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Haikuweza kusakinisha programu ya msimamizi"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Programu ya msimamizi haijasakinishwa kwenye kifaa chako"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Ungependa kuacha kusanidi?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Je, una uhakika unataka kuacha kusanidi?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Hapana"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ndiyo"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Inaghairi..."</string>
 </resources>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 1a4ad32..e666568 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"நிர்வாகப் பயன்பாட்டைப் பயன்படுத்த முடியவில்லை. இதில் கூறுகள் இல்லாமல் இருக்கலாம் அல்லது இது சேதமடைந்து இருக்கலாம். IT துறையைத் தொடர்புகொள்ளவும்."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"நிர்வாகிப் பயன்பாட்டை நிறுவ முடியவில்லை"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"சாதனத்தில் நிர்வாகிப் பயன்பாடு நிறுவப்படவில்லை"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"அமைப்பதை நிறுத்தவா?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"அமைப்பதை நிச்சயமாக நிறுத்தவா?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"வேண்டாம்"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ஆம்"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"ரத்துசெய்கிறது..."</string>
 </resources>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index 778cf08..45ef848 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"నిర్వాహక అనువర్తనాన్ని ఉపయోగించడం సాధ్యపడదు. ఇందులో కొన్ని భాగాలు లేవు లేదా పాడైంది. మీ IT విభాగాన్ని సంప్రదించండి."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"నిర్వాహక అనువర్తనాన్ని ఇన్‌స్టాల్ చేయడం సాధ్యపడలేదు"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"మీ పరికరంలో నిర్వాహక అనువర్తనం ఇన్‌స్టాల్ చేయబడలేదు"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"సెటప్ చేయడం ఆపివేయాలా?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"మీరు ఖచ్చితంగా సెటప్ చేయడాన్ని ఆపివేయాలనుకుంటున్నారా?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"కాదు"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"అవును"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"రద్దు చేస్తోంది..."</string>
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index a454f5a..57e4676 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"ไม่สามารถใช้แอปผู้ดูแลระบบได้เนื่องจากขาดองค์ประกอบหรือมีข้อขัดข้อง โปรดติดต่อฝ่ายไอทีของคุณ"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"ไม่สามารถติดตั้งแอปผู้ดูแลระบบได้"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"อุปกรณ์ของคุณไม่ได้ติดตั้งแอปผู้ดูแลระบบ"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"หยุดการตั้งค่าใช่ไหม"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"คุณแน่ใจไหมว่าต้องการหยุดการตั้งค่า"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"ไม่"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ใช่"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"กำลังยกเลิก..."</string>
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index d6ce612..947cbcf 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Hindi magamit ang admin app. May mga kulang itong bahagi o sira ito. Makipag-ugnayan sa iyong IT department."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Hindi ma-install ang admin app"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Hindi naka-install ang admin app sa iyong device"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Ihinto ang pagse-set up?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Sigurado ka bang gusto mong ihinto ang pagse-set up?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Hindi"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Oo"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Kinakansela..."</string>
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index a3d0455..b9368c4 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Yönetim uygulaması kullanılamıyor. Bileşenleri eksik veya bozuk. BT bölümünüze başvurun."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Yönetici uygulaması yüklenemedi"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Yönetici uygulaması cihazınızda yüklü değil"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Kurulum durdurulsun mu?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Kurulumu durdurmak istediğinizden emin misiniz?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Hayır"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Evet"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"İptal ediliyor..."</string>
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 76d4732..ded0c0d 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Неможливо скористатися додатком адміністратора. У ньому немає певних компонентів або його пошкоджено. Зв’яжіться з ІТ-відділом."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Не вдалося встановити додаток адміністратора"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Додаток адміністратора не встановлено на вашому пристрої"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Припинити налаштування?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Справді припинити налаштування?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Ні"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Так"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Скасування…"</string>
 </resources>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index b418096..87b2f9b 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"‏منتظم کی ایپ کا استعمال نہیں کر سکتے۔ اس میں چھوٹے ہوئے اجزاء ہیں یا یہ خراب ہوگئی ہے۔ اپنے IT ڈیپارٹمنٹ سے رابطہ کریں۔"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"منتظم کی ایپ کو انسٹال نہیں کیا جا سکا"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"منتظم کی ایپ آپ کے آلہ پر انسٹال نہیں ہے"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"ترتیب دینا بند کریں؟"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"کیا آپ واقعی ترتیب دینا بند کرنا چاہتے ہیں؟"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"نہیں"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"ہاں"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"منسوخ کیا جا رہا ہے…"</string>
 </resources>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index 97c2889..679b3cf 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Administrator ilovasidan foydalanib bo‘lmaydi. Unda ba’zi tarkibiy qismlar mavjud emas yoki buzilgan. IT bo‘limiga murojaat qiling."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Administrator ilovasini o‘rnatib bo‘lmadi"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Qurilmangizga administrator ilovasi o‘rnatilmadi"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Sozlash to‘xtatilsinmi?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Haqiqatan ham sozlashni to‘xtatmoqchimisiz?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Yo‘q"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Ha"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Bekor qilinmoqda…"</string>
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 6c3a6a0..34ae373 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Không thể sử dụng ứng dụng quản trị. Ứng dụng thiếu thành phần hoặc bị lỗi. Hãy liên hệ với bộ phận CNTT."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Không thể cài đặt ứng dụng quản trị"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Ứng dụng quản trị chưa được cài đặt trên thiết bị của bạn"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Dừng thiết lập?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Bạn có chắc chắn muốn dừng thiết lập không?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Không"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Có"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Đang hủy..."</string>
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index efe347b..4446e92 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"由于缺少组件或软件包已损坏,无法使用此管理应用。请与您公司的IT部门联系。"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"无法安装管理应用"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"在您的设备上安装管理应用失败"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"要停止设置吗?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"确定要停止设置吗?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"否"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"是"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"正在取消…"</string>
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 5c0710d..55d64f4 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"管理員應用程式因缺少部分元件或已損毀而無法使用,請與您的 IT 部門聯絡。"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"無法安裝管理員應用程式"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"您的裝置尚未安裝管理員應用程式"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"要停止設定嗎?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"您確定要停止設定嗎?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"否"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"是"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"正在取消…"</string>
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index eef0a84..53b58c3 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"管理應用程式因缺少部分元件或已毀損而無法使用,請與您的 IT 部門聯絡。"</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"無法安裝管理應用程式"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"您的裝置尚未安裝管理應用程式"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"停止設定?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"您確定要停止設定嗎?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"否"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"是"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"取消中..."</string>
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 7ba41d1..f21fc74 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -68,4 +68,9 @@
     <string name="device_owner_error_package_invalid" msgid="3816725179069202140">"Ayikwazi ukusebenzisa uhlelo lokusebenza lomqondisi. Xhumana nomnyango wakho we-IT."</string>
     <string name="device_owner_error_installation_failed" msgid="684566845601079360">"Ayikwazanga ukufaka uhlelo lokusebenza lomqondisi"</string>
     <string name="device_owner_error_package_not_installed" msgid="6095079346537408556">"Uhlelo lokusebenza alufakiwe kudivayisi yakho"</string>
+    <string name="profile_owner_cancel_title" msgid="1087667875324931402">"Misa ukusetha?"</string>
+    <string name="profile_owner_cancel_message" msgid="3397782777804924267">"Ingabe uqinisekile ukuthi ufuna ukumisa ukusetha?"</string>
+    <string name="profile_owner_cancel_cancel" msgid="4408725524311574891">"Cha"</string>
+    <string name="profile_owner_cancel_ok" msgid="5951679183850766029">"Yebo"</string>
+    <string name="profile_owner_cancelling" msgid="2007485854183176973">"Kuyakhanselwa..."</string>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index f6a4317..6764c41 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -21,11 +21,16 @@
     <!-- Main text -->
     <dimen name="main_text_padding_left_right">16dp</dimen>
     <dimen name="main_text_padding_bottom">24dp</dimen>
-    <dimen name="main_text_padding_top">24dp</dimen>
+    <dimen name="main_text_padding_top">0dp</dimen>
+    <dimen name="main_text_padding_between_text">8dp</dimen>
     <dimen name="main_text_margins_left_right">0dp</dimen>
-    <dimen name="main_text_container_padding_top">0dp</dimen>
     <dimen name="main_text_size">16sp</dimen>
 
+    <!-- Dialog Fragment text -->
+    <dimen name="dialog_text_padding_left_right">16dp</dimen>
+    <dimen name="dialog_text_padding_bottom">24dp</dimen>
+    <dimen name="dialog_text_padding_top">24dp</dimen>
+
     <!-- Buttons -->
     <dimen name="button_width">100dp</dimen>
 
@@ -39,6 +44,6 @@
     <dimen name="title_padding">@dimen/main_text_padding_left_right</dimen>
 
     <dimen name="row_height">72dp</dimen>
-    <dimen name="row_padding_top">16dp</dimen>
+    <dimen name="row_padding_top">8dp</dimen>
     <dimen name="icon_width_height">56dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5f821bd..3133ef1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -133,4 +133,14 @@
   <string name="device_owner_error_installation_failed">Couldn\'t install the admin app</string>
   <!-- Message of the error dialog when device admin package is not installed. [CHAR LIMIT=NONE] -->
   <string name="device_owner_error_package_not_installed">The admin app isn\'t installed on your device</string>
+  <!-- Title of the cancel profile owner provisioning dialog. [CHAR LIMIT=45] -->
+  <string name="profile_owner_cancel_title">Stop setting up?</string>
+  <!-- Message of the cancel dialog. [CHAR LIMIT=NONE] -->
+  <string name="profile_owner_cancel_message">Are you sure you want to stop setting up?</string>
+  <!-- Cancel button text of the cancel dialog. [CHAR LIMIT=45] -->
+  <string name="profile_owner_cancel_cancel">No</string>
+  <!-- OK button text of the error dialog. [CHAR LIMIT=45] -->
+  <string name="profile_owner_cancel_ok">Yes</string>
+  <!-- Message of the cancel progress dialog. [CHAR LIMIT=45] -->
+  <string name="profile_owner_cancelling">Cancelling...</string>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 26f4ea8..fb8a8a8 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -77,7 +77,7 @@
         <item name="android:layout_width">fill_parent</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:textColor">@color/text_black</item>
-        <item name="android:paddingTop">@dimen/main_text_padding_top</item>
+        <item name="android:paddingTop">@dimen/main_text_padding_between_text</item>
         <item name="android:textSize">@dimen/main_text_size</item>
     </style>
 
@@ -119,10 +119,23 @@
         <item name="android:layout_marginRight">@dimen/main_text_margins_left_right</item>
         <item name="android:paddingLeft">@dimen/main_text_padding_left_right</item>
         <item name="android:paddingRight">@dimen/main_text_padding_left_right</item>
-        <item name="android:paddingTop">@dimen/main_text_container_padding_top</item>
+        <item name="android:paddingTop">@dimen/main_text_padding_top</item>
         <item name="android:textSize">@dimen/main_text_size</item>
     </style>
 
+    <style name="DialogFragmentTextContainer">
+        <item name="android:layout_width">fill_parent</item>
+        <item name="android:layout_height">fill_parent</item>
+        <item name="android:orientation">vertical</item>
+        <item name="android:background">@color/white</item>
+        <item name="android:paddingBottom">@dimen/dialog_text_padding_bottom</item>
+        <item name="android:paddingLeft">@dimen/dialog_text_padding_left_right</item>
+        <item name="android:paddingRight">@dimen/dialog_text_padding_left_right</item>
+        <item name="android:paddingTop">@dimen/dialog_text_padding_top</item>
+        <item name="android:textSize">@dimen/main_text_size</item>
+    </style>
+
+
     <style name="ScrollView" parent="@android:style/Widget.Material.Light.ScrollView">
         <item name="android:theme">@style/ControlOverlayTheme</item>
         <item name="android:layout_width">fill_parent</item>
@@ -132,7 +145,7 @@
     <style name="ProgressBar" parent="@android:Widget.Material.ProgressBar">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
-        <item name="android:layout_marginTop">@dimen/main_text_padding_top</item>
+        <item name="android:layout_marginTop">@dimen/main_text_padding_between_text</item>
         <item name="android:indeterminate">true</item>
     </style>
 
diff --git a/src/com/android/managedprovisioning/BootReminder.java b/src/com/android/managedprovisioning/BootReminder.java
index a7c7afd..85c6511 100644
--- a/src/com/android/managedprovisioning/BootReminder.java
+++ b/src/com/android/managedprovisioning/BootReminder.java
@@ -15,6 +15,7 @@
  */
 package com.android.managedprovisioning;
 
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME;
 
@@ -50,8 +51,13 @@
         EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
     };
 
+    private static final String[] PROFILE_OWNER_ACCOUNT_EXTRAS = {
+        // Key for the account extras
+        EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE
+    };
+
     private static final ComponentName PROFILE_OWNER_INTENT_TARGET =
-            ManagedProvisioningActivity.ALIAS_NO_CHECK_CALLER;
+            ProfileOwnerPreProvisioningActivity.ALIAS_NO_CHECK_CALLER;
 
     /*
      * Device owner parameters that are stored in the IntentStore for resuming provisioning.
@@ -137,7 +143,8 @@
     private static IntentStore getProfileOwnerIntentStore(Context context) {
         return new IntentStore(context,PROFILE_OWNER_INTENT_TARGET, PROFILE_OWNER_PREFERENCES_NAME)
                 .setStringKeys(PROFILE_OWNER_STRING_EXTRAS)
-                .setPersistableBundleKeys(PROFILE_OWNER_PERSISTABLE_BUNDLE_EXTRAS);
+                .setPersistableBundleKeys(PROFILE_OWNER_PERSISTABLE_BUNDLE_EXTRAS)
+                .setAccountKeys(PROFILE_OWNER_ACCOUNT_EXTRAS);
     }
 
     private static IntentStore getDeviceOwnerIntentStore(Context context) {
diff --git a/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java b/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java
index f7f33e9..1b12252 100644
--- a/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java
+++ b/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java
@@ -18,7 +18,6 @@
 
 import android.app.Activity;
 import android.app.AlertDialog;
-import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -29,6 +28,7 @@
 import android.os.SystemProperties;
 import android.provider.Settings.Global;
 import android.provider.Settings.Secure;
+import android.service.persistentdata.PersistentDataBlockManager;
 import android.support.v4.content.LocalBroadcastManager;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -37,7 +37,7 @@
 
 import com.android.managedprovisioning.task.AddWifiNetworkTask;
 
-import java.util.Locale;
+import java.util.ArrayList;
 
 /**
  * This activity starts device owner provisioning:
@@ -63,32 +63,53 @@
  * repeated. We made sure that all tasks can be done twice without causing any problems.
  * </p>
  */
-public class DeviceOwnerProvisioningActivity extends Activity {
+public class DeviceOwnerProvisioningActivity extends Activity
+        implements UserConsentDialog.ConsentCallback {
+    private static final boolean DEBUG = false; // To control logging.
+
     private static final String KEY_USER_CONSENTED = "user_consented";
+    private static final String KEY_CANCEL_DIALOG_SHOWN = "cancel_dialog_shown";
+    private static final String KEY_PENDING_INTENTS = "pending_intents";
 
     private static final int ENCRYPT_DEVICE_REQUEST_CODE = 1;
     private static final int WIFI_REQUEST_CODE = 2;
 
     private BroadcastReceiver mServiceMessageReceiver;
     private TextView mProgressTextView;
-    private Dialog mDialog; // The cancel or error dialog that is currently shown.
-    private boolean mDone; // Indicates whether the service has sent ACTION_PROVISIONING_SUCCESS.
-
-    // Run when wifi picker activity reports success.
-    private Runnable mOnWifiConnectedRunnable;
 
     // Indicates whether user consented by clicking on positive button of interstitial.
     private boolean mUserConsented = false;
 
+    // Params that will be used after user consent.
+    // Extracted from the starting intent.
+    private ProvisioningParams mParams;
+
+    // Indicates that the cancel dialog is shown.
+    private boolean mCancelDialogShown = false;
+
+    // List of intents received while cancel dialog is shown.
+    private ArrayList<Intent> mPendingProvisioningIntents = new ArrayList<Intent>();
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONCREATE");
 
         if (savedInstanceState != null) {
             mUserConsented = savedInstanceState.getBoolean(KEY_USER_CONSENTED, false);
+            mCancelDialogShown = savedInstanceState.getBoolean(KEY_CANCEL_DIALOG_SHOWN, false);
+            mPendingProvisioningIntents = savedInstanceState
+                    .getParcelableArrayList(KEY_PENDING_INTENTS);
         }
 
-        ProvisionLogger.logd("Device owner provisioning activity ONCREATE");
+        // Setup the UI.
+        final LayoutInflater inflater = getLayoutInflater();
+        final View contentView = inflater.inflate(R.layout.progress, null);
+        setContentView(contentView);
+        mProgressTextView = (TextView) findViewById(R.id.prog_text);
+        TextView titleText = (TextView) findViewById(R.id.title);
+        if (titleText != null) titleText.setText(getString(R.string.setup_device));
+        if (mCancelDialogShown) showCancelResetDialog();
 
         // Check whether we can provision.
         if (Global.getInt(getContentResolver(), Global.DEVICE_PROVISIONED, 0 /* default */) != 0) {
@@ -103,13 +124,11 @@
             return;
         }
 
-        // Setup the UI.
-        final LayoutInflater inflater = getLayoutInflater();
-        final View contentView = inflater.inflate(R.layout.progress, null);
-        setContentView(contentView);
-        mProgressTextView = (TextView) findViewById(R.id.prog_text);
-        TextView titleText = (TextView) findViewById(R.id.title);
-        if (titleText != null) titleText.setText(getString(R.string.setup_device));
+        if (factoryResetProtected()) {
+            ProvisionLogger.loge("Factory reset protection blocks provisioning.");
+            error(R.string.device_owner_error_already_provisioned, false /* no factory reset */);
+            return;
+        }
 
         // Setup broadcast receiver for feedback from service.
         mServiceMessageReceiver = new ServiceMessageReceiver();
@@ -120,15 +139,9 @@
         LocalBroadcastManager.getInstance(this).registerReceiver(mServiceMessageReceiver, filter);
 
         // Parse the incoming intent.
-        final ProvisioningParams params;
         MessageParser parser = new MessageParser();
         try {
-            params = parser.parseIntent(getIntent());
-            mOnWifiConnectedRunnable = new Runnable() {
-                public void run() {
-                    showInterstitialAndProvision(params);
-                }
-            };
+            mParams = parser.parseIntent(getIntent());
         } catch (MessageParser.ParseException e) {
             ProvisionLogger.loge("Could not read data from intent", e);
             error(e.getErrorMessageId(), false /* no factory reset */);
@@ -138,20 +151,32 @@
         // Ask to encrypt the device before proceeding
         if (!(EncryptDeviceActivity.isDeviceEncrypted()
                         || SystemProperties.getBoolean("persist.sys.no_req_encrypt", false))) {
-            requestEncryption(parser, params);
+            requestEncryption(parser, mParams);
             finish();
             return;
             // System will reboot. Bootreminder will restart this activity.
         }
 
         // Have the user pick a wifi network if necessary.
-        if (!AddWifiNetworkTask.isConnectedToWifi(this) && TextUtils.isEmpty(params.mWifiSsid)) {
+        if (!AddWifiNetworkTask.isConnectedToWifi(this) && TextUtils.isEmpty(mParams.mWifiSsid)) {
             requestWifiPick();
             return;
             // Wait for onActivityResult.
         }
 
-        showInterstitialAndProvision(params);
+        showInterstitialAndProvision(mParams);
+    }
+
+    private boolean factoryResetProtected() {
+        // Can't refer to type directly here and API is hidden, so
+        // get it via reflection.
+        PersistentDataBlockManager pdbManager = (PersistentDataBlockManager)
+                getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
+        if (pdbManager == null) {
+            ProvisionLogger.loge("Unable to get persistent data block service");
+            return false;
+        }
+        return pdbManager.getDataBlockSize() > 0;
     }
 
     private void showInterstitialAndProvision(final ProvisioningParams params) {
@@ -160,22 +185,22 @@
         } else {
             // Notify the user that the admin will have full control over the device,
             // then start provisioning.
-            new UserConsentDialog(this, UserConsentDialog.DEVICE_OWNER, new Runnable() {
-                    @Override
-                    public void run() {
-                        mUserConsented = true;
-                        startDeviceOwnerProvisioningService(params);
-                    }
-                } /* onUserConsented */ , new Runnable() {
-                    @Override
-                    public void run() {
-                        finish();
-                    }
-                } /* onCancel */).show(getFragmentManager(),
-                        "UserConsentDialogFragment");
+            UserConsentDialog.newInstance(UserConsentDialog.DEVICE_OWNER)
+                    .show(getFragmentManager(), "UserConsentDialogFragment");
         }
     }
 
+    @Override
+    public void onDialogConsent() {
+        mUserConsented = true;
+        startDeviceOwnerProvisioningService(mParams);
+    }
+
+    @Override
+    public void onDialogCancel() {
+        finish();
+    }
+
     private void startDeviceOwnerProvisioningService(ProvisioningParams params) {
         Intent intent = new Intent(this, DeviceOwnerProvisioningService.class);
         intent.putExtra(DeviceOwnerProvisioningService.EXTRA_PROVISIONING_PARAMS, params);
@@ -188,40 +213,45 @@
         @Override
         public void onReceive(Context context, Intent intent)
         {
-            String action = intent.getAction();
-            if (action.equals(DeviceOwnerProvisioningService.ACTION_PROVISIONING_SUCCESS)) {
-                ProvisionLogger.logd("Successfully provisioned");
+            if (mCancelDialogShown) {
 
-                synchronized(this) {
-                    if (mDialog == null) {
-                        onProvisioningSuccess();
-                    } else {
-                        // Postpone finishing this activity till the user has decided whether
-                        // he/she wants to reset or not.
-                        mDone = true;
-                    }
-                }
+                // Postpone handling the intent.
+                mPendingProvisioningIntents.add(intent);
                 return;
-            } else if (action.equals(DeviceOwnerProvisioningService.ACTION_PROVISIONING_ERROR)) {
-                int errorMessageId = intent.getIntExtra(
-                        DeviceOwnerProvisioningService.EXTRA_USER_VISIBLE_ERROR_ID_KEY,
-                        R.string.device_owner_error_general);
+            }
+            handleProvisioningIntent(intent);
+        }
+    }
 
+    private void handleProvisioningIntent(Intent intent) {
+        String action = intent.getAction();
+        if (action.equals(DeviceOwnerProvisioningService.ACTION_PROVISIONING_SUCCESS)) {
+            if (DEBUG) ProvisionLogger.logd("Successfully provisioned");
+            onProvisioningSuccess();
+        } else if (action.equals(DeviceOwnerProvisioningService.ACTION_PROVISIONING_ERROR)) {
+            int errorMessageId = intent.getIntExtra(
+                    DeviceOwnerProvisioningService.EXTRA_USER_VISIBLE_ERROR_ID_KEY,
+                    R.string.device_owner_error_general);
+
+            if (DEBUG) {
                 ProvisionLogger.logd("Error reported with code "
                         + getResources().getString(errorMessageId));
-                error(errorMessageId, true /* always factory reset */);
-            } else if (action.equals(DeviceOwnerProvisioningService.ACTION_PROGRESS_UPDATE)) {
-                int progressMessage = intent.getIntExtra(
-                        DeviceOwnerProvisioningService.EXTRA_PROGRESS_MESSAGE_ID_KEY, -1);
+            }
+            error(errorMessageId, true /* always factory reset */);
+        } else if (action.equals(DeviceOwnerProvisioningService.ACTION_PROGRESS_UPDATE)) {
+            int progressMessage = intent.getIntExtra(
+                    DeviceOwnerProvisioningService.EXTRA_PROGRESS_MESSAGE_ID_KEY, -1);
+            if (DEBUG) {
                 ProvisionLogger.logd("Progress update reported with code "
-                        + getResources().getString(progressMessage));
-                if (progressMessage >= 0) {
-                    progressUpdate(progressMessage);
-                }
+                    + getResources().getString(progressMessage));
+            }
+            if (progressMessage >= 0) {
+                progressUpdate(progressMessage);
             }
         }
     }
 
+
     private void onProvisioningSuccess() {
         // The Setup wizards listens to this flag and finishes itself when it is set.
         // It then fires a home intent, which we catch in the HomeReceiverActivity before sending
@@ -254,49 +284,53 @@
 
     @Override
     public void onBackPressed() {
+        if (mCancelDialogShown) {
+            return;
+        }
+
+        mCancelDialogShown = true;
         showCancelResetDialog();
     }
 
     private void showCancelResetDialog() {
-        AlertDialog.Builder alertBuilder =
-                new AlertDialog.Builder(DeviceOwnerProvisioningActivity.this)
-                        .setCancelable(false)
-                        .setTitle(R.string.device_owner_cancel_title)
-                        .setMessage(R.string.device_owner_cancel_message)
-                        .setNegativeButton(R.string.device_owner_cancel_cancel,
-                                new DialogInterface.OnClickListener() {
-                                    @Override
-                                    public void onClick(DialogInterface dialog,int id) {
-                                        dialog.dismiss();
-                                        synchronized(this) {
-                                            mDialog = null;
-                                            if (mDone) {
-                                                onProvisioningSuccess();
-                                            }
-                                        }
-                                    }
+        new AlertDialog.Builder(DeviceOwnerProvisioningActivity.this)
+                .setCancelable(false)
+                .setTitle(R.string.device_owner_cancel_title)
+                .setMessage(R.string.device_owner_cancel_message)
+                .setNegativeButton(R.string.device_owner_cancel_cancel,
+                        new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog,int id) {
+                                dialog.dismiss();
+                                handlePendingIntents();
+                                mCancelDialogShown = false;
+                            }
                         })
-                        .setPositiveButton(R.string.device_owner_error_reset,
-                                new DialogInterface.OnClickListener() {
-                                    @Override
-                                    public void onClick(DialogInterface dialog,int id) {
-                                        // Factory reset the device.
-                                        Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
-                                        intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
-                                        intent.putExtra(Intent.EXTRA_REASON,
-                                                "DeviceOwnerProvisioningActivity.showCancelResetDialog()");
-                                        sendBroadcast(intent);
-                                        stopService(new Intent(DeviceOwnerProvisioningActivity.this,
-                                                DeviceOwnerProvisioningService.class));
-                                        finish();
-                                    }
-                        });
+                .setPositiveButton(R.string.device_owner_error_reset,
+                        new DialogInterface.OnClickListener() {
+                            @Override
+                            public void onClick(DialogInterface dialog,int id) {
+                                dialog.dismiss();
 
-        if (mDialog != null) {
-            mDialog.dismiss();
+                                // Factory reset the device.
+                                Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
+                                intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
+                                intent.putExtra(Intent.EXTRA_REASON,
+                                        "DeviceOwnerProvisioningActivity.showCancelResetDialog()");
+                                sendBroadcast(intent);
+                                stopService(new Intent(DeviceOwnerProvisioningActivity.this,
+                                                DeviceOwnerProvisioningService.class));
+                                finish();
+                            }
+                        }).show();
+    }
+
+    private void handlePendingIntents() {
+        for (Intent intent : mPendingProvisioningIntents) {
+            if (DEBUG) ProvisionLogger.logd("Handling pending intent " + intent.getAction());
+            handleProvisioningIntent(intent);
         }
-        mDialog = alertBuilder.create();
-        mDialog.show();
+        mPendingProvisioningIntents.clear();
     }
 
     private void progressUpdate(int progressMessage) {
@@ -317,9 +351,9 @@
                                 DeviceOwnerProvisioningService.class));
                 finish();
             } else if (resultCode == RESULT_OK) {
-                ProvisionLogger.logd("Wifi request result is OK");
+                if (DEBUG) ProvisionLogger.logd("Wifi request result is OK");
                 if (AddWifiNetworkTask.isConnectedToWifi(this)) {
-                    mOnWifiConnectedRunnable.run();
+                    showInterstitialAndProvision(mParams);
                 } else {
                     requestWifiPick();
                 }
@@ -337,6 +371,8 @@
                     new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialog,int id) {
+                            dialog.dismiss();
+
                             // Factory reset the device.
                             Intent intent = new Intent(Intent.ACTION_MASTER_CLEAR);
                             intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
@@ -353,6 +389,8 @@
                     new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialog,int id) {
+                            dialog.dismiss();
+
                             // Close activity.
                             stopService(new Intent(DeviceOwnerProvisioningActivity.this,
                                             DeviceOwnerProvisioningService.class));
@@ -360,50 +398,47 @@
                         }
                     });
         }
-        mDialog = alertBuilder.create();
-        mDialog.show();
+        alertBuilder.show();
     }
 
     @Override
     protected void onSaveInstanceState(Bundle outState) {
         outState.putBoolean(KEY_USER_CONSENTED, mUserConsented);
+        outState.putBoolean(KEY_CANCEL_DIALOG_SHOWN, mCancelDialogShown);
+        outState.putParcelableArrayList(KEY_PENDING_INTENTS, mPendingProvisioningIntents);
     }
 
     @Override
     public void onDestroy() {
-        ProvisionLogger.logd("Device owner provisioning activity ONDESTROY");
+        if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONDESTROY");
         if (mServiceMessageReceiver != null) {
             LocalBroadcastManager.getInstance(this).unregisterReceiver(mServiceMessageReceiver);
             mServiceMessageReceiver = null;
         }
-        if (mDialog != null) {
-            mDialog.dismiss();
-            mDialog = null;
-        }
         super.onDestroy();
     }
 
     @Override
     protected void onRestart() {
-        ProvisionLogger.logd("Device owner provisioning activity ONRESTART");
+        if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONRESTART");
         super.onRestart();
     }
 
     @Override
     protected void onResume() {
-        ProvisionLogger.logd("Device owner provisioning activity ONRESUME");
+        if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONRESUME");
         super.onResume();
     }
 
     @Override
     protected void onPause() {
-        ProvisionLogger.logd("Device owner provisioning activity ONPAUSE");
+        if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONPAUSE");
         super.onPause();
     }
 
     @Override
     protected void onStop() {
-        ProvisionLogger.logd("Device owner provisioning activity ONSTOP");
+        if (DEBUG) ProvisionLogger.logd("Device owner provisioning activity ONSTOP");
         super.onStop();
     }
 }
diff --git a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
index 1a63b12..109bb98 100644
--- a/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
+++ b/src/com/android/managedprovisioning/DeviceOwnerProvisioningService.java
@@ -54,6 +54,8 @@
  * </p>
  */
 public class DeviceOwnerProvisioningService extends Service {
+    private static final boolean DEBUG = false; // To control logging.
+
     /**
      * Intent action to activate the CDMA phone connection by OTASP.
      * This is not necessary for a GSM phone connection, which is activated automatically.
@@ -110,11 +112,11 @@
 
     @Override
     public int onStartCommand(final Intent intent, int flags, int startId) {
-        ProvisionLogger.logd("Device owner provisioning service ONSTARTCOMMAND.");
+        if (DEBUG) ProvisionLogger.logd("Device owner provisioning service ONSTARTCOMMAND.");
 
         synchronized (this) { // Make operations on mProvisioningInFlight atomic.
             if (mProvisioningInFlight) {
-                ProvisionLogger.logd("Provisioning already in flight.");
+                if (DEBUG) ProvisionLogger.logd("Provisioning already in flight.");
 
                 sendProgressUpdateToActivity();
 
@@ -129,7 +131,7 @@
                 }
             } else {
                 mProvisioningInFlight = true;
-                ProvisionLogger.logd("First start of the service.");
+                if (DEBUG) ProvisionLogger.logd("First start of the service.");
                 progressUpdate(R.string.progress_data_process);
 
                 // Load the ProvisioningParams (from message in Intent).
@@ -192,32 +194,36 @@
      * This is the core method of this class. It goes through every provisioning step.
      */
     private void startDeviceOwnerProvisioning(final ProvisioningParams params) {
-        ProvisionLogger.logd("Starting device owner provisioning");
+        if (DEBUG) ProvisionLogger.logd("Starting device owner provisioning");
 
         // Construct Tasks. Do not start them yet.
-        mAddWifiNetworkTask = new AddWifiNetworkTask(this, params.mWifiSsid,
-                params.mWifiHidden, params.mWifiSecurityType, params.mWifiPassword,
-                params.mWifiProxyHost, params.mWifiProxyPort, params.mWifiProxyBypassHosts,
-                params.mWifiPacUrl, new AddWifiNetworkTask.Callback() {
-                        @Override
-                        public void onSuccess() {
-                            if (!TextUtils.isEmpty(params.mDeviceAdminPackageDownloadLocation)) {
-                                // Download, install, set as device owner, delete apps.
-                                progressUpdate(R.string.progress_download);
-                                mDownloadPackageTask.run();
-                            } else {
-                                // Device Admin will not be downloaded (but is already present):
-                                // Just set as device owner, delete apps.
-                                progressUpdate(R.string.progress_set_owner);
-                                mSetDevicePolicyTask.run();
+        if (TextUtils.isEmpty(params.mWifiSsid)) {
+            mAddWifiNetworkTask = null;
+        } else {
+            mAddWifiNetworkTask = new AddWifiNetworkTask(this, params.mWifiSsid,
+                    params.mWifiHidden, params.mWifiSecurityType, params.mWifiPassword,
+                    params.mWifiProxyHost, params.mWifiProxyPort, params.mWifiProxyBypassHosts,
+                    params.mWifiPacUrl, new AddWifiNetworkTask.Callback() {
+                            @Override
+                            public void onSuccess() {
+                                if (!TextUtils.isEmpty(params.mDeviceAdminPackageDownloadLocation)) {
+                                    // Download, install, set as device owner, delete apps.
+                                    progressUpdate(R.string.progress_download);
+                                    mDownloadPackageTask.run();
+                                } else {
+                                    // Device Admin will not be downloaded (but is already present):
+                                    // Just set as device owner, delete apps.
+                                    progressUpdate(R.string.progress_set_owner);
+                                    mSetDevicePolicyTask.run();
+                                }
                             }
-                        }
 
-                        @Override
-                        public void onError(){
-                            error(R.string.device_owner_error_wifi);
-                        }
-                });
+                            @Override
+                            public void onError(){
+                                error(R.string.device_owner_error_wifi);
+                            }
+                        });
+        }
 
         mDownloadPackageTask = new DownloadPackageTask(this,
                 params.mDeviceAdminPackageDownloadLocation, params.mDeviceAdminPackageChecksum,
@@ -277,7 +283,11 @@
                 new SetDevicePolicyTask.Callback() {
                     @Override
                     public void onSuccess() {
-                        mDeleteNonRequiredAppsTask.run();
+                        if (params.mLeaveAllSystemAppsEnabled) {
+                            onProvisioningSuccess(params.mDeviceAdminPackageName);
+                        } else {
+                            mDeleteNonRequiredAppsTask.run();
+                        }
                     }
 
                     @Override
@@ -318,7 +328,7 @@
     }
 
     private void startFirstTask(final ProvisioningParams params) {
-        if (!TextUtils.isEmpty(params.mWifiSsid)) {
+        if (mAddWifiNetworkTask != null) {
 
             // Connect to wifi.
             progressUpdate(R.string.progress_connect_to_wifi);
@@ -344,7 +354,10 @@
     }
 
     private void sendError() {
-        ProvisionLogger.logd("Reporting Error: " + getResources().getString(mLastErrorMessage));
+        if (DEBUG) {
+            ProvisionLogger.logd("Reporting Error: " + getResources()
+                .getString(mLastErrorMessage));
+        }
         Intent intent = new Intent(ACTION_PROVISIONING_ERROR);
         intent.setClass(this, DeviceOwnerProvisioningActivity.ServiceMessageReceiver.class);
         intent.putExtra(EXTRA_USER_VISIBLE_ERROR_ID_KEY, mLastErrorMessage);
@@ -352,8 +365,10 @@
     }
 
     private void progressUpdate(int progressMessage) {
-        ProvisionLogger.logd("Reporting progress update: "
-                + getResources().getString(progressMessage));
+        if (DEBUG) {
+            ProvisionLogger.logd("Reporting progress update: " + getResources()
+                .getString(progressMessage));
+        }
         mLastProgressMessage = progressMessage;
         sendProgressUpdateToActivity();
     }
@@ -366,7 +381,7 @@
     }
 
     private void onProvisioningSuccess(String deviceAdminPackage) {
-        ProvisionLogger.logv("Reporting success.");
+        if (DEBUG) ProvisionLogger.logd("Reporting success.");
         mDone = true;
 
         // Enable the HomeReceiverActivity, since the DeviceOwnerProvisioningActivity will shutdown
@@ -390,7 +405,7 @@
         // Start CDMA activation to enable phone calls.
         final Intent intent = new Intent(ACTION_PERFORM_CDMA_PROVISIONING);
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        ProvisionLogger.logv("Starting cdma activation activity");
+        if (DEBUG) ProvisionLogger.logd("Starting cdma activation activity");
         startActivity(intent); // Activity will be a Nop if not a CDMA device.
     }
 
@@ -398,11 +413,11 @@
         try {
             final AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
             if (timeZone != null) {
-                ProvisionLogger.logd("Setting time zone to " + timeZone);
+                if (DEBUG) ProvisionLogger.logd("Setting time zone to " + timeZone);
                 am.setTimeZone(timeZone);
             }
             if (localTime > 0) {
-                ProvisionLogger.logd("Setting time to " + localTime);
+                if (DEBUG) ProvisionLogger.logd("Setting time to " + localTime);
                 am.setTime(localTime);
             }
         } catch (Exception e) {
@@ -416,7 +431,7 @@
             return;
         }
         try {
-            ProvisionLogger.logd("Setting locale to " + locale);
+            if (DEBUG) ProvisionLogger.logd("Setting locale to " + locale);
             // If locale is different from current locale this results in a configuration change,
             // which will trigger the restarting of the activity.
             LocalePicker.updateLocale(locale);
@@ -428,12 +443,12 @@
 
     @Override
     public void onCreate () {
-        ProvisionLogger.logd("Device owner provisioning service ONCREATE.");
+        if (DEBUG) ProvisionLogger.logd("Device owner provisioning service ONCREATE.");
     }
 
     @Override
     public void onDestroy () {
-        ProvisionLogger.logd("Device owner provisioning service ONDESTROY");
+        if (DEBUG) ProvisionLogger.logd("Device owner provisioning service ONDESTROY");
         if (mAddWifiNetworkTask != null) {
             mAddWifiNetworkTask.cleanUp();
         }
diff --git a/src/com/android/managedprovisioning/IntentStore.java b/src/com/android/managedprovisioning/IntentStore.java
index f239c49..ae5839a 100644
--- a/src/com/android/managedprovisioning/IntentStore.java
+++ b/src/com/android/managedprovisioning/IntentStore.java
@@ -15,24 +15,24 @@
  */
 package com.android.managedprovisioning;
 
+import android.accounts.Account;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
-
 import android.os.Bundle;
 import android.os.PersistableBundle;
 import android.util.Xml;
 
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlPullParserFactory;
 import org.xmlpull.v1.XmlSerializer;
 
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
 /**
  * Helper class to load/save resume information from Intents into a SharedPreferences.
  */
@@ -48,8 +48,12 @@
     private String[] mIntKeys = new String[0];
     private String[] mBooleanKeys = new String[0];
     private String[] mPersistableBundleKeys = new String[0];
+    private String[] mAccountKeys = new String[0];
 
     private static final String TAG_PERSISTABLEBUNDLE = "persistable_bundle";
+    private static final String TAG_ACCOUNT = "account";
+    private static final String ATTRIBUTE_ACCOUNT_NAME = "name";
+    private static final String ATTRIBUTE_ACCOUNT_TYPE = "type";
 
     private static final String IS_SET = "isSet";
 
@@ -80,6 +84,11 @@
         return this;
     }
 
+    public IntentStore setAccountKeys(String[] keys) {
+        mAccountKeys = (keys == null) ? new String[0] : keys;
+        return this;
+    }
+
     public IntentStore setPersistableBundleKeys(String[] keys) {
         mPersistableBundleKeys = (keys == null) ? new String[0] : keys;
         return this;
@@ -105,6 +114,13 @@
         for (String key : mBooleanKeys) {
             editor.putBoolean(key, data.getBoolean(key));
         }
+        for (String key : mAccountKeys) {
+            Account account = (Account) data.getParcelable(key);
+            String accountString = accountToString(account);
+            if (accountString != null) {
+                editor.putString(key, accountString);
+            }
+        }
         for (String key : mPersistableBundleKeys) {
 
             // Cast should be guaranteed to succeed by check in the provisioning activities.
@@ -147,6 +163,14 @@
                 result.putExtra(key, mPrefs.getBoolean(key, false));
             }
         }
+        for (String key : mAccountKeys) {
+            if (mPrefs.contains(key)) {
+                Account account = stringToAccount(mPrefs.getString(key, null));
+                if (account != null) {
+                    result.putExtra(key, account);
+                }
+            }
+        }
         for (String key : mPersistableBundleKeys) {
             if (mPrefs.contains(key)) {
                 PersistableBundle bundle = stringToPersistableBundle(mPrefs.getString(key, null));
@@ -159,6 +183,58 @@
         return result;
     }
 
+    private String accountToString(Account account) {
+        if (account == null) {
+            return null;
+        }
+        StringWriter writer = new StringWriter();
+        XmlSerializer serializer = Xml.newSerializer();
+        try {
+            serializer.setOutput(writer);
+            serializer.startDocument(null, true);
+            serializer.startTag(null, TAG_ACCOUNT);
+            serializer.attribute(null /* namespace */, ATTRIBUTE_ACCOUNT_NAME, account.name);
+            serializer.attribute(null /* namespace */, ATTRIBUTE_ACCOUNT_TYPE, account.type);
+            serializer.endTag(null, TAG_ACCOUNT);
+            serializer.endDocument();
+        } catch (IOException e) {
+            ProvisionLogger.loge("Account could not be stored as string.", e);
+            return null;
+        }
+
+        return writer.toString();
+    }
+
+    private Account stringToAccount(String string) {
+        if (string == null) {
+            return null;
+        }
+        XmlPullParserFactory factory;
+        XmlPullParser parser;
+        try {
+            factory = XmlPullParserFactory.newInstance();
+
+            parser = factory.newPullParser();
+            parser.setInput(new StringReader(string));
+
+            if ((parser.next() == XmlPullParser.START_TAG)
+                    && TAG_ACCOUNT.equals(parser.getName())) {
+                String name = parser.getAttributeValue(null /* namespace */,
+                        ATTRIBUTE_ACCOUNT_NAME);
+                String type = parser.getAttributeValue(null /* namespace */,
+                        ATTRIBUTE_ACCOUNT_TYPE);
+                if (name != null && type != null) {
+                    return new Account(name, type);
+                }
+            }
+        } catch (IOException|XmlPullParserException e) {
+            ProvisionLogger.loge(e);
+            // Fall through.
+        }
+        ProvisionLogger.loge("Account could not be restored from string " + string);
+        return null;
+    }
+
     private String persistableBundleToString(PersistableBundle bundle) {
         if (bundle == null) {
             return null;
diff --git a/src/com/android/managedprovisioning/ManagedProvisioningErrorDialog.java b/src/com/android/managedprovisioning/ManagedProvisioningErrorDialog.java
deleted file mode 100644
index ad123bd..0000000
--- a/src/com/android/managedprovisioning/ManagedProvisioningErrorDialog.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 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.managedprovisioning;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.content.DialogInterface;
-import android.os.Bundle;
-
-/**
- * Dialog used to notify the user that the managed provisioning failed, and shutdown the current
- * activity.
- *
- * Note: You should not do any more work in your app after showing this dialog. See guidelines for
- * {@code Activity#finish()} method call.
- */
-public class ManagedProvisioningErrorDialog extends DialogFragment {
-
-  private final String message;
-
-  public ManagedProvisioningErrorDialog(String message) {
-      super();
-      this.message = message;
-  }
-
-  @Override
-  public Dialog onCreateDialog(Bundle savedInstanceState) {
-      // TODO: This disappears when you rotate, fix it when we refactor the app
-
-      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
-      // TODO: Get strings from PM.
-      alertDialogBuilder.setTitle(R.string.provisioning_error_title)
-              .setMessage(message)
-              .setCancelable(false)
-              .setPositiveButton("OK", new DialogInterface.OnClickListener() {
-                        @Override
-                        public void onClick(DialogInterface dialog,int id) {
-                            // Close activity
-                            getActivity().setResult(Activity.RESULT_CANCELED);
-                            getActivity().finish();
-                      }});
-      return alertDialogBuilder.create();
-  }
-}
diff --git a/src/com/android/managedprovisioning/MessageParser.java b/src/com/android/managedprovisioning/MessageParser.java
index dcca445..1cb77d7 100644
--- a/src/com/android/managedprovisioning/MessageParser.java
+++ b/src/com/android/managedprovisioning/MessageParser.java
@@ -32,6 +32,7 @@
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION;
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER;
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM;
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED;
 import static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
@@ -78,6 +79,8 @@
  * sum of the target file {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}.
  * Additional information to send through to the device admin may be specified in
  * {@link #EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE}.
+ * The boolean {@link #EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED} indicates wheter system
+ * apps should not be disabled.
  * Furthermore a wifi network may be specified in {@link #EXTRA_PROVISIONING_WIFI_SSID}, and if
  * applicable {@link #EXTRA_PROVISIONING_WIFI_HIDDEN},
  * {@link #EXTRA_PROVISIONING_WIFI_SECURITY_TYPE}, {@link #EXTRA_PROVISIONING_WIFI_PASSWORD},
@@ -120,7 +123,8 @@
 
     protected static final String[] DEVICE_OWNER_BOOLEAN_EXTRAS = {
         EXTRA_PROVISIONING_WIFI_HIDDEN,
-        EXTRA_PROVISIONING_STARTED_BY_NFC
+        EXTRA_PROVISIONING_STARTED_BY_NFC,
+        EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED
     };
 
     protected static final String[] DEVICE_OWNER_PERSISTABLE_BUNDLE_EXTRAS = {
@@ -151,6 +155,8 @@
 
         bundle.putBoolean(EXTRA_PROVISIONING_WIFI_HIDDEN, params.mWifiHidden);
         bundle.putBoolean(EXTRA_PROVISIONING_STARTED_BY_NFC, params.mStartedByNfc);
+        bundle.putBoolean(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
+                params.mLeaveAllSystemAppsEnabled);
 
         bundle.putParcelable(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, params.mAdminExtrasBundle);
     }
@@ -232,6 +238,10 @@
                 params.mWifiHidden = Boolean.parseBoolean(s);
             }
 
+            if ((s = props.getProperty(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED)) != null) {
+                params.mLeaveAllSystemAppsEnabled = Boolean.parseBoolean(s);
+            }
+
             checkValidityOfProvisioningParams(params);
             return params;
         } catch (IOException e) {
@@ -283,6 +293,9 @@
                 ProvisioningParams.DEFAULT_WIFI_HIDDEN);
         params.mStartedByNfc = intent.getBooleanExtra(EXTRA_PROVISIONING_STARTED_BY_NFC,
                 false);
+        params.mLeaveAllSystemAppsEnabled = intent.getBooleanExtra(
+                EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,
+                ProvisioningParams.DEFAULT_LEAVE_ALL_SYSTEM_APPS_ENABLED);
 
         try {
             params.mAdminExtrasBundle = (PersistableBundle) intent.getParcelableExtra(
diff --git a/src/com/android/managedprovisioning/PreBootListener.java b/src/com/android/managedprovisioning/PreBootListener.java
index 942e202..151ef9a 100644
--- a/src/com/android/managedprovisioning/PreBootListener.java
+++ b/src/com/android/managedprovisioning/PreBootListener.java
@@ -37,49 +37,64 @@
 public class PreBootListener extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
-        int currentUserId = context.getUserId();
-        if (currentUserId == UserHandle.USER_OWNER) {
-            // Resetting the cross-profile intent filters for the managed profiles which have
-            // this user as their parent.
-            UserManager um = (UserManager) context.getSystemService(
-                    Context.USER_SERVICE);
-            List<UserInfo> profiles = um.getProfiles(currentUserId);
-            boolean hasClearedParent = false;
-            if (profiles.size() > 1) {
-                PackageManager pm = context.getPackageManager();
-                for (UserInfo userInfo : profiles) {
-                    if (userInfo.isManagedProfile()) {
-                        if (!hasClearedParent) {
-                            // Removes filters from the parent to all the managed profiles.
-                            pm.clearCrossProfileIntentFilters(currentUserId);
-                            hasClearedParent = true;
-                        }
-                        pm.clearCrossProfileIntentFilters(userInfo.id);
-                        CrossProfileIntentFiltersHelper.setFilters(
-                                pm, currentUserId, userInfo.id);
-                        deleteNonRequiredApps(context, userInfo.id);
-                    }
-                }
+        if (context.getUserId() != UserHandle.USER_OWNER) {
+            return;
+        }
+
+        DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(
+                Context.DEVICE_POLICY_SERVICE);
+        PackageManager pm = context.getPackageManager();
+
+        // Check for device owner.
+        if (dpm.getDeviceOwner() != null && DeleteNonRequiredAppsTask
+                    .shouldDeleteNonRequiredApps(context, UserHandle.USER_OWNER)) {
+
+            // Delete new apps.
+                deleteNonRequiredApps(context, dpm.getDeviceOwner(), UserHandle.USER_OWNER,
+                        R.array.required_apps_managed_device,
+                        R.array.vendor_required_apps_managed_device,
+                        false /* Do not disable INSTALL_SHORTCUT listeners */);
+        }
+
+        // Check for managed profiles.
+        UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        List<UserInfo> profiles = um.getProfiles(UserHandle.USER_OWNER);
+        if (profiles.size() <= 1) {
+            return;
+        }
+
+        // Removes cross profile intent filters from the parent to all the managed profiles.
+        pm.clearCrossProfileIntentFilters(UserHandle.USER_OWNER);
+
+        // For each managed profile reset cross profile intent filters and delete new apps.
+        for (UserInfo userInfo : profiles) {
+            if (!userInfo.isManagedProfile()) {
+                continue;
             }
+            pm.clearCrossProfileIntentFilters(userInfo.id);
+            CrossProfileIntentFiltersHelper.setFilters(
+                    pm, UserHandle.USER_OWNER, userInfo.id);
+
+            ComponentName profileOwner = dpm.getProfileOwnerAsUser(userInfo.id);
+            if (profileOwner == null) {
+                // Shouldn't happen.
+                ProvisionLogger.loge("No profile owner on managed profile " + userInfo.id);
+                continue;
+            }
+            deleteNonRequiredApps(context, profileOwner.getPackageName(), userInfo.id,
+                    R.array.required_apps_managed_profile,
+                    R.array.vendor_required_apps_managed_profile,
+                    true /* Disable INSTALL_SHORTCUT listeners */);
         }
     }
 
-    /**
-     * Deletes non-required apps that have been added to the system image during the system
-     * update.
-     */
-    private void deleteNonRequiredApps(Context context, int userId) {
-        DevicePolicyManager dpm = (DevicePolicyManager)
-                context.getSystemService(Context.DEVICE_POLICY_SERVICE);
-        ComponentName profileOwner = dpm.getProfileOwnerAsUser(userId);
-        if (profileOwner == null) {
-            ProvisionLogger.loge("There is no profile owner on a managed profile.");
-        }
-
-        new DeleteNonRequiredAppsTask(context, profileOwner.getPackageName(), userId,
-                R.array.required_apps_managed_profile, R.array.vendor_required_apps_managed_profile,
-                false /* We are not creating a new profile */,
-                true /* Disable INSTALL_SHORTCUT listeners */,
+    private void deleteNonRequiredApps(Context context, String mdmPackageName, int userId,
+            int requiredAppsList, int vendorRequiredAppsList,
+            boolean disableInstallShortcutListeners) {
+        new DeleteNonRequiredAppsTask(context, mdmPackageName, userId,
+                requiredAppsList, vendorRequiredAppsList,
+                false /*we are not creating a new profile*/,
+                disableInstallShortcutListeners,
                 new DeleteNonRequiredAppsTask.Callback() {
 
                     @Override
diff --git a/src/com/android/managedprovisioning/ManagedProvisioningActivity.java b/src/com/android/managedprovisioning/ProfileOwnerPreProvisioningActivity.java
similarity index 72%
rename from src/com/android/managedprovisioning/ManagedProvisioningActivity.java
rename to src/com/android/managedprovisioning/ProfileOwnerPreProvisioningActivity.java
index ea79cf2..cd3ddb7 100644
--- a/src/com/android/managedprovisioning/ManagedProvisioningActivity.java
+++ b/src/com/android/managedprovisioning/ProfileOwnerPreProvisioningActivity.java
@@ -23,7 +23,9 @@
 import static com.android.managedprovisioning.EncryptDeviceActivity.TARGET_PROFILE_OWNER;
 
 import android.app.Activity;
+import android.app.admin.DevicePolicyManager;
 import android.app.AlertDialog;
+import android.app.ProgressDialog;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
@@ -54,84 +56,63 @@
 import java.util.List;
 
 /**
- * Managed provisioning sets up a separate profile on a device whose primary user is already set up.
- * The typical example is setting up a corporate profile that is controlled by their employer on a
- * users personal device to keep personal and work data separate.
- *
- * The activity handles the input validation and UI for managed profile provisioning.
- * and starts the {@link ManagedProvisioningService}, which runs through the setup steps in an
- * async task.
+ * The activity sets up the environment in which the {@link ProfileOwnerProvisioningActivity} can be run.
+ * It makes sure the device is encrypted, the current launcher supports managed profiles, the
+ * provisioning intent extras are valid, and that the already present managed profile is removed.
  */
-// TODO: Proper error handling to report back to the user and potentially the mdm.
-public class ManagedProvisioningActivity extends Activity {
+public class ProfileOwnerPreProvisioningActivity extends Activity
+        implements UserConsentDialog.ConsentCallback {
 
     private static final String MANAGE_USERS_PERMISSION = "android.permission.MANAGE_USERS";
 
     // Note: must match the constant defined in HomeSettings
     private static final String EXTRA_SUPPORT_MANAGED_PROFILES = "support_managed_profiles";
 
-    protected static final String EXTRA_USER_HAS_CONSENTED_PROVISIONING =
-            "com.android.managedprovisioning.EXTRA_USER_HAS_CONSENTED_PROVISIONING";
-
-    // Aliases to start managed provisioning with and without MANAGE_USERS permission
+    // Aliases to start profile owner provisioning with and without MANAGE_USERS permission
     protected static final ComponentName ALIAS_CHECK_CALLER =
             new ComponentName("com.android.managedprovisioning",
-                    "com.android.managedprovisioning.ManagedProvisioningActivity");
+                    "com.android.managedprovisioning.ProfileOwnerProvisioningActivity");
 
     protected static final ComponentName ALIAS_NO_CHECK_CALLER =
             new ComponentName("com.android.managedprovisioning",
-                    "com.android.managedprovisioning.ManagedProvisioningActivityNoCallerCheck");
+                    "com.android.managedprovisioning.ProfileOwnerProvisioningActivityNoCallerCheck");
 
+    protected static final int PROVISIONING_REQUEST_CODE = 3;
     protected static final int ENCRYPT_DEVICE_REQUEST_CODE = 2;
     protected static final int CHANGE_LAUNCHER_REQUEST_CODE = 1;
 
     private String mMdmPackageName;
-    private BroadcastReceiver mServiceMessageReceiver;
-
-    private View mContentView;
-    private View mMainTextView;
-    private View mProgressView;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        ProvisionLogger.logd("Managed provisioning activity ONCREATE");
-
         final LayoutInflater inflater = getLayoutInflater();
-        mContentView = inflater.inflate(R.layout.user_consent, null);
-        mMainTextView = mContentView.findViewById(R.id.main_text_container);
-        mProgressView = mContentView.findViewById(R.id.progress_container);
-        setContentView(mContentView);
+        View contentView = inflater.inflate(R.layout.user_consent, null);
+        setContentView(contentView);
 
         // Check whether system has the required managed profile feature.
         if (!systemHasManagedProfileFeature()) {
             showErrorAndClose(R.string.managed_provisioning_not_supported,
-                    "Exiting managed provisioning, managed profiles feature is not available");
+                    "Exiting managed profile provisioning, "
+                    + "managed profiles feature is not available");
             return;
         }
         if (Process.myUserHandle().getIdentifier() != UserHandle.USER_OWNER) {
             showErrorAndClose(R.string.user_is_not_owner,
-                    "Exiting managed provisioning, calling user is not owner.");
+                    "Exiting managed profile provisioning, calling user is not owner.");
             return;
         }
 
-        // Setup broadcast receiver for feedback from service.
-        mServiceMessageReceiver = new ServiceMessageReceiver();
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(ManagedProvisioningService.ACTION_PROVISIONING_SUCCESS);
-        filter.addAction(ManagedProvisioningService.ACTION_PROVISIONING_ERROR);
-        LocalBroadcastManager.getInstance(this).registerReceiver(mServiceMessageReceiver, filter);
-
         // Initialize member variables from the intent, stop if the intent wasn't valid.
         try {
             initialize(getIntent());
-        } catch (ManagedProvisioningFailedException e) {
+        } catch (ProvisioningFailedException e) {
             showErrorAndClose(R.string.managed_provisioning_error_text, e.getMessage());
             return;
         }
 
-        setMdmIcon(mMdmPackageName, mContentView);
+        setMdmIcon(mMdmPackageName);
 
         // If the caller started us via ALIAS_NO_CHECK_CALLER then they must have permission to
         // MANAGE_USERS since it is a restricted intent. Otherwise, check the calling package.
@@ -154,6 +135,15 @@
             }
         }
 
+        DevicePolicyManager dpm =
+                (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
+        String deviceOwner = dpm.getDeviceOwner();
+        if (deviceOwner != null && !deviceOwner.equals(mMdmPackageName)) {
+            showErrorAndClose(R.string.managed_provisioning_error_text, "Permission denied, "
+                    + "profile owner must be in the same package as device owner.");
+            return;
+        }
+
         // If there is already a managed profile, allow the user to cancel or delete it.
         int existingManagedProfileUserId = alreadyHasManagedProfile();
         if (existingManagedProfileUserId != -1) {
@@ -164,7 +154,7 @@
     }
 
     private void showStartProvisioningScreen() {
-        Button positiveButton = (Button) mContentView.findViewById(R.id.positive_button);
+        Button positiveButton = (Button) findViewById(R.id.positive_button);
         positiveButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -174,13 +164,8 @@
     }
 
     private boolean packageHasManageUsersPermission(String pkg) {
-        int packagePermission = this.getPackageManager()
+        return PackageManager.PERMISSION_GRANTED == getPackageManager()
                 .checkPermission(MANAGE_USERS_PERMISSION, pkg);
-        if (packagePermission == PackageManager.PERMISSION_GRANTED) {
-            return true;
-        } else {
-            return false;
-        }
     }
 
     private boolean systemHasManagedProfileFeature() {
@@ -195,6 +180,9 @@
         PackageManager pm = getPackageManager();
         ResolveInfo launcherResolveInfo
                 = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
+        if (launcherResolveInfo == null) {
+            return false;
+        }
         try {
             ApplicationInfo launcherAppInfo = getPackageManager().getApplicationInfo(
                     launcherResolveInfo.activityInfo.packageName, 0 /* default flags */);
@@ -208,39 +196,18 @@
         return versionNumber >= Build.VERSION_CODES.LOLLIPOP;
     }
 
-    class ServiceMessageReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(ManagedProvisioningService.ACTION_PROVISIONING_SUCCESS)) {
-                ProvisionLogger.logd("Successfully provisioned."
-                        + "Finishing ManagedProvisioningActivity");
-                ManagedProvisioningActivity.this.setResult(Activity.RESULT_OK);
-                ManagedProvisioningActivity.this.finish();
-                return;
-            } else if (action.equals(ManagedProvisioningService.ACTION_PROVISIONING_ERROR)) {
-                String errorLogMessage = intent.getStringExtra(
-                        ManagedProvisioningService.EXTRA_LOG_MESSAGE_KEY);
-                ProvisionLogger.logd("Error reported: " + errorLogMessage);
-                showErrorAndClose(R.string.managed_provisioning_error_text, errorLogMessage);
-                return;
-            }
-        }
-    }
-
-    private void setMdmIcon(String packageName, View contentView) {
+    private void setMdmIcon(String packageName) {
         if (packageName != null) {
             PackageManager pm = getPackageManager();
             try {
                 ApplicationInfo ai = pm.getApplicationInfo(packageName, /* default flags */ 0);
                 if (ai != null) {
                     Drawable packageIcon = pm.getApplicationIcon(packageName);
-                    ImageView imageView = (ImageView) contentView.findViewById(R.id.mdm_icon_view);
+                    ImageView imageView = (ImageView) findViewById(R.id.mdm_icon_view);
                     imageView.setImageDrawable(packageIcon);
 
                     String appLabel = pm.getApplicationLabel(ai).toString();
-                    TextView deviceManagerName = (TextView) contentView
-                            .findViewById(R.id.device_manager_name);
+                    TextView deviceManagerName = (TextView) findViewById(R.id.device_manager_name);
                     deviceManagerName.setText(appLabel);
                 }
             } catch (PackageManager.NameNotFoundException e) {
@@ -257,13 +224,13 @@
      *
      * @param intent The intent that started provisioning
      */
-    private void initialize(Intent intent) throws ManagedProvisioningFailedException {
+    private void initialize(Intent intent) throws ProvisioningFailedException {
         // Check if the admin extras bundle is of the right type.
         try {
             PersistableBundle bundle = (PersistableBundle) getIntent().getParcelableExtra(
                     EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
         } catch (ClassCastException e) {
-            throw new ManagedProvisioningFailedException("Extra "
+            throw new ProvisioningFailedException("Extra "
                     + EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
                     + " must be of type PersistableBundle.", e);
         }
@@ -271,29 +238,18 @@
         // Validate package name and check if the package is installed
         mMdmPackageName = intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME);
         if (TextUtils.isEmpty(mMdmPackageName)) {
-            throw new ManagedProvisioningFailedException("Missing intent extra: "
+            throw new ProvisioningFailedException("Missing intent extra: "
                     + EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME);
         } else {
             try {
                 this.getPackageManager().getPackageInfo(mMdmPackageName, 0);
             } catch (NameNotFoundException e) {
-                throw new ManagedProvisioningFailedException("Mdm "+ mMdmPackageName
+                throw new ProvisioningFailedException("Mdm "+ mMdmPackageName
                         + " is not installed. ", e);
             }
         }
     }
 
-    @Override
-    public void onBackPressed() {
-        // TODO: Handle this graciously by stopping the provisioning flow and cleaning up.
-    }
-
-    @Override
-    public void onDestroy() {
-        LocalBroadcastManager.getInstance(this).unregisterReceiver(mServiceMessageReceiver);
-        super.onDestroy();
-    }
-
     /**
      * If the device is encrypted start the service which does the provisioning, otherwise ask for
      * user consent to encrypt the device.
@@ -304,13 +260,8 @@
 
             // Notify the user once more that the admin will have full control over the profile,
             // then start provisioning.
-            new UserConsentDialog(this, UserConsentDialog.PROFILE_OWNER, new Runnable() {
-                    @Override
-                    public void run() {
-                        setupEnvironmentAndProvision();
-                    }
-                } /* onUserConsented */ , null /* onCancel */).show(getFragmentManager(),
-                        "UserConsentDialogFragment");
+            UserConsentDialog.newInstance(UserConsentDialog.PROFILE_OWNER)
+                    .show(getFragmentManager(), "UserConsentDialogFragment");
         } else {
             Bundle resumeExtras = getIntent().getExtras();
             resumeExtras.putString(EXTRA_RESUME_TARGET, TARGET_PROFILE_OWNER);
@@ -321,18 +272,25 @@
         }
     }
 
+    @Override
+    public void onDialogConsent() {
+        setupEnvironmentAndProvision();
+    }
+
+    @Override
+    public void onDialogCancel() {
+        // Do nothing.
+    }
+
     private void setupEnvironmentAndProvision() {
         // Remove any pre-provisioning UI in favour of progress display
-        BootReminder.cancelProvisioningReminder(
-                ManagedProvisioningActivity.this);
-        mProgressView.setVisibility(View.VISIBLE);
-        mMainTextView.setVisibility(View.GONE);
+        BootReminder.cancelProvisioningReminder(this);
 
         // Check whether the current launcher supports managed profiles.
         if (!currentLauncherSupportsManagedProfiles()) {
             showCurrentLauncherInvalid();
         } else {
-            startManagedProvisioningService();
+            startProfileOwnerProvisioning();
         }
     }
 
@@ -343,10 +301,10 @@
         // Continue in onActivityResult.
     }
 
-    private void startManagedProvisioningService() {
-        Intent intent = new Intent(this, ManagedProvisioningService.class);
+    private void startProfileOwnerProvisioning() {
+        Intent intent = new Intent(this, ProfileOwnerProvisioningActivity.class);
         intent.putExtras(getIntent());
-        startService(intent);
+        startActivityForResult(intent, PROVISIONING_REQUEST_CODE);
     }
 
     @Override
@@ -361,9 +319,13 @@
             if (resultCode == RESULT_CANCELED) {
                 showCurrentLauncherInvalid();
             } else if (resultCode == RESULT_OK) {
-                startManagedProvisioningService();
+                startProfileOwnerProvisioning();
             }
         }
+        if (requestCode == PROVISIONING_REQUEST_CODE) {
+            setResult(resultCode);
+            finish();
+        }
     }
 
     private void showCurrentLauncherInvalid() {
@@ -390,8 +352,19 @@
 
     public void showErrorAndClose(int resourceId, String logText) {
         ProvisionLogger.loge(logText);
-        new ManagedProvisioningErrorDialog(getString(resourceId))
-              .show(getFragmentManager(), "ErrorDialogFragment");
+        new AlertDialog.Builder(this)
+                .setTitle(R.string.provisioning_error_title)
+                .setMessage(getString(resourceId))
+                .setCancelable(false)
+                .setPositiveButton(R.string.device_owner_error_ok, new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog,int id) {
+                            // Close activity
+                            ProfileOwnerPreProvisioningActivity.this
+                                    .setResult(Activity.RESULT_CANCELED);
+                            ProfileOwnerPreProvisioningActivity.this.finish();
+                        }
+                    }).show();
     }
 
     /**
@@ -449,7 +422,7 @@
                 new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
-                ManagedProvisioningActivity.this.finish();
+                ProfileOwnerPreProvisioningActivity.this.finish();
             }
         };
 
@@ -462,17 +435,17 @@
         return builder.create();
     }
     /**
-     * Exception thrown when the managed provisioning has failed completely.
+     * Exception thrown when the provisioning has failed completely.
      *
      * We're using a custom exception to avoid catching subsequent exceptions that might be
      * significant.
      */
-    private class ManagedProvisioningFailedException extends Exception {
-        public ManagedProvisioningFailedException(String message) {
+    private class ProvisioningFailedException extends Exception {
+        public ProvisioningFailedException(String message) {
             super(message);
         }
 
-        public ManagedProvisioningFailedException(String message, Throwable t) {
+        public ProvisioningFailedException(String message, Throwable t) {
             super(message, t);
         }
     }
diff --git a/src/com/android/managedprovisioning/ProfileOwnerProvisioningActivity.java b/src/com/android/managedprovisioning/ProfileOwnerProvisioningActivity.java
new file mode 100644
index 0000000..a785b09
--- /dev/null
+++ b/src/com/android/managedprovisioning/ProfileOwnerProvisioningActivity.java
@@ -0,0 +1,328 @@
+/*
+ * Copyright 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.managedprovisioning;
+
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AccountManagerFuture;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
+import android.app.Activity;
+import android.app.ActivityManagerNative;
+import android.app.AlertDialog;
+import android.app.IActivityManager;
+import android.app.ProgressDialog;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.support.v4.content.LocalBroadcastManager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import java.io.IOException;
+
+/**
+ * Profile owner provisioning sets up a separate profile on a device whose primary user is already
+ * set up.
+ *
+ * <p>
+ * The typical example is setting up a corporate profile that is controlled by their employer on a
+ * users personal device to keep personal and work data separate.
+ *
+ * <p>
+ * The activity handles the UI for managed profile provisioning and starts the
+ * {@link ProfileOwnerProvisioningService}, which runs through the setup steps in an
+ * async task.
+ */
+public class ProfileOwnerProvisioningActivity extends Activity {
+    protected static final String ACTION_CANCEL_PROVISIONING =
+            "com.android.managedprovisioning.CANCEL_PROVISIONING";
+
+    private BroadcastReceiver mServiceMessageReceiver;
+
+    // Provisioning service started
+    private static final int CANCELSTATUS_PROVISIONING = 1;
+    // Back button pressed during provisioning, confirm dialog showing.
+    private static final int CANCELSTATUS_CONFIRMING = 2;
+    // Cancel confirmed, waiting for the provisioning service to complete.
+    private static final int CANCELSTATUS_CANCELLING = 3;
+    // Cancelling not possible anymore, provisioning already finished succesfully.
+    private static final int CANCELSTATUS_FINALIZING = 4;
+
+    private static final String KEY_CANCELSTATUS= "cancelstatus";
+    private static final String KEY_PENDING_INTENT = "pending_intent";
+
+    private int mCancelStatus = CANCELSTATUS_PROVISIONING;
+    private Intent mPendingProvisioningResult = null;
+    private ProgressDialog mCancelProgressDialog = null;
+    private AccountManager mAccountManager;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        ProvisionLogger.logd("Profile owner provisioning activity ONCREATE");
+        mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
+
+        if (savedInstanceState != null) {
+            mCancelStatus = savedInstanceState.getInt(KEY_CANCELSTATUS, CANCELSTATUS_PROVISIONING);
+            mPendingProvisioningResult = savedInstanceState.getParcelable(KEY_PENDING_INTENT);
+        }
+
+        final LayoutInflater inflater = getLayoutInflater();
+        View contentView = inflater.inflate(R.layout.progress, null);
+        setContentView(contentView);
+        TextView textView = (TextView) findViewById(R.id.prog_text);
+        if (textView != null) textView.setText(getString(R.string.setting_up_workspace));
+
+
+        if (mCancelStatus == CANCELSTATUS_CONFIRMING) {
+            showCancelProvisioningDialog();
+        } else if (mCancelStatus == CANCELSTATUS_CANCELLING) {
+            showCancelProgressDialog();
+        }
+    }
+
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+
+        // Setup broadcast receiver for feedback from service.
+        mServiceMessageReceiver = new ServiceMessageReceiver();
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(ProfileOwnerProvisioningService.ACTION_PROVISIONING_SUCCESS);
+        filter.addAction(ProfileOwnerProvisioningService.ACTION_PROVISIONING_ERROR);
+        filter.addAction(ProfileOwnerProvisioningService.ACTION_PROVISIONING_CANCELLED);
+        LocalBroadcastManager.getInstance(this).registerReceiver(mServiceMessageReceiver, filter);
+
+        // Start service async to make sure the UI is loaded first.
+        final Handler handler = new Handler(getMainLooper());
+        handler.post(new Runnable() {
+                @Override
+                public void run() {
+                    Intent intent = new Intent(ProfileOwnerProvisioningActivity.this,
+                            ProfileOwnerProvisioningService.class);
+                    intent.putExtras(getIntent());
+                    startService(intent);
+                }
+            });
+    }
+
+    class ServiceMessageReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (mCancelStatus == CANCELSTATUS_CONFIRMING) {
+                // Store the incoming intent and only process it after the user has responded to
+                // the cancel dialog
+                mPendingProvisioningResult = intent;
+                return;
+            }
+            handleProvisioningResult(intent);
+        }
+    }
+
+    private void handleProvisioningResult(Intent intent) {
+        String action = intent.getAction();
+        if (ProfileOwnerProvisioningService.ACTION_PROVISIONING_SUCCESS.equals(action)) {
+            if (mCancelStatus == CANCELSTATUS_CANCELLING) {
+                return;
+            }
+
+            ProvisionLogger.logd("Successfully provisioned."
+                    + "Finishing ProfileOwnerProvisioningActivity");
+
+            Intent pendingIntent = (Intent) intent.getParcelableExtra(
+                    ProfileOwnerProvisioningService.EXTRA_PENDING_SUCCESS_INTENT);
+            int serialNumber = intent.getIntExtra(
+                    ProfileOwnerProvisioningService.EXTRA_PROFILE_USER_SERIAL_NUMBER, -1);
+
+            int userId = intent.getIntExtra(ProfileOwnerProvisioningService.EXTRA_PROFILE_USER_ID,
+                    -1);
+            onProvisioningSuccess(pendingIntent, userId, serialNumber);
+        } else if (ProfileOwnerProvisioningService.ACTION_PROVISIONING_ERROR.equals(action)) {
+            if (mCancelStatus == CANCELSTATUS_CANCELLING){
+                return;
+            }
+            String errorLogMessage = intent.getStringExtra(
+                    ProfileOwnerProvisioningService.EXTRA_LOG_MESSAGE_KEY);
+            ProvisionLogger.logd("Error reported: " + errorLogMessage);
+            error(R.string.managed_provisioning_error_text, errorLogMessage);
+        } if (ProfileOwnerProvisioningService.ACTION_PROVISIONING_CANCELLED.equals(action)) {
+            if (mCancelStatus != CANCELSTATUS_CANCELLING) {
+                return;
+            }
+            mCancelProgressDialog.dismiss();
+            ProfileOwnerProvisioningActivity.this.setResult(Activity.RESULT_CANCELED);
+            stopService(new Intent(ProfileOwnerProvisioningActivity.this,
+                            ProfileOwnerProvisioningService.class));
+            ProfileOwnerProvisioningActivity.this.finish();
+        }
+    }
+
+    @Override
+    public void onBackPressed() {
+        if (mCancelStatus == CANCELSTATUS_PROVISIONING) {
+            showCancelProvisioningDialog();
+        }
+    }
+
+    private void showCancelProvisioningDialog() {
+        mCancelStatus = CANCELSTATUS_CONFIRMING;
+        AlertDialog alertDialog = new AlertDialog.Builder(this)
+                        .setCancelable(false)
+                        .setTitle(R.string.profile_owner_cancel_title)
+                        .setMessage(R.string.profile_owner_cancel_message)
+                        .setNegativeButton(R.string.profile_owner_cancel_cancel,
+                                new DialogInterface.OnClickListener() {
+                                    @Override
+                                    public void onClick(DialogInterface dialog,int id) {
+                                        mCancelStatus = CANCELSTATUS_PROVISIONING;
+                                        if (mPendingProvisioningResult != null) {
+                                            handleProvisioningResult(mPendingProvisioningResult);
+                                        }
+                                    }
+                        })
+                        .setPositiveButton(R.string.profile_owner_cancel_ok,
+                                new DialogInterface.OnClickListener() {
+                                    @Override
+                                    public void onClick(DialogInterface dialog,int id) {
+                                        confirmCancel();
+                                    }
+                        })
+                        .create();
+        alertDialog.show();
+    }
+
+    protected void showCancelProgressDialog() {
+        mCancelProgressDialog = new ProgressDialog(this);
+        mCancelProgressDialog.setMessage(getText(R.string.profile_owner_cancelling));
+        mCancelProgressDialog.setCancelable(false);
+        mCancelProgressDialog.setCanceledOnTouchOutside(false);
+        mCancelProgressDialog.show();
+    }
+
+    public void error(int resourceId, String logText) {
+        ProvisionLogger.loge(logText);
+        new AlertDialog.Builder(this)
+                .setTitle(R.string.provisioning_error_title)
+                .setMessage(getString(resourceId))
+                .setCancelable(false)
+                .setPositiveButton(R.string.device_owner_error_ok, new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog,int id) {
+                            confirmCancel();
+                        }
+                    }).show();
+    }
+
+    private void confirmCancel() {
+        mCancelStatus = CANCELSTATUS_CANCELLING;
+        Intent intent = new Intent(ProfileOwnerProvisioningActivity.this,
+                ProfileOwnerProvisioningService.class);
+        intent.setAction(ACTION_CANCEL_PROVISIONING);
+        startService(intent);
+        showCancelProgressDialog();
+    }
+
+    /**
+     * Notify the mdm that provisioning has completed. When the mdm has received the intent, stop
+     * the service and notify the {@link ProfileOwnerProvisioningActivity} so that it can finish itself.
+     */
+    private void onProvisioningSuccess(Intent pendingSuccessIntent, int userId, int serialNumber) {
+        mCancelStatus = CANCELSTATUS_FINALIZING;
+        Settings.Secure.putIntForUser(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE,
+                1 /* true- > setup complete */, userId);
+
+        UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
+        UserHandle userHandle = userManager.getUserForSerialNumber(serialNumber);
+
+        // Use an ordered broadcast, so that we only finish when the mdm has received it.
+        // Avoids a lag in the transition between provisioning and the mdm.
+        BroadcastReceiver mdmReceivedSuccessReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                ProvisionLogger.logd("ACTION_PROFILE_PROVISIONING_COMPLETE broadcast received by"
+                        + " mdm");
+                ProfileOwnerProvisioningActivity.this.setResult(Activity.RESULT_OK);
+
+                // Now cleanup the primary profile if necessary
+                if (getIntent().hasExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE)) {
+                    ProvisionLogger.logd("Cleaning up account from the primary user.");
+                    final Account account = (Account) getIntent().getParcelableExtra(
+                            EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE);
+                    new AsyncTask<Void, Void, Void>() {
+                        @Override
+                        protected Void doInBackground(Void... params) {
+                            removeAccount(account);
+                            return null;
+                        }
+                    }.execute();
+                }
+
+                ProfileOwnerProvisioningActivity.this.finish();
+                stopService(new Intent(ProfileOwnerProvisioningActivity.this,
+                                ProfileOwnerProvisioningService.class));
+            }
+        };
+
+        sendOrderedBroadcastAsUser(pendingSuccessIntent, userHandle, null,
+                mdmReceivedSuccessReceiver, null, Activity.RESULT_OK, null, null);
+        ProvisionLogger.logd("Provisioning complete broadcast has been sent to user "
+            + userHandle.getIdentifier());
+    }
+
+    private void removeAccount(Account account) {
+        try {
+            AccountManagerFuture<Bundle> bundle = mAccountManager.removeAccount(account,
+                    this, null /* callback */, null /* handler */);
+            if (bundle.getResult().getBoolean(AccountManager.KEY_BOOLEAN_RESULT, false)) {
+                ProvisionLogger.logw("Account removed from the primary user.");
+            } else {
+                ProvisionLogger.logw("Could not remove account from the primary user.");
+            }
+        } catch (OperationCanceledException | AuthenticatorException | IOException e) {
+            ProvisionLogger.logw("Exception removing account from the primary user.", e);
+        }
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        outState.putInt(KEY_CANCELSTATUS, mCancelStatus);
+        outState.putParcelable(KEY_PENDING_INTENT, mPendingProvisioningResult);
+    }
+
+    @Override
+    public void onPause() {
+        LocalBroadcastManager.getInstance(this).unregisterReceiver(mServiceMessageReceiver);
+        super.onPause();
+    }
+}
+
diff --git a/src/com/android/managedprovisioning/ManagedProvisioningService.java b/src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java
similarity index 66%
rename from src/com/android/managedprovisioning/ManagedProvisioningService.java
rename to src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java
index f63a244..44a6048 100644
--- a/src/com/android/managedprovisioning/ManagedProvisioningService.java
+++ b/src/com/android/managedprovisioning/ProfileOwnerProvisioningService.java
@@ -17,10 +17,15 @@
 package com.android.managedprovisioning;
 
 import static android.app.admin.DeviceAdminReceiver.ACTION_PROFILE_PROVISIONING_COMPLETE;
+import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME;
 import static android.Manifest.permission.BIND_DEVICE_ADMIN;
 
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.app.ActivityManagerNative;
 import android.app.IActivityManager;
@@ -30,7 +35,6 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.IntentFilter;
 import android.content.pm.ActivityInfo;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
@@ -38,35 +42,45 @@
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.UserInfo;
 import android.os.AsyncTask;
+import android.os.IBinder;
 import android.os.Parcelable;
 import android.os.PersistableBundle;
-import android.os.IBinder;
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.MediaStore;
-import android.provider.Settings;
 import android.support.v4.content.LocalBroadcastManager;
 import android.text.TextUtils;
 
 import com.android.managedprovisioning.CrossProfileIntentFiltersHelper;
 import com.android.managedprovisioning.task.DeleteNonRequiredAppsTask;
 
+import java.io.IOException;
+
 /**
- * Service that runs the managed provisioning.
+ * Service that runs the profile owner provisioning.
  *
- * <p>This service is started from and sends updates to the {@link ManagedProvisioningActivity},
+ * <p>This service is started from and sends updates to the {@link ProfileOwnerProvisioningActivity},
  * which contains the provisioning UI.
  */
-public class ManagedProvisioningService extends Service {
+public class ProfileOwnerProvisioningService extends Service {
+    // Extra keys for reporting back success to the activity.
+    public static final String EXTRA_PROFILE_USER_ID =
+            "com.android.managedprovisioning.extra.profile_user_id";
+    public static final String EXTRA_PROFILE_USER_SERIAL_NUMBER =
+            "com.android.managedprovisioning.extra.profile_user_serial_number";
+    public static final String EXTRA_PENDING_SUCCESS_INTENT =
+            "com.android.managedprovisioning.extra.pending_success_intent";
 
     // Intent actions for communication with DeviceOwnerProvisioningService.
     public static final String ACTION_PROVISIONING_SUCCESS =
             "com.android.managedprovisioning.provisioning_success";
     public static final String ACTION_PROVISIONING_ERROR =
             "com.android.managedprovisioning.error";
+    public static final String ACTION_PROVISIONING_CANCELLED =
+            "com.android.managedprovisioning.cancelled";
     public static final String EXTRA_LOG_MESSAGE_KEY = "ProvisioingErrorLogMessage";
 
     private String mMdmPackageName;
@@ -75,15 +89,23 @@
     // PersistableBundle extra received in starting intent.
     // Should be passed through to device management application when provisioning is complete.
     private PersistableBundle mAdminExtrasBundle;
+    private Account mAccountToMigrate;
 
     private IPackageManager mIpm;
     private UserInfo mManagedProfileUserInfo;
+    private AccountManager mAccountManager;
     private UserManager mUserManager;
 
     private int mStartIdProvisioning;
-    private AsyncTask<Intent, Object, Void> runnerTask;
+    private AsyncTask<Intent, Void, Void> runnerTask;
 
-    private class RunnerTask extends AsyncTask<Intent, Object, Void> {
+    // MessageId of the last error message.
+    private String mLastErrorMessage = null;
+
+    private boolean mDone = false;
+    private boolean mCancelInFuture = false;
+
+    private class RunnerTask extends AsyncTask<Intent, Void, Void> {
         @Override
         protected Void doInBackground(Intent ... intents) {
             initialize(intents[0]);
@@ -96,9 +118,8 @@
     public void onCreate() {
         super.onCreate();
 
-        ProvisionLogger.logd("Managed provisioning service ONCREATE");
-
         mIpm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+        mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
         mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
 
         runnerTask = new RunnerTask();
@@ -106,19 +127,54 @@
 
     @Override
     public int onStartCommand(final Intent intent, int flags, int startId) {
+        if (ProfileOwnerProvisioningActivity.ACTION_CANCEL_PROVISIONING.equals(intent.getAction())) {
+            ProvisionLogger.logd("Cancelling profile owner provisioning service");
+            cancelProvisioning();
+            return START_NOT_STICKY;
+        }
 
-        ProvisionLogger.logd("Starting managed provisioning service");
+        ProvisionLogger.logd("Starting profile owner provisioning service");
+
         try {
             runnerTask.execute(intent);
-        } catch (IllegalStateException ex) {
-            ProvisionLogger.logd("ManagedProvisioningService: Provisioning already in progress, "
-                    + "second provisioning intent not being processed");
+        } catch (IllegalStateException e) {
+            // runnerTask is either in progress, or finished.
+            ProvisionLogger.logd(
+                    "ProfileOwnerProvisioningService: Provisioning already started, "
+                    + "second provisioning intent not being processed, only reporting status.");
+            reportStatus();
         }
         return START_NOT_STICKY;
     }
 
+    private void reportStatus() {
+        if (mLastErrorMessage != null) {
+            sendError();
+        }
+        synchronized (this) {
+            if (mDone) {
+                notifyActivityOfSuccess();
+            }
+        }
+    }
+
+    private void cancelProvisioning() {
+        synchronized (this) {
+            if (!mDone) {
+                mCancelInFuture = true;
+                return;
+            }
+            cleanup();
+        }
+    }
+
     private void initialize(Intent intent) {
         mMdmPackageName = intent.getStringExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME);
+        mAccountToMigrate = (Account) intent.getParcelableExtra(
+                EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE);
+        if (mAccountToMigrate != null) {
+            ProvisionLogger.logi("Migrating account to managed profile");
+        }
 
         // Cast is guaranteed by check in Activity.
         mAdminExtrasBundle  = (PersistableBundle) intent.getParcelableExtra(
@@ -186,13 +242,83 @@
      * apps not needed have been deleted).
      */
     private void setUpProfileAndFinish() {
-            installMdmOnManagedProfile();
-            setMdmAsActiveAdmin();
-            setMdmAsManagedProfileOwner();
-            startManagedProfile();
-            CrossProfileIntentFiltersHelper.setFilters(
-                    getPackageManager(), getUserId(), mManagedProfileUserInfo.id);
-            onProvisioningSuccess(mActiveAdminComponentName);
+        installMdmOnManagedProfile();
+        setMdmAsActiveAdmin();
+        setMdmAsManagedProfileOwner();
+        CrossProfileIntentFiltersHelper.setFilters(
+                getPackageManager(), getUserId(), mManagedProfileUserInfo.id);
+
+        if (!startManagedProfile(mManagedProfileUserInfo.id)) {
+            error("Could not start user in background");
+            return;
+        }
+        copyAccount(mAccountToMigrate);
+        synchronized (this) {
+            mDone = true;
+            if (mCancelInFuture) {
+                cleanup();
+            } else {
+                // Notify activity of success.
+                notifyActivityOfSuccess();
+            }
+        }
+    }
+
+    /**
+     * Initialize the user that underlies the managed profile.
+     * This is required so that the provisioning complete broadcast can be sent across to the
+     * profile and apps can run on it.
+     */
+    private boolean startManagedProfile(int userId)  {
+        ProvisionLogger.logd("Starting user in background");
+        IActivityManager iActivityManager = ActivityManagerNative.getDefault();
+        try {
+            return iActivityManager.startUserInBackground(userId);
+        } catch (RemoteException neverThrown) {
+            // Never thrown, as we are making local calls.
+            ProvisionLogger.loge("This should not happen.", neverThrown);
+        }
+        return false;
+    }
+
+    private void notifyActivityOfSuccess() {
+        // Compose the intent that will be fired by the activity.
+        Intent completeIntent = new Intent(ACTION_PROFILE_PROVISIONING_COMPLETE);
+        completeIntent.setComponent(mActiveAdminComponentName);
+        completeIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES |
+                Intent.FLAG_RECEIVER_FOREGROUND);
+        if (mAdminExtrasBundle != null) {
+            completeIntent.putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE,
+                    mAdminExtrasBundle);
+        }
+
+        Intent successIntent = new Intent(ACTION_PROVISIONING_SUCCESS);
+        successIntent.putExtra(EXTRA_PROFILE_USER_ID, mManagedProfileUserInfo.id);
+        successIntent.putExtra(EXTRA_PENDING_SUCCESS_INTENT, completeIntent);
+        successIntent.putExtra(EXTRA_PROFILE_USER_SERIAL_NUMBER,
+                mManagedProfileUserInfo.serialNumber);
+        LocalBroadcastManager.getInstance(ProfileOwnerProvisioningService.this)
+                .sendBroadcast(successIntent);
+    }
+
+    private void copyAccount(Account account) {
+        if (account == null) {
+            ProvisionLogger.logd("No account to migrate to the managed profile.");
+            return;
+        }
+        ProvisionLogger.logd("Attempting to copy account to user " + mManagedProfileUserInfo.id);
+        try {
+            if (mAccountManager.copyAccountToUser(account, mManagedProfileUserInfo.getUserHandle(),
+                    /* callback= */ null, /* handler= */ null).getResult()) {
+                ProvisionLogger.logi("Copied account to user " + mManagedProfileUserInfo.id);
+            } else {
+                ProvisionLogger.loge("Could not copy account to user "
+                        + mManagedProfileUserInfo.id);
+            }
+        } catch (OperationCanceledException | AuthenticatorException | IOException e) {
+            ProvisionLogger.logw("Exception copying account to user " + mManagedProfileUserInfo.id,
+                    e);
+        }
     }
 
     private void createProfile(String profileName) {
@@ -212,27 +338,7 @@
         }
     }
 
-    /**
-     * Initializes the user that underlies the managed profile.
-     * This is required so that the provisioning complete broadcast can be sent across to the
-     * profile and apps can run on it.
-     */
-    private void startManagedProfile()  {
-        ProvisionLogger.logd("Starting user in background");
-        IActivityManager iActivityManager = ActivityManagerNative.getDefault();
-        try {
-            boolean success = iActivityManager.startUserInBackground(mManagedProfileUserInfo.id);
-            if (!success) {
-               error("Could not start user in background");
-            }
-        } catch (RemoteException neverThrown) {
-            // Never thrown, as we are making local calls.
-            ProvisionLogger.loge("This should not happen.", neverThrown);
-        }
-    }
-
     private void installMdmOnManagedProfile() {
-
         ProvisionLogger.logd("Installing mobile device management app " + mMdmPackageName +
               " on managed profile");
 
@@ -261,7 +367,6 @@
     }
 
     private void setMdmAsManagedProfileOwner() {
-
         ProvisionLogger.logd("Setting package " + mMdmPackageName + " as managed profile owner.");
 
         DevicePolicyManager dpm =
@@ -274,7 +379,6 @@
     }
 
     private void setMdmAsActiveAdmin() {
-
         ProvisionLogger.logd("Setting package " + mMdmPackageName + " as active admin.");
 
         DevicePolicyManager dpm =
@@ -283,55 +387,15 @@
                 mManagedProfileUserInfo.id);
     }
 
-    /**
-     * Notify the mdm that provisioning has completed. When the mdm has received the intent, stop
-     * the service and notify the {@link ManagedProvisioningActivity} so that it can finish itself.
-     *
-     * @param deviceAdminComponent The component of the mdm that will be notified.
-     */
-    private void onProvisioningSuccess(ComponentName deviceAdminComponent) {
-        Settings.Secure.putIntForUser(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE,
-                1 /* true- > setup complete */, mManagedProfileUserInfo.id);
-
-        UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
-        UserHandle userHandle = userManager.getUserForSerialNumber(
-                mManagedProfileUserInfo.serialNumber);
-
-        Intent completeIntent = new Intent(ACTION_PROFILE_PROVISIONING_COMPLETE);
-        completeIntent.setComponent(mActiveAdminComponentName);
-        completeIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES |
-            Intent.FLAG_RECEIVER_FOREGROUND);
-        if (mAdminExtrasBundle != null) {
-            completeIntent.putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, mAdminExtrasBundle);
-        }
-
-        // Use an ordered broadcast, so that we only finish when the mdm has received it.
-        // Avoids a lag in the transition between provisioning and the mdm.
-        BroadcastReceiver mdmReceivedSuccessReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                ProvisionLogger.logd("ACTION_PROFILE_PROVISIONING_COMPLETE broadcast received by"
-                        + " mdm");
-                Intent successIntent = new Intent(ACTION_PROVISIONING_SUCCESS);
-                LocalBroadcastManager.getInstance(ManagedProvisioningService.this)
-                        .sendBroadcast(successIntent);
-                stopSelf();
-            }
-
-        };
-        sendOrderedBroadcastAsUser(completeIntent, userHandle, null,
-                mdmReceivedSuccessReceiver, null, Activity.RESULT_OK, null, null);
-
-        ProvisionLogger.logd("Provisioning complete broadcast has been sent to user "
-            + userHandle.getIdentifier());
+    private void error(String dialogMessage) {
+        mLastErrorMessage = dialogMessage;
+        sendError();
     }
 
-    private void error(String logMessage) {
+    private void sendError() {
         Intent intent = new Intent(ACTION_PROVISIONING_ERROR);
-        intent.putExtra(EXTRA_LOG_MESSAGE_KEY, logMessage);
+        intent.putExtra(EXTRA_LOG_MESSAGE_KEY, mLastErrorMessage);
         LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
-        cleanup();
-        stopSelf();
     }
 
     /**
@@ -343,15 +407,13 @@
             ProvisionLogger.logd("Removing managed profile");
             mUserManager.removeUser(mManagedProfileUserInfo.id);
         }
+        Intent cancelIntent = new Intent(ACTION_PROVISIONING_CANCELLED);
+        LocalBroadcastManager.getInstance(ProfileOwnerProvisioningService.this)
+                .sendBroadcast(cancelIntent);
     }
 
     @Override
     public IBinder onBind(Intent intent) {
         return null;
     }
-
-    @Override
-    public void onDestroy() {
-        ProvisionLogger.logd("ManagedProvisioningService  ONDESTROY");
-    }
 }
diff --git a/src/com/android/managedprovisioning/ProvisioningParams.java b/src/com/android/managedprovisioning/ProvisioningParams.java
index 927ac12..ab919d2 100644
--- a/src/com/android/managedprovisioning/ProvisioningParams.java
+++ b/src/com/android/managedprovisioning/ProvisioningParams.java
@@ -29,6 +29,7 @@
 public class ProvisioningParams implements Parcelable {
     public static final long DEFAULT_LOCAL_TIME = -1;
     public static final boolean DEFAULT_WIFI_HIDDEN = false;
+    public static final boolean DEFAULT_LEAVE_ALL_SYSTEM_APPS_ENABLED = false;
     public static final int DEFAULT_WIFI_PROXY_PORT = 0;
 
     public String mTimeZone;
@@ -54,6 +55,8 @@
 
     public boolean mStartedByNfc; // True iff provisioning flow was started by Nfc bump.
 
+    public boolean mLeaveAllSystemAppsEnabled;
+
     public String getLocaleAsString() {
         if (mLocale != null) {
             return mLocale.getLanguage() + "_" + mLocale.getCountry();
@@ -91,6 +94,7 @@
         out.writeByteArray(mDeviceAdminPackageChecksum);
         out.writeParcelable(mAdminExtrasBundle, 0 /* default */);
         out.writeInt(mStartedByNfc ? 1 : 0);
+        out.writeInt(mLeaveAllSystemAppsEnabled ? 1 : 0);
     }
 
     public static final Parcelable.Creator<ProvisioningParams> CREATOR
@@ -116,6 +120,7 @@
             in.readByteArray(params.mDeviceAdminPackageChecksum);
             params.mAdminExtrasBundle = in.readParcelable(null /* use default classloader */);
             params.mStartedByNfc = in.readInt() == 1;
+            params.mLeaveAllSystemAppsEnabled = in.readInt() == 1;
             return params;
         }
 
diff --git a/src/com/android/managedprovisioning/UserConsentDialog.java b/src/com/android/managedprovisioning/UserConsentDialog.java
index af792d7..47b390b 100644
--- a/src/com/android/managedprovisioning/UserConsentDialog.java
+++ b/src/com/android/managedprovisioning/UserConsentDialog.java
@@ -19,7 +19,6 @@
 import android.app.Activity;
 import android.app.Dialog;
 import android.app.DialogFragment;
-import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.net.Uri;
@@ -41,50 +40,63 @@
 
     public static final String LEARN_MORE_URL_PROFILE_OWNER =
             "https://support.google.com/android/work/answer/6090512";
+    // TODO: replace by the final device owner learn more link.
+    public static final String LEARN_MORE_URL_DEVICE_OWNER =
+            "https://support.google.com/android/work/answer/6090512";
 
-    private final Context mContext;
-    private final int mAdminMonitorsStringId;
-    private final Uri mLearnMoreUri;
-    private final Runnable mOnUserConsentRunnable;
-    private final Runnable mOnCancelRunnable;
+    // Only urls starting with this base can be visisted in the device owner case.
+    public static final String LEARN_MORE_ALLOWED_BASE_URL =
+            "https://support.google.com/";
 
-    public UserConsentDialog(final Context context, int ownerType,
-            final Runnable onUserConsentRunnable, final Runnable onCancelRunnable) {
-        super();
-        mContext = context;
-        if (ownerType == PROFILE_OWNER) {
-            mAdminMonitorsStringId = R.string.admin_has_ability_to_monitor_profile;
-            mLearnMoreUri = Uri.parse(LEARN_MORE_URL_PROFILE_OWNER);
-        } else if (ownerType == DEVICE_OWNER) {
-            mAdminMonitorsStringId = R.string.admin_has_ability_to_monitor_device;
-            mLearnMoreUri = null;
-        } else {
-            throw new IllegalArgumentException("Illegal value for argument ownerType.");
-        }
-        mOnUserConsentRunnable = onUserConsentRunnable;
-        mOnCancelRunnable = onCancelRunnable;
+    private static final String KEY_OWNER_TYPE = "owner_type";
+
+    public static UserConsentDialog newInstance(int ownerType) {
+        UserConsentDialog dialog = new UserConsentDialog();
+        Bundle args = new Bundle();
+        args.putInt(KEY_OWNER_TYPE, ownerType);
+        dialog.setArguments(args);
+        return dialog;
     }
 
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        final Dialog dialog = new Dialog(mContext, R.style.ManagedProvisioningDialogTheme);
+        int ownerType = getArguments().getInt(KEY_OWNER_TYPE);
+        if (ownerType != PROFILE_OWNER && ownerType != DEVICE_OWNER) {
+            throw new IllegalArgumentException("Illegal value for argument ownerType.");
+        }
+
+        final Dialog dialog = new Dialog(getActivity(), R.style.ManagedProvisioningDialogTheme);
         dialog.setContentView(R.layout.learn_more_dialog);
         dialog.setCanceledOnTouchOutside(false);
 
         TextView text1 = (TextView) dialog.findViewById(R.id.learn_more_text1);
-        text1.setText(mAdminMonitorsStringId);
+        if (ownerType == PROFILE_OWNER) {
+            text1.setText(R.string.admin_has_ability_to_monitor_profile);
+        } else if (ownerType == DEVICE_OWNER) {
+            text1.setText(R.string.admin_has_ability_to_monitor_device);
+        }
 
-        final TextView linkText = (TextView) dialog.findViewById(R.id.learn_more_link);
-        if (mLearnMoreUri != null) {
+        TextView linkText = (TextView) dialog.findViewById(R.id.learn_more_link);
+        if (ownerType == PROFILE_OWNER) {
             linkText.setOnClickListener(new OnClickListener() {
                     @Override
                     public void onClick(View v) {
-                        Intent browserIntent = new Intent(Intent.ACTION_VIEW, mLearnMoreUri);
-                        mContext.startActivity(browserIntent);
+                        Intent browserIntent = new Intent(Intent.ACTION_VIEW,
+                                Uri.parse(LEARN_MORE_URL_PROFILE_OWNER));
+                        getActivity().startActivity(browserIntent);
                     }
                 });
-        } else {
-            linkText.setVisibility(View.GONE);
+        } else if (ownerType == DEVICE_OWNER) {
+            linkText.setOnClickListener(new OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        Intent webIntent = new Intent(getActivity(), WebActivity.class);
+                        webIntent.putExtra(WebActivity.EXTRA_URL, LEARN_MORE_URL_DEVICE_OWNER);
+                        webIntent.putExtra(WebActivity.EXTRA_ALLOWED_URL_BASE,
+                                LEARN_MORE_ALLOWED_BASE_URL);
+                        getActivity().startActivity(webIntent);
+                    }
+                });
         }
 
         Button positiveButton = (Button) dialog.findViewById(R.id.positive_button);
@@ -92,9 +104,7 @@
                 @Override
                 public void onClick(View v) {
                     dialog.dismiss();
-                    if (mOnUserConsentRunnable != null) {
-                        mOnUserConsentRunnable.run();
-                    }
+                    ((ConsentCallback) getActivity()).onDialogConsent();
                 }
             });
 
@@ -103,9 +113,7 @@
                 @Override
                 public void onClick(View v) {
                     dialog.dismiss();
-                    if (mOnCancelRunnable != null) {
-                        mOnCancelRunnable.run();
-                    }
+                    ((ConsentCallback) getActivity()).onDialogCancel();
                 }
             });
 
@@ -114,8 +122,11 @@
 
     @Override
     public void onCancel(DialogInterface dialog) {
-        if (mOnCancelRunnable != null) {
-            mOnCancelRunnable.run();
-        }
+        ((ConsentCallback) getActivity()).onDialogCancel();
+    }
+
+    public interface ConsentCallback {
+        public abstract void onDialogConsent();
+        public abstract void onDialogCancel();
     }
 }
\ No newline at end of file
diff --git a/src/com/android/managedprovisioning/WebActivity.java b/src/com/android/managedprovisioning/WebActivity.java
new file mode 100644
index 0000000..81779dd
--- /dev/null
+++ b/src/com/android/managedprovisioning/WebActivity.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 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.managedprovisioning;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+/**
+ * This activity shows a web view, which loads the {@link #EXTRA_URL} indicated in the starting
+ * intent. By default the user can click on links and load other urls. However, if the
+ * {@link EXTRA_ALLOWED_URL_BASE} is set in the starting intent, then only url starting with the
+ * allowed url base will be loaded.
+ *
+ * <p>
+ * This activity is currently used by the {@link UserConsentDialog} to display the google support
+ * web page about the Device Owner concept.
+ * </p>
+ */
+public class WebActivity extends Activity {
+    public static final String EXTRA_URL = "extra_url";
+
+    // Users can only browse urls starting with the base specified by the following extra.
+    // If this extra is not used, there are no restrictions on browsable urls.
+    public static final String EXTRA_ALLOWED_URL_BASE = "extra_allowed_url_base";
+
+    private WebView mWebView;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        mWebView = new WebView(this);
+        final String extraUrl = getIntent().getStringExtra(EXTRA_URL);
+        final String extraAllowedUrlBase = getIntent().getStringExtra(EXTRA_ALLOWED_URL_BASE);
+        if (extraUrl == null) {
+            ProvisionLogger.loge("No url provided to WebActivity.");
+            finish();
+            return;
+        }
+        mWebView.loadUrl(extraUrl);
+        mWebView.setWebViewClient(new WebViewClient() {
+                @Override
+                public boolean shouldOverrideUrlLoading(WebView view, String url) {
+                    if (extraAllowedUrlBase != null && url.startsWith(extraAllowedUrlBase)) {
+                        view.loadUrl(url);
+                    }
+                    return true;
+                }
+            });
+
+        this.setContentView(mWebView);
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java b/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
index e5aec3b..4d8d89f 100644
--- a/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
+++ b/src/com/android/managedprovisioning/task/AddWifiNetworkTask.java
@@ -21,6 +21,9 @@
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
 import android.text.TextUtils;
 
 import java.lang.Thread;
@@ -36,6 +39,7 @@
     private static final int RETRY_SLEEP_DURATION_BASE_MS = 500;
     private static final int RETRY_SLEEP_MULTIPLIER = 2;
     private static final int MAX_RETRIES = 6;
+    private static final int RECONNECT_TIMEOUT_MS = 30000;
 
     private final Context mContext;
     private final String mSsid;
@@ -52,14 +56,23 @@
     private NetworkMonitor mNetworkMonitor;
     private WifiConfig mWifiConfig;
 
+    private Handler mHandler;
+    private boolean mTaskDone = false;
+
     private int mDurationNextSleep = RETRY_SLEEP_DURATION_BASE_MS;
     private int mRetriesLeft = MAX_RETRIES;
 
+    /**
+     * @throws IllegalArgumentException if the {@code ssid} parameter is empty.
+     */
     public AddWifiNetworkTask(Context context, String ssid, boolean hidden, String securityType,
             String password, String proxyHost, int proxyPort, String proxyBypassHosts,
             String pacUrl, Callback callback) {
         mCallback = callback;
         mContext = context;
+        if (TextUtils.isEmpty(ssid)) {
+            throw new IllegalArgumentException("The ssid must be non-empty.");
+        }
         mSsid = ssid;
         mHidden = hidden;
         mSecurityType = securityType;
@@ -70,6 +83,12 @@
         mPacUrl = pacUrl;
         mWifiManager  = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
         mWifiConfig = new WifiConfig(mWifiManager);
+
+        HandlerThread thread = new HandlerThread("Timeout thread",
+                android.os.Process.THREAD_PRIORITY_BACKGROUND);
+        thread.start();
+        Looper looper = thread.getLooper();
+        mHandler = new Handler(looper);
     }
 
     public void run() {
@@ -79,20 +98,13 @@
             return;
         }
 
-        mNetworkMonitor = new NetworkMonitor(mContext, this);
-
-        if (!isConnectedToWifi(mContext)) {
-            if (TextUtils.isEmpty(mSsid)) {
-                ProvisionLogger.loge("Wifi is supposed to be setup in activity," +
-                        " or a valid wifi ssid has to be specified.");
-                mCallback.onError();
-                return;
-            }
-
-            connectToProvidedNetwork();
-        } else {
+        if (isConnectedToSpecifiedWifi()) {
             mCallback.onSuccess();
+            return;
         }
+
+        mNetworkMonitor = new NetworkMonitor(mContext, this);
+        connectToProvidedNetwork();
     }
 
     private void connectToProvidedNetwork() {
@@ -118,43 +130,51 @@
                 mCallback.onError();
                 return;
             }
-        } else {
-            if (!mWifiManager.reconnect()) {
-                ProvisionLogger.loge("Unable to connect to wifi");
-                mCallback.onError();
-                return;
-            }
+        }
+
+        // Network was successfully saved, now connect to it.
+        if (!mWifiManager.reconnect()) {
+            ProvisionLogger.loge("Unable to connect to wifi");
+            mCallback.onError();
+            return;
         }
 
         // NetworkMonitor will call onNetworkConnected when in Wifi mode.
+        // Post time out event in case the NetworkMonitor doesn't call back.
+        mHandler.postDelayed(new Runnable() {
+                public void run(){
+                    synchronized(this) {
+                        if (mTaskDone) return;
+                        mTaskDone = true;
+                    }
+                    ProvisionLogger.loge("Setting up wifi connection timed out.");
+                    mCallback.onError();
+                    return;
+                }
+            }, RECONNECT_TIMEOUT_MS);
     }
 
     private boolean enableWifi() {
-        if (mWifiManager != null) {
-            int wifiState = mWifiManager.getWifiState();
-            boolean wifiOn = wifiState == WifiManager.WIFI_STATE_ENABLED;
-            if (!wifiOn) {
-                if (!mWifiManager.setWifiEnabled(true)) {
-                    return false;
-                } else {
-                    return true;
-                }
-            } else {
-                return true;
-            }
-        } else {
-            return false;
-        }
+        return mWifiManager != null
+                && (mWifiManager.isWifiEnabled() || mWifiManager.setWifiEnabled(true));
     }
 
     @Override
     public void onNetworkConnected() {
-        if (NetworkMonitor.isConnectedToWifi(mContext) &&
-                mWifiManager.getConnectionInfo().getSSID().equals(mSsid)) {
+        if (isConnectedToSpecifiedWifi()) {
+            synchronized(this) {
+                if (mTaskDone) return;
+                mTaskDone = true;
+            }
+
             ProvisionLogger.logd("Connected to the correct network");
-            mNetworkMonitor.close();
-            mNetworkMonitor = null;
+
+            // Remove time out callback.
+            mHandler.removeCallbacksAndMessages(null);
+
+            cleanUp();
             mCallback.onSuccess();
+            return;
         }
     }
 
@@ -170,6 +190,12 @@
         }
     }
 
+    private boolean isConnectedToSpecifiedWifi() {
+        return NetworkMonitor.isConnectedToWifi(mContext)
+                && mWifiManager.getConnectionInfo() != null
+                && mSsid.equals(mWifiManager.getConnectionInfo().getSSID());
+    }
+
     public static boolean isConnectedToWifi(Context context) {
         ConnectivityManager cm =
                 (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
diff --git a/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java b/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
index 07b9749..924ff25 100644
--- a/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
+++ b/src/com/android/managedprovisioning/task/DeleteNonRequiredAppsTask.java
@@ -53,7 +53,7 @@
 
 /**
  * Removes all system apps with a launcher that are not required.
- * Also disables sharing via Bluetooth and Nfc, and components that listen to
+ * Also disables sharing via Bluetooth, and components that listen to
  * ACTION_INSTALL_SHORTCUT.
  * This class is called a first time when a user is created, but also after a system update.
  * In this case, it checks if the system apps that have been added need to be disabled.
@@ -67,8 +67,8 @@
     private final int mReqAppsList;
     private final int mVendorReqAppsList;
     private final int mUserId;
-    private final boolean mNewProfile; // If we are provisioning a new profile.
-    private final boolean mDisableInstallShortcutListeners;
+    private final boolean mNewProfile; // If we are provisioning a new managed profile/device.
+    private final boolean mDisableInstallShortcutListenersAndTelecom;
 
     private static final String TAG_SYSTEM_APPS = "system-apps";
     private static final String TAG_PACKAGE_LIST_ITEM = "item";
@@ -76,7 +76,7 @@
 
     public DeleteNonRequiredAppsTask(Context context, String mdmPackageName, int userId,
             int requiredAppsList, int vendorRequiredAppsList, boolean newProfile,
-            boolean disableInstallShortcutListeners, Callback callback) {
+            boolean disableInstallShortcutListenersAndTelecom, Callback callback) {
         mCallback = callback;
         mContext = context;
         mMdmPackageName = mdmPackageName;
@@ -86,19 +86,26 @@
         mReqAppsList = requiredAppsList;
         mVendorReqAppsList = vendorRequiredAppsList;
         mNewProfile = newProfile;
-        mDisableInstallShortcutListeners = disableInstallShortcutListeners;
+        mDisableInstallShortcutListenersAndTelecom = disableInstallShortcutListenersAndTelecom;
     }
 
     public void run() {
         if (mNewProfile) {
-            disableNfcBluetoothSharing();
+            disableBluetoothSharing();
         }
         deleteNonRequiredApps();
     }
 
-    private void disableNfcBluetoothSharing() {
-        ProvisionLogger.logd("Disabling Nfc and Bluetooth sharing.");
-        disableComponent(new ComponentName("com.android.nfc", "com.android.nfc.BeamShareActivity"));
+    /**
+     * Returns if this task should be run on OTA.
+     * This is indicated by the presence of the system apps file.
+     */
+    public static boolean shouldDeleteNonRequiredApps(Context context, int userId) {
+        return getSystemAppsFile(context, userId).exists();
+    }
+
+    private void disableBluetoothSharing() {
+        ProvisionLogger.logd("Disabling Bluetooth sharing.");
         disableComponent(new ComponentName("com.android.bluetooth",
                 "com.android.bluetooth.opp.BluetoothOppLauncherActivity"));
     }
@@ -106,32 +113,34 @@
     private void deleteNonRequiredApps() {
         ProvisionLogger.logd("Deleting non required apps.");
 
-        File file = new File(mContext.getFilesDir() + File.separator + "system_apps"
-                + File.separator + "user" + mUserId + ".xml");
-        file.getParentFile().mkdirs(); // Creating the folder if it does not exist
+        File systemAppsFile = getSystemAppsFile(mContext, mUserId);
+        systemAppsFile.getParentFile().mkdirs(); // Creating the folder if it does not exist
 
         Set<String> currentApps = getCurrentSystemApps();
         Set<String> previousApps;
         if (mNewProfile) {
+            // Provisioning case.
+
             // If this userId was a managed profile before, file may exist. In this case, we ignore
             // what is in this file.
             previousApps = new HashSet<String>();
         } else {
-            if (file.exists()) {
-                previousApps = readSystemApps(file);
-            } else {
-                // If for some reason, the system apps have not been written to file before, we will
-                // not delete any system apps this time.
-                writeSystemApps(currentApps, file);
-                mCallback.onSuccess();
+            // OTA case.
+
+            if (!systemAppsFile.exists()) {
+                // Error, this task should not have been run.
+                ProvisionLogger.loge("No system apps list found for user " + mUserId);
+                mCallback.onError();
                 return;
             }
+
+            previousApps = readSystemApps(systemAppsFile);
         }
-        writeSystemApps(currentApps, file);
+        writeSystemApps(currentApps, systemAppsFile);
         Set<String> newApps = currentApps;
         newApps.removeAll(previousApps);
 
-        if (mDisableInstallShortcutListeners) {
+        if (mDisableInstallShortcutListenersAndTelecom) {
             Intent actionShortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
             if (previousApps.isEmpty()) {
                 // Here, all the apps are in newApps.
@@ -150,27 +159,34 @@
         packagesToDelete.removeAll(getRequiredApps());
         packagesToDelete.retainAll(getCurrentAppsWithLauncher());
         // com.android.server.telecom should not handle CALL intents in the managed profile.
-        if (mNewProfile) {
+        if (mDisableInstallShortcutListenersAndTelecom && mNewProfile) {
             packagesToDelete.add("com.android.server.telecom");
         }
-        int size = packagesToDelete.size();
-        if (size > 0) {
-            PackageDeleteObserver packageDeleteObserver =
-                        new PackageDeleteObserver(packagesToDelete.size());
-            for (String packageName : packagesToDelete) {
-                try {
-                    mIpm.deletePackageAsUser(packageName, packageDeleteObserver, mUserId,
-                            PackageManager.DELETE_SYSTEM_APP);
-                } catch (RemoteException neverThrown) {
-                    // Never thrown, as we are making local calls.
-                    ProvisionLogger.loge("This should not happen.", neverThrown);
-                }
-            }
-        } else {
+        if (packagesToDelete.isEmpty()) {
             mCallback.onSuccess();
+            return;
+        }
+        PackageDeleteObserver packageDeleteObserver =
+                new PackageDeleteObserver(packagesToDelete.size());
+        for (String packageName : packagesToDelete) {
+            try {
+                mIpm.deletePackageAsUser(packageName, packageDeleteObserver, mUserId,
+                        PackageManager.DELETE_SYSTEM_APP);
+            } catch (RemoteException neverThrown) {
+                    // Never thrown, as we are making local calls.
+                ProvisionLogger.loge("This should not happen.", neverThrown);
+            }
         }
     }
 
+    static File getSystemAppsFile(Context context, int userId) {
+        return new File(context.getFilesDir() + File.separator + "system_apps"
+                + File.separator + "user" + userId + ".xml");
+    }
+
+    /**
+     * Disable all components that can handle the specified broadcast intent.
+     */
     private void disableReceivers(Intent intent) {
         List<ResolveInfo> receivers = mPm.queryBroadcastReceivers(intent, 0, mUserId);
         for (ResolveInfo ri : receivers) {
@@ -235,9 +251,9 @@
         return apps;
     }
 
-    private void writeSystemApps(Set<String> packageNames, File file) {
+    private void writeSystemApps(Set<String> packageNames, File systemAppsFile) {
         try {
-            FileOutputStream stream = new FileOutputStream(file, false);
+            FileOutputStream stream = new FileOutputStream(systemAppsFile, false);
             XmlSerializer serializer = new FastXmlSerializer();
             serializer.setOutput(stream, "utf-8");
             serializer.startDocument(null, true);
@@ -255,13 +271,13 @@
         }
     }
 
-    private Set<String> readSystemApps(File file) {
+    private Set<String> readSystemApps(File systemAppsFile) {
         Set<String> result = new HashSet<String>();
-        if (!file.exists()) {
+        if (!systemAppsFile.exists()) {
             return result;
         }
         try {
-            FileInputStream stream = new FileInputStream(file);
+            FileInputStream stream = new FileInputStream(systemAppsFile);
 
             XmlPullParser parser = Xml.newPullParser();
             parser.setInput(stream, null);