Merge tag android-5.1.0_r1 into AOSP_5.1_MERGE

Change-Id: Ie5a291b2a241c1293c7da7810c176e538cbec69a
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 56ef3d4..690a4f5 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -125,8 +125,14 @@
             android:noHistory="true"
         />
 
-        <service android:name=".handover.HandoverService"
-            android:process=":handover"
+        <service android:name=".beam.BeamSendService"
+            android:process=":beam"
+        />
+        <service android:name=".beam.BeamReceiveService"
+            android:process=":beam"
+        />
+
+        <service android:name=".handover.PeripheralHandoverService"
         />
     </application>
 </manifest>
diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp
index 5001ee7..36e89c0 100755
--- a/nci/jni/NativeNfcManager.cpp
+++ b/nci/jni/NativeNfcManager.cpp
@@ -122,6 +122,7 @@
 static bool                 sRfEnabled = false; // whether RF discovery is enabled
 static bool                 sSeRfActive = false;  // whether RF with SE is likely active
 static bool                 sReaderModeEnabled = false; // whether we're only reading tags, not allowing P2p/card emu
+static bool                 sP2pEnabled = false;
 static bool                 sP2pActive = false; // whether p2p was last active
 static bool                 sAbortConnlessWait = false;
 #define CONFIG_UPDATE_TECH_MASK     (1 << 1)
@@ -930,7 +931,7 @@
 **
 *******************************************************************************/
 static void nfcManager_enableDiscovery (JNIEnv* e, jobject o, jint technologies_mask, \
-    jboolean enable_lptd, jboolean reader_mode, jboolean enable_host_routing,
+    jboolean enable_lptd, jboolean reader_mode, jboolean enable_host_routing, jboolean enable_p2p,
     jboolean restart)
 {
     tNFA_TECHNOLOGY_MASK tech_mask = DEFAULT_TECH_MASK;
@@ -968,20 +969,27 @@
         if (sPollingEnabled)
         {
             ALOGD ("%s: Enable p2pListening", __FUNCTION__);
-            PeerToPeer::getInstance().enableP2pListening (!reader_mode);
+
+            if (enable_p2p && !sP2pEnabled) {
+                sP2pEnabled = true;
+                PeerToPeer::getInstance().enableP2pListening (true);
+                NFA_ResumeP2p();
+            } else if (!enable_p2p && sP2pEnabled) {
+                sP2pEnabled = false;
+                PeerToPeer::getInstance().enableP2pListening (false);
+                NFA_PauseP2p();
+            }
 
             if (reader_mode && !sReaderModeEnabled)
             {
                 sReaderModeEnabled = true;
-                NFA_PauseP2p();
                 NFA_DisableListening();
                 NFA_SetRfDiscoveryDuration(READER_MODE_DISCOVERY_DURATION);
             }
-            else if (sReaderModeEnabled)
+            else if (!reader_mode && sReaderModeEnabled)
             {
                 struct nfc_jni_native_data *nat = getNative(e, o);
                 sReaderModeEnabled = false;
-                NFA_ResumeP2p();
                 NFA_EnableListening();
                 NFA_SetRfDiscoveryDuration(nat->discovery_duration);
             }
@@ -1044,7 +1052,7 @@
         status = stopPolling_rfDiscoveryDisabled();
 
     PeerToPeer::getInstance().enableP2pListening (false);
-
+    sP2pEnabled = false;
     sDiscoveryEnabled = false;
     //if nothing is active after this, then tell the controller to power down
     if (! PowerSwitch::getInstance ().setModeOff (PowerSwitch::DISCOVERY))
@@ -1616,7 +1624,7 @@
     {"commitRouting", "()Z",
             (void*) nfcManager_commitRouting},
 
-    {"doEnableDiscovery", "(IZZZZ)V",
+    {"doEnableDiscovery", "(IZZZZZ)V",
             (void*) nfcManager_enableDiscovery},
 
     {"doCheckLlcp", "()Z",
diff --git a/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java b/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
index d327f62..99ee5d5 100755
--- a/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
+++ b/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
@@ -102,11 +102,13 @@
                                           boolean enableLowPowerPolling,
                                           boolean enableReaderMode,
                                           boolean enableHostRouting,
+                                          boolean enableP2p,
                                           boolean restart);
     @Override
     public void enableDiscovery(NfcDiscoveryParameters params, boolean restart) {
         doEnableDiscovery(params.getTechMask(), params.shouldEnableLowPowerDiscovery(),
-                params.shouldEnableReaderMode(), params.shouldEnableHostRouting(), restart);
+                params.shouldEnableReaderMode(), params.shouldEnableHostRouting(),
+                params.shouldEnableP2p(), restart);
     }
 
     @Override
diff --git a/nxp/jni/com_android_nfc_NativeNfcManager.cpp b/nxp/jni/com_android_nfc_NativeNfcManager.cpp
index c80141e..cfbab9b 100644
--- a/nxp/jni/com_android_nfc_NativeNfcManager.cpp
+++ b/nxp/jni/com_android_nfc_NativeNfcManager.cpp
@@ -1360,7 +1360,7 @@
 
 // TODO: use enable_lptd
 static void com_android_nfc_NfcManager_enableDiscovery(JNIEnv *e, jobject o, jint modes,
-        jboolean, jboolean reader_mode, jboolean restart)
+        jboolean, jboolean reader_mode, jboolean enable_p2p, jboolean restart)
 {
     NFCSTATUS ret;
     struct nfc_jni_native_data *nat;
@@ -1393,17 +1393,28 @@
 
     if (modes != 0)
     {
-        if (reader_mode)
+
+        if (enable_p2p)
+        {
+            nat->p2p_initiator_modes = phNfc_eP2P_ALL;
+            nat->p2p_target_modes = 0x0E; // All passive except 106, active
+            nat->discovery_cfg.Duration = 300000; /* in ms */
+        }
+        else
         {
             nat->p2p_initiator_modes = 0;
             nat->p2p_target_modes = 0;
+            nat->discovery_cfg.Duration = 200000; /* in ms */
+
+        }
+
+        if (reader_mode)
+        {
             nat->discovery_cfg.PollDevInfo.PollCfgInfo.DisableCardEmulation = TRUE;
             nat->discovery_cfg.Duration = 200000; /* in ms */
         }
         else
         {
-            nat->p2p_initiator_modes = phNfc_eP2P_ALL;
-            nat->p2p_target_modes = 0x0E; // All passive except 106, active
             nat->discovery_cfg.PollDevInfo.PollCfgInfo.DisableCardEmulation = FALSE;
             nat->discovery_cfg.Duration = 300000; /* in ms */
         }
@@ -1414,7 +1425,7 @@
         nat->discovery_cfg.PollDevInfo.PollCfgInfo.EnableIso15693 = (modes & 0x08) != 0;
     }
 
-    nfc_jni_start_discovery_locked(nat, restart);
+    nfc_jni_start_discovery_locked(nat, false);
 clean_and_return:
     CONCURRENCY_UNLOCK();
 }
@@ -2369,7 +2380,7 @@
    {"doDeinitialize", "()Z",
       (void *)com_android_nfc_NfcManager_deinitialize},
 
-   {"doEnableDiscovery", "(IZZZ)V",
+   {"doEnableDiscovery", "(IZZZZ)V",
       (void *)com_android_nfc_NfcManager_enableDiscovery},
 
    {"doCheckLlcp", "()Z",
diff --git a/nxp/src/com/android/nfc/dhimpl/NativeNfcManager.java b/nxp/src/com/android/nfc/dhimpl/NativeNfcManager.java
index cc73db3..805e1ea 100755
--- a/nxp/src/com/android/nfc/dhimpl/NativeNfcManager.java
+++ b/nxp/src/com/android/nfc/dhimpl/NativeNfcManager.java
@@ -161,11 +161,12 @@
     private native void doEnableDiscovery(int techMask,
                                           boolean enableLowPowerPolling,
                                           boolean enableReaderMode,
+                                          boolean enableP2p,
                                           boolean restart);
     @Override
     public void enableDiscovery(NfcDiscoveryParameters params, boolean restart) {
         doEnableDiscovery(params.getTechMask(), params.shouldEnableLowPowerDiscovery(),
-                params.shouldEnableReaderMode(), restart);
+                params.shouldEnableReaderMode(), params.shouldEnableP2p(), restart);
     }
 
     @Override
diff --git a/res/drawable-hdpi/icon.png b/res/drawable-hdpi/icon.png
index 07c6f3a..f732349 100644
--- a/res/drawable-hdpi/icon.png
+++ b/res/drawable-hdpi/icon.png
Binary files differ
diff --git a/res/drawable-mdpi/icon.png b/res/drawable-mdpi/icon.png
index 66c648d..a27df56 100644
--- a/res/drawable-mdpi/icon.png
+++ b/res/drawable-mdpi/icon.png
Binary files differ
diff --git a/res/drawable-xhdpi/icon.png b/res/drawable-xhdpi/icon.png
index c1dd26c..3bfed64 100644
--- a/res/drawable-xhdpi/icon.png
+++ b/res/drawable-xhdpi/icon.png
Binary files differ
diff --git a/res/drawable-xxhdpi/icon.png b/res/drawable-xxhdpi/icon.png
index 6a7fed7..ca1bce3 100644
--- a/res/drawable-xxhdpi/icon.png
+++ b/res/drawable-xxhdpi/icon.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/icon.png b/res/drawable-xxxhdpi/icon.png
new file mode 100644
index 0000000..9b0c96b
--- /dev/null
+++ b/res/drawable-xxxhdpi/icon.png
Binary files differ
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index bb42ce4..12139c7 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Raak om te bekyk"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Die ontvanger se toestel ondersteun nie groot lêeroordrag via \'n straal nie."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Bring toestelle weer bymekaar"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Koppel tans"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Gekoppel"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Kon nie koppel nie"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Ontkoppel tans"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Ontkoppel"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Bind tans saam"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Kon nie saambind nie"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Straal is tans besig. Probeer weer wanneer die vorige oordrag voltooid is."</string>
+    <string name="device" msgid="4459621591392478151">"toestel"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Koppel tans <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Het <xliff:g id="DEVICE_NAME">%1$s</xliff:g> gekoppel"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Kon nie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> koppel nie"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Ontkoppel tans <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Het <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ontkoppel"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Bind tans <xliff:g id="DEVICE_NAME">%1$s</xliff:g> saam"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Kon nie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> saambind nie"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Kon nie Bluetooth aktiveer nie"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Is jy seker jy wil die Bluetooth-toestel, <xliff:g id="DEVICE_NAME">%1$s</xliff:g>, saambind?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ja"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 6d516f0..49cd2af 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"ለማየት ንካ"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"የተቀባዩ መሣሪያ ትልቅ ፋይል በሞገድ በኩል ማስተላለፍ አይደግፍም።"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"መሣሪያዎችን ዳግም አንድ ላይ አሰባስብ"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"በመገናኘት ላይ"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"ተገናኝቷል"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"ማገናኘት አልተቻለም"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"ግንኙነት በማቋረጥ ላይ"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"ግንኙነት ተቋርጧል"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"በማገናኘት ላይ"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"ማጣመር አልተቻለም"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam አሁን ላይ ባተሌ ነው። ቀዳሚው ዝውውር ሲጠናቀቅ እንደገና ይሞክሩ።"</string>
+    <string name="device" msgid="4459621591392478151">"መሣሪያ"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ን በማገናኘት ላይ"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ተገናኝቷል"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ን ማገናኘት አልተቻለም"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"የ<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ን ግንኙነት በማቋረጥ ላይ"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"የ<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ግንኙነት ተቋርጧል"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ን በማጣመር ላይ"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ን ማጣመር አልተቻለም"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"ብሉቱዝ ማንቃት አልተቻለም"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"እርግጠኛ ንዎት የብሉቱዝ መሣሪያው <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ን ማጣመር ይፈልጋሉ?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"አዎ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 26966ff..1e5db50 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"المس ليتم العرض"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"جهاز المستلم لا يوفر نقل ملفات كبيرة عبر تبادل البيانات."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"تجميع الأجهزة معًا من جديد"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"جارٍ الاتصال"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"متصل"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"تعذر الاتصال"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"جارٍ قطع الاتصال"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"تم قطع الاتصال"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"الإقران"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"تعذر الإقران"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"الشعاع مشغول حاليًا. يمكنك إعادة المحاولة عند اكتمال عملية النقل السابقة."</string>
+    <string name="device" msgid="4459621591392478151">"جهاز"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"جارٍ الاتصال بـ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"تم الاتصال بـ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"تعذر الاتصال بـ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"جارٍ إلغاء الاتصال بـ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"تم إلغاء الاتصال بـ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"جارٍ إقران <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"تعذر إقران <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"تعذر تمكين بلوتوث"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"هل تريد بالتأكيد إقران جهاز بلوتوث <xliff:g id="DEVICE_NAME">%1$s</xliff:g>؟"</string>
     <string name="pair_yes" msgid="3525614878559994448">"نعم"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index e647818..1b4cd27 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Докоснете, за да видите"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Устройството на получателя не поддържа прехвърляне на големи файлове чрез излъчване."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Приближете отново устройствата едно до друго"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Установява се връзка"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Установена е връзка"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Не можа да се установи връзка"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Връзката се прекратява"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Връзката е прекратена"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Извършва се сдвояване"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Не можа да се сдвои"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Понастоящем Android Лъч работи. Опитайте отново, когато предишното прехвърляне завърши."</string>
+    <string name="device" msgid="4459621591392478151">"устройството"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Установява се връзка с/ъс <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Установена е връзка с/ъс <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Не можа да се установи връзка с/ъс <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Връзката с/ъс <xliff:g id="DEVICE_NAME">%1$s</xliff:g> се прекратява"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Връзката с/ъс <xliff:g id="DEVICE_NAME">%1$s</xliff:g> е прекратена"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Извършва се сдвояване с/ъс <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Неуспешно сдвояване с/ъс <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth не можа да се активира"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Наистина ли искате да сдвоите устройството с Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Да"</string>
diff --git a/res/values-bn-rBD/strings.xml b/res/values-bn-rBD/strings.xml
index edbb8b6..9b5a7f5 100644
--- a/res/values-bn-rBD/strings.xml
+++ b/res/values-bn-rBD/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"দেখতে স্পর্শ করুন"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"রিসিভার এর ডিভাইস বীমের মাধ্যমে বড় ফাইল স্থানান্তর সমর্থন করে না।"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"ডিভাইসগুলিকে আবার একত্র করুন"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"সংযুক্ত হচ্ছে"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"সংযুক্ত হয়েছে"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"সংযুক্ত করা যায়নি"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"সংযোগ বিচ্ছিন্ন হচ্ছে"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"সংযোগ বিচ্ছিন্ন হয়েছে"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"যুক্ত করা হচ্ছে"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"যুক্ত করা যায়নি"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"বীম বর্তমানে ব্যস্ত রয়েছে৷ পূর্ববর্তী স্থানন্তরণটি সম্পূর্ণ হলে আবার চেষ্টা করুন৷"</string>
+    <string name="device" msgid="4459621591392478151">"ডিভাইস"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> এর সাথে সংযোগ করা হচ্ছে"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> সংযুক্ত হয়েছে"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> সংযোগ করা যায়নি"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> থেকে সংযোগ বিচ্ছিন্ন করা হচ্ছে"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> থেকে সংযোগ বিচ্ছিন্ন হয়েছে"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> যুক্ত করা হচ্ছে"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> যুক্ত করা যায়নি"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth সক্ষম করা যায়নি"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"আপনি কি <xliff:g id="DEVICE_NAME">%1$s</xliff:g> Bluetooth ডিভাইসটি যুক্ত করার ব্যাপারে নিশ্চিত?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"হ্যাঁ"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 4d18a65..2a58467 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Toca per visualitzar"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"El dispositiu del receptor no és compatible amb la transferència de fitxers grans mitjançant sensors."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Torna a apropar els dispositius"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"S\'està connectant."</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"S\'ha connectat."</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"No s\'ha pogut connectar."</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"S\'està desconnectant."</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"S\'ha desconnectat."</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"S\'està emparellant."</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"No s\'ha pogut emparellar."</string>
+    <string name="beam_busy" msgid="5253335587620612576">"En aquest moment Beam està ocupat. Prova-ho de nou quan acabi la transferència anterior."</string>
+    <string name="device" msgid="4459621591392478151">"dispositiu"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"S\'està connectant <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"S\'ha connectat <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"No s\'ha pogut connectar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"S\'està desconnectant <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"S\'ha desconnectat <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"S\'està emparellant <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"No s\'ha pogut emparellar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"No es pot activar el Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Estàs segur que vols emparellar el dispositiu Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Sí"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 46bbbcc..3a93b08 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Zobrazte dotykem"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Zařízení příjemce nepodporuje přenos velkých souborů prostřednictvím funkce Beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Znovu přibližte zařízení"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Připojování"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Připojeno"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Nelze připojit"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Odpojování"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Odpojeno"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Párování"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Nelze spárovat"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Aplikace Beam je momentálně zaneprázdněná. Opakujte akci po dokončení předchozího přenosu."</string>
+    <string name="device" msgid="4459621591392478151">"zařízení"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Připojování k zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Připojeno k zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g> se nepodařilo připojit"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Odpojování od zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Odpojeno od zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Párování se zařízením <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Zařízení <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nelze spárovat"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth nelze povolit."</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Opravdu chcete spárovat zařízení Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ano"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 42b34c0..5b811b7 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Tryk for at se"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Modtagerens enhed understøtter ikke overførsel af store filer via Beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Før enhederne sammen igen"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Opretter forbindelse"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Tilsluttet"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Der kunne ikke oprettes forbindelse"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Afbryder forbindelse"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Afbrudt"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Parrer"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Kunne ikke parres"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam er optaget i øjeblikket. Prøv igen, når den forrige overførsel er gennemført."</string>
+    <string name="device" msgid="4459621591392478151">"enhed"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Opretter forbindelse til <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Forbundet med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Kunne ikke oprette forbindelse til <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Forbindelsen til <xliff:g id="DEVICE_NAME">%1$s</xliff:g> afbrydes"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Forbindelsen til <xliff:g id="DEVICE_NAME">%1$s</xliff:g> er afbrudt"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Parrer med <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Parring med <xliff:g id="DEVICE_NAME">%1$s</xliff:g> mislykkedes"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth kunne ikke aktiveres"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Er du sikker på du vil parre Bluetooth-enheden <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ja"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 15149a8..beb17b7 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Zum Anzeigen berühren"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Das Gerät des Empfängers unterstützt die Übertragung großer Dateien durch Beamen nicht."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Geräte erneut nebeneinander platzieren"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Verbindung wird hergestellt."</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Verbunden"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Verbindung nicht möglich"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Verbindung wird getrennt."</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Getrennt"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Pairing erfolgt"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Pairing nicht möglich"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Android Beam ist momentan ausgelastet. Bitte versuchen Sie es erneut, wenn die vorherige Übertragung abgeschlossen ist."</string>
+    <string name="device" msgid="4459621591392478151">"Gerät"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Verbindung zu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> wird hergestellt"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> verbunden"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Verbindung zu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nicht möglich"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Verbindung zu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> wird getrennt"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Verbindung zu <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ist getrennt"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Pairing mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> wird durchgeführt"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Pairing mit <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nicht möglich"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth konnte nicht aktiviert werden."</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Möchten Sie das Bluetooth-Gerät <xliff:g id="DEVICE_NAME">%1$s</xliff:g> wirklich koppeln?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ja"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 8897f1d..ce1fc72 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Αγγίξτε για προβολή"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Η συσκευή του παραλήπτη δεν υποστηρίζει τη μεταφορά μεγάλων αρχείων μέσω ζεύξης."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Φέρτε ξανά τις συσκευές σας σε επαφή"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Σύνδεση"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Συνδέθηκε"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Δεν ήταν δυνατή η σύνδεση"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Αποσύνδεση"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Αποσυνδέθηκε"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Σύζευξη"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Δεν ήταν δυνατή η σύζευξη"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Η λειτουργία ζεύξης είναι απασχολημένη αυτήν τη στιγμή. Δοκιμάστε ξανά μετά την ολοκλήρωση της προηγούμενης μεταφοράς."</string>
+    <string name="device" msgid="4459621591392478151">"συσκευή"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Σύνδεση σε <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Συνδέθηκε <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Δεν ήταν δυνατή η σύνδεση σε <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Αποσύνδεση <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Αποσυνδέθηκε <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Σύζευξη <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Δεν ήταν δυνατή η σύζευξη <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Δεν ήταν δυνατή η ενεργοποίηση του Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Είστε βέβαιοι ότι θέλετε να γίνει σύζευξη της συσκευής Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>;"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ναι"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 451b6ab..307e92c 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Touch to view"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"The receiver\'s device doesn\'t support large file transfer via beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Bring devices together again"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Connecting"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Connected"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Could not connect"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Disconnecting"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Disconnected"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Pairing"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Could not pair"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam is currently busy. Try again when the previous transfer completes."</string>
+    <string name="device" msgid="4459621591392478151">"device"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Connecting <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Connected <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Could not connect <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Disconnecting <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Disconnected <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Pairing <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Could not pair <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Could not enable Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Are you sure you want to pair the Bluetooth device <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Yes"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 451b6ab..307e92c 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Touch to view"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"The receiver\'s device doesn\'t support large file transfer via beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Bring devices together again"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Connecting"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Connected"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Could not connect"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Disconnecting"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Disconnected"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Pairing"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Could not pair"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam is currently busy. Try again when the previous transfer completes."</string>
+    <string name="device" msgid="4459621591392478151">"device"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Connecting <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Connected <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Could not connect <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Disconnecting <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Disconnected <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Pairing <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Could not pair <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Could not enable Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Are you sure you want to pair the Bluetooth device <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Yes"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 86ea746..aa564b0 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Toca para ver"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"El dispositivo del receptor no admite la transferencia de archivos de gran tamaño."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Volver a unir los dispositivos"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Conectando"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Conectado"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"No se pudo establecer conexión."</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Desconectando…"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Desconectado"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Sincronizando…"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"No se pudo sincronizar."</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam está ocupado en este momento. Vuelve a intentarlo cuando finalice la transferencia anterior."</string>
+    <string name="device" msgid="4459621591392478151">"dispositivo"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Conectando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> con conexión"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Error al conectar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Desconectando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> sin conexión"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Sincronizando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Error al sincronizar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Error al activar Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"¿Realmente deseas sincronizar el dispositivo Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Sí"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 8ec045c..b05c6cb 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Tocar para ver"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"El dispositivo del receptor no admite la transferencia de archivos de gran tamaño."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Vuelve a juntar los dispositivos"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Conectando"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Conectado"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Error al establecer conexión"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Desconectando"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Desconectado"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Vinculando"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Error al vincular"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Android Beam está ocupado en este momento. Vuelve a intentarlo cuando se complete la transferencia anterior."</string>
+    <string name="device" msgid="4459621591392478151">"dispositivo"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Conectando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> conectado"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"No se ha podido conectar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Desconectando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> desconectado"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Vinculando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"No se ha podido vincular <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Error al habilitar Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"¿Seguro que quieres vincular el dispositivo Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Sí"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 3431f2e..f9b8ac8 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Puudutage  vaatamiseks"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Vastuvõtja seade ei toeta suurte failide edastamist kiire kaudu."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Ühendage seadmed uuesti"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Ühendamine"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Ühendatud"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Ühendust ei õnnestunud luua"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Ühenduse katkestamine"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Ühendus on katkestatud"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Sidumine"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Ei saanud siduda"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Kiirega edastamise funktsioon on praegu hõivatud. Proovige uuesti, kui ülekandmine on lõppenud."</string>
+    <string name="device" msgid="4459621591392478151">"seade"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Ühendamine seadmega <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Ühendatud seadmega <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Ei õnnestunud ühendada seadmega <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Ühenduse katkestamine seadmega <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Ühendus seadmega <xliff:g id="DEVICE_NAME">%1$s</xliff:g> on katkestatud"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Sidumine seadmega <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Ei saa siduda seadmega <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetoothi ei saanud lubada"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Kas soovite kindlasti ühildada Bluetoothi seadme <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Jah"</string>
diff --git a/res/values-eu-rES/strings.xml b/res/values-eu-rES/strings.xml
index 5a2b40f..7c3243a 100644
--- a/res/values-eu-rES/strings.xml
+++ b/res/values-eu-rES/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Ukitu ikusteko"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Hartzailearen gailuak ez du onartzen fitxategi handiak NFC bidez transferitzea."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Elkartu gailuak berriro"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Konektatzen"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Konektatuta"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Ezin izan da konektatu"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Deskonektatzen"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Deskonektatuta"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Parekatzen"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Ezin izan da parekatu"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam lanpetuta dago. Saiatu berriro abian den transferentzia amaitutakoan."</string>
+    <string name="device" msgid="4459621591392478151">"gailua"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> konektatzen"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> konektatu da"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Ezin izan da <xliff:g id="DEVICE_NAME">%1$s</xliff:g> konektatu"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> deskonektatzen"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> deskonektatu da"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> gailuarekin parekatzen"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Ezin izan da <xliff:g id="DEVICE_NAME">%1$s</xliff:g> gailuarekin parekatu"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Ezin izan da Bluetootha gaitu"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Ziur <xliff:g id="DEVICE_NAME">%1$s</xliff:g> Bluetooth gailuarekin parekatu nahi duzula?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Bai"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index c5a6df5..a3fe0e7 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"برای مشاهده لمس کنید"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"دستگاه گیرنده انتقال فایل‌های بزرگ از طریق پرتو را پشتیبانی نمی‌کند."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"مرتبط‌کردن دوباره دستگاه‌ها"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"در حال اتصال"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"متصل شد"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"متصل نشد"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"در حال قطع ارتباط"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"اتصال قطع شد"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"در حال مرتبط کردن"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"مرتبط نشد"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"«پرتو» در حال حاضر مشغول است. هنگامی که انتقال قبلی کامل شد دوباره امتحان کنید."</string>
+    <string name="device" msgid="4459621591392478151">"دستگاه"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"در حال اتصال <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> متصل شد"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> متصل نشد"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"در حال قطع ارتباط <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"ارتباط <xliff:g id="DEVICE_NAME">%1$s</xliff:g> قطع شد"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"در حال مرتبط‌سازی <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> مرتبط نشد"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"فعال کردن بلوتوث امکانپذیر نیست"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"آیا مطمئن هستید که می‌خواهید دستگاه بلوتوث <xliff:g id="DEVICE_NAME">%1$s</xliff:g> را جفت کنید؟"</string>
     <string name="pair_yes" msgid="3525614878559994448">"بله"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 0672cef..609c19d 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Kosketa ja näytä"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Vastaanottajan laite ei tue suurten tiedostojen siirtoa sisällön jakamisen kautta."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Yhdistä laitteet uudelleen"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Muodostetaan yhteyttä"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Yhdistetty"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Yhteyttä ei voitu muodostaa"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Katkaistaan yhteyttä"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Yhteys katkaistu"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Laiteparia muodostetaan"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Laiteparia ei voitu muodostaa"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam on tällä hetkellä varattu. Yritä uudelleen, kun edellinen siirto on valmis."</string>
+    <string name="device" msgid="4459621591392478151">"laite"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Yhdistetään <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> on yhdistetty"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ei voinut muodostaa yhteyttä"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Katkaistaan yhteys: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ei ole enää yhteydessä"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Muodostetaan laiteparia: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Laiteparia ei voitu muodostaa: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth-yhteyttä ei voi ottaa käyttöön"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Oletko varma, että haluat muodostaa laiteparin Bluetooth-laitteeseen <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Kyllä"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 0e0901a..6d29ed9 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Appuyer pour afficher"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Le récepteur n\'est pas compatible avec le transfert de fichiers volumineux via le partage."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Mettre de nouveau les appareils côte à côte"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Connexion en cours…"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Connecté"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Impossible d’établir la connexion"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Dissociation en cours…"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Déconnecté"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Association en cours"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Impossible d\'associer les appareils"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam est actuellement occupé. Essayez de nouveau lorsque le transfert précédent sera terminé."</string>
+    <string name="device" msgid="4459621591392478151">"appareil"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Connexion de « <xliff:g id="DEVICE_NAME">%1$s</xliff:g> » en cours"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Connecté à « <xliff:g id="DEVICE_NAME">%1$s</xliff:g> »"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Impossible de connecter « <xliff:g id="DEVICE_NAME">%1$s</xliff:g> »"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Déconnexion de « <xliff:g id="DEVICE_NAME">%1$s</xliff:g> » en cours"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Déconnecté de « <xliff:g id="DEVICE_NAME">%1$s</xliff:g> »"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Association de « <xliff:g id="DEVICE_NAME">%1$s</xliff:g> » en cours"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Impossible d\'associer « <xliff:g id="DEVICE_NAME">%1$s</xliff:g> »"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Impossible d\'activer le Bluetooth."</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Voulez-vous vraiment associer l\'appareil Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Oui"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 4a10b03..5f2de3d 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Appuyer pour afficher"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Le récepteur n\'est pas compatible avec le transfert de fichiers volumineux via le partage."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Mettre de nouveau les appareils côte à côte"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Connexion en cours…"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Connecté"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Impossible d’établir la connexion."</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Déconnexion en cours…"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Déconnecté"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Association en cours…"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Impossible d\'effectuer l\'association."</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Android Beam est actuellement occupé. Veuillez réessayer une fois le transfert précédent terminé."</string>
+    <string name="device" msgid="4459621591392478151">"appareil"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Connexion de l\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g> en cours…"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"L\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g> a bien été connecté."</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Impossible de connecter <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Déconnexion de l\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g> en cours…"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"L\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g> a bien été déconnecté."</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Association de l\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g> en cours…"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Impossible d\'associer l\'appareil <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Impossible d\'activer le Bluetooth."</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Voulez-vous vraiment associer l\'appareil Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Oui"</string>
diff --git a/res/values-gl-rES/strings.xml b/res/values-gl-rES/strings.xml
index b42db1f..845ee42 100644
--- a/res/values-gl-rES/strings.xml
+++ b/res/values-gl-rES/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Toca para ver"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"O dispositivo do destinatario non é compatible coa transferencia de ficheiros grandes."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Achega os dispositivos de novo"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Conectando"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Conectado"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Non se puido conectar"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Desconectando"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Desconectado"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Sincronizando"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Non se puido sincronizar"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam está ocupado neste momento. Téntao de novo cando se complete a transferencia anterior."</string>
+    <string name="device" msgid="4459621591392478151">"dispositivo"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Conectando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> conectado"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Non se puido conectar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Desconectando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> desconectado"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Sincronizando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Non se puido sincronizar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Non se puido activar o Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Seguro que queres sincronizar o dispositivo Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Si"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index f7f5760..b744006 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"देखने के लिए स्‍पर्श करें"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"प्राप्तकर्ता का डिवाइस, बीम द्वारा बड़ी फ़ाइल के स्थानांतरण का समर्थन नहीं करता."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"डिवाइस को पुन: एक साथ लाएं"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"कनेक्ट हो रहा है"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"कनेक्ट है"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"कनेक्‍ट नहीं किया जा सका"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"डिस्कनेक्ट हो रहा है"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"डिस्कनेक्ट हो गया"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"युग्मन"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"युग्‍मित नहीं किया जा सका"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam वर्तमान में व्‍यस्‍त है. पिछला ट्रांसफर पूर्ण हो जाने पर पुन: प्रयास करें."</string>
+    <string name="device" msgid="4459621591392478151">"डिवाइस"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> को कनेक्‍ट किया जा रहा है"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> को कनेक्‍ट किया गया"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> को कनेक्‍ट नहीं किया जा सका"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> को डिस्‍कनेक्‍ट किया जा रहा है"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> को डिस्‍कनेक्‍ट किया गया"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> को युग्‍मित किया जा रहा है"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> को युग्‍मित नहीं किया जा सका"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"ब्लूटूथ को सक्षम नहीं किया जा सका"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"क्‍या आप वाकई ब्लूटूथ डिवाइस <xliff:g id="DEVICE_NAME">%1$s</xliff:g> को युग्मित करना चाहते हैं?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"हां"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 9f0ed85..863d4b1 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Dodirnite za prikaz"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Uređaj prijamnika ne podržava prijenos velikih datoteka emitiranjem."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Opet povežite uređaje"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Povezivanje"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Povezano"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Spajanje nije moguće"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Prekid veze"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Nije povezano"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Uparivanje"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Uparivanje nije moguće"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam je trenutačno zauzet. Pokušajte ponovo po dovršetku prethodnog prijenosa."</string>
+    <string name="device" msgid="4459621591392478151">"uređaj"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Povezivanje s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> povezan je"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nije povezan"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Prekidanje veze s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Prekinuta je veza s uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Uparivanje uređaja <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nije uparen"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Omogućavanje Bluetootha nije bilo moguće"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Jeste li sigurni da želite upariti Bluetooth uređaj <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Da"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 53ae196..28b02f5 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"A megtekintéshez érintse meg."</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"A fogadó eszköz nem támogatja a nagyméretű fájlok átvitelét adatsugárzás útján."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Eszközök újbóli összekapcsolása"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Kapcsolódás"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Csatlakoztatva"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"A kapcsolódás sikertelen"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Leválasztás"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Leválasztva"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Párosítás"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Nem sikerült a párosítás"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"A Beam jelenleg elfoglalt. Próbálja újra, ha az előző átvitel már befejeződött."</string>
+    <string name="device" msgid="4459621591392478151">"eszköz"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Csatlakozás a következőhöz: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Csatlakozva a következőhöz: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Nem sikerült csatlakozni ehhez: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Leválasztás a következőről: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Leválasztva a következőről: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Párosítás a következővel: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Nem sikerült a párosítás ezzel: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Nem lehet aktiválni a Bluetootht"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Biztosan párosítani szeretné a(z) <xliff:g id="DEVICE_NAME">%1$s</xliff:g> Bluetooth-eszközt?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Igen"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index 3b01039..2b32b45 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Հպեք՝ դիտելու համար"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Ընդունողի սարքը չի աջակցում ռադիոհաղորդմամբ մեծ ֆայլերի փոխանցումը:"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Սարքերը կրկին միմյանց հետ կցել"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Միացում"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Կապակցված է"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Չհաջողվեց միանալ"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Անջատվում է"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Անջատված է"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Զուգավորում"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Չհաջողվեց զուգավորել"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Այս պահին տվյալների փոխանցումը զբաղված է: Փորձեք կրկին նախորդ փոխանցումը ավարտելուց հետո:"</string>
+    <string name="device" msgid="4459621591392478151">"սարք"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ի կապակցում"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքը կապակցված է"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Չհաջողվեց կապակցել <xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքը"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ի կապախզում"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքը կապախզված է"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ի զուգավորում"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Չհաջողվեց զուգավորել <xliff:g id="DEVICE_NAME">%1$s</xliff:g> սարքը"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Չհաջողվեց միացնել Bluetooth-ը"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Վստա՞հ եք, որ ցանկանում եք զուգավորել <xliff:g id="DEVICE_NAME">%1$s</xliff:g> Bluetooth սարքը:"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Այո"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index b2ff88a..f1cf98c 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Sentuh untuk melihat"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Perangkat penerima tidak mendukung transfer file besar melalui beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Kumpulkan lagi perangkatnya"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Menyambungkan"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Tersambung"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Tidak dapat menyambung"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Memutuskan sambungan"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Sambungan terputus"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Menyandingkan"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Tidak dapat menyandingkan"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam sedang sibuk. Coba lagi jika transfer sebelumnya telah selesai."</string>
+    <string name="device" msgid="4459621591392478151">"perangkat"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Menghubungkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> terhubung"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Tidak dapat menghubungkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Memutuskan hubungan dengan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Hubungan dengan <xliff:g id="DEVICE_NAME">%1$s</xliff:g> terputus"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Menyandingkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Tidak dapat menyandingkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Tidak dapat mengaktifkan Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Yakin ingin menyandingkan perangkat Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ya"</string>
diff --git a/res/values-is-rIS/strings.xml b/res/values-is-rIS/strings.xml
index 687c494..96eb6d7 100644
--- a/res/values-is-rIS/strings.xml
+++ b/res/values-is-rIS/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Snertu til að skoða"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Tæki viðtakandans styður ekki flutning stórra skráa með NFC."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Settu tækin hvort upp að öðru aftur"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Tengist"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Tengt"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Tenging mistókst"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Aftengist"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Aftengt"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Parar"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Ekki var hægt að para"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam er upptekið. Reyndu aftur þegar fyrri flutningi er lokið."</string>
+    <string name="device" msgid="4459621591392478151">"tæki"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Tengist <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Tengt við <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Ekki var hægt að tengjast <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Aftengist frá <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Aftengt frá <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Parast við <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Ekki var hægt að parast við <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Ekki var hægt að kveikja á Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Ertu viss um að þú viljir para Bluetooth-tækið <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Já"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 5f0bd87..161cfa6 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Tocca per visualizzare"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Il dispositivo del destinatario non supporta il trasferimento di file di grandi dimensioni tramite Android Beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Avvicina di nuovo i dispositivi"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Connessione in corso"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Connesso"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Impossibile connettersi"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Scollegamento in corso"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Disconnesso"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Accoppiamento"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Impossibile accoppiare"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam è occupato al momento. Riprova al termine del trasferimento precedente."</string>
+    <string name="device" msgid="4459621591392478151">"dispositivo"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Collegamento di <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> collegato"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Impossibile collegare <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Scollegamento di <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> scollegato"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Accoppiamento di <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Impossibile accoppiare <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Impossibile attivare il Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Vuoi accoppiare il dispositivo Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Sì"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 1e05402..936d1b0 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"גע כדי להציג"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"המכשיר המקבל אינו תומך בהעברת קובץ גדול באמצעות קרן."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"קרב שוב את המכשירים"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"מתחבר"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"מחובר"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"לא ניתן להתחבר."</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"מתנתק"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"מנותק"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"התאמה"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"לא ניתן לבצע התאמה"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"‏Beam אינו פנוי כעת. נסה שוב לאחר השלמת ההעברה הקודמת."</string>
+    <string name="device" msgid="4459621591392478151">"מכשיר"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"מתחבר אל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"מחובר אל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"לא ניתן להתחבר אל <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"מתנתק מ-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"מנותק מ-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"מבצע התאמה עם <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"לא ניתן לבצע התאמה עם <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"‏לא ניתן להפעיל Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"‏האם אתה בטוח שאתה רוצה להתאים את מכשיר ה-Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"כן"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 24d5858..382cf20 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"タップして表示"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"受信側の端末は、ビーム経由のサイズの大きなファイルの転送をサポートしていません。"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"端末同士をもう一度近づける"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"接続しています"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"接続済み"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"接続できませんでした"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"切断しています"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"未接続"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"ペア設定しています"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"ペア設定できませんでした"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"ビームは現在使用中です。前回の転送が完了したら、もう一度お試しください。"</string>
+    <string name="device" msgid="4459621591392478151">"端末"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>を接続しています"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>を接続しました"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>を接続できませんでした"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>を切断しています"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>を切断しました"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>をペア設定しています"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>をペア設定できませんでした"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetoothを有効にできませんでした"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Bluetoothデバイス<xliff:g id="DEVICE_NAME">%1$s</xliff:g>をペアに設定してもよろしいですか?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"はい"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index 51c634b..8b06c0d 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"შეეხეთ სანახავად"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"მიმღების მოწყობილობას დიდი ფაილების სხივით გადაცემის მხარდაჭერა არ გააჩნია."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"ისევ მიაახლოვეთ მოწყობილობები ერთმანეთს"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"დაკავშირება..."</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"დაკავშირებულია"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"დაკავშირება ვერ მოხერხდა"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"მიმდინარეობს გათიშვა"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"კავშირი შეწყვეტილია"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"დაწყვილება..."</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"დაწყვილება ვერ მოხერხდა"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"სხივი ამჟამად დაკავებულია. სცადეთ ხელახლა, როდესაც წინა გადაცემა დასრულდება."</string>
+    <string name="device" msgid="4459621591392478151">"მოწყობილობა"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"უკავშირდება <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"დაკავშირებულია <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"ვერ ვუკავშირდებით <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"კავშირი წყდება <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"გათიშულია <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"დაწყვილება <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"ვერ წყვილდება <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth-ის გააქტიურება ვერ მოხერხდა"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"დარწმუნებული ხართ, რომ გსურთ დააწყვილოთ Bluetooth მოწყობილობა <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"დიახ"</string>
diff --git a/res/values-kk-rKZ/strings.xml b/res/values-kk-rKZ/strings.xml
index 0182af9..e09ae03 100644
--- a/res/values-kk-rKZ/strings.xml
+++ b/res/values-kk-rKZ/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Көру үшін түрту"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Хабар алушының құрылғысы бим арқылы үлкен файл жіберуді қолдамайды."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Құрылғыларды қайта біріктіру"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Қосылуда"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Қосылды"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Қосылу мүмкін болмады"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Ажыратылуда"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Ажыратылған"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Жұпталуда"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Жұптау мүмкін болмады"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Тарату қазіргі уақытта бос емес. Алдыңғы тасымалдау аяқталғанда әрекетті қайталаңыз."</string>
+    <string name="device" msgid="4459621591392478151">"құрылғы"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Connecting <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Connected <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Could not connect <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Disconnecting <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Disconnected <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Pairing <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Could not pair <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth байланысын қосу мүмкін болмады."</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Bluetooth құрылғысын <xliff:g id="DEVICE_NAME">%1$s</xliff:g> құрылғысымен жұптауды қалайсыз ба?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Иә"</string>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index bdf1fb4..f6d4625 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"ប៉ះ​ដើម្បី​មើល"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"ឧបករណ៍​របស់​អ្នក​ទទួល​មិន​គាំទ្រ​ការ​ផ្ទេរ​ឯកសារ​​ដែល​មាន​ទំហំ​ធំ​តាម​ការ​ផ្ទេរ​ឡើយ។"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"នាំ​ឧបករណ៍​ជាមួយគ្នា​ម្ដងទៀត"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"ភ្ជាប់"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"បាន​ភ្ជាប់"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"មិន​អាច​ភ្ជាប់"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"ផ្ដាច់"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"បាន​ផ្ដាច់"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"ផ្គូផ្គង​"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"មិន​អាច​ផ្គូផ្គង"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"ប៊ីមកំពុងជាប់រវល់។ សាកល្បងម្តងទៀតនៅពេលដែលការផ្ទេរពីមុនបញ្ចប់។"</string>
+    <string name="device" msgid="4459621591392478151">"ឧបករណ៍"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"កំពុងភ្ជាប់ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"បានភ្ជាប់ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"មិនអាចភ្ជាប់ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> បានទេ"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"កំពុងផ្តាច់ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"បានផ្តាច់ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"កំពុងភ្ជាប់ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"មិនអាចភ្ជាប់ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> បានទេ"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"មិន​អាច​បើក​ប៊្លូធូស"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"តើ​អ្នក​ប្រាកដ​ជា​ចង់​ផ្គូផ្គង​ឧបករណ៍​ប៊្លូធូស <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"បាទ/ចាស"</string>
diff --git a/res/values-kn-rIN/strings.xml b/res/values-kn-rIN/strings.xml
index 414040d..9dfe6d3 100644
--- a/res/values-kn-rIN/strings.xml
+++ b/res/values-kn-rIN/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"ವೀಕ್ಷಿಸಲು ಸ್ಪರ್ಶಿಸಿ"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"ಸ್ವೀಕರಿಸುವವರ ಸಾಧನವು ಬೀಮ್ ಮೂಲಕ ಮಾಡಲಾಗುವ ವರ್ಗಾವಣೆಯನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"ಸಾಧನಗಳನ್ನು ಮತ್ತೆ ಒಟ್ಟಿಗೆ ತನ್ನಿ"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"ಜೋಡಿಸುವಿಕೆ"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"ಜೋಡಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"ಬೀಮ್ ಪ್ರಸ್ತುತ ಕಾರ್ಯನಿರತವಾಗಿದೆ. ಹಿಂದಿನ ವರ್ಗಾವಣೆ ಪೂರ್ಣಗೊಂಡ ಬಳಿಕ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ."</string>
+    <string name="device" msgid="4459621591392478151">"ಸಾಧನ"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನವನ್ನು ಸಂಪರ್ಕಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನವನ್ನು ಸಂಪರ್ಕಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನವನ್ನು ಸಂಪರ್ಕಿತಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನವನ್ನು ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನವನ್ನು ಸಂಪರ್ಕಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನವನ್ನು ಜೋಡಣೆ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಸಾಧನವನ್ನು ಜೋಡಣೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"ಬ್ಲೂಟೂತ್ ಸಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"ನೀವು <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ಬ್ಲೂಟೂತ್ ಸಾಧನವನ್ನು ಜೋಡಿಸಲು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"ಹೌದು"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 728c9bb..e495e30 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"터치하여 보기"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"수신자의 기기는 빔을 통한 대용량 파일 전송을 지원하지 않습니다."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"기기 다시 공유"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"연결 중"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"연결됨"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"연결하지 못함"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"연결을 끊는 중"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"연결 끊김"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"페어링"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"페어링하지 못함"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"현재 공유 작업을 진행 중입니다. 기존 전송 작업이 완료되면 다시 시도하세요."</string>
+    <string name="device" msgid="4459621591392478151">"기기"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>에 연결하는 중"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>에 연결됨"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>에 연결할 수 없음"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>와(과) 연결 해제하는 중"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>와(과) 연결 해제됨"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>와(과) 페어링하는 중"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>와(과) 페어링할 수 없음"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"블루투스를 사용하도록 설정하지 못함"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"블루투스 기기 <xliff:g id="DEVICE_NAME">%1$s</xliff:g>을(를) 페어링하시겠습니까?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"예"</string>
diff --git a/res/values-ky-rKG/strings.xml b/res/values-ky-rKG/strings.xml
index cfb2059..bb14bcf 100644
--- a/res/values-ky-rKG/strings.xml
+++ b/res/values-ky-rKG/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Көрүш үчүн тийиңиз"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Алуучунун түзмөгү beam аркылуу чоң файлдарды кабылдабайт."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Түзмөктөрдү кайрадан бириктириңиз"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Туташууда"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Туташты"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Туташа алган жок"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Ажыратылууда"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Ажыратылды"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Жупташтыруу"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Жупташкан жок"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Учурда өткөрүү бош эмес. Мурунку өткөрүү аяктаганда кайра аракет кылыңыз."</string>
+    <string name="device" msgid="4459621591392478151">"түзмөк"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> туташтырылууда"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> туташтырылды"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> менен туташа алган жок"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ажыратылууда"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ажыратылды"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> жупташтырылууда"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> жупташтырылбай койду"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth жандырылган жок"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> Bluetooth түзмөгү менен жупташтырууну каалаганыңыз аныкпы?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ооба"</string>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index fb94126..5746e9e 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"ແຕະ​ເພື່ອ​ເບິ່ງ"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"ອຸປະກອນຂອງຜູ່ຮັບບໍ່ສາມາດຮອງຮັບການໂອນໄຟລ໌ຂະຫນາດໃຫຍ່ໂດຍຜ່ານ beam ໄດ້."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"ນຳອຸປະກອນເຂົ້າມາຫາກັນໃໝ່ອີກຄັ້ງ"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"ກຳລັງເຊື່ອມຕໍ່"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"ເຊື່ອມ​ຕໍ່ແລ້ວ"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"ບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"ກຳລັງຕັດການເຊື່ອມຕໍ່"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"​ຕັດ​ການ​ເຊື່ອມ​ຕໍ່​ແລ້ວ"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"​ກຳ​ລັງ​ຈັບ​ຄູ່"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"ບໍ່ສາມາດຈັບຄູ່ໄດ້"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"ປະ​ຈຸ​ບັນ Beam ບໍ່​ວ່າງ. ລອງ​ໃໝ່​ອີກ​ເມື່ອ​ການ​ໂອນທີ່​ຜ່ານ​ມາ​ສຳ​ເລັດແລ້ວ."</string>
+    <string name="device" msgid="4459621591392478151">"ອຸປະກອນ"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"ກຳ​ລັງ​ເຊື່ອມ​ຕໍ່ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ທີ່​ເຊື່ອມ​ຕໍ່​ແລ້ວ"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"ບໍ່​ສາມ​າດ​ເຊື່ອ​ມ​ຕໍ່​ກັບ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ໄດ້"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"ກຳ​ລັງ​ຕັດ​ເຊື່ອມ​ຕໍ່ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ທີ່​ຕັດ​ເຊື່ອມ​ຕໍ່​ແລ້ວ"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"ກຳ​ລັງ​ຈັບ​ຄູ່ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"ບໍ່​ສາ​ມາດ​ຈັບ​ຄູ່ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ໄດ້"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"ບໍ່ສາມາດເປີດນຳໃຊ້ Bluetooth ໄດ້"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"ທ່ານແນ່ໃຈບໍວ່າທ່ານຕ້ອງການຈັບຄູ່ອຸປະກອນ Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"ຕົກລົງ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 4cca11b..a00419c 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Jei norite peržiūrėti, palieskite"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Gavėjo įrenginyje nepalaikomas didelio failo perdavimas naudojant perdavimo funkciją."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Vėl susiekite įrenginius"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Jungiamasi"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Prijungta"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Nepavyko prisijungti"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Atsijungiama"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Atjungta"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Susiejama"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Nepavyko susieti"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Perdavimo paslauga šiuo metu užimta. Bandykite dar kartą, kai bus baigtas ankstesnis perkėlimas."</string>
+    <string name="device" msgid="4459621591392478151">"įrenginys"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Jungiamasi prie „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Prisijungta prie „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Nepavyko prisijungti prie „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Atsijungiama nuo „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Atsijungta nuo „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Susiejama su „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Nepavyko susieti su „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Nepavyko įgalinti „Bluetooth“"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Ar tikrai norite susieti „Bluetooth“ įrenginį „<xliff:g id="DEVICE_NAME">%1$s</xliff:g>“?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Taip"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index ee0c1c0..944757f 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Pieskarieties, lai skatītu."</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Saņēmēja ierīce neatbalsta lielu failu pārsūtīšanu, izmantojot funkciju Beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Vēlreiz novietojiet ierīces blakus."</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Notiek savienojuma izveide"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Savienojums izveidots"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Nevarēja izveidot savienojumu"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Notiek savienojuma pārtraukšana"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Savienojums pārtraukts"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Notiek savienošana pārī"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Nevarēja savienot pārī"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Funkcija Beam šobrīd ir noslogota. Mēģiniet vēlreiz, tiklīdz ir pabeigta iepriekšējā pārsūtīšana."</string>
+    <string name="device" msgid="4459621591392478151">"ierīce"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Notiek savienošana ar ierīci <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Savienots ar ierīci <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Nevarēja savienot ar ierīci <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Notiek ierīces <xliff:g id="DEVICE_NAME">%1$s</xliff:g> atvienošana."</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Ierīce <xliff:g id="DEVICE_NAME">%1$s</xliff:g> tika atvienota."</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Notiek savienošana pārī ar ierīci <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Nevarēja savienot pārī ar ierīci <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Nevarēja iespējot Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Vai tiešām vēlaties savienot pārī Bluetooth ierīci <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Jā"</string>
diff --git a/res/values-mk-rMK/strings.xml b/res/values-mk-rMK/strings.xml
index 87e12ad..36c8b9b 100644
--- a/res/values-mk-rMK/strings.xml
+++ b/res/values-mk-rMK/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Допри за да видиш"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Уредот на примачот не поддржува пренос на големи датотеки преку зрак."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Повторно спој ги уредите"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Се поврзува"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Поврзано"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Не можеше да се поврзе"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Се исклучува"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Исклучено"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Се спаруваат"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Не можеше да се спарат"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam е моментално зафатен. Обидете се повторно кога ќе заврши претходниот пренос."</string>
+    <string name="device" msgid="4459621591392478151">"уред"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Се поврзува <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> e поврзан"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Не можеше да се поврзе со <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Се исклучува <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> е исклучен"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Се спарува <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Не можеше да се спари <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Не може да се овозможи Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Дали сте сигурни дека сакате да го спарите уредот со Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Да"</string>
diff --git a/res/values-ml-rIN/strings.xml b/res/values-ml-rIN/strings.xml
index fc00938..d9bb0a5 100644
--- a/res/values-ml-rIN/strings.xml
+++ b/res/values-ml-rIN/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"കാണാൻ സ്‌പർശിക്കുക"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"ബീം മുഖേന വലിയ ഫയൽ കൈമാറുന്നതിനെ സ്വീകർത്താവിന്റെ ഉപകരണം പിന്തുണയ്ക്കുന്നില്ല."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"ഉപകരണങ്ങൾ വീണ്ടും ഒരുമിച്ചുകൊണ്ടുവരുക"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"കണക്റ്റുചെയ്യുന്നു"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"കണക്‌റ്റുചെയ്‌തു"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"കണക്‌റ്റുചെയ്യാനായില്ല"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"വിച്‌ഛേദിക്കുന്നു"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"വിച്ഛേദിച്ചു"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"ജോടിയാക്കുന്നു"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"ജോടിയാക്കാനായില്ല"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"ബീം നിലവിൽ തിരക്കിലാണ്. മുമ്പുള്ള കൈമാറ്റം പൂർത്തിയാക്കുമ്പോൾ വീണ്ടും ശ്രമിക്കുക."</string>
+    <string name="device" msgid="4459621591392478151">"ഉപകരണം"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>, കണക്‌റ്റുചെയ്യുന്നു"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>, കണക്‌റ്റുചെയ്‌തു"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>, കണക്‌റ്റുചെയ്യാനായില്ല"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>, വിച്‌ഛേദിക്കുന്നു"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>, വിച്‌ഛേദിച്ചു"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>, ജോടിയാക്കുന്നു"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>, ജോടിയാക്കാനായില്ല"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"ബ്ലൂടൂത്ത് പ്രവർത്തനക്ഷമമാക്കാനായില്ല"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"നിങ്ങൾക്ക് <xliff:g id="DEVICE_NAME">%1$s</xliff:g> എന്ന ബ്ലൂടൂത്ത് ഉപകരണം ജോടിയാക്കണമെന്ന് തീർച്ചയാണോ?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"വേണം"</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index 451ace6..bb94efb 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Харахын тулд хүрнэ үү"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Хүлээн авагч төхөөрөмж том файлыг бийм-ээр дамжуулахыг дэмждэггүй."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Төхөөрөмжүүдийг дахин хамтад нь байлгах"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Холбогдож байна"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Холбогдсон"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Холбож чадсангүй"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Салгаж байна"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Салгагдсан"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Хослуулж байна"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Хослуулж чадсангүй"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam одоохондоо завгүй байна. Өмнөх шилжүүлэг дууссан үед дахин оролдоно уу."</string>
+    <string name="device" msgid="4459621591392478151">"төхөөрөмж"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г холбож байна"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г холбосон байна"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г холбож чадсангүй"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-н холбоог салгаж байна"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-н холбоог салгасан байна"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г хослуулан холбож байна"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>-г хослуулан холбож чадсангүй"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Блютүүтийг идэвхжүүлж чадсангүй"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Та Блютүүт төхөөрөмж <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-тэй хослуулахдаа итгэлтэй байна уу?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Тийм"</string>
diff --git a/res/values-mr-rIN/strings.xml b/res/values-mr-rIN/strings.xml
index 8503b3a..f63cf04 100644
--- a/res/values-mr-rIN/strings.xml
+++ b/res/values-mr-rIN/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"पाहण्यासाठी स्पर्श करा"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"प्राप्तकर्त्याचे डिव्हाइस बीमद्वारे मोठी फाईल स्थानांतरीत करण्यास समर्थन देत नाही."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"डिव्हाइसेस पुन्हा एकत्र आणा"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"कनेक्ट करीत आहे"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"कनेक्ट केलेले"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"कनेक्ट करू शकलो नाही"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"डिस्कनेक्ट करत आहे"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"डिस्कनेक्ट केले"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"जोडत आहे"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"जोडू शकलो नाही"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"बीम करणे सध्या व्यस्त आहे. मागील स्थानांतरीत करणे पूर्ण झाल्यानंतर पुन्हा प्रयत्न करा."</string>
+    <string name="device" msgid="4459621591392478151">"डिव्हाइस"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> कनेक्‍ट करीत आहे"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> कनेक्‍ट केले"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> कनेक्‍ट करणे शक्य झाले नाही"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> डिस्‍कनेक्‍ट करीत आहे"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> डिस्‍कनेक्‍ट केले"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> जोडणी करीत आहे"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> जोडणे शक्य झाले नाही"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"ब सक्षम करू शकलो नाही"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"आपण <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ब डिव्हाइस जोडू इच्छिता याची आपल्याला खात्री आहे?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"होय"</string>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 7c6b616..caed039 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Sentuh untuk melihat"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Peranti penerima tidak menyokong pemindahan fail besar melalui pancaran."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Dekatkan peranti semula"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Menyambung"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Disambungkan"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Tidak dapat menyambung"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Memutuskan sambungan"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Diputuskan sambungan"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Menjadikan pasangan"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Tidak dapat berpasangan"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Pancaran sibuk pada masa ini. Cuba lagi apabila pemindahan sebelumnya selesai."</string>
+    <string name="device" msgid="4459621591392478151">"peranti"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Menyambungkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> disambungkan"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Tidak dapat menyambungkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Memutuskan sambungan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> diputuskan sambungan"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Memasangkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Tidak dapat memasangkan <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Tidak dapat mendayakan Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Adakah anda pasti anda mahu memadankan peranti Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ya"</string>
diff --git a/res/values-my-rMM/strings.xml b/res/values-my-rMM/strings.xml
index c3fc9c8..6908d83 100644
--- a/res/values-my-rMM/strings.xml
+++ b/res/values-my-rMM/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"ကြည့်ရန် တို့ထိပါ"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"လက်ခံစက်သည် လှိုင်းလွှင့်ခြင်းမှတစ်ဆင့် ကြီးမားသောဖိုင်လွဲခြင်းများကို မထောက်ပံ့ပါ"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"ထပ်ပြီး စက်ကို အတူထားပါ"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"ချိတ်ဆက်နေ"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"ချိတ်ဆက်ထား"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"မချိတ်ဆက်နိုင်ခဲ့ပါ"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"ချိတ်ဆက်မှု ဖြတ်နေ"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"ချိတ်ဆက်မှု ဖြတ်ထား"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"တွဲချိတ်နေ"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"တွဲချိတ်၍မရနိုင်ခဲ့ပါ"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam လောလောဆယ် အလုပ်များနေ၏။ ယခင် ကူးပြောင်းမှုပြီးမှ ထပ်မံကြိုးစားပါ။"</string>
+    <string name="device" msgid="4459621591392478151">"ကိရိယာ"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> အားချိတ်ဆက်နေ၏"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> အား ချိတ်ဆက်ပြီး"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> အား မချိတ်ဆက်နိုင်ပါ"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>အားချိတ်ဆက်မှုဖြတ်တောက်နေ၏"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> နှင့်မချိတ်ဆက်ထားပါ"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့်တွဲချိတ်နေ၏"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့်မတွဲချိတ်နိုင်ပါ"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"ဘလူးတုသ်ကို မရရှိနိုင်ပါ"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"ဘလူးတုသ်စက်<xliff:g id="DEVICE_NAME">%1$s</xliff:g>နှင့် တွဲချိတ်ရန် ကျိန်းသေပါသလား?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"မှန်ပါသည်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index df489a1..cea1dd0 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Trykk for å se"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Mottakerens enhet støtter ikke store filoverføringer via Android Beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Før enhetene sammen igjen"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Kobler til"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Tilkoblet"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Kunne ikke koble til"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Kobler fra"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Frakoblet"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Kobler til"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Kunne ikke koble til"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam er opptatt for øyeblikket. Prøv igjen når den forrige overføringen er fullført."</string>
+    <string name="device" msgid="4459621591392478151">"enhet"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Kobler til <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Tilkoblet <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Kunne ikke koble til <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Kobler fra <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Frakoblet <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Sammenkobler <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Kunne ikke sammenkoble <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Kunne ikke aktivere Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Er du sikker på at koble til Bluetooth-enheten <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ja"</string>
diff --git a/res/values-ne-rNP/strings.xml b/res/values-ne-rNP/strings.xml
index f270592..ebdee3c 100644
--- a/res/values-ne-rNP/strings.xml
+++ b/res/values-ne-rNP/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"अवलोकन गर्न छुनुहोस्"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"प्राप्तकर्ताको उपकरणले बिम मार्फत ठूलो फाइल ट्रान्सफर गर्न समर्थन गर्दैन।"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"फेरि उपकरणहरू एकै साथ ल्याउनुहोस्"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"जडान गरिँदै"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"जडित"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"जडान गर्न सकेन"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"विच्छेद हुँदै..."</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"विच्छेद भएको"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"जोडा मिलाउँदै"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"जोडा मिलाउन सकेन"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"बीम अहिले व्यस्त छ। अघिल्लो स्थानान्तरण पूरा भएपछि फेरि प्रयास गर्नुहोस्।"</string>
+    <string name="device" msgid="4459621591392478151">"यन्त्र"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> जडान गर्दै"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"जडित <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> जडान गर्न सकेन"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> विच्छेदन गर्दै"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> विच्छेद गरियो"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> जोडा गर्दै"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> जोडा गर्न सकेन"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"ब्लुटुथ सक्षम पार्न सकेन"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"तपाईँ ब्लुटुथ उपकरण जोडी गर्न निश्चित हुनुहुन्छ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"हो"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index d0ea4d3..11b2c8f 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Raak aan om te bekijken"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Het apparaat van de ontvanger ondersteunt de overdracht van grote bestanden via beam niet."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Houd de apparaten nogmaals tegen elkaar"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Verbinding maken"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Verbonden"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Kan niet verbinden"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Verbinding verbreken"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Verbinding verbroken"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Koppelen"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Kan niet koppelen"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam is momenteel bezet. Probeer het opnieuw zodra de huidige overdracht is voltooid."</string>
+    <string name="device" msgid="4459621591392478151">"apparaat"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> verbinden"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> verbonden"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Kan <xliff:g id="DEVICE_NAME">%1$s</xliff:g> niet verbinden"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Verbinding met <xliff:g id="DEVICE_NAME">%1$s</xliff:g> verbreken"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Verbinding met <xliff:g id="DEVICE_NAME">%1$s</xliff:g> verbroken"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> koppelen"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Kan <xliff:g id="DEVICE_NAME">%1$s</xliff:g> niet koppelen"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Kan Bluetooth niet inschakelen"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Weet u zeker dat u het Bluetooth-apparaat <xliff:g id="DEVICE_NAME">%1$s</xliff:g> wilt koppelen?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ja"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index ab6422c..28510cb 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Dotknij, by wyświetlić"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Urządzenie odbierające nie pozwala na zbliżeniowe przesyłanie dużych plików."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Zbliż urządzenia do siebie"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Łączę"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Połączono"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Nie można nawiązać połączenia"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Rozłączam"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Rozłączono"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Parowanie"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Nie można sparować"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Funkcja Beam jest teraz zajęta. Spróbuj ponownie, gdy zakończy się poprzednia transmisja."</string>
+    <string name="device" msgid="4459621591392478151">"urządzenie"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Łączę: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Połączono: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Nie udało się połączyć: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Odłączam: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Odłączono: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Paruję: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Nie udało się sparować: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Nie można włączyć Bluetootha"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Czy na pewno chcesz sparować urządzenie Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Tak"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index ce0b917..0c78c9c 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Tocar para ver"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"O dispositivo do recetor não suporta a transferência de ficheiros grandes através de partilha."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Juntar os dispositivos novamente"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"A ligar"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Ligado"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Não foi possível ligar"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"A desligar"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Desligado"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"A sincronizar"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Não foi possível sincronizar"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"O Beam está atualmente ocupado. Tente novamente quando a transferência anterior for concluída."</string>
+    <string name="device" msgid="4459621591392478151">"dispositivo"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"A ligar o <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ligado"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Não foi possível ligar o <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"A desligar o <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> desligado"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"A sincronizar o <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Não foi possível sincronizar o <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Não foi possível ativar o Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Tem a certeza de que pretende sincronizar o dispositivo Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Sim"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index d05244f..bbf26d0 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Toque para visualizar"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"O dispositivo receptor não suporta a transferência de arquivos grandes por meio do Android Beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Una dispositivos novamente"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Conectando"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Conectado"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Não foi possível conectar"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Desconectando"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Desconectado"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Pareando"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Não foi possível parear"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"O Beam está ocupado no momento. Tente novamente quando a transferência anterior for concluída."</string>
+    <string name="device" msgid="4459621591392478151">"dispositivo"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Conectando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> conectado"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Não foi possível conectar o <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Desconectando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> desconectado"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Pareando <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Não foi possível parear o <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Não foi possível ativar o Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Tem certeza de que deseja parear o dispositivo Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Sim"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 3dd9c0d..8749531 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Atingeţi pentru a afişa"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Dispozitivul destinatarului nu acceptă transferul fişierelor mari prin fascicul."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Apropiați dispozitivele din nou"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Se conectează"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Conectat"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Nu s-a putut realiza conectarea"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Se deconectează"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Deconectat"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Se împerechează"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Împerecherea a eșuat"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam este ocupat. Încercați după finalizarea transferului anterior."</string>
+    <string name="device" msgid="4459621591392478151">"dispozitiv"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Se conectează <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"S-a conectat <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Nu s-a putut conecta <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Se deconectează <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"S-a deconectat <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Se asociază <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Nu s-a putut asocia <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Activarea Bluetooth a eşuat"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Sigur doriţi să împerecheaţi dispozitivul Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Da"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 0427dd8..ea338e9 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Нажмите, чтобы просмотреть"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Устройство получателя не поддерживает передачу больших объемов данных через Android Beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Повторить попытку"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Подключение…"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Подключено"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Ошибка подключения"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Отключение…"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Не подключено"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Подключение…"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Ошибка подключения"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Передавать данные пока нельзя. Повторите попытку после окончания предыдущего сеанса."</string>
+    <string name="device" msgid="4459621591392478151">"устройство"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Устройство <xliff:g id="DEVICE_NAME">%1$s</xliff:g> подключается"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Устройство <xliff:g id="DEVICE_NAME">%1$s</xliff:g> подключено"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Не удалось подключить устройство <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Устройство <xliff:g id="DEVICE_NAME">%1$s</xliff:g> отключается"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Устройство <xliff:g id="DEVICE_NAME">%1$s</xliff:g> отключено"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Подключение к устройству <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Не удалось подключить устройство <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Не удалось включить Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Подключить Bluetooth-устройство <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Да"</string>
diff --git a/res/values-si-rLK/strings.xml b/res/values-si-rLK/strings.xml
index ddf0bc6..611167a 100644
--- a/res/values-si-rLK/strings.xml
+++ b/res/values-si-rLK/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"බැලීමට ස්පර්ශ කරන්න"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"බීම් ඔස්සේ ලැබෙන්නාගේ උපාංගය විශාල ගොනු හුවමාරුව සඳහා සහය නොදක්වයි."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"නැවතත් උපාංග එකට ගෙනෙන්න"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"සම්බන්ධ වෙමින්"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"සම්බන්ධිත"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"සම්බන්ධ විය නොහැක"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"විසන්ධි වෙමින්"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"විසන්ධි වුණි"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"යුගල කරමින්"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"යුගල කළ නොහැක"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam දැනට කාර්ය බහුලය. පෙර මාරුව සම්පූර්ණ වන විට නැවත උත්සාහ කරන්න."</string>
+    <string name="device" msgid="4459621591392478151">"උපාංගය"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> සබැඳෙමින්"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> සබැඳිණි"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> සබැඳීමට නොහැකි විය"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> විසන්ධි කරමින්"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> විසන්ධි කරන ලදී"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> යුගල කරමින්"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> යුගල කිරීමට නොහැකි විය"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"බ්ලූටූත් සබල කළ නොහැක"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> බ්ලූටූත් උපාංගය යුගල කිරීමට අවශ්‍ය බවට ඔබට විශ්වාසද?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"ඔව්"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index af401d8..f87be62 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Zobrazte dotykom"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Zariadenie príjemcu nepodporuje prenos veľkých súborov prostredníctvom funkcie Beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Znova priblížte zariadenia"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Pripája sa"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Pripojené"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Nepodarilo sa pripojiť"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Odpája sa"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Odpojené"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Páruje sa"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Nie je možné spárovať"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Aplikácia Beam je momentálne zaneprázdnená. Skúste to znova, keď sa dokončí predchádzajúci prenos."</string>
+    <string name="device" msgid="4459621591392478151">"zariadenie"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Pripája sa zariadenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Zariadenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> je pripojené"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Zariadenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> sa nepodarilo pripojiť"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Odpája sa zariadenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Zariadenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> bolo odpojené"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Páruje sa zariadenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Zariadenie <xliff:g id="DEVICE_NAME">%1$s</xliff:g> sa nepodarilo spárovať"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth sa nepodarilo povoliť"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Naozaj chcete spárovať zariadenie Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Áno"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 2c16197..2fc02a4 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Dotaknite se za prikaz"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Prejemnikova naprava ne podpira prenosa velikih datotek prek funkcije Android Beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Znova združi naprave"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Vzpostavljanje povezave"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Povezava je vzpostavljena"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Povezava ni mogoča"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Prekinjanje povezave"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Povezava je prekinjena"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Seznanjanje"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Seznanitev ni mogoča"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Android Beam je trenutno zaseden. Poskusite znova, ko se konča prejšnji prenos."</string>
+    <string name="device" msgid="4459621591392478151">"naprava"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Povezovanje naprave <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Naprava <xliff:g id="DEVICE_NAME">%1$s</xliff:g> je povezana"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Naprave <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ni mogoče povezati"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Prekinjanje povezave z napravo <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Povezava z napravo <xliff:g id="DEVICE_NAME">%1$s</xliff:g> je prekinjena"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Seznanjanje naprave <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Naprave <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ni bilo mogoče seznaniti"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetootha ni mogoče omogočiti"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Ste prepričani, da želite seznaniti napravo Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Da"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index b485e2e..d48f5a6 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Додирните да бисте прегледали"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Уређај пријемника не подржава пренос великих датотека пребацивањем."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Поново приближите уређаје"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Повезивање"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Повезано је"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Повезивање није успело"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Прекидање везе"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Веза је прекинута"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Упаривање"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Упаривање није успело"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Пребацивање је тренутно заузето. Покушајте поново када се претходни пренос заврши."</string>
+    <string name="device" msgid="4459621591392478151">"уређај"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Повезивање са уређајем <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Уређај <xliff:g id="DEVICE_NAME">%1$s</xliff:g> је повезан"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Повезивање са уређајем <xliff:g id="DEVICE_NAME">%1$s</xliff:g> није успело"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Прекидање везе са уређајем <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Веза са уређајем <xliff:g id="DEVICE_NAME">%1$s</xliff:g> је прекинута"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Упаривање уређаја <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Упаривање уређаја <xliff:g id="DEVICE_NAME">%1$s</xliff:g> није успело"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Није могуће омогућити Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Да ли сте сигурни да желите да упарите Bluetooth уређај <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Да"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index e4dc050..4545520 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Tryck och visa"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Mottagarens enheten stöder inte trådlös överföring av stora filer."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"För samman enheterna igen"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Ansluter"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Ansluten"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Det gick inte att ansluta"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Anslutningen avbryts"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Frånkopplad"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Kopplar"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Det gick inte att koppla"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam används för närvarande. Försök igen när den pågående överföringen är klar."</string>
+    <string name="device" msgid="4459621591392478151">"enhet"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Ansluter <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> har anslutits"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Det gick inte att ansluta <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Kopplar från <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> har kopplats från"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Kopplar <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Det gick inte att koppla <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Det gick inte att aktivera Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Är du säker på att du vill para ihop Bluetooth-enheten <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ja"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 8db6fb8..49ddd86 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Gusa ili utazame"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Kifaa cha upokeaji hakihimili uhamishaji wa faili kubwa kupitia kwenye boriti."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Unganisha vifaa tena"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Inaunganisha"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Imeunganishwa"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Haikuweza kuunganisha"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Inakata muunganisho"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Imekata muunganisho"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Inaoanisha"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Haikuweza kuoanisha"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Android Beam inatumika kwa sasa. Jaribu tena itakapokamilisha uhamishaji uliotangulia."</string>
+    <string name="device" msgid="4459621591392478151">"kifaa"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Inaunganisha <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Imeunganisha <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Haikuweza kuunganisha <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Inaondoa <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Imeondoa <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Inaoanisha <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Haikuweza kuoanisha <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Haikuweza kuwezesha Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Una uhakika unataka kuoanisha kifaa cha Bluetooth cha <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ndiyo"</string>
diff --git a/res/values-ta-rIN/strings.xml b/res/values-ta-rIN/strings.xml
index 235bb75..62e9bd0 100644
--- a/res/values-ta-rIN/strings.xml
+++ b/res/values-ta-rIN/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"பார்க்கத் தொடவும்"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"பெறுநரின் சாதனம் பீம் வழியான பெரிய கோப்புப் பரிமாற்றத்தை ஆதரிக்கவில்லை."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"மீண்டும் சாதனங்களை ஒன்றாகக் கொண்டுவரவும்"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"இணைக்கிறது"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"இணைக்கப்பட்டது"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"இணைக்க முடியவில்லை"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"துண்டிக்கிறது"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"துண்டிக்கப்பட்டது"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"இணைக்கிறது"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"இணைக்க முடியவில்லை"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"பீம் தற்போது பணிமிகுதியில் உள்ளது. முந்தைய இடமாற்றம் முடியும்போது, மீண்டும் முயலவும்."</string>
+    <string name="device" msgid="4459621591392478151">"சாதனம்"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ஐ இணைக்கிறது"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> இணைக்கப்பட்டது"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ஐ இணைக்க முடியவில்லை"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> துண்டிக்கப்படுகிறது"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> துண்டிக்கப்பட்டது"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> இணைக்கப்படுகிறது"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ஐ இணைக்க முடியவில்லை"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"புளூடூத்தைச் செயல்படுத்த முடியவில்லை"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"புளூடூத் சாதனம் <xliff:g id="DEVICE_NAME">%1$s</xliff:g> உடன் இணைக்க வேண்டும் என்று விரும்புகிறீர்களா?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"ஆம்"</string>
diff --git a/res/values-te-rIN/strings.xml b/res/values-te-rIN/strings.xml
index fef4929..bf66fd9 100644
--- a/res/values-te-rIN/strings.xml
+++ b/res/values-te-rIN/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"వీక్షించడానికి తాకండి"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"స్వీకర్త పరికరం Beam ద్వారా పెద్ద ఫైల్ బదిలీకి మద్దతు ఇవ్వదు."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"పరికరాలను మళ్లీ సమీపంలోకి తీసుకురండి"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"కనెక్ట్ చేస్తోంది"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"కనెక్ట్ చేయబడింది"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"కనెక్ట్ చేయడం సాధ్యపడలేదు"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"డిస్‌కనెక్ట్ చేస్తోంది"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"డిస్‌కనెక్ట్ చేయబడింది"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"జత చేస్తోంది"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"జత చేయడం సాధ్యపడలేదు"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam ప్రస్తుతం బిజీగా ఉంది. మునుపటి బదిలీ పూర్తయిన తర్వాత మళ్లీ ప్రయత్నించండి."</string>
+    <string name="device" msgid="4459621591392478151">"పరికరం"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ని కనెక్ట్ చేస్తోంది"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> కనెక్ట్ చేయబడింది"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ని కనెక్ట్ చేయడం సాధ్యపడలేదు"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ని డిస్‌కనెక్ట్ చేస్తోంది"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> డిస్‌కనెక్ట్ చేయబడింది"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ని జత చేస్తోంది"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ని జత చేయడం సాధ్యపడలేదు"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"బ్లూటూత్‌ను ప్రారంభించడం సాధ్యపడలేదు"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"మీరు ఖచ్చితంగా <xliff:g id="DEVICE_NAME">%1$s</xliff:g> బ్లూటూత్ పరికరాన్ని జత చేయాలనుకుంటున్నారా?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"అవును"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 7e26b1f..426a140 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"แตะเพื่อดู"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"อุปกรณ์ของผู้รับไม่สนับสนุนการถ่ายโอนไฟล์ขนาดใหญ่ผ่านการบีม"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"นำอุปกรณ์มารวมกันอีกครั้ง"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"กำลังเชื่อมต่อ"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"เชื่อมต่อแล้ว"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"ไม่สามารถเชื่อมต่อ"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"กำลังยกเลิกการเชื่อมต่อ"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"ยกเลิกการเชื่อมต่อแล้ว"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"กำลังจับคู่อุปกรณ์"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"ไม่สามารถจับคู่อุปกรณ์"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam ไม่ว่างในขณะนี้ ลองอีกครั้งเมื่อการโอนก่อนหน้าเสร็จสมบูรณ์แล้ว"</string>
+    <string name="device" msgid="4459621591392478151">"อุปกรณ์"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"กำลังเชื่อมต่อกับ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"เชื่อมต่อกับ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> อยู่"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"ไม่สามารถเชื่อมต่อกับ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"กำลังยกเลิกการเชื่อมต่อกับ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"ยกเลิกการเชื่อมต่อกับ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> แล้ว"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"กำลังจับคู่กับ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"ไม่สามารถจับคู่กับ <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"ไม่สามารถเปิดใช้งานบลูทูธ"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"คุณแน่ใจหรือไม่ว่าต้องการจับคู่อุปกรณ์บลูทูธ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> นี้"</string>
     <string name="pair_yes" msgid="3525614878559994448">"ใช่"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 02b71ab..a37e4b0 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Pindutin upang tingnan"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Hindi sinusuportahan ng device ng receiver ang malaking paglipat ng file sa pamamagitan ng beam."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Pagsamahing muli ang mga device"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Kumokonekta"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Nakakonekta"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Hindi makakonekta"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Nagdidiskonekta"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Nadiskonekta"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Nagpapares"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Hindi makapagpares"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Kasalukuyang abala ang beam. Subukang muli kapag nakumpleto na ang dating paglilipat."</string>
+    <string name="device" msgid="4459621591392478151">"device"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Ikinokonekta ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Naikonekta na ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Hindi naikonekta ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Idinidiskonekta ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Nadiskonekta ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Ipinapares ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Hindi naipares ang <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Hindi mapagana ang Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Sigurado ka bang nais mong ipares ang Bluetooth device na <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Oo"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 382dbfe..b592b7e 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Görüntülemek için dokunun"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Alıcının cihazı yüksek boyutlu dosyaların ışınlamayla aktarılmasını desteklemiyor."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Cihazları tekrar bir araya getirin"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Bağlanılıyor"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Bağlı"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Bağlantı kurulamadı"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Bağlantı kesiliyor"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Bağlantı kesildi"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Eşleştiriliyor"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Eşleştirilemedi"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Android Beam şu anda meşgul. Önceki aktarım işlemi tamamlandığında tekrar deneyin."</string>
+    <string name="device" msgid="4459621591392478151">"cihaz"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Şu cihaza bağlanılıyor: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Şu cihaza bağlanıldı: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Şu cihaza bağlanılamadı: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Şu cihazın bağlantısı kesiliyor: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Şu cihazın bağlantısı kesildi: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Şu cihazla eşleştiriliyor: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Şu cihazla eşleştirilemedi: <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth etkinleştirilemedi"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> adlı Bluetooth cihazını eşlemek istediğinizden emin misiniz?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Evet"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 284104c..2c7e0b2 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Торкніться, щоб переглянути"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Пристрій отримувача не підтримує пересилання великих файлів за допомогою функції Передавання даних Android."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Знову притуліть пристрої один до одного"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Під’єднання"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Під’єднано"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Не вдалося під’єднатись"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Від’єднання"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Від’єднано"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Підключення"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Не вдалося підключитися"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Неможливо передати. Повторіть спробу, коли завершиться попереднє передавання."</string>
+    <string name="device" msgid="4459621591392478151">"пристрій"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Під’єднання пристрою <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Пристрій <xliff:g id="DEVICE_NAME">%1$s</xliff:g> під’єднано"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Пристрій <xliff:g id="DEVICE_NAME">%1$s</xliff:g> не під’єднано"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Від’єднання пристрою <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Пристрій <xliff:g id="DEVICE_NAME">%1$s</xliff:g> від’єднано"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Підключення пристрою <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Пристрій <xliff:g id="DEVICE_NAME">%1$s</xliff:g> не підключено"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Не вдалося ввімкнути Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Дійсно створити пару з пристроєм Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g>?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Так"</string>
diff --git a/res/values-ur-rPK/strings.xml b/res/values-ur-rPK/strings.xml
index ac4937f..8622bc0 100644
--- a/res/values-ur-rPK/strings.xml
+++ b/res/values-ur-rPK/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"دیکھنے کیلئے ٹچ کریں"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"موصول کرنے والے کا آلہ بیم کے ذریعے بڑی فائل کی منتقلی کا تعاون نہیں کرتا ہے۔"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"آلات کو دوبارہ سے ساتھ لائیں"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"منسلک کیا جا رہا ہے"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"منسلک ہے"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"مربوط نہیں ہو سکا"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"غیر منسلک کیا جا رہا ہے"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"غیر منسلک ہے"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"جوڑا بنایا جا رہا ہے"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"جوڑا نہیں بنایا جا سکا"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"‏Beam فی الحال مصروف ہے۔ سابقہ منتقلی مکمل ہونے پر دوبارہ کوشش کریں۔"</string>
+    <string name="device" msgid="4459621591392478151">"آلہ"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> منسلک ہو رہا ہے"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> منسلک ہوگیا"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> منسلک نہیں ہو سکا"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> غیر منسلک ہو رہا ہے"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> غیر منسلک ہوگیا"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> جوڑا بنا رہا ہے"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> جوڑا نہیں بنا سکا"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"بلوٹوتھ فعال نہیں ہو سکا"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"کیا آپ واقعی بلوٹوتھ آلہ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> کا جوڑا بنانا چاہتے ہیں؟"</string>
     <string name="pair_yes" msgid="3525614878559994448">"ہاں"</string>
diff --git a/res/values-uz-rUZ/strings.xml b/res/values-uz-rUZ/strings.xml
index 415a216..1c71337 100644
--- a/res/values-uz-rUZ/strings.xml
+++ b/res/values-uz-rUZ/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Ko‘rish uchun bosing"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Qabul qiluvchining qurilmasi o‘tkazish xususiyati orqali katta hajmdagi fayllar o‘tkazmasini qo‘llab-quvvatlamaydi."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Qurilmalarni yana jipslashtiring"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Ulanmoqda"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Ulandi"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Ulanib bo‘lmadi"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Aloqa uzilmoqda"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Aloqa uzildi"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Ulanmoqda"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Ulanib bo‘lmadi"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam hozirda band. Avvalgi o‘tkazma tugallangach, qaytadan urining."</string>
+    <string name="device" msgid="4459621591392478151">"qurilma"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ulanmoqda"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ulandi"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ulanmadi"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> bilan aloqa uzilmoqda"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> bilan aloqa uzildi"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ulanmoqda"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ulanmadi"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Bluetooth’ni yoqib bo‘lmadi"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> Bluetooth qurilmasini bo‘glashga ishonchingiz komilmi?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Ha"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index e1a203c..17cfefd 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Chạm để xem"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Thiết bị của người nhận không hỗ trợ truyền tệp lớn qua quá trình chiếu."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Nhóm các thiết bị lại với nhau lần nữa"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Đang kết nối"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Đã kết nối"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Không thể kết nối"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Đang ngắt kết nối"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Đã ngắt kết nối"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Đang ghép nối"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Không thể ghép nối"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam hiện đang bận. Hãy thử lại khi quá trình truyền trước đây hoàn tất."</string>
+    <string name="device" msgid="4459621591392478151">"thiết bị"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Đang kết nối <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Đã kết nối <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Không thể kết nối <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Đang ngắt kết nối <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Đã ngắt kết nối <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Đang ghép nối <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Không thể ghép nối <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Không thể bật Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Bạn có chắc chắn muốn ghép nối thiết bị Bluetooth <xliff:g id="DEVICE_NAME">%1$s</xliff:g> không?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Có"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 9ca318a..934c1fd 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"触摸即可查看"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"接收者的设备不支持传输较大的文件。"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"再次让两台设备接触"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"正在连接"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"已连接"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"无法连接"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"正在断开连接"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"已断开连接"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"正在配对"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"无法配对"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam 目前正忙。请在之前的传输任务完成后重试。"</string>
+    <string name="device" msgid="4459621591392478151">"设备"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"正在连接到<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"已连接到<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"无法连接到<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"正在断开与<xliff:g id="DEVICE_NAME">%1$s</xliff:g>的连接"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"已断开与<xliff:g id="DEVICE_NAME">%1$s</xliff:g>的连接"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"正在与<xliff:g id="DEVICE_NAME">%1$s</xliff:g>配对"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"无法与<xliff:g id="DEVICE_NAME">%1$s</xliff:g>配对"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"无法启用蓝牙"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"您确定要与蓝牙设备<xliff:g id="DEVICE_NAME">%1$s</xliff:g>配对吗?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"是"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 7438b75..b2d7884 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"輕觸即可查看"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"接收者的裝置不支援經由 Beam 傳送大型檔案。"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"再次把裝置放在一起"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"正在連線"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"已連線"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"無法連線"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"正在中斷連線"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"已中斷連線"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"配對中"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"無法配對"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam 目前忙碌中。請在完成上一個傳輸工作後再試一次。"</string>
+    <string name="device" msgid="4459621591392478151">"裝置"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"正在連接<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"已連接<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"無法連接<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"正在中斷連接<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"已中斷連接<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"正在配對<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"無法配對<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"無法啟用藍牙"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"您確定要與藍牙裝置「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」配對嗎?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"是"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index cfc64ec..3c33636 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"輕觸即可查看"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"接收者的裝置不支援透過 Beam 傳輸大型檔案。"</string>
     <string name="beam_try_again" msgid="3364677301009783455">"再次將裝置放在一起"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"連線中"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"已連線"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"無法連線"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"正在中斷連線"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"已中斷連線"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"配對中"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"無法配對"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Beam 目前忙碌中。請等待先前的傳輸作業完成,然後再試一次。"</string>
+    <string name="device" msgid="4459621591392478151">"裝置"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"正在與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 連線"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"已連上 <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"無法與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 連線"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"正在中斷與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 的連線"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"已中斷與 <xliff:g id="DEVICE_NAME">%1$s</xliff:g> 的連線"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> 配對中"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> 無法配對"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"無法啟用藍牙"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"您確定要與藍牙裝置「<xliff:g id="DEVICE_NAME">%1$s</xliff:g>」配對嗎?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"是"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index a801ca7..e69586c 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -18,13 +18,15 @@
     <string name="beam_touch_to_view" msgid="7853129156831642630">"Thinta ukuze ubuke"</string>
     <string name="beam_handover_not_supported" msgid="4083165921751489015">"Idivayisi yomamukeli ayisekeli ukuhanjiswa kwamafayela amakhulu ngokuvumelanisa."</string>
     <string name="beam_try_again" msgid="3364677301009783455">"Phinda uhlanganise ndawonye amadivayisi"</string>
-    <string name="connecting_peripheral" msgid="3957490448472434505">"Iyaxhuma"</string>
-    <string name="connected_peripheral" msgid="5777997713940423952">"Ixhunyiwe"</string>
-    <string name="connect_peripheral_failed" msgid="7173159351147270788">"Ayikwazanga ukuxhuma"</string>
-    <string name="disconnecting_peripheral" msgid="5320432304947519207">"Iyanqamula"</string>
-    <string name="disconnected_peripheral" msgid="2768150931245385916">"Kunqamukile"</string>
-    <string name="pairing_peripheral" msgid="5618129595426303236">"Iyabhanqa"</string>
-    <string name="pairing_peripheral_failed" msgid="976004756112808526">"Ayikwazanga ukubhanqa"</string>
+    <string name="beam_busy" msgid="5253335587620612576">"Ukuvumelansia okwamanje kumatasa. Zama futhi uma ukuthutha kwangaphambili kuqeda."</string>
+    <string name="device" msgid="4459621591392478151">"idivayisi"</string>
+    <string name="connecting_peripheral" msgid="1296182660525660935">"Ixhuma ku-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connected_peripheral" msgid="20748648543160091">"Ixhunyiwe ku-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="connect_peripheral_failed" msgid="7925702596242839275">"Ayikwazanga ukuxhuma ku-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnecting_peripheral" msgid="1443699384809097200">"Iyanqamula ku-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="disconnected_peripheral" msgid="4470578100296504366">"Inqanyuliwe ku-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral" msgid="6983626861540899365">"Ibhangqa i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
+    <string name="pairing_peripheral_failed" msgid="6087643307743264679">"Ayikwazanga ukubhangqa i-<xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string>
     <string name="failed_to_enable_bt" msgid="7229153323594758077">"Ayikwazanga ukunika amandla i-Bluetooth"</string>
     <string name="confirm_pairing" msgid="4112568077038265363">"Ingabe unesiqinisekiso sokuthi ufuna ukuhambisa ngakubili idivayisi <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ye-Bluetooth?"</string>
     <string name="pair_yes" msgid="3525614878559994448">"Yebo"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 923e432..78102a6 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -28,15 +28,27 @@
     <string name="beam_touch_to_view">Touch to view</string>
     <string name="beam_handover_not_supported">The receiver\'s device doesn\'t support large file transfer via beam.</string>
     <string name="beam_try_again">Bring devices together again</string>
+    <string name="beam_busy">Beam is currently busy. Try again when the previous transfer completes.</string>
 
-    <string name="connecting_peripheral">Connecting</string>
-    <string name="connected_peripheral">Connected</string>
-    <string name="connect_peripheral_failed">Could not connect</string>
-    <string name="disconnecting_peripheral">Disconnecting</string>
-    <string name="disconnected_peripheral">Disconnected</string>
-    <string name="pairing_peripheral">Pairing</string>
-    <string name="pairing_peripheral_failed">Could not pair</string>
+    <!-- String referring to the device being connected when there is no name for the device -->
+    <string name="device">device</string>
+    <!-- Toast string informing the user that the device is connecting [CHAR_LIMIT=35] -->
+    <string name="connecting_peripheral">Connecting <xliff:g id="device_name">%1$s</xliff:g></string>
+    <!-- Toast string informing the user that the device is connected [CHAR_LIMIT=35] -->
+    <string name="connected_peripheral">Connected <xliff:g id="device_name">%1$s</xliff:g></string>
+    <!-- Toast string informing the user that the device failed to connect [CHAR_LIMIT=35] -->
+    <string name="connect_peripheral_failed">Could not connect <xliff:g id="device_name">%1$s</xliff:g></string>
+    <!-- Toast string informing the user that the device is disconnecting [CHAR_LIMIT=35] -->
+    <string name="disconnecting_peripheral">Disconnecting <xliff:g id="device_name">%1$s</xliff:g></string>
+    <!-- Toast string informing the user that the device is disconnected [CHAR_LIMIT=35] -->
+    <string name="disconnected_peripheral">Disconnected <xliff:g id="device_name">%1$s</xliff:g></string>
+    <!-- Toast string informing the user that the device is pairing [CHAR_LIMIT=35] -->
+    <string name="pairing_peripheral">Pairing <xliff:g id="device_name">%1$s</xliff:g></string>
+    <!-- Toast string informing the user that the device failed to pair [CHAR_LIMIT=35] -->
+    <string name="pairing_peripheral_failed">Could not pair <xliff:g id="device_name">%1$s</xliff:g></string>
+    <!-- Toast string informing the user that BT could not be enabled [CHAR_LIMIT=35] -->
     <string name="failed_to_enable_bt">Could not enable Bluetooth</string>
+    <!-- Dialog string informing the user that BT could not be enabled [CHAR_LIMIT=75] -->
     <string name="confirm_pairing">Are you sure you want to pair the Bluetooth device <xliff:g id="device_name">%1$s</xliff:g>?</string>
     <string name="pair_yes">Yes</string>
     <string name="pair_no">No</string>
diff --git a/src/com/android/nfc/BeamShareActivity.java b/src/com/android/nfc/BeamShareActivity.java
index 84a658a..10f6632 100644
--- a/src/com/android/nfc/BeamShareActivity.java
+++ b/src/com/android/nfc/BeamShareActivity.java
@@ -32,6 +32,7 @@
 import android.nfc.NdefRecord;
 import android.nfc.NfcAdapter;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.util.Log;
 import android.webkit.URLUtil;
 
@@ -78,7 +79,7 @@
 
     private void showNfcDialogAndExit(int msgId) {
         IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
-        registerReceiver(mReceiver, filter);
+        registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null);
 
         AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this,
                 AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
@@ -204,18 +205,18 @@
                 }
             }
             if (numValidUris > 0) {
-                shareData = new BeamShareData(null, uriArray, 0);
+                shareData = new BeamShareData(null, uriArray, UserHandle.CURRENT, 0);
             } else {
                 // No uris left
-                shareData = new BeamShareData(null, null, 0);
+                shareData = new BeamShareData(null, null, UserHandle.CURRENT, 0);
             }
         } else if (mNdefMessage != null) {
-            shareData = new BeamShareData(mNdefMessage, null, 0);
+            shareData = new BeamShareData(mNdefMessage, null, UserHandle.CURRENT, 0);
             if (DBG) Log.d(TAG, "Created NDEF message:" + mNdefMessage.toString());
         } else {
             if (DBG) Log.d(TAG, "Could not find any data to parse.");
             // Activity may have set something to share over NFC, so pass on anyway
-            shareData = new BeamShareData(null, null, 0);
+            shareData = new BeamShareData(null, null, UserHandle.CURRENT, 0);
         }
         mNfcAdapter.invokeBeam(shareData);
         finish();
diff --git a/src/com/android/nfc/NfcDiscoveryParameters.java b/src/com/android/nfc/NfcDiscoveryParameters.java
index 5a49ef3..1149836 100644
--- a/src/com/android/nfc/NfcDiscoveryParameters.java
+++ b/src/com/android/nfc/NfcDiscoveryParameters.java
@@ -55,27 +55,29 @@
             return this;
         }
 
+        public NfcDiscoveryParameters.Builder setEnableP2p(boolean enable) {
+            mParameters.mEnableP2p = enable;
+            return this;
+        }
+
         public NfcDiscoveryParameters build() {
-            if (mParameters.mEnableReaderMode && mParameters.mEnableLowPowerDiscovery) {
-                throw new IllegalStateException("Can't enable LPTD and reader mode simultaneously");
+            if (mParameters.mEnableReaderMode &&
+                    (mParameters.mEnableLowPowerDiscovery || mParameters.mEnableP2p)) {
+                throw new IllegalStateException("Can't enable LPTD/P2P and reader mode " +
+                        "simultaneously");
             }
             return mParameters;
         }
     }
 
-    // Polling technology masks
     static final int NFC_POLL_DEFAULT = -1;
-    static final int NFC_POLL_A = 0x01;
-    static final int NFC_POLL_B = 0x02;
-    static final int NFC_POLL_F = 0x04;
-    static final int NFC_POLL_ISO15693 = 0x08;
-    static final int NFC_POLL_B_PRIME = 0x10;
-    static final int NFC_POLL_KOVIO = 0x20;
 
+    // NOTE: when adding a new field, don't forget to update equals() and toString() below
     private int mTechMask = 0;
     private boolean mEnableLowPowerDiscovery = true;
     private boolean mEnableReaderMode = false;
     private boolean mEnableHostRouting = false;
+    private boolean mEnableP2p = false;
 
     public NfcDiscoveryParameters() {}
 
@@ -99,6 +101,10 @@
         return mTechMask != 0 || mEnableHostRouting;
     }
 
+    public boolean shouldEnableP2p() {
+        return mEnableP2p;
+    }
+
     @Override
     public boolean equals(Object obj) {
         if (obj == this) {
@@ -112,7 +118,8 @@
         return mTechMask == params.mTechMask &&
                 (mEnableLowPowerDiscovery == params.mEnableLowPowerDiscovery) &&
                 (mEnableReaderMode == params.mEnableReaderMode) &&
-                (mEnableHostRouting == params.mEnableHostRouting);
+                (mEnableHostRouting == params.mEnableHostRouting)
+                && (mEnableP2p == params.mEnableP2p);
     }
 
     @Override
@@ -125,7 +132,8 @@
         }
         sb.append("mEnableLPD: " + Boolean.toString(mEnableLowPowerDiscovery) + "\n");
         sb.append("mEnableReader: " + Boolean.toString(mEnableReaderMode) + "\n");
-        sb.append("mEnableHostRouting: " + Boolean.toString(mEnableHostRouting));
+        sb.append("mEnableHostRouting: " + Boolean.toString(mEnableHostRouting) + "\n");
+        sb.append("mEnableP2p: " + Boolean.toString(mEnableP2p));
         return sb.toString();
     }
 
diff --git a/src/com/android/nfc/NfcDispatcher.java b/src/com/android/nfc/NfcDispatcher.java
index 90261c4..9fd30a6 100644
--- a/src/com/android/nfc/NfcDispatcher.java
+++ b/src/com/android/nfc/NfcDispatcher.java
@@ -16,9 +16,11 @@
 
 package com.android.nfc;
 
-import android.nfc.INfcUnlockHandler;
+import android.bluetooth.BluetoothAdapter;
+
 import com.android.nfc.RegisteredComponentCache.ComponentInfo;
-import com.android.nfc.handover.HandoverManager;
+import com.android.nfc.handover.HandoverDataParser;
+import com.android.nfc.handover.PeripheralHandoverService;
 
 import android.app.Activity;
 import android.app.ActivityManager;
@@ -50,7 +52,6 @@
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -69,10 +70,11 @@
     private final IActivityManager mIActivityManager;
     private final RegisteredComponentCache mTechListFilters;
     private final ContentResolver mContentResolver;
-    private final HandoverManager mHandoverManager;
+    private final HandoverDataParser mHandoverDataParser;
     private final String[] mProvisioningMimes;
     private final ScreenStateHelper mScreenStateHelper;
     private final NfcUnlockManager mNfcUnlockManager;
+    private final boolean mDeviceSupportsBluetooth;
 
     // Locked on this
     private PendingIntent mOverrideIntent;
@@ -81,16 +83,17 @@
     private boolean mProvisioningOnly;
 
     NfcDispatcher(Context context,
-                  HandoverManager handoverManager,
+                  HandoverDataParser handoverDataParser,
                   boolean provisionOnly) {
         mContext = context;
         mIActivityManager = ActivityManagerNative.getDefault();
         mTechListFilters = new RegisteredComponentCache(mContext,
                 NfcAdapter.ACTION_TECH_DISCOVERED, NfcAdapter.ACTION_TECH_DISCOVERED);
         mContentResolver = context.getContentResolver();
-        mHandoverManager = handoverManager;
+        mHandoverDataParser = handoverDataParser;
         mScreenStateHelper = new ScreenStateHelper(context);
         mNfcUnlockManager = NfcUnlockManager.getInstance();
+        mDeviceSupportsBluetooth = BluetoothAdapter.getDefaultAdapter() != null;
 
         synchronized (this) {
             mProvisioningOnly = provisionOnly;
@@ -259,7 +262,7 @@
             return screenUnlocked ? DISPATCH_UNLOCK : DISPATCH_SUCCESS;
         }
 
-        if (mHandoverManager.tryHandover(message)) {
+        if (tryPeripheralHandover(message)) {
             if (DBG) Log.i(TAG, "matched BT HANDOVER");
             return screenUnlocked ? DISPATCH_UNLOCK : DISPATCH_SUCCESS;
         }
@@ -505,6 +508,24 @@
         return false;
     }
 
+    public boolean tryPeripheralHandover(NdefMessage m) {
+        if (m == null || !mDeviceSupportsBluetooth) return false;
+
+        if (DBG) Log.d(TAG, "tryHandover(): " + m.toString());
+
+        HandoverDataParser.BluetoothHandoverData handover = mHandoverDataParser.parseBluetooth(m);
+        if (handover == null || !handover.valid) return false;
+
+        Intent intent = new Intent(mContext, PeripheralHandoverService.class);
+        intent.putExtra(PeripheralHandoverService.EXTRA_PERIPHERAL_DEVICE, handover.device);
+        intent.putExtra(PeripheralHandoverService.EXTRA_PERIPHERAL_NAME, handover.name);
+        intent.putExtra(PeripheralHandoverService.EXTRA_PERIPHERAL_TRANSPORT, handover.transport);
+        mContext.startServiceAsUser(intent, UserHandle.CURRENT);
+
+        return true;
+    }
+
+
     /**
      * Tells the ActivityManager to resume allowing app switches.
      *
diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java
index d827883..82eba2d 100755
--- a/src/com/android/nfc/NfcService.java
+++ b/src/com/android/nfc/NfcService.java
@@ -20,6 +20,7 @@
 import android.app.Application;
 import android.app.KeyguardManager;
 import android.app.PendingIntent;
+import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -27,6 +28,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
+import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.UserInfo;
@@ -73,16 +75,18 @@
 import com.android.nfc.DeviceHost.TagEndpoint;
 import com.android.nfc.cardemulation.CardEmulationManager;
 import com.android.nfc.dhimpl.NativeNfcManager;
-import com.android.nfc.handover.HandoverManager;
+import com.android.nfc.handover.HandoverDataParser;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
 
+
 public class NfcService implements DeviceHostListener {
     static final boolean DBG = false;
     static final String TAG = "NfcService";
@@ -214,7 +218,7 @@
     private NfcDispatcher mNfcDispatcher;
     private PowerManager mPowerManager;
     private KeyguardManager mKeyguard;
-    private HandoverManager mHandoverManager;
+    private HandoverDataParser mHandoverDataParser;
     private ContentResolver mContentResolver;
     private CardEmulationManager mCardEmulationManager;
 
@@ -312,7 +316,7 @@
 
         mNfcUnlockManager = NfcUnlockManager.getInstance();
 
-        mHandoverManager = new HandoverManager(mContext);
+        mHandoverDataParser = new HandoverDataParser();
         boolean isNfcProvisioningEnabled = false;
         try {
             isNfcProvisioningEnabled = mContext.getResources().getBoolean(
@@ -327,8 +331,8 @@
             mInProvisionMode = false;
         }
 
-        mNfcDispatcher = new NfcDispatcher(mContext, mHandoverManager, mInProvisionMode);
-        mP2pLinkManager = new P2pLinkManager(mContext, mHandoverManager,
+        mNfcDispatcher = new NfcDispatcher(mContext, mHandoverDataParser, mInProvisionMode);
+        mP2pLinkManager = new P2pLinkManager(mContext, mHandoverDataParser,
                 mDeviceHost.getDefaultLlcpMiu(), mDeviceHost.getDefaultLlcpRwSize());
 
         mPrefs = mContext.getSharedPreferences(PREF, Context.MODE_PRIVATE);
@@ -372,6 +376,9 @@
         ownerFilter.addDataScheme("package");
         mContext.registerReceiver(mOwnerReceiver, ownerFilter);
 
+        IntentFilter policyFilter = new IntentFilter(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
+        mContext.registerReceiverAsUser(mPolicyReceiver, UserHandle.ALL, policyFilter, null, null);
+
         updatePackageCache();
 
         PackageManager pm = mContext.getPackageManager();
@@ -647,11 +654,39 @@
     }
 
     void setBeamShareActivityState(boolean enabled) {
-        mContext.getPackageManager().setComponentEnabledSetting(
-                new ComponentName("com.android.nfc","com.android.nfc.BeamShareActivity"),
-                enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
-                          PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
-                PackageManager.DONT_KILL_APP);
+        UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+        // Propagate the state change to all user profiles related to the current
+        // user. Note that the list returned by getUserProfiles contains the
+        // current user.
+        List <UserHandle> luh = um.getUserProfiles();
+        for (UserHandle uh : luh){
+            enforceBeamShareActivityPolicy(mContext, uh, enabled);
+        }
+    }
+
+    void enforceBeamShareActivityPolicy(Context context, UserHandle uh,
+            boolean isGlobalEnabled){
+        UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        IPackageManager mIpm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+        boolean isActiveForUser =
+                (!um.hasUserRestriction(UserManager.DISALLOW_OUTGOING_BEAM, uh)) &&
+                isGlobalEnabled;
+        if (DBG){
+            Log.d(TAG, "Enforcing a policy change on user: " + uh +
+                    ", isActiveForUser = " + isActiveForUser);
+        }
+        try {
+            mIpm.setComponentEnabledSetting(new ComponentName(
+                    BeamShareActivity.class.getPackageName$(),
+                    BeamShareActivity.class.getName()),
+                    isActiveForUser ?
+                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
+                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                            PackageManager.DONT_KILL_APP,
+                    uh.getIdentifier());
+        } catch (RemoteException e) {
+            Log.w(TAG, "Unable to change Beam status for user " + uh);
+        }
     }
 
     final class NfcAdapterService extends INfcAdapter.Stub {
@@ -805,8 +840,7 @@
 
             // don't allow Beam for managed profiles, or devices with a device owner or policy owner
             UserInfo userInfo = mUserManager.getUserInfo(UserHandle.getCallingUserId());
-            if(!userInfo.isManagedProfile()
-                    && !mUserManager.hasUserRestriction(
+            if(!mUserManager.hasUserRestriction(
                             UserManager.DISALLOW_OUTGOING_BEAM, userInfo.getUserHandle())) {
                 mP2pLinkManager.setNdefCallback(callback, Binder.getCallingUid());
             } else if (DBG) {
@@ -815,6 +849,11 @@
         }
 
         @Override
+        public void verifyNfcPermission() {
+            NfcPermissions.enforceUserPermissions(mContext);
+        }
+
+        @Override
         public void invokeBeam() {
             NfcPermissions.enforceUserPermissions(mContext);
 
@@ -954,8 +993,7 @@
             Map<Integer, Integer> techCodeToMask = new HashMap<Integer, Integer>();
 
             techCodeToMask.put(TagTechnology.NFC_A, NfcService.NFC_POLL_A);
-            techCodeToMask.put(TagTechnology.NFC_B,
-                    NfcService.NFC_POLL_B | NfcService.NFC_POLL_B_PRIME);
+            techCodeToMask.put(TagTechnology.NFC_B, NfcService.NFC_POLL_B);
             techCodeToMask.put(TagTechnology.NFC_V, NfcService.NFC_POLL_ISO15693);
             techCodeToMask.put(TagTechnology.NFC_F, NfcService.NFC_POLL_F);
             techCodeToMask.put(TagTechnology.NFC_BARCODE, NfcService.NFC_POLL_KOVIO);
@@ -1413,7 +1451,6 @@
                     // Notify dispatcher it's fine to dispatch to any package now
                     // and allow handover transfers.
                     mNfcDispatcher.disableProvisioningMode();
-                    mHandoverManager.setEnabled(true);
                 }
             }
             // Special case: if we're transitioning to unlocked state while
@@ -1469,20 +1506,25 @@
                 paramsBuilder.setEnableReaderMode(true);
             } else {
                 paramsBuilder.setTechMask(NfcDiscoveryParameters.NFC_POLL_DEFAULT);
+                paramsBuilder.setEnableP2p(mIsNdefPushEnabled);
             }
         } else if (screenState == ScreenStateHelper.SCREEN_STATE_ON_LOCKED && mInProvisionMode) {
             paramsBuilder.setTechMask(NfcDiscoveryParameters.NFC_POLL_DEFAULT);
+            // enable P2P for MFM/EDU/Corp provisioning
+            paramsBuilder.setEnableP2p(true);
         } else if (screenState == ScreenStateHelper.SCREEN_STATE_ON_LOCKED &&
                 mNfcUnlockManager.isLockscreenPollingEnabled()) {
             // For lock-screen tags, no low-power polling
             paramsBuilder.setTechMask(mNfcUnlockManager.getLockscreenPollMask());
             paramsBuilder.setEnableLowPowerDiscovery(false);
+            paramsBuilder.setEnableP2p(false);
         }
 
         if (mIsHceCapable && mScreenState >= ScreenStateHelper.SCREEN_STATE_ON_LOCKED) {
             // Host routing is always enabled at lock screen or later
             paramsBuilder.setEnableHostRouting(true);
         }
+
         return paramsBuilder.build();
     }
 
@@ -1775,16 +1817,34 @@
             intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
             // Resume app switches so the receivers can start activites without delay
             mNfcDispatcher.resumeAppSwitches();
-
+            ArrayList<String> matchingPackages = new ArrayList<String>();
+            ArrayList<String> preferredPackages = new ArrayList<String>();
             synchronized (this) {
                 for (PackageInfo pkg : mInstalledPackages) {
                     if (pkg != null && pkg.applicationInfo != null) {
                         if (mNfceeAccessControl.check(pkg.applicationInfo)) {
-                            intent.setPackage(pkg.packageName);
-                            mContext.sendBroadcast(intent);
+                            matchingPackages.add(pkg.packageName);
+                            if (mCardEmulationManager != null &&
+                                    mCardEmulationManager.packageHasPreferredService(pkg.packageName)) {
+                                preferredPackages.add(pkg.packageName);
+                            }
                         }
                     }
                 }
+                if (preferredPackages.size() > 0) {
+                    // If there's any packages in here which are preferred, only
+                    // send field events to those packages, to prevent other apps
+                    // with signatures in nfcee_access.xml from acting upon the events.
+                    for (String packageName : preferredPackages){
+                        intent.setPackage(packageName);
+                        mContext.sendBroadcast(intent);
+                    }
+                } else {
+                    for (String packageName : matchingPackages){
+                        intent.setPackage(packageName);
+                        mContext.sendBroadcast(intent);
+                    }
+                }
             }
         }
 
@@ -1919,6 +1979,7 @@
                 } else if (action.equals(Intent.ACTION_USER_PRESENT)) {
                     screenState = ScreenStateHelper.SCREEN_STATE_ON_UNLOCKED;
                 }
+
                 new ApplyRoutingTask().execute(Integer.valueOf(screenState));
             } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) {
                 boolean isAirplaneModeOn = intent.getBooleanExtra("state", false);
@@ -1950,6 +2011,7 @@
         }
     };
 
+
     private final BroadcastReceiver mOwnerReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -1968,6 +2030,17 @@
         }
     };
 
+    private final BroadcastReceiver mPolicyReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent){
+            String action = intent.getAction();
+            if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED
+                    .equals(action)) {
+                enforceBeamShareActivityPolicy(context,
+                        new UserHandle(getSendingUserId()), mIsNdefPushEnabled);
+            }
+        }
+    };
 
     /**
      * Returns true if airplane mode is currently on
diff --git a/src/com/android/nfc/NfcWifiProtectedSetup.java b/src/com/android/nfc/NfcWifiProtectedSetup.java
index 1419248..dbd22b7 100644
--- a/src/com/android/nfc/NfcWifiProtectedSetup.java
+++ b/src/com/android/nfc/NfcWifiProtectedSetup.java
@@ -24,8 +24,12 @@
 import android.nfc.tech.Ndef;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.util.Log;
 
+import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
 import java.util.Arrays;
+import java.util.BitSet;
 
 public final class NfcWifiProtectedSetup {
 
@@ -37,13 +41,20 @@
      * ID into configuration record for SSID and Network Key in hex.
      * Obtained from WFA Wifi Simple Configuration Technical Specification v2.0.2.1.
      */
-    private static final String SSID_ID = "1045";
-    private static final String NETWORK_KEY_ID = "1027";
+    private static final short CREDENTIAL_FIELD_ID = 0x100E;
+    private static final short SSID_FIELD_ID = 0x1045;
+    private static final short NETWORK_KEY_FIELD_ID = 0x1027;
+    private static final short AUTH_TYPE_FIELD_ID = 0x1003;
 
-    private static final int SIZE_FIELD_WIDTH = 4;
-    private static final int MAX_SSID_SIZE_BYTES = 32;
+    private static final short AUTH_TYPE_EXPECTED_SIZE = 2;
+
+    private static final short AUTH_TYPE_OPEN = 0;
+    private static final short AUTH_TYPE_WPA_PSK = 0x0002;
+    private static final short AUTH_TYPE_WPA_EAP =  0x0008;
+    private static final short AUTH_TYPE_WPA2_EAP = 0x0010;
+    private static final short AUTH_TYPE_WPA2_PSK = 0x0020;
+
     private static final int MAX_NETWORK_KEY_SIZE_BYTES = 64;
-    private static final int HEX_CHARS_PER_BYTE = 2;
 
     private NfcWifiProtectedSetup() {}
 
@@ -58,7 +69,13 @@
             return false;
         }
 
-        final WifiConfiguration wifiConfiguration = parse(cachedNdefMessage);
+        final WifiConfiguration wifiConfiguration;
+        try {
+            wifiConfiguration = parse(cachedNdefMessage);
+        } catch (BufferUnderflowException e) {
+            // malformed payload
+            return false;
+        }
 
         if (wifiConfiguration != null &&!UserManager.get(context).hasUserRestriction(
                 UserManager.DISALLOW_CONFIG_WIFI, UserHandle.CURRENT)) {
@@ -77,99 +94,77 @@
     private static WifiConfiguration parse(NdefMessage message) {
         NdefRecord[] records = message.getRecords();
 
-        for (int i = 0; i < records.length; ++i) {
-            NdefRecord record = records[i];
+        for (NdefRecord record : records) {
             if (new String(record.getType()).equals(NFC_TOKEN_MIME_TYPE)) {
-                String hexStringPayload = bytesToHex(record.getPayload());
-
-                int ssidStringIndex = hexStringPayload.indexOf(SSID_ID);
-
-                if (ssidStringIndex > 0) {
-                    int networkKeyStringIndex = hexStringPayload.indexOf(NETWORK_KEY_ID);
-                    if (networkKeyStringIndex > 0) {
-
-                        ssidStringIndex += SSID_ID.length();
-                        networkKeyStringIndex += NETWORK_KEY_ID.length();
-
-                        String ssidSize;
-                        try {
-                            ssidSize = hexStringPayload.substring(ssidStringIndex,
-                                    ssidStringIndex + SIZE_FIELD_WIDTH);
-                        } catch(IndexOutOfBoundsException ex) {
-                            return null;
-                        }
-
-                        int ssidSizeBytes = hexStringToInt(ssidSize);
-                        if (ssidSizeBytes > MAX_SSID_SIZE_BYTES) {
-                            return null;
-                        }
-
-                        String networkKeySize;
-                        try {
-                            networkKeySize = hexStringPayload.substring(networkKeyStringIndex,
-                                    networkKeyStringIndex + SIZE_FIELD_WIDTH);
-                        } catch (IndexOutOfBoundsException ex) {
-                            return null;
-                        }
-
-                        int networkKeySizeBytes = hexStringToInt(networkKeySize);
-                        if (networkKeySizeBytes > MAX_NETWORK_KEY_SIZE_BYTES) {
-                            return null;
-                        }
-
-                        ssidStringIndex += SIZE_FIELD_WIDTH;
-                        networkKeyStringIndex += SIZE_FIELD_WIDTH;
-
-                        String ssid;
-                        String networkKey;
-                        try {
-                            int ssidByteIndex = ssidStringIndex / HEX_CHARS_PER_BYTE;
-                            ssid = new String(Arrays.copyOfRange(record.getPayload(), ssidByteIndex,
-                                    ssidByteIndex + ssidSizeBytes));
-
-                            int networkKeyByteIndex = networkKeyStringIndex / HEX_CHARS_PER_BYTE;
-                            networkKey = new String(Arrays.copyOfRange(record.getPayload(),
-                                            networkKeyByteIndex,
-                                            networkKeyByteIndex + networkKeySizeBytes));
-                        } catch (ArrayIndexOutOfBoundsException ex) {
-                            return null;
-                        }
-
-                        WifiConfiguration configuration = new WifiConfiguration();
-                        configuration.preSharedKey = '"' + networkKey + '"';
-                        configuration.SSID = '"' + ssid + '"';
-
-                        return configuration;
+                ByteBuffer payload = ByteBuffer.wrap(record.getPayload());
+                while (payload.hasRemaining()) {
+                    short fieldId = payload.getShort();
+                    short fieldSize = payload.getShort();
+                    if (fieldId == CREDENTIAL_FIELD_ID) {
+                        return parseCredential(payload, fieldSize);
                     }
                 }
             }
         }
+        return null;
+    }
+
+    private static WifiConfiguration parseCredential(ByteBuffer payload, short size) {
+        int startPosition = payload.position();
+        WifiConfiguration result = new WifiConfiguration();
+        while (payload.position() < startPosition + size) {
+            short fieldId = payload.getShort();
+            short fieldSize = payload.getShort();
+
+            // sanity check
+            if (payload.position() + fieldSize > startPosition + size) {
+                return null;
+            }
+
+            switch (fieldId) {
+                case SSID_FIELD_ID:
+                    byte[] ssid = new byte[fieldSize];
+                    payload.get(ssid);
+                    result.SSID = "\"" + new String(ssid) + "\"";
+                    break;
+                case NETWORK_KEY_FIELD_ID:
+                    if (fieldSize > MAX_NETWORK_KEY_SIZE_BYTES) {
+                        return null;
+                    }
+                    byte[] networkKey = new byte[fieldSize];
+                    payload.get(networkKey);
+                    result.preSharedKey = "\"" + new String(networkKey) + "\"";
+                    break;
+                case AUTH_TYPE_FIELD_ID:
+                    if (fieldSize != AUTH_TYPE_EXPECTED_SIZE) {
+                        // corrupt data
+                        return null;
+                    }
+
+                    short authType = payload.getShort();
+                    populateAllowedKeyManagement(result.allowedKeyManagement, authType);
+                    break;
+                default:
+                    // unknown / unparsed tag
+                    payload.position(payload.position() + fieldSize);
+                    break;
+            }
+        }
+
+        if (result.preSharedKey != null && result.SSID != null) {
+            return result;
+        }
 
         return null;
     }
 
-    private static int hexStringToInt(String bigEndianHexString) {
-        int val = 0;
-
-        for (int i = 0; i < bigEndianHexString.length(); ++i) {
-            val = (val | Character.digit(bigEndianHexString.charAt(i), 16));
-
-            if (i < bigEndianHexString.length() - 1) {
-                val <<= 4;
-            }
+    private static void populateAllowedKeyManagement(BitSet allowedKeyManagement, short authType) {
+        if (authType == AUTH_TYPE_WPA_PSK || authType == AUTH_TYPE_WPA2_PSK) {
+            allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
+        } else if (authType == AUTH_TYPE_WPA_EAP || authType == AUTH_TYPE_WPA2_EAP) {
+            allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
+        } else if (authType == AUTH_TYPE_OPEN) {
+            allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
         }
-
-        return val;
     }
-
-    private static String bytesToHex(byte[] bytes) {
-        char[] hexChars = new char[bytes.length * 2];
-        for ( int j = 0; j < bytes.length; j++) {
-            int value = bytes[j] & 0xFF;
-            hexChars[j * 2] = Character.forDigit(value >>> 4, 16);
-            hexChars[j * 2 + 1] = Character.forDigit(value & 0x0F, 16);
-        }
-        return new String(hexChars);
-    }
-
 }
diff --git a/src/com/android/nfc/P2pEventManager.java b/src/com/android/nfc/P2pEventManager.java
index f5db544..c68fae8 100644
--- a/src/com/android/nfc/P2pEventManager.java
+++ b/src/com/android/nfc/P2pEventManager.java
@@ -16,6 +16,8 @@
 
 package com.android.nfc;
 
+import com.android.nfc.beam.SendUi;
+
 import android.app.NotificationManager;
 import android.content.Context;
 import android.content.res.Configuration;
@@ -129,6 +131,15 @@
     }
 
     @Override
+    public void onP2pHandoverBusy() {
+        mNfcService.playSound(NfcService.SOUND_ERROR);
+        mVibrator.vibrate(VIBRATION_PATTERN, -1);
+        mSendUi.finishAndToast(SendUi.FINISH_SCALE_UP, mContext.getString(R.string.beam_busy));
+        mSending = false;
+        mNdefSent = false;
+    }
+
+    @Override
     public void onP2pReceiveComplete(boolean playSound) {
         mVibrator.vibrate(VIBRATION_PATTERN, -1);
         if (playSound) mNfcService.playSound(NfcService.SOUND_END);
diff --git a/src/com/android/nfc/P2pLinkManager.java b/src/com/android/nfc/P2pLinkManager.java
index 487cd4e..13c65ef 100755
--- a/src/com/android/nfc/P2pLinkManager.java
+++ b/src/com/android/nfc/P2pLinkManager.java
@@ -16,11 +16,17 @@
 
 package com.android.nfc;
 
+import android.content.Intent;
 import android.content.pm.UserInfo;
+
+import com.android.nfc.beam.BeamManager;
+import com.android.nfc.beam.BeamSendService;
+import com.android.nfc.beam.BeamTransferRecord;
+
 import android.os.UserManager;
 import com.android.nfc.echoserver.EchoServer;
 import com.android.nfc.handover.HandoverClient;
-import com.android.nfc.handover.HandoverManager;
+import com.android.nfc.handover.HandoverDataParser;
 import com.android.nfc.handover.HandoverServer;
 import com.android.nfc.ndefpush.NdefPushClient;
 import com.android.nfc.ndefpush.NdefPushServer;
@@ -109,6 +115,11 @@
     public void onP2pHandoverNotSupported();
 
     /**
+     * Called to indicate the device is busy with another handover transfer
+     */
+    public void onP2pHandoverBusy();
+
+    /**
      * Called to indicate a receive was successful.
      */
     public void onP2pReceiveComplete(boolean playSound);
@@ -173,6 +184,7 @@
     static final int MSG_HANDOVER_NOT_SUPPORTED = 7;
     static final int MSG_SHOW_CONFIRMATION_UI = 8;
     static final int MSG_WAIT_FOR_LINK_TIMEOUT = 9;
+    static final int MSG_HANDOVER_BUSY = 10;
 
     // values for mLinkState
     static final int LINK_STATE_DOWN = 1;
@@ -196,6 +208,7 @@
     static final int HANDOVER_SUCCESS = 0;
     static final int HANDOVER_FAILURE = 1;
     static final int HANDOVER_UNSUPPORTED = 2;
+    static final int HANDOVER_BUSY = 3;
 
     final NdefPushServer mNdefPushServer;
     final SnepServer mDefaultSnepServer;
@@ -204,7 +217,7 @@
     final Context mContext;
     final P2pEventListener mEventListener;
     final Handler mHandler;
-    final HandoverManager mHandoverManager;
+    final HandoverDataParser mHandoverDataParser;
     final ForegroundUtils mForegroundUtils;
 
     final int mDefaultMiu;
@@ -218,6 +231,7 @@
     boolean mIsReceiveEnabled;
     NdefMessage mMessageToSend;  // not valid in SEND_STATE_NOTHING_TO_SEND
     Uri[] mUrisToSend;  // not valid in SEND_STATE_NOTHING_TO_SEND
+    UserHandle mUserHandle; // not valid in SEND_STATE_NOTHING_TO_SEND
     int mSendFlags; // not valid in SEND_STATE_NOTHING_TO_SEND
     IAppCallback mCallbackNdef;
     int mNdefCallbackUid;
@@ -231,11 +245,11 @@
     boolean mLlcpConnectDelayed;
     long mLastLlcpActivationTime;
 
-    public P2pLinkManager(Context context, HandoverManager handoverManager, int defaultMiu,
+    public P2pLinkManager(Context context, HandoverDataParser handoverDataParser, int defaultMiu,
             int defaultRwSize) {
         mNdefPushServer = new NdefPushServer(NDEFPUSH_SAP, mNppCallback);
         mDefaultSnepServer = new SnepServer(mDefaultSnepCallback, defaultMiu, defaultRwSize);
-        mHandoverServer = new HandoverServer(HANDOVER_SAP, handoverManager, mHandoverCallback);
+        mHandoverServer = new HandoverServer(context, HANDOVER_SAP, handoverDataParser, mHandoverCallback);
 
         if (ECHOSERVER_ENABLED) {
             mEchoServer = new EchoServer();
@@ -251,7 +265,7 @@
         mIsSendEnabled = false;
         mIsReceiveEnabled = false;
         mPrefs = context.getSharedPreferences(NfcService.PREF, Context.MODE_PRIVATE);
-        mHandoverManager = handoverManager;
+        mHandoverDataParser = handoverDataParser;
         mDefaultMiu = defaultMiu;
         mDefaultRwSize = defaultRwSize;
         mLlcpServicesConnected = false;
@@ -328,9 +342,11 @@
                 } else if (shareData.ndefMessage != null) {
                     mMessageToSend = shareData.ndefMessage;
                 }
+
+                mUserHandle = shareData.userHandle;
             }
             if (mMessageToSend != null ||
-                    (mUrisToSend != null && mHandoverManager.isHandoverSupported())) {
+                    (mUrisToSend != null && mHandoverDataParser.isHandoverSupported())) {
                 mSendState = SEND_STATE_PENDING;
                 mEventListener.onP2pNfcTapRequested();
                 scheduleTimeoutLocked(MSG_WAIT_FOR_LINK_TIMEOUT, WAIT_FOR_LINK_TIMEOUT_MS);
@@ -364,7 +380,7 @@
                         mSendState = SEND_STATE_NOTHING_TO_SEND;
                         prepareMessageToSend(true);
                         if (mMessageToSend != null ||
-                                (mUrisToSend != null && mHandoverManager.isHandoverSupported())) {
+                                (mUrisToSend != null && mHandoverDataParser.isHandoverSupported())) {
                             // Ideally we would delay showing the Beam animation until
                             // we know for certain the other side has SNEP/handover.
                             // Unfortunately, the NXP LLCP implementation has a bug that
@@ -466,10 +482,11 @@
                         BeamShareData shareData = mCallbackNdef.createBeamShareData();
                         mMessageToSend = shareData.ndefMessage;
                         mUrisToSend = shareData.uris;
+                        mUserHandle = shareData.userHandle;
                         mSendFlags = shareData.flags;
                         return;
                     } catch (Exception e) {
-                        Log.e(TAG, "Failed NDEF callback: " + e.getMessage());
+                        Log.e(TAG, "Failed NDEF callback: ", e);
                     }
                 } else {
                     // This is not necessarily an error - we no longer unset callbacks from
@@ -484,7 +501,7 @@
             String[] pkgs = mPackageManager.getPackagesForUid(foregroundUids.get(0));
             if (pkgs != null && pkgs.length >= 1) {
                 if (!generatePlayLink || beamDefaultDisabled(pkgs[0])
-                        || isManagedOrBeamDisabled(foregroundUids.get(0))) {
+                        || isBeamDisabled(foregroundUids.get(0))) {
                     if (DBG) Log.d(TAG, "Disabling default Beam behavior");
                     mMessageToSend = null;
                     mUrisToSend = null;
@@ -499,11 +516,10 @@
         }
     }
 
-    private boolean isManagedOrBeamDisabled(int uid) {
+    private boolean isBeamDisabled(int uid) {
         UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
         UserInfo userInfo = userManager.getUserInfo(UserHandle.getUserId(uid));
-        return userInfo.isManagedProfile() ||
-                userManager.hasUserRestriction(
+        return userManager.hasUserRestriction(
                         UserManager.DISALLOW_OUTGOING_BEAM, userInfo.getUserHandle());
 
     }
@@ -603,6 +619,10 @@
         mHandler.sendEmptyMessage(MSG_HANDOVER_NOT_SUPPORTED);
     }
 
+    void onHandoverBusy() {
+        mHandler.sendEmptyMessage(MSG_HANDOVER_BUSY);
+    }
+
     void onSendComplete(NdefMessage msg, long elapsedRealtime) {
         // Make callbacks on UI thread
         mHandler.sendEmptyMessage(MSG_SEND_COMPLETE);
@@ -748,9 +768,15 @@
         SnepClient snepClient;
         HandoverClient handoverClient;
 
-        int doHandover(Uri[] uris) throws IOException {
+        int doHandover(Uri[] uris, UserHandle userHandle) throws IOException {
             NdefMessage response = null;
-            NdefMessage request = mHandoverManager.createHandoverRequestMessage();
+            BeamManager beamManager = BeamManager.getInstance();
+
+            if (beamManager.isBeamInProgress()) {
+                return HANDOVER_BUSY;
+            }
+
+            NdefMessage request = mHandoverDataParser.createHandoverRequestMessage();
             if (request != null) {
                 if (handoverClient != null) {
                     response = handoverClient.sendHandoverRequest(request);
@@ -768,7 +794,12 @@
             } else {
                 return HANDOVER_UNSUPPORTED;
             }
-            mHandoverManager.doHandoverUri(uris, response);
+
+            if (!beamManager.startBeamSend(mContext,
+                    mHandoverDataParser.getOutgoingHandoverData(response), uris, userHandle)) {
+                return HANDOVER_BUSY;
+            }
+
             return HANDOVER_SUCCESS;
         }
 
@@ -785,6 +816,7 @@
         public Void doInBackground(Void... args) {
             NdefMessage m;
             Uri[] uris;
+            UserHandle userHandle;
             boolean result = false;
 
             synchronized (P2pLinkManager.this) {
@@ -793,6 +825,7 @@
                 }
                 m = mMessageToSend;
                 uris = mUrisToSend;
+                userHandle = mUserHandle;
                 snepClient = mSnepClient;
                 handoverClient = mHandoverClient;
                 nppClient = mNdefPushClient;
@@ -803,7 +836,7 @@
             if (uris != null) {
                 if (DBG) Log.d(TAG, "Trying handover request");
                 try {
-                    int handoverResult = doHandover(uris);
+                    int handoverResult = doHandover(uris, userHandle);
                     switch (handoverResult) {
                         case HANDOVER_SUCCESS:
                             result = true;
@@ -815,6 +848,10 @@
                             result = false;
                             onHandoverUnsupported();
                             break;
+                        case HANDOVER_BUSY:
+                            result = false;
+                            onHandoverBusy();
+                            break;
                     }
                 } catch (IOException e) {
                     result = false;
@@ -860,6 +897,11 @@
         public void onHandoverRequestReceived() {
             onReceiveHandover();
         }
+
+        @Override
+        public void onHandoverBusy() {
+            onHandoverBusy();
+        }
     };
 
     final NdefPushServer.Callback mNppCallback = new NdefPushServer.Callback() {
@@ -883,7 +925,7 @@
             // since Android 4.1 used the NFC Forum default server to
             // implement connection handover, we will support this
             // until we can deprecate it.
-            NdefMessage response = mHandoverManager.tryHandoverRequest(msg);
+            NdefMessage response = mHandoverDataParser.getIncomingHandoverData(msg).handoverSelect;
             if (response != null) {
                 onReceiveHandover();
                 return SnepMessage.getSuccessResponse(response);
@@ -998,6 +1040,17 @@
                     }
                 }
                 break;
+            case MSG_HANDOVER_BUSY:
+                synchronized (P2pLinkManager.this) {
+                    mSendTask = null;
+
+                    if (mLinkState == LINK_STATE_DOWN || mSendState != SEND_STATE_SENDING) {
+                        break;
+                    }
+                    mSendState = SEND_STATE_NOTHING_TO_SEND;
+                    if (DBG) Log.d(TAG, "onP2pHandoverBusy()");
+                    mEventListener.onP2pHandoverBusy();
+                }
         }
         return true;
     }
diff --git a/src/com/android/nfc/beam/BeamManager.java b/src/com/android/nfc/beam/BeamManager.java
new file mode 100644
index 0000000..ba16aa5
--- /dev/null
+++ b/src/com/android/nfc/beam/BeamManager.java
@@ -0,0 +1,133 @@
+/*
+* Copyright (C) 2008 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.nfc.beam;
+
+import com.android.nfc.handover.HandoverDataParser;
+
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.UserHandle;
+import android.util.Log;
+
+/**
+ * Manager for starting and stopping Beam transfers. Prevents more than one transfer from
+ * happening at a time.
+ */
+public class BeamManager implements Handler.Callback {
+    private static final String TAG = "BeamManager";
+    private static final boolean DBG = false;
+
+    private static final String ACTION_WHITELIST_DEVICE =
+            "android.btopp.intent.action.WHITELIST_DEVICE";
+    public static final int MSG_BEAM_COMPLETE = 0;
+
+    private final Object mLock;
+
+    private boolean mBeamInProgress;
+    private final Handler mCallback;
+
+    private static final class Singleton {
+        public static final BeamManager INSTANCE = new BeamManager();
+    }
+
+    private BeamManager() {
+        mLock = new Object();
+        mBeamInProgress = false;
+        mCallback = new Handler(Looper.getMainLooper(), this);
+    }
+
+    public static BeamManager getInstance() {
+        return Singleton.INSTANCE;
+    }
+
+    public boolean isBeamInProgress() {
+        synchronized (mLock) {
+            return mBeamInProgress;
+        }
+    }
+
+    public boolean startBeamReceive(Context context,
+                                 HandoverDataParser.BluetoothHandoverData handoverData) {
+        synchronized (mLock) {
+            if (mBeamInProgress) {
+                return false;
+            } else {
+                mBeamInProgress = true;
+            }
+        }
+
+        BeamTransferRecord transferRecord =
+                BeamTransferRecord.forBluetoothDevice(
+                        handoverData.device, handoverData.carrierActivating, null);
+
+        Intent receiveIntent = new Intent(context.getApplicationContext(),
+                BeamReceiveService.class);
+        receiveIntent.putExtra(BeamReceiveService.EXTRA_BEAM_TRANSFER_RECORD, transferRecord);
+        receiveIntent.putExtra(BeamReceiveService.EXTRA_BEAM_COMPLETE_CALLBACK,
+                new Messenger(mCallback));
+        whitelistOppDevice(context, handoverData.device);
+        context.startServiceAsUser(receiveIntent, UserHandle.CURRENT);
+        return true;
+    }
+
+    public boolean startBeamSend(Context context,
+                               HandoverDataParser.BluetoothHandoverData outgoingHandoverData,
+                               Uri[] uris, UserHandle userHandle) {
+        synchronized (mLock) {
+            if (mBeamInProgress) {
+                return false;
+            } else {
+                mBeamInProgress = true;
+            }
+        }
+
+        BeamTransferRecord transferRecord = BeamTransferRecord.forBluetoothDevice(
+                outgoingHandoverData.device, outgoingHandoverData.carrierActivating,
+                uris);
+        Intent sendIntent = new Intent(context.getApplicationContext(),
+                BeamSendService.class);
+        sendIntent.putExtra(BeamSendService.EXTRA_BEAM_TRANSFER_RECORD, transferRecord);
+        sendIntent.putExtra(BeamSendService.EXTRA_BEAM_COMPLETE_CALLBACK,
+                new Messenger(mCallback));
+        context.startServiceAsUser(sendIntent, userHandle);
+        return true;
+    }
+
+    @Override
+    public boolean handleMessage(Message msg) {
+        if (msg.what == MSG_BEAM_COMPLETE) {
+            synchronized (mLock) {
+                mBeamInProgress = false;
+            }
+            return true;
+        }
+        return false;
+    }
+
+    void whitelistOppDevice(Context context, BluetoothDevice device) {
+        if (DBG) Log.d(TAG, "Whitelisting " + device + " for BT OPP");
+        Intent intent = new Intent(ACTION_WHITELIST_DEVICE);
+        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
+        context.sendBroadcastAsUser(intent, UserHandle.CURRENT);
+    }
+
+}
diff --git a/src/com/android/nfc/beam/BeamReceiveService.java b/src/com/android/nfc/beam/BeamReceiveService.java
new file mode 100644
index 0000000..7deb014
--- /dev/null
+++ b/src/com/android/nfc/beam/BeamReceiveService.java
@@ -0,0 +1,175 @@
+package com.android.nfc.beam;
+
+import com.android.nfc.R;
+
+import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.media.SoundPool;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.util.Log;
+
+
+/**
+ * @hide
+ */
+public class BeamReceiveService extends Service implements BeamTransferManager.Callback {
+    private static String TAG = "BeamReceiveService";
+    private static boolean DBG = true;
+
+    public static final String EXTRA_BEAM_TRANSFER_RECORD
+            = "com.android.nfc.beam.EXTRA_BEAM_TRANSFER_RECORD";
+    public static final String EXTRA_BEAM_COMPLETE_CALLBACK
+            = "com.android.nfc.beam.TRANSFER_COMPLETE_CALLBACK";
+
+    private BeamStatusReceiver mBeamStatusReceiver;
+    private boolean mBluetoothEnabledByNfc;
+    private int mStartId;
+    private SoundPool mSoundPool;
+    private int mSuccessSound;
+    private BeamTransferManager mTransferManager;
+    private Messenger mCompleteCallback;
+
+    private final BluetoothAdapter mBluetoothAdapter;
+    private final BroadcastReceiver mBluetoothStateReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
+                int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
+                        BluetoothAdapter.ERROR);
+                if (state == BluetoothAdapter.STATE_OFF) {
+                    mBluetoothEnabledByNfc = false;
+                }
+            }
+        }
+    };
+
+    public BeamReceiveService() {
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        mStartId = startId;
+
+        BeamTransferRecord transferRecord;
+        if (intent == null ||
+                (transferRecord = intent.getParcelableExtra(EXTRA_BEAM_TRANSFER_RECORD)) == null) {
+            if (DBG) Log.e(TAG, "No transfer record provided. Stopping.");
+            stopSelf(startId);
+            return START_NOT_STICKY;
+        }
+
+        mCompleteCallback = intent.getParcelableExtra(EXTRA_BEAM_COMPLETE_CALLBACK);
+
+        if (prepareToReceive(transferRecord)) {
+            if (DBG) Log.i(TAG, "Ready for incoming Beam transfer");
+            return START_STICKY;
+        } else {
+            invokeCompleteCallback();
+            stopSelf(startId);
+            return START_NOT_STICKY;
+        }
+    }
+
+    // TODO: figure out a way to not duplicate this code
+    @Override
+    public void onCreate() {
+        super.onCreate();
+
+        mSoundPool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0);
+        mSuccessSound = mSoundPool.load(this, R.raw.end, 1);
+
+        // register BT state receiver
+        IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
+        registerReceiver(mBluetoothStateReceiver, filter);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (mSoundPool != null) {
+            mSoundPool.release();
+        }
+
+        if (mBeamStatusReceiver != null) {
+            unregisterReceiver(mBeamStatusReceiver);
+        }
+        unregisterReceiver(mBluetoothStateReceiver);
+    }
+
+    boolean prepareToReceive(BeamTransferRecord transferRecord) {
+        if (mTransferManager != null) {
+            return false;
+        }
+
+        if (transferRecord.dataLinkType != BeamTransferRecord.DATA_LINK_TYPE_BLUETOOTH) {
+            // only support BT
+            return false;
+        }
+
+        if (!mBluetoothAdapter.isEnabled()) {
+            if (!mBluetoothAdapter.enableNoAutoConnect()) {
+                Log.e(TAG, "Error enabling Bluetooth.");
+                return false;
+            }
+            mBluetoothEnabledByNfc = true;
+            if (DBG) Log.d(TAG, "Queueing out transfer "
+                    + Integer.toString(transferRecord.id));
+        }
+
+        mTransferManager = new BeamTransferManager(this, this, transferRecord, true);
+
+        // register Beam status receiver
+        mBeamStatusReceiver = new BeamStatusReceiver(this, mTransferManager);
+        registerReceiver(mBeamStatusReceiver, mBeamStatusReceiver.getIntentFilter(),
+                BeamStatusReceiver.BEAM_STATUS_PERMISSION, new Handler());
+
+        mTransferManager.start();
+        mTransferManager.updateNotification();
+        return true;
+    }
+
+    private void invokeCompleteCallback() {
+        if (mCompleteCallback != null) {
+            try {
+                mCompleteCallback.send(Message.obtain(null, BeamManager.MSG_BEAM_COMPLETE));
+            } catch (RemoteException e) {
+                Log.e(TAG, "failed to invoke Beam complete callback", e);
+            }
+        }
+    }
+
+    @Override
+    public void onTransferComplete(BeamTransferManager transfer, boolean success) {
+        // Play success sound
+        if (success) {
+            mSoundPool.play(mSuccessSound, 1.0f, 1.0f, 0, 0, 1.0f);
+        } else {
+            if (DBG) Log.d(TAG, "Transfer failed, final state: " +
+                    Integer.toString(transfer.mState));
+        }
+
+        if (mBluetoothEnabledByNfc) {
+            mBluetoothEnabledByNfc = false;
+            mBluetoothAdapter.disable();
+        }
+
+        invokeCompleteCallback();
+        stopSelf(mStartId);
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+}
diff --git a/src/com/android/nfc/beam/BeamSendService.java b/src/com/android/nfc/beam/BeamSendService.java
new file mode 100644
index 0000000..59019d5
--- /dev/null
+++ b/src/com/android/nfc/beam/BeamSendService.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.nfc.beam;
+
+import com.android.nfc.R;
+
+import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.media.SoundPool;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.util.Log;
+
+public class BeamSendService extends Service implements BeamTransferManager.Callback {
+    private static String TAG = "BeamSendService";
+    private static boolean DBG = true;
+
+    public static String EXTRA_BEAM_TRANSFER_RECORD
+            = "com.android.nfc.beam.EXTRA_BEAM_TRANSFER_RECORD";
+    public static final String EXTRA_BEAM_COMPLETE_CALLBACK
+            = "com.android.nfc.beam.TRANSFER_COMPLETE_CALLBACK";
+
+    private BeamTransferManager mTransferManager;
+    private BeamStatusReceiver mBeamStatusReceiver;
+    private boolean mBluetoothEnabledByNfc;
+    private Messenger mCompleteCallback;
+    private int mStartId;
+    SoundPool mSoundPool;
+    int mSuccessSound;
+
+    private final BluetoothAdapter mBluetoothAdapter;
+    private final BroadcastReceiver mBluetoothStateReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
+                handleBluetoothStateChanged(intent);
+            }
+        }
+    };
+
+    public BeamSendService() {
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+
+        mSoundPool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0);
+        mSuccessSound = mSoundPool.load(this, R.raw.end, 1);
+
+        // register BT state receiver
+        IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
+        registerReceiver(mBluetoothStateReceiver, filter);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (mSoundPool != null) {
+            mSoundPool.release();
+        }
+
+        if (mBeamStatusReceiver != null) {
+            unregisterReceiver(mBeamStatusReceiver);
+        }
+        unregisterReceiver(mBluetoothStateReceiver);
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        mStartId = startId;
+
+        BeamTransferRecord transferRecord;
+        if (intent == null ||
+                (transferRecord = intent.getParcelableExtra(EXTRA_BEAM_TRANSFER_RECORD)) == null) {
+            if (DBG) Log.e(TAG, "No transfer record provided. Stopping.");
+            stopSelf(startId);
+            return START_NOT_STICKY;
+        }
+
+        mCompleteCallback = intent.getParcelableExtra(EXTRA_BEAM_COMPLETE_CALLBACK);
+
+        if (doTransfer(transferRecord)) {
+            if (DBG) Log.i(TAG, "Starting outgoing Beam transfer");
+            return START_STICKY;
+        } else {
+            invokeCompleteCallback();
+            stopSelf(startId);
+            return START_NOT_STICKY;
+        }
+    }
+
+    boolean doTransfer(BeamTransferRecord transferRecord) {
+        if (createBeamTransferManager(transferRecord)) {
+            // register Beam status receiver
+            mBeamStatusReceiver = new BeamStatusReceiver(this, mTransferManager);
+            registerReceiver(mBeamStatusReceiver, mBeamStatusReceiver.getIntentFilter(),
+                    BeamStatusReceiver.BEAM_STATUS_PERMISSION, new Handler());
+
+            if (transferRecord.dataLinkType == BeamTransferRecord.DATA_LINK_TYPE_BLUETOOTH) {
+                if (mBluetoothAdapter.isEnabled()) {
+                    // Start the transfer
+                    mTransferManager.start();
+                } else {
+                    if (!mBluetoothAdapter.enableNoAutoConnect()) {
+                        Log.e(TAG, "Error enabling Bluetooth.");
+                        mTransferManager = null;
+                        return false;
+                    }
+                    mBluetoothEnabledByNfc = true;
+                    if (DBG) Log.d(TAG, "Queueing out transfer "
+                            + Integer.toString(transferRecord.id));
+                }
+            }
+            return true;
+        }
+
+        return false;
+    }
+
+    boolean createBeamTransferManager(BeamTransferRecord transferRecord) {
+        if (mTransferManager != null) {
+            return false;
+        }
+
+        if (transferRecord.dataLinkType != BeamTransferRecord.DATA_LINK_TYPE_BLUETOOTH) {
+            // only support BT
+            return false;
+        }
+
+        mTransferManager = new BeamTransferManager(this, this, transferRecord, false);
+        mTransferManager.updateNotification();
+        return true;
+    }
+
+    private void handleBluetoothStateChanged(Intent intent) {
+        int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
+                BluetoothAdapter.ERROR);
+        if (state == BluetoothAdapter.STATE_ON) {
+            if (mTransferManager != null &&
+                    mTransferManager.mDataLinkType == BeamTransferRecord.DATA_LINK_TYPE_BLUETOOTH) {
+                mTransferManager.start();
+            }
+        } else if (state == BluetoothAdapter.STATE_OFF) {
+            mBluetoothEnabledByNfc = false;
+        }
+    }
+
+    private void invokeCompleteCallback() {
+        if (mCompleteCallback != null) {
+            try {
+                mCompleteCallback.send(Message.obtain(null, BeamManager.MSG_BEAM_COMPLETE));
+            } catch (RemoteException e) {
+                Log.e(TAG, "failed to invoke Beam complete callback", e);
+            }
+        }
+    }
+
+    @Override
+    public void onTransferComplete(BeamTransferManager transfer, boolean success) {
+        // Play success sound
+        if (success) {
+            mSoundPool.play(mSuccessSound, 1.0f, 1.0f, 0, 0, 1.0f);
+        } else {
+            if (DBG) Log.d(TAG, "Transfer failed, final state: " +
+                    Integer.toString(transfer.mState));
+        }
+
+        if (mBluetoothEnabledByNfc) {
+            mBluetoothEnabledByNfc = false;
+            mBluetoothAdapter.disable();
+        }
+
+        invokeCompleteCallback();
+        stopSelf(mStartId);
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+}
diff --git a/src/com/android/nfc/beam/BeamStatusReceiver.java b/src/com/android/nfc/beam/BeamStatusReceiver.java
new file mode 100644
index 0000000..67b5b82
--- /dev/null
+++ b/src/com/android/nfc/beam/BeamStatusReceiver.java
@@ -0,0 +1,155 @@
+package com.android.nfc.beam;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.Uri;
+import android.util.Log;
+
+import java.io.File;
+
+/**
+ * @hide
+ */
+public class BeamStatusReceiver extends BroadcastReceiver {
+    private static final boolean DBG = true;
+    private static final String TAG = "BeamStatusReceiver";
+
+    private static final String ACTION_HANDOVER_STARTED =
+            "android.nfc.handover.intent.action.HANDOVER_STARTED";
+
+    private static final String ACTION_TRANSFER_PROGRESS =
+            "android.nfc.handover.intent.action.TRANSFER_PROGRESS";
+
+    private static final String ACTION_TRANSFER_DONE =
+            "android.nfc.handover.intent.action.TRANSFER_DONE";
+
+    private static final String EXTRA_HANDOVER_DATA_LINK_TYPE =
+            "android.nfc.handover.intent.extra.HANDOVER_DATA_LINK_TYPE";
+
+
+    private static final String EXTRA_TRANSFER_PROGRESS =
+            "android.nfc.handover.intent.extra.TRANSFER_PROGRESS";
+
+    private static final String EXTRA_TRANSFER_URI =
+            "android.nfc.handover.intent.extra.TRANSFER_URI";
+
+    private static final String EXTRA_OBJECT_COUNT =
+            "android.nfc.handover.intent.extra.OBJECT_COUNT";
+
+    private static final String EXTRA_TRANSFER_STATUS =
+            "android.nfc.handover.intent.extra.TRANSFER_STATUS";
+
+    private static final String EXTRA_TRANSFER_MIMETYPE =
+            "android.nfc.handover.intent.extra.TRANSFER_MIME_TYPE";
+
+    private static final String ACTION_STOP_BLUETOOTH_TRANSFER =
+            "android.btopp.intent.action.STOP_HANDOVER_TRANSFER";
+
+    // FIXME: Needs to stay in sync with com.android.bluetooth.opp.Constants
+    private static final int HANDOVER_TRANSFER_STATUS_SUCCESS = 0;
+    private static final int HANDOVER_TRANSFER_STATUS_FAILURE = 1;
+
+    // permission needed to be able to receive handover status requests
+    public static final String BEAM_STATUS_PERMISSION =
+            "android.permission.NFC_HANDOVER_STATUS";
+
+    // Needed to build cancel intent in Beam notification
+    public static final String EXTRA_INCOMING =
+            "com.android.nfc.handover.extra.INCOMING";
+
+    public static final String EXTRA_TRANSFER_ID =
+            "android.nfc.handover.intent.extra.TRANSFER_ID";
+
+    public static final String EXTRA_ADDRESS =
+            "android.nfc.handover.intent.extra.ADDRESS";
+
+    public static final String ACTION_CANCEL_HANDOVER_TRANSFER =
+            "com.android.nfc.handover.action.CANCEL_HANDOVER_TRANSFER";
+
+    public static final int DIRECTION_INCOMING = 0;
+    public static final int DIRECTION_OUTGOING = 1;
+
+    private final Context mContext;
+    private final BeamTransferManager mTransferManager;
+
+    BeamStatusReceiver(Context context, BeamTransferManager transferManager) {
+        mContext = context;
+        mTransferManager = transferManager;
+    }
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        String action = intent.getAction();
+        int dataLinkType = intent.getIntExtra(EXTRA_HANDOVER_DATA_LINK_TYPE,
+                BeamTransferManager.DATA_LINK_TYPE_BLUETOOTH);
+
+        if (ACTION_CANCEL_HANDOVER_TRANSFER.equals(action)) {
+            if (mTransferManager != null) {
+                mTransferManager.cancel();
+            }
+        } else if (ACTION_TRANSFER_PROGRESS.equals(action) ||
+                ACTION_TRANSFER_DONE.equals(action) ||
+                ACTION_HANDOVER_STARTED.equals(action)) {
+            handleTransferEvent(intent, dataLinkType);
+        }
+    }
+
+    public IntentFilter getIntentFilter() {
+        IntentFilter filter = new IntentFilter(ACTION_TRANSFER_DONE);
+        filter.addAction(ACTION_TRANSFER_PROGRESS);
+        filter.addAction(ACTION_CANCEL_HANDOVER_TRANSFER);
+        filter.addAction(ACTION_HANDOVER_STARTED);
+        return filter;
+    }
+
+    private void handleTransferEvent(Intent intent, int deviceType) {
+        String action = intent.getAction();
+        int id = intent.getIntExtra(EXTRA_TRANSFER_ID, -1);
+
+        String sourceAddress = intent.getStringExtra(EXTRA_ADDRESS);
+
+        if (sourceAddress == null) return;
+
+        if (mTransferManager == null) {
+            // There is no transfer running for this source address; most likely
+            // the transfer was cancelled. We need to tell BT OPP to stop transferring.
+            if (id != -1) {
+                if (deviceType == BeamTransferManager.DATA_LINK_TYPE_BLUETOOTH) {
+                    if (DBG) Log.d(TAG, "Didn't find transfer, stopping");
+                    Intent cancelIntent = new Intent(ACTION_STOP_BLUETOOTH_TRANSFER);
+                    cancelIntent.putExtra(EXTRA_TRANSFER_ID, id);
+                    mContext.sendBroadcast(cancelIntent);
+                }
+            }
+            return;
+        }
+
+        mTransferManager.setBluetoothTransferId(id);
+
+        if (action.equals(ACTION_TRANSFER_DONE)) {
+            int handoverStatus = intent.getIntExtra(EXTRA_TRANSFER_STATUS,
+                    HANDOVER_TRANSFER_STATUS_FAILURE);
+            if (handoverStatus == HANDOVER_TRANSFER_STATUS_SUCCESS) {
+                String uriString = intent.getStringExtra(EXTRA_TRANSFER_URI);
+                String mimeType = intent.getStringExtra(EXTRA_TRANSFER_MIMETYPE);
+                Uri uri = Uri.parse(uriString);
+                if (uri != null && uri.getScheme() == null) {
+                    uri = Uri.fromFile(new File(uri.getPath()));
+                }
+                mTransferManager.finishTransfer(true, uri, mimeType);
+            } else {
+                mTransferManager.finishTransfer(false, null, null);
+            }
+        } else if (action.equals(ACTION_TRANSFER_PROGRESS)) {
+            float progress = intent.getFloatExtra(EXTRA_TRANSFER_PROGRESS, 0.0f);
+            mTransferManager.updateFileProgress(progress);
+        } else if (action.equals(ACTION_HANDOVER_STARTED)) {
+            int count = intent.getIntExtra(EXTRA_OBJECT_COUNT, 0);
+            if (count > 0) {
+                mTransferManager.setObjectCount(count);
+            }
+        }
+    }
+}
diff --git a/src/com/android/nfc/handover/HandoverTransfer.java b/src/com/android/nfc/beam/BeamTransferManager.java
similarity index 87%
rename from src/com/android/nfc/handover/HandoverTransfer.java
rename to src/com/android/nfc/beam/BeamTransferManager.java
index b0baf18..b678501 100644
--- a/src/com/android/nfc/handover/HandoverTransfer.java
+++ b/src/com/android/nfc/beam/BeamTransferManager.java
@@ -14,7 +14,9 @@
  * limitations under the License.
  */
 
-package com.android.nfc.handover;
+package com.android.nfc.beam;
+
+import com.android.nfc.R;
 
 import android.app.Notification;
 import android.app.NotificationManager;
@@ -34,20 +36,22 @@
 import android.os.UserHandle;
 import android.util.Log;
 
-import com.android.nfc.R;
-
 import java.io.File;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Locale;
 
 /**
- * A HandoverTransfer object represents a set of files
+ * A BeamTransferManager object represents a set of files
  * that were received through NFC connection handover
  * from the same source address.
  *
+ * It manages starting, stopping, and processing the transfer, as well
+ * as the user visible notification.
+ *
  * For Bluetooth, files are received through OPP, and
  * we have no knowledge how many files will be transferred
  * as part of a single transaction.
@@ -57,21 +61,21 @@
  * same source address as part of the same transfer.
  * The corresponding URIs will be grouped in a single folder.
  *
+ * @hide
  */
-public class HandoverTransfer implements Handler.Callback,
-        MediaScannerConnection.OnScanCompletedListener {
 
+public class BeamTransferManager implements Handler.Callback,
+        MediaScannerConnection.OnScanCompletedListener {
     interface Callback {
 
-        void onTransferComplete(HandoverTransfer transfer, boolean success);
+        void onTransferComplete(BeamTransferManager transfer, boolean success);
     };
-    static final String TAG = "HandoverTransfer";
+    static final String TAG = "BeamTransferManager";
 
     static final Boolean DBG = true;
 
     // In the states below we still accept new file transfer
     static final int STATE_NEW = 0;
-
     static final int STATE_IN_PROGRESS = 1;
     static final int STATE_W4_NEXT_TRANSFER = 2;
     // In the states below no new files are accepted.
@@ -83,9 +87,8 @@
     static final int MSG_NEXT_TRANSFER_TIMER = 0;
 
     static final int MSG_TRANSFER_TIMEOUT = 1;
-    static final int DEVICE_TYPE_BLUETOOTH = 1;
+    static final int DATA_LINK_TYPE_BLUETOOTH = 1;
 
-    public static final int DEVICE_TYPE_WIFI = 2;
     // We need to receive an update within this time period
     // to still consider this transfer to be "alive" (ie
     // a reason to keep the handover transport enabled).
@@ -97,6 +100,12 @@
 
     static final String BEAM_DIR = "beam";
 
+    static final String ACTION_WHITELIST_DEVICE =
+            "android.btopp.intent.action.WHITELIST_DEVICE";
+
+    static final String ACTION_STOP_BLUETOOTH_TRANSFER =
+            "android.btopp.intent.action.STOP_HANDOVER_TRANSFER";
+
     final boolean mIncoming;  // whether this is an incoming transfer
 
     final int mTransferId; // Unique ID of this transfer used for notifications
@@ -107,49 +116,51 @@
     final Handler mHandler;
     final NotificationManager mNotificationManager;
     final BluetoothDevice mRemoteDevice;
-    final String mRemoteMac;
     final Callback mCallback;
-    final Long mStartTime;
+    final boolean mRemoteActivating;
 
     // Variables below are only accessed on the main thread
     int mState;
     int mCurrentCount;
     int mSuccessCount;
     int mTotalCount;
-    int mDeviceType;
+    int mDataLinkType;
     boolean mCalledBack;
     Long mLastUpdate; // Last time an event occurred for this transfer
     float mProgress; // Progress in range [0..1]
     ArrayList<Uri> mUris; // Received uris from transport
     ArrayList<String> mTransferMimeTypes; // Mime-types received from transport
-    Uri[] mOutgoingUris; // URIs to send via Wifi Direct
-
+    Uri[] mOutgoingUris; // URIs to send
     ArrayList<String> mPaths; // Raw paths on the filesystem for Beam-stored files
     HashMap<String, String> mMimeTypes; // Mime-types associated with each path
     HashMap<String, Uri> mMediaUris; // URIs found by the media scanner for each path
     int mUrisScanned;
+    Long mStartTime;
 
-    public HandoverTransfer(Context context, Callback callback,
-            PendingHandoverTransfer pendingTransfer) {
+    public BeamTransferManager(Context context, Callback callback,
+                               BeamTransferRecord pendingTransfer, boolean incoming) {
         mContext = context;
         mCallback = callback;
         mRemoteDevice = pendingTransfer.remoteDevice;
-        mRemoteMac = pendingTransfer.remoteMacAddress;
-        mIncoming = pendingTransfer.incoming;
+        mIncoming = incoming;
         mTransferId = pendingTransfer.id;
         mBluetoothTransferId = -1;
-        mDeviceType = pendingTransfer.deviceType;
+        mDataLinkType = pendingTransfer.dataLinkType;
+        mRemoteActivating = pendingTransfer.remoteActivating;
+        mStartTime = 0L;
         // For incoming transfers, count can be set later
         mTotalCount = (pendingTransfer.uris != null) ? pendingTransfer.uris.length : 0;
         mLastUpdate = SystemClock.elapsedRealtime();
         mProgress = 0.0f;
         mState = STATE_NEW;
-        mUris = new ArrayList<Uri>();
+        mUris = pendingTransfer.uris == null
+                ? new ArrayList<Uri>()
+                : new ArrayList<Uri>(Arrays.asList(pendingTransfer.uris));
         mTransferMimeTypes = new ArrayList<String>();
         mMimeTypes = new HashMap<String, String>();
         mPaths = new ArrayList<String>();
         mMediaUris = new HashMap<String, Uri>();
-        mCancelIntent = buildCancelIntent(mIncoming);
+        mCancelIntent = buildCancelIntent();
         mUrisScanned = 0;
         mCurrentCount = 0;
         mSuccessCount = 0;
@@ -158,17 +169,30 @@
         mHandler.sendEmptyMessageDelayed(MSG_TRANSFER_TIMEOUT, ALIVE_CHECK_MS);
         mNotificationManager = (NotificationManager) mContext.getSystemService(
                 Context.NOTIFICATION_SERVICE);
-
-        mStartTime = System.currentTimeMillis();
     }
 
     void whitelistOppDevice(BluetoothDevice device) {
         if (DBG) Log.d(TAG, "Whitelisting " + device + " for BT OPP");
-        Intent intent = new Intent(HandoverManager.ACTION_WHITELIST_DEVICE);
+        Intent intent = new Intent(ACTION_WHITELIST_DEVICE);
         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
         mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
     }
 
+    public void start() {
+        if (mStartTime > 0) {
+            // already started
+            return;
+        }
+
+        mStartTime = System.currentTimeMillis();
+
+        if (!mIncoming) {
+            if (mDataLinkType == BeamTransferRecord.DATA_LINK_TYPE_BLUETOOTH) {
+                new BluetoothOppHandover(mContext, mRemoteDevice, mUris, mRemoteActivating).start();
+            }
+        }
+    }
+
     public void updateFileProgress(float progress) {
         if (!isRunning()) return; // Ignore when we're no longer running
 
@@ -218,7 +242,6 @@
             if (mIncoming) {
                 processFiles();
             } else {
-                Log.i(TAG, "Updating state!");
                 updateStateAndNotification(mSuccessCount > 0 ? STATE_SUCCESS : STATE_FAILED);
             }
         } else {
@@ -258,9 +281,8 @@
     }
 
     private void sendBluetoothCancelIntentAndUpdateState() {
-        Intent cancelIntent = new Intent(
-                "android.btopp.intent.action.STOP_HANDOVER_TRANSFER");
-        cancelIntent.putExtra(HandoverService.EXTRA_TRANSFER_ID, mBluetoothTransferId);
+        Intent cancelIntent = new Intent(ACTION_STOP_BLUETOOTH_TRANSFER);
+        cancelIntent.putExtra(BeamStatusReceiver.EXTRA_TRANSFER_ID, mBluetoothTransferId);
         mContext.sendBroadcast(cancelIntent);
         updateStateAndNotification(STATE_CANCELLED);
     }
@@ -409,10 +431,6 @@
 
     }
 
-    public int getTransferId() {
-        return mTransferId;
-    }
-
     public boolean handleMessage(Message msg) {
         if (msg.what == MSG_NEXT_TRANSFER_TIMER) {
             // We didn't receive a new transfer in time, finalize this one
@@ -442,18 +460,6 @@
         }
     }
 
-    boolean checkMediaStorage(File path) {
-        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
-            if (!path.isDirectory() && !path.mkdir()) {
-                Log.e(TAG, "Not dir or not mkdir " + path.getAbsolutePath());
-                return false;
-            }
-            return true;
-        } else {
-            Log.e(TAG, "External storage not mounted, can't store file.");
-            return false;
-        }
-    }
 
     Intent buildViewIntent() {
         if (mPaths.size() == 0) return null;
@@ -469,19 +475,31 @@
         return viewIntent;
     }
 
-    PendingIntent buildCancelIntent(boolean incoming) {
-        Intent intent = new Intent(HandoverService.ACTION_CANCEL_HANDOVER_TRANSFER);
-        intent.putExtra(HandoverService.EXTRA_ADDRESS, mDeviceType == DEVICE_TYPE_BLUETOOTH
-                ? mRemoteDevice.getAddress() : mRemoteMac);
-        intent.putExtra(HandoverService.EXTRA_INCOMING, incoming ?
-                HandoverService.DIRECTION_INCOMING : HandoverService.DIRECTION_OUTGOING);
+    PendingIntent buildCancelIntent() {
+        Intent intent = new Intent(BeamStatusReceiver.ACTION_CANCEL_HANDOVER_TRANSFER);
+        intent.putExtra(BeamStatusReceiver.EXTRA_ADDRESS, mRemoteDevice.getAddress());
+        intent.putExtra(BeamStatusReceiver.EXTRA_INCOMING, mIncoming ?
+                BeamStatusReceiver.DIRECTION_INCOMING : BeamStatusReceiver.DIRECTION_OUTGOING);
         PendingIntent pi = PendingIntent.getBroadcast(mContext, mTransferId, intent,
                 PendingIntent.FLAG_ONE_SHOT);
 
         return pi;
     }
 
-    File generateUniqueDestination(String path, String fileName) {
+    static boolean checkMediaStorage(File path) {
+        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+            if (!path.isDirectory() && !path.mkdir()) {
+                Log.e(TAG, "Not dir or not mkdir " + path.getAbsolutePath());
+                return false;
+            }
+            return true;
+        } else {
+            Log.e(TAG, "External storage not mounted, can't store file.");
+            return false;
+        }
+    }
+
+    static File generateUniqueDestination(String path, String fileName) {
         int dotIndex = fileName.lastIndexOf(".");
         String extension = null;
         String fileNameWithoutExtension = null;
@@ -502,7 +520,7 @@
         return dstFile;
     }
 
-    File generateMultiplePath(String beamRoot) {
+    static File generateMultiplePath(String beamRoot) {
         // Generate a unique directory with the date
         String format = "yyyy-MM-dd";
         SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.US);
diff --git a/src/com/android/nfc/beam/BeamTransferRecord.aidl b/src/com/android/nfc/beam/BeamTransferRecord.aidl
new file mode 100644
index 0000000..93af205
--- /dev/null
+++ b/src/com/android/nfc/beam/BeamTransferRecord.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2013 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.nfc.beam;
+
+parcelable BeamTransferRecord;
diff --git a/src/com/android/nfc/beam/BeamTransferRecord.java b/src/com/android/nfc/beam/BeamTransferRecord.java
new file mode 100644
index 0000000..d8f8668
--- /dev/null
+++ b/src/com/android/nfc/beam/BeamTransferRecord.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.nfc.beam;
+
+import android.bluetooth.BluetoothDevice;
+import android.net.Uri;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class BeamTransferRecord implements Parcelable {
+
+    public static int DATA_LINK_TYPE_BLUETOOTH = 0;
+
+    public int id;
+    public boolean remoteActivating;
+    public Uri[] uris;
+    public int dataLinkType;
+
+    // Data link specific fields
+    public BluetoothDevice remoteDevice;
+
+
+    private BeamTransferRecord(BluetoothDevice remoteDevice,
+                               boolean remoteActivating, Uri[] uris) {
+        this.id = 0;
+        this.remoteDevice = remoteDevice;
+        this.remoteActivating = remoteActivating;
+        this.uris = uris;
+
+        this.dataLinkType = DATA_LINK_TYPE_BLUETOOTH;
+    }
+
+    public static final BeamTransferRecord forBluetoothDevice(
+            BluetoothDevice remoteDevice, boolean remoteActivating,
+            Uri[] uris) {
+       return new BeamTransferRecord(remoteDevice, remoteActivating, uris);
+    }
+
+    public static final Parcelable.Creator<BeamTransferRecord> CREATOR
+            = new Parcelable.Creator<BeamTransferRecord>() {
+        public BeamTransferRecord createFromParcel(Parcel in) {
+            int deviceType = in.readInt();
+
+            if (deviceType != DATA_LINK_TYPE_BLUETOOTH) {
+                // only support BLUETOOTH
+                return null;
+            }
+
+            BluetoothDevice remoteDevice = in.readParcelable(getClass().getClassLoader());
+            boolean remoteActivating = (in.readInt() == 1);
+            int numUris = in.readInt();
+            Uri[] uris = null;
+            if (numUris > 0) {
+                uris = new Uri[numUris];
+                in.readTypedArray(uris, Uri.CREATOR);
+            }
+
+            return new BeamTransferRecord(remoteDevice,
+                    remoteActivating, uris);
+
+        }
+
+        @Override
+        public BeamTransferRecord[] newArray(int size) {
+            return new BeamTransferRecord[size];
+        }
+    };
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(dataLinkType);
+        dest.writeParcelable(remoteDevice, 0);
+        dest.writeInt(remoteActivating ? 1 : 0);
+        dest.writeInt(uris != null ? uris.length : 0);
+        if (uris != null && uris.length > 0) {
+            dest.writeTypedArray(uris, 0);
+        }
+    }
+}
diff --git a/src/com/android/nfc/handover/BluetoothOppHandover.java b/src/com/android/nfc/beam/BluetoothOppHandover.java
similarity index 89%
rename from src/com/android/nfc/handover/BluetoothOppHandover.java
rename to src/com/android/nfc/beam/BluetoothOppHandover.java
index 85e7f13..84d3c20 100644
--- a/src/com/android/nfc/handover/BluetoothOppHandover.java
+++ b/src/com/android/nfc/beam/BluetoothOppHandover.java
@@ -14,21 +14,18 @@
  * limitations under the License.
  */
 
-package com.android.nfc.handover;
+package com.android.nfc.beam;
 
 import android.bluetooth.BluetoothDevice;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Handler;
 import android.os.Message;
 import android.os.SystemClock;
-import android.os.UserHandle;
 import android.util.Log;
-import android.webkit.MimeTypeMap;
+
 import java.util.ArrayList;
-import java.util.Arrays;
 
 public class BluetoothOppHandover implements Handler.Callback {
     static final String TAG = "BluetoothOppHandover";
@@ -52,14 +49,14 @@
     final Context mContext;
     final BluetoothDevice mDevice;
 
-    final Uri[] mUris;
+    final ArrayList<Uri> mUris;
     final boolean mRemoteActivating;
     final Handler mHandler;
     final Long mCreateTime;
 
     int mState;
 
-    public BluetoothOppHandover(Context context, BluetoothDevice device, Uri[] uris,
+    public BluetoothOppHandover(Context context, BluetoothDevice device, ArrayList<Uri> uris,
             boolean remoteActivating) {
         mContext = context;
         mDevice = device;
@@ -67,7 +64,7 @@
         mRemoteActivating = remoteActivating;
         mCreateTime = SystemClock.elapsedRealtime();
 
-        mHandler = new Handler(context.getMainLooper(),this);
+        mHandler = new Handler(context.getMainLooper(), this);
         mState = STATE_INIT;
     }
 
@@ -99,7 +96,7 @@
     void sendIntent() {
         Intent intent = new Intent();
         intent.setPackage("com.android.bluetooth");
-        String mimeType = MimeTypeUtil.getMimeTypeForUri(mContext, mUris[0]);
+        String mimeType = MimeTypeUtil.getMimeTypeForUri(mContext, mUris.get(0));
         intent.setType(mimeType);
         intent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
         for (Uri uri : mUris) {
@@ -113,13 +110,12 @@
                 Log.e(TAG, "Failed to transfer permission to Bluetooth process.");
             }
         }
-        if (mUris.length == 1) {
+        if (mUris.size() == 1) {
             intent.setAction(ACTION_HANDOVER_SEND);
-            intent.putExtra(Intent.EXTRA_STREAM, mUris[0]);
+            intent.putExtra(Intent.EXTRA_STREAM, mUris.get(0));
         } else {
-            ArrayList<Uri> uris = new ArrayList<Uri>(Arrays.asList(mUris));
             intent.setAction(ACTION_HANDOVER_SEND_MULTIPLE);
-            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
+            intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, mUris);
         }
         if (DBG) Log.d(TAG, "Handing off outging transfer to BT");
         mContext.sendBroadcast(intent);
diff --git a/src/com/android/nfc/FireflyRenderer.java b/src/com/android/nfc/beam/FireflyRenderer.java
similarity index 99%
rename from src/com/android/nfc/FireflyRenderer.java
rename to src/com/android/nfc/beam/FireflyRenderer.java
index 40c931d..d87a5d9 100644
--- a/src/com/android/nfc/FireflyRenderer.java
+++ b/src/com/android/nfc/beam/FireflyRenderer.java
@@ -15,7 +15,7 @@
  */
 
 
-package com.android.nfc;
+package com.android.nfc.beam;
 
 import android.content.Context;
 import android.graphics.Bitmap;
diff --git a/src/com/android/nfc/handover/MimeTypeUtil.java b/src/com/android/nfc/beam/MimeTypeUtil.java
similarity index 97%
rename from src/com/android/nfc/handover/MimeTypeUtil.java
rename to src/com/android/nfc/beam/MimeTypeUtil.java
index 7a0556d..73d7fd6 100644
--- a/src/com/android/nfc/handover/MimeTypeUtil.java
+++ b/src/com/android/nfc/beam/MimeTypeUtil.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.nfc.handover;
+package com.android.nfc.beam;
 
 import android.content.ContentResolver;
 import android.content.Context;
@@ -46,4 +46,4 @@
             return null;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/nfc/SendUi.java b/src/com/android/nfc/beam/SendUi.java
similarity index 99%
rename from src/com/android/nfc/SendUi.java
rename to src/com/android/nfc/beam/SendUi.java
index 58a3888..0761ba5 100644
--- a/src/com/android/nfc/SendUi.java
+++ b/src/com/android/nfc/beam/SendUi.java
@@ -14,9 +14,11 @@
  * limitations under the License.
  */
 
-package com.android.nfc;
+package com.android.nfc.beam;
 
 import com.android.internal.policy.PolicyManager;
+import com.android.nfc.R;
+import com.android.nfc.beam.FireflyRenderer;
 
 import android.animation.Animator;
 import android.animation.AnimatorSet;
@@ -110,8 +112,8 @@
     static final int TEXT_HINT_ALPHA_DURATION_MS = 500;
     static final int TEXT_HINT_ALPHA_START_DELAY_MS = 300;
 
-    static final int FINISH_SCALE_UP = 0;
-    static final int FINISH_SEND_SUCCESS = 1;
+    public static final int FINISH_SCALE_UP = 0;
+    public static final int FINISH_SEND_SUCCESS = 1;
 
     static final int STATE_IDLE = 0;
     static final int STATE_W4_SCREENSHOT = 1;
@@ -185,7 +187,7 @@
     int mSurfaceWidth;
     int mSurfaceHeight;
 
-    interface Callback {
+    public interface Callback {
         public void onSendConfirmed();
         public void onCanceled();
     }
diff --git a/src/com/android/nfc/cardemulation/AidRoutingManager.java b/src/com/android/nfc/cardemulation/AidRoutingManager.java
index a727989..96225b7 100644
--- a/src/com/android/nfc/cardemulation/AidRoutingManager.java
+++ b/src/com/android/nfc/cardemulation/AidRoutingManager.java
@@ -88,7 +88,23 @@
 
     void clearNfcRoutingTableLocked() {
         for (Map.Entry<String, Integer> aidEntry : mRouteForAid.entrySet())  {
-            NfcService.getInstance().unrouteAids(aidEntry.getKey());
+            String aid = aidEntry.getKey();
+            if (aid.endsWith("*")) {
+                if (mAidMatchingSupport == AID_MATCHING_EXACT_ONLY) {
+                    Log.e(TAG, "Device does not support prefix AIDs but AID [" + aid
+                            + "] is registered");
+                } else if (mAidMatchingSupport == AID_MATCHING_PREFIX_ONLY) {
+                    if (DBG) Log.d(TAG, "Unrouting prefix AID " + aid);
+                    // Cut off '*' since controller anyway treats all AIDs as a prefix
+                    aid = aid.substring(0, aid.length() - 1);
+                } else if (mAidMatchingSupport == AID_MATCHING_EXACT_OR_PREFIX) {
+                    if (DBG) Log.d(TAG, "Unrouting prefix AID " + aid);
+                }
+            } else {
+                if (DBG) Log.d(TAG, "Unrouting exact AID " + aid);
+            }
+
+            NfcService.getInstance().unrouteAids(aid);
         }
     }
 
diff --git a/src/com/android/nfc/cardemulation/CardEmulationManager.java b/src/com/android/nfc/cardemulation/CardEmulationManager.java
index e179464..02d3622 100644
--- a/src/com/android/nfc/cardemulation/CardEmulationManager.java
+++ b/src/com/android/nfc/cardemulation/CardEmulationManager.java
@@ -248,6 +248,15 @@
     }
 
     /**
+     * Returns whether a service in this package is preferred,
+     * either because it's the default payment app or it's running
+     * in the foreground.
+     */
+    public boolean packageHasPreferredService(String packageName) {
+        return mPreferredServices.packageHasPreferredService(packageName);
+    }
+
+    /**
      * This class implements the application-facing APIs
      * and are called from binder. All calls must be
      * permission-checked.
diff --git a/src/com/android/nfc/cardemulation/PreferredServices.java b/src/com/android/nfc/cardemulation/PreferredServices.java
index 8954225..41f10fa 100644
--- a/src/com/android/nfc/cardemulation/PreferredServices.java
+++ b/src/com/android/nfc/cardemulation/PreferredServices.java
@@ -354,6 +354,20 @@
         loadDefaultsFromSettings(userId);
     }
 
+    public boolean packageHasPreferredService(String packageName) {
+        if (packageName == null) return false;
+
+        if (mPaymentDefaults.currentPreferred != null &&
+                packageName.equals(mPaymentDefaults.currentPreferred.getPackageName())) {
+            return true;
+        } else if (mForegroundCurrent != null &&
+                packageName.equals(mForegroundCurrent.getPackageName())) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("Preferred services (in order of importance): ");
         pw.println("    *** Current preferred foreground service: " + mForegroundCurrent);
diff --git a/src/com/android/nfc/handover/BluetoothPeripheralHandover.java b/src/com/android/nfc/handover/BluetoothPeripheralHandover.java
index 39dcf81..3ac09e6 100644
--- a/src/com/android/nfc/handover/BluetoothPeripheralHandover.java
+++ b/src/com/android/nfc/handover/BluetoothPeripheralHandover.java
@@ -222,8 +222,7 @@
                                 != BluetoothProfile.STATE_DISCONNECTED) {
                             mHidResult = RESULT_PENDING;
                             mInput.disconnect(mDevice);
-                            toast(mContext.getString(R.string.disconnecting_peripheral) + " " +
-                                    mName + "...");
+                            toast(getToastString(R.string.disconnecting_peripheral));
                             break;
                         } else {
                             mHidResult = RESULT_DISCONNECTED;
@@ -244,8 +243,7 @@
                             mA2dpResult = RESULT_DISCONNECTED;
                         }
                         if (mA2dpResult == RESULT_PENDING || mHfpResult == RESULT_PENDING) {
-                            toast(mContext.getString(R.string.disconnecting_peripheral) + " " +
-                                    mName + "...");
+                            toast(getToastString(R.string.disconnecting_peripheral));
                             break;
                         }
                     }
@@ -254,7 +252,7 @@
             case STATE_DISCONNECTING:
                 if (mTransport == BluetoothDevice.TRANSPORT_LE) {
                     if (mHidResult == RESULT_DISCONNECTED) {
-                        toast(mContext.getString(R.string.disconnected_peripheral) + " " + mName);
+                        toast(getToastString(R.string.disconnected_peripheral));
                         complete(false);
                     }
 
@@ -265,7 +263,7 @@
                         break;
                     }
                     if (mA2dpResult == RESULT_DISCONNECTED && mHfpResult == RESULT_DISCONNECTED) {
-                        toast(mContext.getString(R.string.disconnected_peripheral) + " " + mName);
+                        toast(getToastString(R.string.disconnected_peripheral));
                     }
                     complete(false);
                     break;
@@ -275,6 +273,10 @@
 
     }
 
+    private String getToastString(int resid) {
+        return mContext.getString(resid, mName != null ? mName : R.string.device);
+    }
+
     boolean getProfileProxys() {
 
         if (mTransport == BluetoothDevice.TRANSPORT_LE) {
@@ -294,6 +296,7 @@
     void nextStepConnect() {
         switch (mState) {
             case STATE_INIT_COMPLETE:
+
                 if (mDevice.getBondState() != BluetoothDevice.BOND_BONDED) {
                     requestPairConfirmation();
                     mState = STATE_WAITING_FOR_BOND_CONFIRMATION;
@@ -325,8 +328,7 @@
                                 != BluetoothProfile.STATE_CONNECTED) {
                             mHidResult = RESULT_PENDING;
                             mInput.connect(mDevice);
-                            toast(mContext.getString(R.string.connecting_peripheral) + " "
-                                    + mName + "...");
+                            toast(getToastString(R.string.connecting_peripheral));
                             break;
                         } else {
                             mHidResult = RESULT_CONNECTED;
@@ -346,8 +348,7 @@
                             mA2dpResult = RESULT_CONNECTED;
                         }
                         if (mA2dpResult == RESULT_PENDING || mHfpResult == RESULT_PENDING) {
-                            toast(mContext.getString(R.string.connecting_peripheral) + " "
-                                    + mName + "...");
+                            toast(getToastString(R.string.connecting_peripheral));
                             break;
                         }
                     }
@@ -358,11 +359,11 @@
                     if (mHidResult == RESULT_PENDING) {
                         break;
                     } else if (mHidResult == RESULT_CONNECTED) {
-                        toast(mContext.getString(R.string.connected_peripheral) + " " + mName);
+                        toast(getToastString(R.string.connected_peripheral));
+                        mDevice.setAlias(mName);
                         complete(true);
                     } else {
-                        toast (mContext.getString(R.string.connect_peripheral_failed) + " "
-                                + mName);
+                        toast (getToastString(R.string.connect_peripheral_failed));
                         complete(false);
                     }
                 } else {
@@ -372,11 +373,12 @@
                     }
                     if (mA2dpResult == RESULT_CONNECTED || mHfpResult == RESULT_CONNECTED) {
                         // we'll take either as success
-                        toast(mContext.getString(R.string.connected_peripheral) + " " + mName);
+                        toast(getToastString(R.string.connected_peripheral));
                         if (mA2dpResult == RESULT_CONNECTED) startTheMusic();
+                        mDevice.setAlias(mName);
                         complete(true);
                     } else {
-                        toast (mContext.getString(R.string.connect_peripheral_failed) + " " + mName);
+                        toast (getToastString(R.string.connect_peripheral_failed));
                         complete(false);
                     }
                 }
@@ -386,9 +388,9 @@
 
     void startBonding() {
         mState = STATE_BONDING;
-        toast(mContext.getString(R.string.pairing_peripheral) + " " + mName + "...");
+        toast(getToastString(R.string.pairing_peripheral));
         if (!mDevice.createBond(mTransport)) {
-            toast(mContext.getString(R.string.pairing_peripheral_failed) + " " + mName);
+            toast(getToastString(R.string.pairing_peripheral_failed));
             complete(false);
         }
     }
@@ -410,7 +412,7 @@
             if (bond == BluetoothDevice.BOND_BONDED) {
                 nextStepConnect();
             } else if (bond == BluetoothDevice.BOND_NONE) {
-                toast(mContext.getString(R.string.pairing_peripheral_failed) + " " + mName);
+                toast(getToastString(R.string.pairing_peripheral_failed));
                 complete(false);
             }
         } else if (BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED.equals(action) &&
diff --git a/src/com/android/nfc/handover/HandoverDataParser.java b/src/com/android/nfc/handover/HandoverDataParser.java
new file mode 100644
index 0000000..71e06ad
--- /dev/null
+++ b/src/com/android/nfc/handover/HandoverDataParser.java
@@ -0,0 +1,471 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.nfc.handover;
+
+import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Random;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.content.Intent;
+import android.nfc.FormatException;
+import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
+import android.os.UserHandle;
+import android.util.Log;
+
+/**
+ * Manages handover of NFC to other technologies.
+ */
+public class HandoverDataParser {
+    private static final String TAG = "NfcHandover";
+    private static final boolean DBG = false;
+
+    private static final byte[] TYPE_BT_OOB = "application/vnd.bluetooth.ep.oob"
+            .getBytes(Charset.forName("US_ASCII"));
+    private static final byte[] TYPE_BLE_OOB = "application/vnd.bluetooth.le.oob"
+            .getBytes(Charset.forName("US_ASCII"));
+
+    private static final byte[] TYPE_NOKIA = "nokia.com:bt".getBytes(Charset.forName("US_ASCII"));
+
+    private static final byte[] RTD_COLLISION_RESOLUTION = {0x63, 0x72}; // "cr";
+
+    private static final int CARRIER_POWER_STATE_INACTIVE = 0;
+    private static final int CARRIER_POWER_STATE_ACTIVE = 1;
+    private static final int CARRIER_POWER_STATE_ACTIVATING = 2;
+    private static final int CARRIER_POWER_STATE_UNKNOWN = 3;
+
+    private static final int BT_HANDOVER_TYPE_MAC = 0x1B;
+    private static final int BT_HANDOVER_TYPE_LE_ROLE = 0x1C;
+    private static final int BT_HANDOVER_TYPE_LONG_LOCAL_NAME = 0x09;
+    private static final int BT_HANDOVER_TYPE_SHORT_LOCAL_NAME = 0x08;
+    public static final int BT_HANDOVER_LE_ROLE_CENTRAL_ONLY = 0x01;
+
+    private final BluetoothAdapter mBluetoothAdapter;
+
+    private final Object mLock = new Object();
+    // Variables below synchronized on mLock
+
+    private String mLocalBluetoothAddress;
+
+    public static class BluetoothHandoverData {
+        public boolean valid = false;
+        public BluetoothDevice device;
+        public String name;
+        public boolean carrierActivating = false;
+        public int transport = BluetoothDevice.TRANSPORT_AUTO;
+    }
+
+    public static class IncomingHandoverData {
+        public final NdefMessage handoverSelect;
+        public final BluetoothHandoverData handoverData;
+
+        public IncomingHandoverData(NdefMessage handoverSelect,
+                                    BluetoothHandoverData handoverData) {
+            this.handoverSelect = handoverSelect;
+            this.handoverData = handoverData;
+        }
+    }
+
+    public HandoverDataParser() {
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    }
+
+    static NdefRecord createCollisionRecord() {
+        byte[] random = new byte[2];
+        new Random().nextBytes(random);
+        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, RTD_COLLISION_RESOLUTION, null, random);
+    }
+
+    NdefRecord createBluetoothAlternateCarrierRecord(boolean activating) {
+        byte[] payload = new byte[4];
+        payload[0] = (byte) (activating ? CARRIER_POWER_STATE_ACTIVATING :
+            CARRIER_POWER_STATE_ACTIVE);  // Carrier Power State: Activating or active
+        payload[1] = 1;   // length of carrier data reference
+        payload[2] = 'b'; // carrier data reference: ID for Bluetooth OOB data record
+        payload[3] = 0;  // Auxiliary data reference count
+        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_ALTERNATIVE_CARRIER, null,
+                payload);
+    }
+
+    NdefRecord createBluetoothOobDataRecord() {
+        byte[] payload = new byte[8];
+        // Note: this field should be little-endian per the BTSSP spec
+        // The Android 4.1 implementation used big-endian order here.
+        // No single Android implementation has ever interpreted this
+        // length field when parsing this record though.
+        payload[0] = (byte) (payload.length & 0xFF);
+        payload[1] = (byte) ((payload.length >> 8) & 0xFF);
+
+        synchronized (mLock) {
+            if (mLocalBluetoothAddress == null) {
+                mLocalBluetoothAddress = mBluetoothAdapter.getAddress();
+            }
+
+            byte[] addressBytes = addressToReverseBytes(mLocalBluetoothAddress);
+            System.arraycopy(addressBytes, 0, payload, 2, 6);
+        }
+
+        return new NdefRecord(NdefRecord.TNF_MIME_MEDIA, TYPE_BT_OOB, new byte[]{'b'}, payload);
+    }
+
+    public boolean isHandoverSupported() {
+        return (mBluetoothAdapter != null);
+    }
+
+    public NdefMessage createHandoverRequestMessage() {
+        if (mBluetoothAdapter == null) {
+            return null;
+        }
+
+        NdefRecord[] dataRecords = new NdefRecord[] {
+                createBluetoothOobDataRecord()
+        };
+        return new NdefMessage(
+                createHandoverRequestRecord(),
+                dataRecords);
+    }
+
+    NdefMessage createBluetoothHandoverSelectMessage(boolean activating) {
+        return new NdefMessage(createHandoverSelectRecord(
+                createBluetoothAlternateCarrierRecord(activating)),
+                createBluetoothOobDataRecord());
+    }
+
+    NdefRecord createHandoverSelectRecord(NdefRecord alternateCarrier) {
+        NdefMessage nestedMessage = new NdefMessage(alternateCarrier);
+        byte[] nestedPayload = nestedMessage.toByteArray();
+
+        ByteBuffer payload = ByteBuffer.allocate(nestedPayload.length + 1);
+        payload.put((byte)0x12);  // connection handover v1.2
+        payload.put(nestedPayload);
+
+        byte[] payloadBytes = new byte[payload.position()];
+        payload.position(0);
+        payload.get(payloadBytes);
+        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_HANDOVER_SELECT, null,
+                payloadBytes);
+    }
+
+    NdefRecord createHandoverRequestRecord() {
+        NdefRecord[] messages = new NdefRecord[] {
+                createBluetoothAlternateCarrierRecord(false)
+        };
+
+        NdefMessage nestedMessage = new NdefMessage(createCollisionRecord(), messages);
+
+        byte[] nestedPayload = nestedMessage.toByteArray();
+
+        ByteBuffer payload = ByteBuffer.allocate(nestedPayload.length + 1);
+        payload.put((byte) 0x12);  // connection handover v1.2
+        payload.put(nestedMessage.toByteArray());
+
+        byte[] payloadBytes = new byte[payload.position()];
+        payload.position(0);
+        payload.get(payloadBytes);
+        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_HANDOVER_REQUEST, null,
+                payloadBytes);
+    }
+
+    /**
+     * Returns null if message is not a Handover Request,
+     * returns the IncomingHandoverData (Hs + parsed data) if it is.
+     */
+    public IncomingHandoverData getIncomingHandoverData(NdefMessage handoverRequest) {
+        if (handoverRequest == null) return null;
+        if (mBluetoothAdapter == null) return null;
+
+        if (DBG) Log.d(TAG, "getIncomingHandoverData():" + handoverRequest.toString());
+
+        NdefRecord handoverRequestRecord = handoverRequest.getRecords()[0];
+        if (handoverRequestRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
+            return null;
+        }
+
+        if (!Arrays.equals(handoverRequestRecord.getType(), NdefRecord.RTD_HANDOVER_REQUEST)) {
+            return null;
+        }
+
+        // we have a handover request, look for BT OOB record
+        BluetoothHandoverData bluetoothData = null;
+        for (NdefRecord dataRecord : handoverRequest.getRecords()) {
+            if (dataRecord.getTnf() == NdefRecord.TNF_MIME_MEDIA) {
+                if (Arrays.equals(dataRecord.getType(), TYPE_BT_OOB)) {
+                    bluetoothData = parseBtOob(ByteBuffer.wrap(dataRecord.getPayload()));
+                }
+            }
+        }
+
+        NdefMessage hs = tryBluetoothHandoverRequest(bluetoothData);
+        if (hs != null) {
+            return new IncomingHandoverData(hs, bluetoothData);
+        }
+
+        return null;
+    }
+
+    public BluetoothHandoverData getOutgoingHandoverData(NdefMessage handoverSelect) {
+        return parseBluetooth(handoverSelect);
+    }
+
+    private NdefMessage tryBluetoothHandoverRequest(BluetoothHandoverData bluetoothData) {
+        NdefMessage selectMessage = null;
+        if (bluetoothData != null) {
+            // Note: there could be a race where we conclude
+            // that Bluetooth is already enabled, and shortly
+            // after the user turns it off. That will cause
+            // the transfer to fail, but there's nothing
+            // much we can do about it anyway. It shouldn't
+            // be common for the user to be changing BT settings
+            // while waiting to receive a picture.
+            boolean bluetoothActivating = !mBluetoothAdapter.isEnabled();
+
+            // return BT OOB record so they can perform handover
+            selectMessage = (createBluetoothHandoverSelectMessage(bluetoothActivating));
+            if (DBG) Log.d(TAG, "Waiting for incoming transfer, [" +
+                    bluetoothData.device.getAddress() + "]->[" + mLocalBluetoothAddress + "]");
+        }
+
+        return selectMessage;
+    }
+
+
+
+    boolean isCarrierActivating(NdefRecord handoverRec, byte[] carrierId) {
+        byte[] payload = handoverRec.getPayload();
+        if (payload == null || payload.length <= 1) return false;
+        // Skip version
+        byte[] payloadNdef = new byte[payload.length - 1];
+        System.arraycopy(payload, 1, payloadNdef, 0, payload.length - 1);
+        NdefMessage msg;
+        try {
+            msg = new NdefMessage(payloadNdef);
+        } catch (FormatException e) {
+            return false;
+        }
+
+        for (NdefRecord alt : msg.getRecords()) {
+            byte[] acPayload = alt.getPayload();
+            if (acPayload != null) {
+                ByteBuffer buf = ByteBuffer.wrap(acPayload);
+                int cps = buf.get() & 0x03; // Carrier Power State is in lower 2 bits
+                int carrierRefLength = buf.get() & 0xFF;
+                if (carrierRefLength != carrierId.length) return false;
+
+                byte[] carrierRefId = new byte[carrierRefLength];
+                buf.get(carrierRefId);
+                if (Arrays.equals(carrierRefId, carrierId)) {
+                    // Found match, returning whether power state is activating
+                    return (cps == CARRIER_POWER_STATE_ACTIVATING);
+                }
+            }
+        }
+
+        return true;
+    }
+
+    BluetoothHandoverData parseBluetoothHandoverSelect(NdefMessage m) {
+        // TODO we could parse this a lot more strictly; right now
+        // we just search for a BT OOB record, and try to cross-reference
+        // the carrier state inside the 'hs' payload.
+        for (NdefRecord oob : m.getRecords()) {
+            if (oob.getTnf() == NdefRecord.TNF_MIME_MEDIA &&
+                    Arrays.equals(oob.getType(), TYPE_BT_OOB)) {
+                BluetoothHandoverData data = parseBtOob(ByteBuffer.wrap(oob.getPayload()));
+                if (data != null && isCarrierActivating(m.getRecords()[0], oob.getId())) {
+                    data.carrierActivating = true;
+                }
+                return data;
+            }
+
+            if (oob.getTnf() == NdefRecord.TNF_MIME_MEDIA &&
+                    Arrays.equals(oob.getType(), TYPE_BLE_OOB)) {
+                return parseBleOob(ByteBuffer.wrap(oob.getPayload()));
+            }
+        }
+
+        return null;
+    }
+
+    public BluetoothHandoverData parseBluetooth(NdefMessage m) {
+        NdefRecord r = m.getRecords()[0];
+        short tnf = r.getTnf();
+        byte[] type = r.getType();
+
+        // Check for BT OOB record
+        if (r.getTnf() == NdefRecord.TNF_MIME_MEDIA && Arrays.equals(r.getType(), TYPE_BT_OOB)) {
+            return parseBtOob(ByteBuffer.wrap(r.getPayload()));
+        }
+
+        // Check for BLE OOB record
+        if (r.getTnf() == NdefRecord.TNF_MIME_MEDIA && Arrays.equals(r.getType(), TYPE_BLE_OOB)) {
+            return parseBleOob(ByteBuffer.wrap(r.getPayload()));
+        }
+
+        // Check for Handover Select, followed by a BT OOB record
+        if (tnf == NdefRecord.TNF_WELL_KNOWN &&
+                Arrays.equals(type, NdefRecord.RTD_HANDOVER_SELECT)) {
+            return parseBluetoothHandoverSelect(m);
+        }
+
+        // Check for Nokia BT record, found on some Nokia BH-505 Headsets
+        if (tnf == NdefRecord.TNF_EXTERNAL_TYPE && Arrays.equals(type, TYPE_NOKIA)) {
+            return parseNokia(ByteBuffer.wrap(r.getPayload()));
+        }
+
+        return null;
+    }
+
+    BluetoothHandoverData parseNokia(ByteBuffer payload) {
+        BluetoothHandoverData result = new BluetoothHandoverData();
+        result.valid = false;
+
+        try {
+            payload.position(1);
+            byte[] address = new byte[6];
+            payload.get(address);
+            result.device = mBluetoothAdapter.getRemoteDevice(address);
+            result.valid = true;
+            payload.position(14);
+            int nameLength = payload.get();
+            byte[] nameBytes = new byte[nameLength];
+            payload.get(nameBytes);
+            result.name = new String(nameBytes, Charset.forName("UTF-8"));
+        } catch (IllegalArgumentException e) {
+            Log.i(TAG, "nokia: invalid BT address");
+        } catch (BufferUnderflowException e) {
+            Log.i(TAG, "nokia: payload shorter than expected");
+        }
+        if (result.valid && result.name == null) result.name = "";
+        return result;
+    }
+
+    BluetoothHandoverData parseBtOob(ByteBuffer payload) {
+        BluetoothHandoverData result = new BluetoothHandoverData();
+        result.valid = false;
+
+        try {
+            payload.position(2); // length
+            byte[] address = parseMacFromBluetoothRecord(payload);
+            result.device = mBluetoothAdapter.getRemoteDevice(address);
+            result.valid = true;
+
+            while (payload.remaining() > 0) {
+                byte[] nameBytes;
+                int len = payload.get();
+                int type = payload.get();
+                switch (type) {
+                    case BT_HANDOVER_TYPE_SHORT_LOCAL_NAME:
+                        nameBytes = new byte[len - 1];
+                        payload.get(nameBytes);
+                        result.name = new String(nameBytes, Charset.forName("UTF-8"));
+                        break;
+                    case BT_HANDOVER_TYPE_LONG_LOCAL_NAME:
+                        if (result.name != null) break;  // prefer short name
+                        nameBytes = new byte[len - 1];
+                        payload.get(nameBytes);
+                        result.name = new String(nameBytes, Charset.forName("UTF-8"));
+                        break;
+                    default:
+                        payload.position(payload.position() + len - 1);
+                        break;
+                }
+            }
+        } catch (IllegalArgumentException e) {
+            Log.i(TAG, "BT OOB: invalid BT address");
+        } catch (BufferUnderflowException e) {
+            Log.i(TAG, "BT OOB: payload shorter than expected");
+        }
+        if (result.valid && result.name == null) result.name = "";
+        return result;
+    }
+
+    BluetoothHandoverData parseBleOob(ByteBuffer payload) {
+        BluetoothHandoverData result = new BluetoothHandoverData();
+        result.valid = false;
+        result.transport = BluetoothDevice.TRANSPORT_LE;
+
+        try {
+
+            while (payload.remaining() > 0) {
+                byte[] nameBytes;
+                int len = payload.get();
+                int type = payload.get();
+                switch (type) {
+                    case BT_HANDOVER_TYPE_MAC: // mac address
+                        byte[] address = parseMacFromBluetoothRecord(payload);
+                        payload.position(payload.position() + 1); // advance over random byte
+                        result.device = mBluetoothAdapter.getRemoteDevice(address);
+                        result.valid = true;
+                        break;
+                    case BT_HANDOVER_TYPE_LE_ROLE:
+                        byte role = payload.get();
+                        if (role == BT_HANDOVER_LE_ROLE_CENTRAL_ONLY) {
+                            // only central role supported, can't pair
+                            result.valid = false;
+                            return result;
+                        }
+                        break;
+                    case BT_HANDOVER_TYPE_LONG_LOCAL_NAME:
+                        nameBytes = new byte[len - 1];
+                        payload.get(nameBytes);
+                        result.name = new String(nameBytes, Charset.forName("UTF-8"));
+                        break;
+                    default:
+                        payload.position(payload.position() + len - 1);
+                        break;
+                }
+            }
+        } catch (IllegalArgumentException e) {
+            Log.i(TAG, "BT OOB: invalid BT address");
+        } catch (BufferUnderflowException e) {
+            Log.i(TAG, "BT OOB: payload shorter than expected");
+        }
+        if (result.valid && result.name == null) result.name = "";
+        return result;
+    }
+
+    private byte[] parseMacFromBluetoothRecord(ByteBuffer payload) {
+        byte[] address = new byte[6];
+        payload.get(address);
+        // ByteBuffer.order(LITTLE_ENDIAN) doesn't work for
+        // ByteBuffer.get(byte[]), so manually swap order
+        for (int i = 0; i < 3; i++) {
+            byte temp = address[i];
+            address[i] = address[5 - i];
+            address[5 - i] = temp;
+        }
+        return address;
+    }
+
+    static byte[] addressToReverseBytes(String address) {
+        String[] split = address.split(":");
+        byte[] result = new byte[split.length];
+
+        for (int i = 0; i < split.length; i++) {
+            // need to parse as int because parseByte() expects a signed byte
+            result[split.length - 1 - i] = (byte)Integer.parseInt(split[i], 16);
+        }
+
+        return result;
+    }
+}
+
diff --git a/src/com/android/nfc/handover/HandoverManager.java b/src/com/android/nfc/handover/HandoverManager.java
deleted file mode 100644
index d48b490..0000000
--- a/src/com/android/nfc/handover/HandoverManager.java
+++ /dev/null
@@ -1,744 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.nfc.handover;
-
-import java.nio.BufferUnderflowException;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Random;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.ServiceConnection;
-import android.net.Uri;
-import android.nfc.FormatException;
-import android.nfc.NdefMessage;
-import android.nfc.NdefRecord;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.os.UserHandle;
-import android.util.Log;
-
-/**
- * Manages handover of NFC to other technologies.
- */
-public class HandoverManager {
-    private static final String TAG = "NfcHandover";
-    private static final boolean DBG = false;
-
-    private static final byte[] TYPE_BT_OOB = "application/vnd.bluetooth.ep.oob"
-            .getBytes(Charset.forName("US_ASCII"));
-    private static final byte[] TYPE_BLE_OOB = "application/vnd.bluetooth.le.oob"
-            .getBytes(Charset.forName("US_ASCII"));
-
-    private static final byte[] TYPE_NOKIA = "nokia.com:bt".getBytes(Charset.forName("US_ASCII"));
-
-    private static final byte[] RTD_COLLISION_RESOLUTION = {0x63, 0x72}; // "cr";
-
-    private static final int CARRIER_POWER_STATE_INACTIVE = 0;
-    private static final int CARRIER_POWER_STATE_ACTIVE = 1;
-    private static final int CARRIER_POWER_STATE_ACTIVATING = 2;
-    private static final int CARRIER_POWER_STATE_UNKNOWN = 3;
-
-    private static final int BT_HANDOVER_TYPE_MAC = 0x1B;
-    private static final int BT_HANDOVER_TYPE_LE_ROLE = 0x1C;
-    private static final int BT_HANDOVER_TYPE_LONG_LOCAL_NAME = 0x09;
-    private static final int BT_HANDOVER_TYPE_SHORT_LOCAL_NAME = 0x08;
-    public static final int BT_HANDOVER_LE_ROLE_CENTRAL_ONLY = 0x01;
-
-    static final String ACTION_WHITELIST_DEVICE =
-            "android.btopp.intent.action.WHITELIST_DEVICE";
-
-    static final int MSG_HANDOVER_COMPLETE = 0;
-    static final int MSG_HEADSET_CONNECTED = 1;
-    static final int MSG_HEADSET_NOT_CONNECTED = 2;
-
-    private final Context mContext;
-    private final BluetoothAdapter mBluetoothAdapter;
-    private final MessageHandler mHandler = new MessageHandler();
-    private final Messenger mMessenger = new Messenger(mHandler);
-
-    private final Object mLock = new Object();
-    // Variables below synchronized on mLock
-    /* package as optimization */ HashMap<Integer, PendingHandoverTransfer> mPendingTransfers;
-    private ArrayList<Message> mPendingServiceMessages;
-    /* package as optimization */ boolean mBluetoothHeadsetPending;
-    /* package as optimization */ boolean mBluetoothHeadsetConnected;
-    protected boolean mBluetoothEnabledByNfc;
-    private int mHandoverTransferId;
-    private Messenger mService = null;
-    private boolean mBinding = false;
-    private boolean mBound;
-    private String mLocalBluetoothAddress;
-    private boolean mEnabled;
-
-    static class BluetoothHandoverData {
-        public boolean valid = false;
-        public BluetoothDevice device;
-        public String name;
-        public boolean carrierActivating = false;
-        public int transport = BluetoothDevice.TRANSPORT_AUTO;
-    }
-
-    class MessageHandler extends Handler {
-        @Override
-        public void handleMessage(Message msg) {
-            synchronized (mLock) {
-                switch (msg.what) {
-                    case MSG_HANDOVER_COMPLETE:
-                        int transferId = msg.arg1;
-                        Log.d(TAG, "Completed transfer id: " + Integer.toString(transferId));
-                        if (mPendingTransfers.containsKey(transferId)) {
-                            mPendingTransfers.remove(transferId);
-                          } else {
-                            Log.e(TAG, "Could not find completed transfer id: " +
-                                    Integer.toString(transferId));
-                        }
-                        break;
-                    case MSG_HEADSET_CONNECTED:
-                        mBluetoothEnabledByNfc = msg.arg1 != 0;
-                        mBluetoothHeadsetConnected = true;
-                        mBluetoothHeadsetPending = false;
-                        break;
-                    case MSG_HEADSET_NOT_CONNECTED:
-                        mBluetoothEnabledByNfc = false; // No need to maintain this state any longer
-                        mBluetoothHeadsetConnected = false;
-                        mBluetoothHeadsetPending = false;
-                        break;
-                    default:
-                        break;
-                }
-                unbindServiceIfNeededLocked(false);
-            }
-        }
-    };
-
-    private ServiceConnection mConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            synchronized (mLock) {
-                mService = new Messenger(service);
-                mBinding = false;
-                mBound = true;
-                // Register this client and transfer last known service state
-                Message msg = Message.obtain(null, HandoverService.MSG_REGISTER_CLIENT);
-                msg.arg1 = mBluetoothEnabledByNfc ? 1 : 0;
-                msg.arg2 = mBluetoothHeadsetConnected ? 1 : 0;
-                msg.replyTo = mMessenger;
-                try {
-                    mService.send(msg);
-                } catch (RemoteException e) {
-                    Log.e(TAG, "Failed to register client");
-                }
-                // Send all queued messages
-                while (!mPendingServiceMessages.isEmpty()) {
-                    msg = mPendingServiceMessages.remove(0);
-                    try {
-                        mService.send(msg);
-                    } catch (RemoteException e) {
-                        Log.e(TAG, "Failed to send queued message to service");
-                    }
-                }
-            }
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            synchronized (mLock) {
-                Log.d(TAG, "Service disconnected");
-                if (mService != null) {
-                    try {
-                        Message msg = Message.obtain(null, HandoverService.MSG_DEREGISTER_CLIENT);
-                        msg.replyTo = mMessenger;
-                        mService.send(msg);
-                    } catch (RemoteException e) {
-                        // Service may have crashed - ignore
-                    }
-                }
-                mService = null;
-                mBound = false;
-                mBluetoothHeadsetPending = false;
-                mPendingTransfers.clear();
-                mPendingServiceMessages.clear();
-            }
-        }
-    };
-
-    public HandoverManager(Context context) {
-        mContext = context;
-        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-        mPendingTransfers = new HashMap<Integer, PendingHandoverTransfer>();
-        mPendingServiceMessages = new ArrayList<Message>();
-
-        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
-        mContext.registerReceiver(mReceiver, filter, null, null);
-        mEnabled = true;
-        mBluetoothEnabledByNfc = false;
-    }
-
-    final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (action.equals(Intent.ACTION_USER_SWITCHED)) {
-                // Just force unbind the service.
-                unbindServiceIfNeededLocked(true);
-            }
-        }
-    };
-
-    /**
-     * @return whether the service was bound to successfully
-     */
-    boolean bindServiceIfNeededLocked() {
-        if (!mBinding) {
-            Log.d(TAG, "Binding to handover service");
-            boolean bindSuccess = mContext.bindServiceAsUser(new Intent(mContext,
-                    HandoverService.class), mConnection, Context.BIND_AUTO_CREATE,
-                    UserHandle.CURRENT);
-            mBinding = bindSuccess;
-            return bindSuccess;
-        } else {
-           // A previous bind is pending
-           return true;
-        }
-    }
-
-    void unbindServiceIfNeededLocked(boolean force) {
-        // If no service operation is pending, unbind
-        if (mBound && (force || (!mBluetoothHeadsetPending && mPendingTransfers.isEmpty()))) {
-            Log.d(TAG, "Unbinding from service.");
-            mContext.unbindService(mConnection);
-            mBound = false;
-            mPendingServiceMessages.clear();
-            mBluetoothHeadsetPending = false;
-            mPendingTransfers.clear();
-        }
-        return;
-    }
-
-    static NdefRecord createCollisionRecord() {
-        byte[] random = new byte[2];
-        new Random().nextBytes(random);
-        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, RTD_COLLISION_RESOLUTION, null, random);
-    }
-
-    NdefRecord createBluetoothAlternateCarrierRecord(boolean activating) {
-        byte[] payload = new byte[4];
-        payload[0] = (byte) (activating ? CARRIER_POWER_STATE_ACTIVATING :
-            CARRIER_POWER_STATE_ACTIVE);  // Carrier Power State: Activating or active
-        payload[1] = 1;   // length of carrier data reference
-        payload[2] = 'b'; // carrier data reference: ID for Bluetooth OOB data record
-        payload[3] = 0;  // Auxiliary data reference count
-        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_ALTERNATIVE_CARRIER, null, payload);
-    }
-
-    NdefRecord createBluetoothOobDataRecord() {
-        byte[] payload = new byte[8];
-        // Note: this field should be little-endian per the BTSSP spec
-        // The Android 4.1 implementation used big-endian order here.
-        // No single Android implementation has ever interpreted this
-        // length field when parsing this record though.
-        payload[0] = (byte) (payload.length & 0xFF);
-        payload[1] = (byte) ((payload.length >> 8) & 0xFF);
-
-        synchronized (mLock) {
-            if (mLocalBluetoothAddress == null) {
-                mLocalBluetoothAddress = mBluetoothAdapter.getAddress();
-            }
-
-            byte[] addressBytes = addressToReverseBytes(mLocalBluetoothAddress);
-            System.arraycopy(addressBytes, 0, payload, 2, 6);
-        }
-
-        return new NdefRecord(NdefRecord.TNF_MIME_MEDIA, TYPE_BT_OOB, new byte[]{'b'}, payload);
-    }
-
-    public void setEnabled(boolean enabled) {
-        synchronized (mLock) {
-            mEnabled = enabled;
-        }
-    }
-
-    public boolean isHandoverSupported() {
-        return (mBluetoothAdapter != null);
-    }
-
-    public NdefMessage createHandoverRequestMessage() {
-        if (mBluetoothAdapter == null) {
-            return null;
-        }
-
-        NdefRecord[] dataRecords = new NdefRecord[] {
-                createBluetoothOobDataRecord()
-        };
-        return new NdefMessage(
-                createHandoverRequestRecord(),
-                dataRecords);
-    }
-
-    NdefMessage createBluetoothHandoverSelectMessage(boolean activating) {
-        return new NdefMessage(createHandoverSelectRecord(
-                createBluetoothAlternateCarrierRecord(activating)),
-                createBluetoothOobDataRecord());
-    }
-
-    NdefRecord createHandoverSelectRecord(NdefRecord alternateCarrier) {
-        NdefMessage nestedMessage = new NdefMessage(alternateCarrier);
-        byte[] nestedPayload = nestedMessage.toByteArray();
-
-        ByteBuffer payload = ByteBuffer.allocate(nestedPayload.length + 1);
-        payload.put((byte)0x12);  // connection handover v1.2
-        payload.put(nestedPayload);
-
-        byte[] payloadBytes = new byte[payload.position()];
-        payload.position(0);
-        payload.get(payloadBytes);
-        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_HANDOVER_SELECT, null,
-                payloadBytes);
-    }
-
-    NdefRecord createHandoverRequestRecord() {
-        NdefRecord[] messages = new NdefRecord[] {
-                createBluetoothAlternateCarrierRecord(false)
-        };
-
-        NdefMessage nestedMessage = new NdefMessage(createCollisionRecord(), messages);
-
-        byte[] nestedPayload = nestedMessage.toByteArray();
-
-        ByteBuffer payload = ByteBuffer.allocate(nestedPayload.length + 1);
-        payload.put((byte) 0x12);  // connection handover v1.2
-        payload.put(nestedMessage.toByteArray());
-
-        byte[] payloadBytes = new byte[payload.position()];
-        payload.position(0);
-        payload.get(payloadBytes);
-        return new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_HANDOVER_REQUEST, null,
-                payloadBytes);
-    }
-
-    /**
-     * Return null if message is not a Handover Request,
-     * return the Handover Select response if it is.
-     */
-    public NdefMessage tryHandoverRequest(NdefMessage m) {
-        if (m == null) return null;
-        if (mBluetoothAdapter == null) return null;
-
-        if (DBG) Log.d(TAG, "tryHandoverRequest():" + m.toString());
-
-        NdefRecord handoverRequestRecord = m.getRecords()[0];
-        if (handoverRequestRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
-            return null;
-        }
-
-        if (!Arrays.equals(handoverRequestRecord.getType(), NdefRecord.RTD_HANDOVER_REQUEST)) {
-            return null;
-        }
-
-        // we have a handover request, look for BT OOB record
-        BluetoothHandoverData bluetoothData = null;
-        for (NdefRecord dataRecord : m.getRecords()) {
-            if (dataRecord.getTnf() == NdefRecord.TNF_MIME_MEDIA) {
-                if (Arrays.equals(dataRecord.getType(), TYPE_BT_OOB)) {
-                    bluetoothData = parseBtOob(ByteBuffer.wrap(dataRecord.getPayload()));
-                }
-            }
-        }
-
-        return tryBluetoothHandoverRequest(bluetoothData);
-    }
-
-    private NdefMessage tryBluetoothHandoverRequest(BluetoothHandoverData bluetoothData) {
-        NdefMessage selectMessage = null;
-        if (bluetoothData != null) {
-
-            // Note: there could be a race where we conclude
-            // that Bluetooth is already enabled, and shortly
-            // after the user turns it off. That will cause
-            // the transfer to fail, but there's nothing
-            // much we can do about it anyway. It shouldn't
-            // be common for the user to be changing BT settings
-            // while waiting to receive a picture.
-            boolean bluetoothActivating = !mBluetoothAdapter.isEnabled();
-            synchronized (mLock) {
-                if (!mEnabled) return null;
-
-                Message msg = Message.obtain(null, HandoverService.MSG_START_INCOMING_TRANSFER);
-                PendingHandoverTransfer transfer
-                        = registerBluetoothInTransferLocked(bluetoothData.device);
-                Bundle transferData = new Bundle();
-                transferData.putParcelable(HandoverService.BUNDLE_TRANSFER, transfer);
-                msg.setData(transferData);
-
-                if (!sendOrQueueMessageLocked(msg)) {
-                    removeTransferLocked(transfer.id);
-                    return null;
-                }
-            }
-            // BT OOB found, whitelist it for incoming OPP data
-            whitelistOppDevice(bluetoothData.device);
-
-            // return BT OOB record so they can perform handover
-            selectMessage = (createBluetoothHandoverSelectMessage(bluetoothActivating));
-            if (DBG) Log.d(TAG, "Waiting for incoming transfer, [" +
-                    bluetoothData.device.getAddress() + "]->[" + mLocalBluetoothAddress + "]");
-        }
-
-        return selectMessage;
-    }
-
-    public boolean sendOrQueueMessageLocked(Message msg) {
-        if (!mBound || mService == null) {
-            // Need to start service, let us know if we can queue the message
-            if (!bindServiceIfNeededLocked()) {
-                Log.e(TAG, "Could not start service");
-                return false;
-            }
-            // Queue the message to send when the service is bound
-            mPendingServiceMessages.add(msg);
-        } else {
-            try {
-                mService.send(msg);
-            } catch (RemoteException e) {
-                Log.e(TAG, "Could not connect to handover service");
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public boolean tryHandover(NdefMessage m) {
-        if (m == null) return false;
-        if (mBluetoothAdapter == null) return false;
-
-        if (DBG) Log.d(TAG, "tryHandover(): " + m.toString());
-
-        BluetoothHandoverData handover = parseBluetooth(m);
-        if (handover == null) return false;
-        if (!handover.valid) return true;
-
-        synchronized (mLock) {
-            if (!mEnabled) return false;
-
-            if (mBluetoothAdapter == null) {
-                if (DBG) Log.d(TAG, "BT handover, but BT not available");
-                return true;
-            }
-
-            Message msg = Message.obtain(null, HandoverService.MSG_PERIPHERAL_HANDOVER, 0, 0);
-            Bundle headsetData = new Bundle();
-            headsetData.putParcelable(HandoverService.EXTRA_PERIPHERAL_DEVICE, handover.device);
-            headsetData.putString(HandoverService.EXTRA_PERIPHERAL_NAME, handover.name);
-            headsetData.putInt(HandoverService.EXTRA_PERIPHERAL_TRANSPORT, handover.transport);
-            msg.setData(headsetData);
-            return sendOrQueueMessageLocked(msg);
-        }
-    }
-
-    // This starts sending an Uri over BT
-    public void doHandoverUri(Uri[] uris,
-                              NdefMessage handoverResponse) {
-        if (mBluetoothAdapter == null) return;
-
-        BluetoothHandoverData data = parseBluetooth(handoverResponse);
-        if (data != null && data.valid) {
-            // Register a new handover transfer object
-            synchronized (mLock) {
-                Message msg = Message.obtain(null, HandoverService.MSG_START_OUTGOING_TRANSFER, 0, 0);
-                PendingHandoverTransfer transfer = registerBluetoothOutTransferLocked(data, uris);
-                Bundle transferData = new Bundle();
-                transferData.putParcelable(HandoverService.BUNDLE_TRANSFER, transfer);
-                msg.setData(transferData);
-                if (DBG) Log.d(TAG, "Initiating outgoing bluetooth transfer, [" +
-                        mLocalBluetoothAddress + "]->[" + data.device.getAddress() + "]");
-                sendOrQueueMessageLocked(msg);
-            }
-        }
-    }
-
-    PendingHandoverTransfer registerBluetoothInTransferLocked(BluetoothDevice remoteDevice) {
-        PendingHandoverTransfer transfer = PendingHandoverTransfer.forBluetoothDevice(
-                mHandoverTransferId++, true, remoteDevice, false, null);
-        mPendingTransfers.put(transfer.id, transfer);
-
-        return transfer;
-    }
-
-    PendingHandoverTransfer registerBluetoothOutTransferLocked(BluetoothHandoverData data,
-                                                               Uri[] uris) {
-        PendingHandoverTransfer transfer = PendingHandoverTransfer.forBluetoothDevice(
-                mHandoverTransferId++, false, data.device, data.carrierActivating, uris);
-        mPendingTransfers.put(transfer.id, transfer);
-        return transfer;
-    }
-
-    void removeTransferLocked(int id) {
-        mPendingTransfers.remove(id);
-    }
-
-    void whitelistOppDevice(BluetoothDevice device) {
-        if (DBG) Log.d(TAG, "Whitelisting " + device + " for BT OPP");
-        Intent intent = new Intent(ACTION_WHITELIST_DEVICE);
-        intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
-        mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT);
-    }
-
-    boolean isCarrierActivating(NdefRecord handoverRec, byte[] carrierId) {
-        byte[] payload = handoverRec.getPayload();
-        if (payload == null || payload.length <= 1) return false;
-        // Skip version
-        byte[] payloadNdef = new byte[payload.length - 1];
-        System.arraycopy(payload, 1, payloadNdef, 0, payload.length - 1);
-        NdefMessage msg;
-        try {
-            msg = new NdefMessage(payloadNdef);
-        } catch (FormatException e) {
-            return false;
-        }
-
-        for (NdefRecord alt : msg.getRecords()) {
-            byte[] acPayload = alt.getPayload();
-            if (acPayload != null) {
-                ByteBuffer buf = ByteBuffer.wrap(acPayload);
-                int cps = buf.get() & 0x03; // Carrier Power State is in lower 2 bits
-                int carrierRefLength = buf.get() & 0xFF;
-                if (carrierRefLength != carrierId.length) return false;
-
-                byte[] carrierRefId = new byte[carrierRefLength];
-                buf.get(carrierRefId);
-                if (Arrays.equals(carrierRefId, carrierId)) {
-                    // Found match, returning whether power state is activating
-                    return (cps == CARRIER_POWER_STATE_ACTIVATING);
-                }
-            }
-        }
-
-        return true;
-    }
-
-    BluetoothHandoverData parseBluetoothHandoverSelect(NdefMessage m) {
-        // TODO we could parse this a lot more strictly; right now
-        // we just search for a BT OOB record, and try to cross-reference
-        // the carrier state inside the 'hs' payload.
-        for (NdefRecord oob : m.getRecords()) {
-            if (oob.getTnf() == NdefRecord.TNF_MIME_MEDIA &&
-                    Arrays.equals(oob.getType(), TYPE_BT_OOB)) {
-                BluetoothHandoverData data = parseBtOob(ByteBuffer.wrap(oob.getPayload()));
-                if (data != null && isCarrierActivating(m.getRecords()[0], oob.getId())) {
-                    data.carrierActivating = true;
-                }
-                return data;
-            }
-
-            if (oob.getTnf() == NdefRecord.TNF_MIME_MEDIA &&
-                    Arrays.equals(oob.getType(), TYPE_BLE_OOB)) {
-                return parseBleOob(ByteBuffer.wrap(oob.getPayload()));
-            }
-        }
-
-        return null;
-    }
-
-    BluetoothHandoverData parseBluetooth(NdefMessage m) {
-        NdefRecord r = m.getRecords()[0];
-        short tnf = r.getTnf();
-        byte[] type = r.getType();
-
-        // Check for BT OOB record
-        if (r.getTnf() == NdefRecord.TNF_MIME_MEDIA && Arrays.equals(r.getType(), TYPE_BT_OOB)) {
-            return parseBtOob(ByteBuffer.wrap(r.getPayload()));
-        }
-
-        // Check for BLE OOB record
-        if (r.getTnf() == NdefRecord.TNF_MIME_MEDIA && Arrays.equals(r.getType(), TYPE_BLE_OOB)) {
-            return parseBleOob(ByteBuffer.wrap(r.getPayload()));
-        }
-
-        // Check for Handover Select, followed by a BT OOB record
-        if (tnf == NdefRecord.TNF_WELL_KNOWN &&
-                Arrays.equals(type, NdefRecord.RTD_HANDOVER_SELECT)) {
-            return parseBluetoothHandoverSelect(m);
-        }
-
-        // Check for Nokia BT record, found on some Nokia BH-505 Headsets
-        if (tnf == NdefRecord.TNF_EXTERNAL_TYPE && Arrays.equals(type, TYPE_NOKIA)) {
-            return parseNokia(ByteBuffer.wrap(r.getPayload()));
-        }
-
-        return null;
-    }
-
-    BluetoothHandoverData parseNokia(ByteBuffer payload) {
-        BluetoothHandoverData result = new BluetoothHandoverData();
-        result.valid = false;
-
-        try {
-            payload.position(1);
-            byte[] address = new byte[6];
-            payload.get(address);
-            result.device = mBluetoothAdapter.getRemoteDevice(address);
-            result.valid = true;
-            payload.position(14);
-            int nameLength = payload.get();
-            byte[] nameBytes = new byte[nameLength];
-            payload.get(nameBytes);
-            result.name = new String(nameBytes, Charset.forName("UTF-8"));
-        } catch (IllegalArgumentException e) {
-            Log.i(TAG, "nokia: invalid BT address");
-        } catch (BufferUnderflowException e) {
-            Log.i(TAG, "nokia: payload shorter than expected");
-        }
-        if (result.valid && result.name == null) result.name = "";
-        return result;
-    }
-
-    BluetoothHandoverData parseBtOob(ByteBuffer payload) {
-        BluetoothHandoverData result = new BluetoothHandoverData();
-        result.valid = false;
-
-        try {
-            payload.position(2); // length
-            byte[] address = parseMacFromBluetoothRecord(payload);
-            result.device = mBluetoothAdapter.getRemoteDevice(address);
-            result.valid = true;
-
-            while (payload.remaining() > 0) {
-                byte[] nameBytes;
-                int len = payload.get();
-                int type = payload.get();
-                switch (type) {
-                    case BT_HANDOVER_TYPE_SHORT_LOCAL_NAME:
-                        nameBytes = new byte[len - 1];
-                        payload.get(nameBytes);
-                        result.name = new String(nameBytes, Charset.forName("UTF-8"));
-                        break;
-                    case BT_HANDOVER_TYPE_LONG_LOCAL_NAME:
-                        if (result.name != null) break;  // prefer short name
-                        nameBytes = new byte[len - 1];
-                        payload.get(nameBytes);
-                        result.name = new String(nameBytes, Charset.forName("UTF-8"));
-                        break;
-                    default:
-                        payload.position(payload.position() + len - 1);
-                        break;
-                }
-            }
-        } catch (IllegalArgumentException e) {
-            Log.i(TAG, "BT OOB: invalid BT address");
-        } catch (BufferUnderflowException e) {
-            Log.i(TAG, "BT OOB: payload shorter than expected");
-        }
-        if (result.valid && result.name == null) result.name = "";
-        return result;
-    }
-
-    BluetoothHandoverData parseBleOob(ByteBuffer payload) {
-        BluetoothHandoverData result = new BluetoothHandoverData();
-        result.valid = false;
-        result.transport = BluetoothDevice.TRANSPORT_LE;
-
-        try {
-
-            while (payload.remaining() > 0) {
-                byte[] nameBytes;
-                int len = payload.get();
-                int type = payload.get();
-                switch (type) {
-                    case BT_HANDOVER_TYPE_MAC: // mac address
-                        byte[] address = parseMacFromBluetoothRecord(payload);
-                        payload.position(payload.position() + 1); // advance over random byte
-                        result.device = mBluetoothAdapter.getRemoteDevice(address);
-                        result.valid = true;
-                        break;
-                    case BT_HANDOVER_TYPE_LE_ROLE:
-                        byte role = payload.get();
-                        if (role == BT_HANDOVER_LE_ROLE_CENTRAL_ONLY) {
-                            // only central role supported, can't pair
-                            result.valid = false;
-                            return result;
-                        }
-                        break;
-                    case BT_HANDOVER_TYPE_LONG_LOCAL_NAME:
-                        nameBytes = new byte[len - 1];
-                        payload.get(nameBytes);
-                        result.name = new String(nameBytes, Charset.forName("UTF-8"));
-                        break;
-                    default:
-                        payload.position(payload.position() + len - 1);
-                        break;
-                }
-            }
-        } catch (IllegalArgumentException e) {
-            Log.i(TAG, "BT OOB: invalid BT address");
-        } catch (BufferUnderflowException e) {
-            Log.i(TAG, "BT OOB: payload shorter than expected");
-        }
-        if (result.valid && result.name == null) result.name = "";
-        return result;
-    }
-
-    private byte[] parseMacFromBluetoothRecord(ByteBuffer payload) {
-        byte[] address = new byte[6];
-        payload.get(address);
-        // ByteBuffer.order(LITTLE_ENDIAN) doesn't work for
-        // ByteBuffer.get(byte[]), so manually swap order
-        for (int i = 0; i < 3; i++) {
-            byte temp = address[i];
-            address[i] = address[5 - i];
-            address[5 - i] = temp;
-        }
-        return address;
-    }
-
-    static byte[] addressToReverseBytes(String address) {
-        String[] split = address.split(":");
-        byte[] result = new byte[split.length];
-
-        for (int i = 0; i < split.length; i++) {
-            // need to parse as int because parseByte() expects a signed byte
-            result[split.length - 1 - i] = (byte)Integer.parseInt(split[i], 16);
-        }
-
-        return result;
-    }
-
-    final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
-    private static String byteArrayToHexString(byte[] bytes) {
-        char[] hexChars = new char[bytes.length * 2];
-        for ( int j = 0; j < bytes.length; j++ ) {
-            int v = bytes[j] & 0xFF;
-            hexChars[j * 2] = hexArray[v >>> 4];
-            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
-        }
-        return new String(hexChars);
-    }
-}
-
diff --git a/src/com/android/nfc/handover/HandoverServer.java b/src/com/android/nfc/handover/HandoverServer.java
index 093d1dd..23ac1d9 100644
--- a/src/com/android/nfc/handover/HandoverServer.java
+++ b/src/com/android/nfc/handover/HandoverServer.java
@@ -15,40 +15,50 @@
  */
 package com.android.nfc.handover;
 
-import android.nfc.FormatException;
-import android.nfc.NdefMessage;
-import android.util.Log;
-
-import com.android.nfc.LlcpException;
-import com.android.nfc.NfcService;
 import com.android.nfc.DeviceHost.LlcpServerSocket;
 import com.android.nfc.DeviceHost.LlcpSocket;
+import com.android.nfc.LlcpException;
+import com.android.nfc.NfcService;
+import com.android.nfc.beam.BeamManager;
+import com.android.nfc.beam.BeamReceiveService;
+import com.android.nfc.beam.BeamTransferRecord;
+
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.content.Intent;
+import android.nfc.FormatException;
+import android.nfc.NdefMessage;
+import android.os.UserHandle;
+import android.util.Log;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.Arrays;
 
 public final class HandoverServer {
-    public static final String HANDOVER_SERVICE_NAME = "urn:nfc:sn:handover";
-    public static final String TAG = "HandoverServer";
-    public static final Boolean DBG = false;
+    static final String HANDOVER_SERVICE_NAME = "urn:nfc:sn:handover";
+    static final String TAG = "HandoverServer";
+    static final Boolean DBG = false;
 
-    public static final int MIU = 128;
+    static final int MIU = 128;
 
-    final HandoverManager mHandoverManager;
+    final HandoverDataParser mHandoverDataParser;
     final int mSap;
     final Callback mCallback;
+    private final Context mContext;
 
     ServerThread mServerThread = null;
     boolean mServerRunning = false;
 
     public interface Callback {
         void onHandoverRequestReceived();
+        void onHandoverBusy();
     }
 
-    public HandoverServer(int sap, HandoverManager manager, Callback callback) {
+    public HandoverServer(Context context, int sap, HandoverDataParser manager, Callback callback) {
+        mContext = context;
         mSap = sap;
-        mHandoverManager = manager;
+        mHandoverDataParser = manager;
         mCallback = callback;
     }
 
@@ -191,16 +201,24 @@
                     }
 
                     if (handoverRequestMsg != null) {
+                        BeamManager beamManager = BeamManager.getInstance();
+
+                        if (beamManager.isBeamInProgress()) {
+                            mCallback.onHandoverBusy();
+                            break;
+                        }
+
                         // 2) convert to handover response
-                        NdefMessage resp = mHandoverManager.tryHandoverRequest(handoverRequestMsg);
-                        if (resp == null) {
+                        HandoverDataParser.IncomingHandoverData handoverData
+                                = mHandoverDataParser.getIncomingHandoverData(handoverRequestMsg);
+                        if (handoverData == null) {
                             Log.e(TAG, "Failed to create handover response");
                             break;
                         }
 
                         // 3) send handover response
                         int offset = 0;
-                        byte[] buffer = resp.toByteArray();
+                        byte[] buffer = handoverData.handoverSelect.toByteArray();
                         int remoteMiu = mSock.getRemoteMiu();
                         while (offset < buffer.length) {
                             int length = Math.min(buffer.length - offset, remoteMiu);
@@ -210,6 +228,10 @@
                         }
                         // We're done
                         mCallback.onHandoverRequestReceived();
+                        if (!beamManager.startBeamReceive(mContext, handoverData.handoverData)) {
+                            mCallback.onHandoverBusy();
+                            break;
+                        }
                         // We can process another handover transfer
                         byteStream = new ByteArrayOutputStream();
                     }
@@ -238,3 +260,4 @@
         }
     }
 }
+
diff --git a/src/com/android/nfc/handover/HandoverService.java b/src/com/android/nfc/handover/HandoverService.java
deleted file mode 100644
index b2c7814..0000000
--- a/src/com/android/nfc/handover/HandoverService.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.nfc.handover;
-
-import android.app.Service;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.media.AudioManager;
-import android.media.SoundPool;
-import android.net.Uri;
-import android.nfc.NfcAdapter;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.Pair;
-
-import com.android.nfc.R;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Queue;
-
-public class HandoverService extends Service implements HandoverTransfer.Callback,
-        BluetoothPeripheralHandover.Callback {
-
-    static final String TAG = "HandoverService";
-    static final boolean DBG = true;
-
-    static final int MSG_REGISTER_CLIENT = 0;
-    static final int MSG_DEREGISTER_CLIENT = 1;
-    static final int MSG_START_INCOMING_TRANSFER = 2;
-    static final int MSG_START_OUTGOING_TRANSFER = 3;
-    static final int MSG_PERIPHERAL_HANDOVER = 4;
-    static final int MSG_PAUSE_POLLING = 5;
-
-
-    static final String BUNDLE_TRANSFER = "transfer";
-
-    static final String EXTRA_PERIPHERAL_DEVICE = "device";
-    static final String EXTRA_PERIPHERAL_NAME = "headsetname";
-    static final String EXTRA_PERIPHERAL_TRANSPORT = "transporttype";
-
-    public static final String ACTION_CANCEL_HANDOVER_TRANSFER =
-            "com.android.nfc.handover.action.CANCEL_HANDOVER_TRANSFER";
-
-    public static final String EXTRA_INCOMING =
-            "com.android.nfc.handover.extra.INCOMING";
-
-    public static final String ACTION_HANDOVER_STARTED =
-            "android.nfc.handover.intent.action.HANDOVER_STARTED";
-
-    public static final String ACTION_TRANSFER_PROGRESS =
-            "android.nfc.handover.intent.action.TRANSFER_PROGRESS";
-
-    public static final String ACTION_TRANSFER_DONE =
-            "android.nfc.handover.intent.action.TRANSFER_DONE";
-
-    public static final String EXTRA_TRANSFER_STATUS =
-            "android.nfc.handover.intent.extra.TRANSFER_STATUS";
-
-    public static final String EXTRA_TRANSFER_MIMETYPE =
-            "android.nfc.handover.intent.extra.TRANSFER_MIME_TYPE";
-
-    public static final String EXTRA_ADDRESS =
-            "android.nfc.handover.intent.extra.ADDRESS";
-
-    public static final String EXTRA_TRANSFER_DIRECTION =
-            "android.nfc.handover.intent.extra.TRANSFER_DIRECTION";
-
-    public static final String EXTRA_TRANSFER_ID =
-            "android.nfc.handover.intent.extra.TRANSFER_ID";
-
-    public static final String EXTRA_TRANSFER_PROGRESS =
-            "android.nfc.handover.intent.extra.TRANSFER_PROGRESS";
-
-    public static final String EXTRA_TRANSFER_URI =
-            "android.nfc.handover.intent.extra.TRANSFER_URI";
-
-    public static final String EXTRA_OBJECT_COUNT =
-            "android.nfc.handover.intent.extra.OBJECT_COUNT";
-
-    public static final String EXTRA_HANDOVER_DEVICE_TYPE =
-            "android.nfc.handover.intent.extra.HANDOVER_DEVICE_TYPE";
-
-    public static final int DIRECTION_INCOMING = 0;
-    public static final int DIRECTION_OUTGOING = 1;
-
-    public static final int HANDOVER_TRANSFER_STATUS_SUCCESS = 0;
-    public static final int HANDOVER_TRANSFER_STATUS_FAILURE = 1;
-
-    // permission needed to be able to receive handover status requests
-    public static final String HANDOVER_STATUS_PERMISSION =
-            "android.permission.NFC_HANDOVER_STATUS";
-
-    // Amount of time to pause polling when connecting to peripherals
-    private static final int PAUSE_POLLING_TIMEOUT_MS = 35000;
-    public static final int PAUSE_DELAY_MILLIS = 300;
-
-    // Variables below only accessed on main thread
-    final Queue<BluetoothOppHandover> mPendingOutTransfers;
-    final HashMap<Pair<String, Boolean>, HandoverTransfer> mBluetoothTransfers;
-    final Messenger mMessenger;
-
-    SoundPool mSoundPool;
-    int mSuccessSound;
-
-    BluetoothAdapter mBluetoothAdapter;
-    NfcAdapter mNfcAdapter;
-    Messenger mClient;
-    Handler mHandler;
-    BluetoothPeripheralHandover mBluetoothPeripheralHandover;
-    boolean mBluetoothHeadsetConnected;
-    boolean mBluetoothEnabledByNfc;
-
-    private HandoverTransfer mWifiTransfer;
-
-    class MessageHandler extends Handler {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_REGISTER_CLIENT:
-                    mClient = msg.replyTo;
-                    // Restore state from previous instance
-                    mBluetoothEnabledByNfc = msg.arg1 != 0;
-                    mBluetoothHeadsetConnected = msg.arg2 != 0;
-                    break;
-                case MSG_DEREGISTER_CLIENT:
-                    mClient = null;
-                    break;
-                case MSG_START_INCOMING_TRANSFER:
-                    doIncomingTransfer(msg);
-                    break;
-                case MSG_START_OUTGOING_TRANSFER:
-                    doOutgoingTransfer(msg);
-                    break;
-                case MSG_PERIPHERAL_HANDOVER:
-                    doPeripheralHandover(msg);
-                    break;
-                case MSG_PAUSE_POLLING:
-                    mNfcAdapter.pausePolling(PAUSE_POLLING_TIMEOUT_MS);
-                    break;
-            }
-        }
-
-    }
-
-    final BroadcastReceiver mHandoverStatusReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            int deviceType = intent.getIntExtra(EXTRA_HANDOVER_DEVICE_TYPE,
-                    HandoverTransfer.DEVICE_TYPE_BLUETOOTH);
-
-            if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
-                handleBluetoothStateChanged(intent);
-            } else if (action.equals(ACTION_CANCEL_HANDOVER_TRANSFER)) {
-                handleCancelTransfer(intent, deviceType);
-            } else if (action.equals(ACTION_TRANSFER_PROGRESS) ||
-                    action.equals(ACTION_TRANSFER_DONE) ||
-                    action.equals(ACTION_HANDOVER_STARTED)) {
-                handleTransferEvent(intent, deviceType);
-            }
-        }
-    };
-
-    public HandoverService() {
-        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-        mPendingOutTransfers = new LinkedList<BluetoothOppHandover>();
-        mBluetoothTransfers = new HashMap<Pair<String, Boolean>, HandoverTransfer>();
-        mHandler = new MessageHandler();
-        mMessenger = new Messenger(mHandler);
-        mBluetoothHeadsetConnected = false;
-        mBluetoothEnabledByNfc = false;
-    }
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
-
-        mSoundPool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0);
-        mSuccessSound = mSoundPool.load(this, R.raw.end, 1);
-        mNfcAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());
-
-        IntentFilter filter = new IntentFilter(ACTION_TRANSFER_DONE);
-        filter.addAction(ACTION_TRANSFER_PROGRESS);
-        filter.addAction(ACTION_CANCEL_HANDOVER_TRANSFER);
-        filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
-        filter.addAction(ACTION_HANDOVER_STARTED);
-        registerReceiver(mHandoverStatusReceiver, filter, HANDOVER_STATUS_PERMISSION, mHandler);
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        if (mSoundPool != null) {
-            mSoundPool.release();
-        }
-        unregisterReceiver(mHandoverStatusReceiver);
-    }
-
-    void doOutgoingTransfer(Message msg) {
-        Bundle msgData = msg.getData();
-
-        msgData.setClassLoader(getClassLoader());
-        PendingHandoverTransfer pendingTransfer = msgData.getParcelable(BUNDLE_TRANSFER);
-        createHandoverTransfer(pendingTransfer);
-
-        if (pendingTransfer.deviceType == HandoverTransfer.DEVICE_TYPE_BLUETOOTH) {
-            // Create the actual bluetooth transfer
-
-            BluetoothOppHandover handover = new BluetoothOppHandover(HandoverService.this,
-                    pendingTransfer.remoteDevice, pendingTransfer.uris,
-                    pendingTransfer.remoteActivating);
-            if (mBluetoothAdapter.isEnabled()) {
-                // Start the transfer
-                handover.start();
-            } else {
-                if (!enableBluetooth()) {
-                    Log.e(TAG, "Error enabling Bluetooth.");
-                    notifyClientTransferComplete(pendingTransfer.id);
-                    return;
-                }
-                if (DBG) Log.d(TAG, "Queueing out transfer " + Integer.toString(pendingTransfer.id));
-                mPendingOutTransfers.add(handover);
-                // Queue the transfer and enable Bluetooth - when it is enabled
-                // the transfer will be started.
-            }
-        }
-    }
-
-    void doIncomingTransfer(Message msg) {
-        Bundle msgData = msg.getData();
-
-        msgData.setClassLoader(getClassLoader());
-        PendingHandoverTransfer pendingTransfer = msgData.getParcelable(BUNDLE_TRANSFER);
-        if (pendingTransfer.deviceType == HandoverTransfer.DEVICE_TYPE_BLUETOOTH &&
-                !mBluetoothAdapter.isEnabled() && !enableBluetooth()) {
-            Log.e(TAG, "Error enabling Bluetooth.");
-            notifyClientTransferComplete(pendingTransfer.id);
-            return;
-        }
-        createHandoverTransfer(pendingTransfer);
-        // Remote device will connect and finish the transfer
-    }
-
-    void doPeripheralHandover(Message msg) {
-        Bundle msgData = msg.getData();
-        BluetoothDevice device = msgData.getParcelable(EXTRA_PERIPHERAL_DEVICE);
-        String name = msgData.getString(EXTRA_PERIPHERAL_NAME);
-        int transport = msgData.getInt(EXTRA_PERIPHERAL_TRANSPORT);
-        if (mBluetoothPeripheralHandover != null) {
-           Log.d(TAG, "Ignoring pairing request, existing handover in progress.");
-           return;
-        }
-        mBluetoothPeripheralHandover = new BluetoothPeripheralHandover(HandoverService.this,
-                device, name, transport, HandoverService.this);
-        // TODO: figure out a way to disable polling without deactivating current target
-        if (transport == BluetoothDevice.TRANSPORT_LE) {
-            mHandler.sendMessageDelayed(
-                    mHandler.obtainMessage(MSG_PAUSE_POLLING), PAUSE_DELAY_MILLIS);
-        }
-        if (mBluetoothAdapter.isEnabled()) {
-            if (!mBluetoothPeripheralHandover.start()) {
-                mNfcAdapter.resumePolling();
-            }
-        } else {
-            // Once BT is enabled, the headset pairing will be started
-
-            if (!enableBluetooth()) {
-                Log.e(TAG, "Error enabling Bluetooth.");
-                mBluetoothPeripheralHandover = null;
-            }
-        }
-    }
-
-    void startPendingTransfers() {
-        while (!mPendingOutTransfers.isEmpty()) {
-             BluetoothOppHandover handover = mPendingOutTransfers.remove();
-             handover.start();
-        }
-    }
-
-    boolean enableBluetooth() {
-        if (!mBluetoothAdapter.isEnabled()) {
-            mBluetoothEnabledByNfc = true;
-            return mBluetoothAdapter.enableNoAutoConnect();
-        }
-        return true;
-    }
-
-    void disableBluetoothIfNeeded() {
-        if (!mBluetoothEnabledByNfc) return;
-
-        if (mBluetoothTransfers.size() == 0 && !mBluetoothHeadsetConnected) {
-            mBluetoothAdapter.disable();
-            mBluetoothEnabledByNfc = false;
-        }
-    }
-
-    void createHandoverTransfer(PendingHandoverTransfer pendingTransfer) {
-        HandoverTransfer transfer;
-        String macAddress;
-
-        if (pendingTransfer.deviceType == HandoverTransfer.DEVICE_TYPE_BLUETOOTH) {
-            macAddress = pendingTransfer.remoteDevice.getAddress();
-            transfer = maybeCreateHandoverTransfer(macAddress,
-                    pendingTransfer.incoming, pendingTransfer);
-        } else {
-            Log.e(TAG, "Invalid device type [" + pendingTransfer.deviceType + "] received.");
-            return;
-        }
-
-        if (transfer != null) {
-            transfer.updateNotification();
-        }
-    }
-
-    HandoverTransfer maybeCreateHandoverTransfer(String address, boolean incoming,
-                                                 PendingHandoverTransfer pendingTransfer) {
-        HandoverTransfer transfer;
-        Pair<String, Boolean> key = new Pair<String, Boolean>(address, incoming);
-
-        if (mBluetoothTransfers.containsKey(key)) {
-            transfer = mBluetoothTransfers.get(key);
-            if (!transfer.isRunning()) {
-                mBluetoothTransfers.remove(key); // new one created below
-            } else {
-                // There is already a transfer running to this
-                // device - it will automatically get combined
-                // with the existing transfer.
-                notifyClientTransferComplete(pendingTransfer.id);
-                return null;
-            }
-        } else {
-            transfer = new HandoverTransfer(this, this, pendingTransfer);
-        }
-
-        mBluetoothTransfers.put(key, transfer);
-        return transfer;
-    }
-
-
-    HandoverTransfer findHandoverTransfer(String macAddress, boolean incoming) {
-        Pair<String, Boolean> key = new Pair<String, Boolean>(macAddress, incoming);
-        if (mBluetoothTransfers.containsKey(key)) {
-            HandoverTransfer transfer = mBluetoothTransfers.get(key);
-            if (transfer.isRunning()) {
-                return transfer;
-            }
-        }
-
-        return null;
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-       return mMessenger.getBinder();
-    }
-
-    private void handleTransferEvent(Intent intent, int deviceType) {
-        String action = intent.getAction();
-        int direction = intent.getIntExtra(EXTRA_TRANSFER_DIRECTION, -1);
-        int id = intent.getIntExtra(EXTRA_TRANSFER_ID, -1);
-        if (action.equals(ACTION_HANDOVER_STARTED)) {
-            // This is always for incoming transfers
-            direction = DIRECTION_INCOMING;
-        }
-        String sourceAddress = intent.getStringExtra(EXTRA_ADDRESS);
-
-        if (direction == -1 || sourceAddress == null) return;
-        boolean incoming = (direction == DIRECTION_INCOMING);
-
-        HandoverTransfer transfer =
-                findHandoverTransfer(sourceAddress, incoming);
-        if (transfer == null) {
-            // There is no transfer running for this source address; most likely
-            // the transfer was cancelled. We need to tell BT OPP to stop transferring.
-            if (id != -1) {
-                if (deviceType == HandoverTransfer.DEVICE_TYPE_BLUETOOTH) {
-                    if (DBG) Log.d(TAG, "Didn't find transfer, stopping");
-                    Intent cancelIntent = new Intent(
-                            "android.btopp.intent.action.STOP_HANDOVER_TRANSFER");
-                    cancelIntent.putExtra(EXTRA_TRANSFER_ID, id);
-                    sendBroadcast(cancelIntent);
-                }
-            }
-            return;
-        }
-
-        transfer.setBluetoothTransferId(id);
-
-        if (action.equals(ACTION_TRANSFER_DONE)) {
-            int handoverStatus = intent.getIntExtra(EXTRA_TRANSFER_STATUS,
-                    HANDOVER_TRANSFER_STATUS_FAILURE);
-            if (handoverStatus == HANDOVER_TRANSFER_STATUS_SUCCESS) {
-                String uriString = intent.getStringExtra(EXTRA_TRANSFER_URI);
-                String mimeType = intent.getStringExtra(EXTRA_TRANSFER_MIMETYPE);
-                Uri uri = Uri.parse(uriString);
-                if (uri != null && uri.getScheme() == null) {
-                    uri = Uri.fromFile(new File(uri.getPath()));
-                }
-                transfer.finishTransfer(true, uri, mimeType);
-            } else {
-                transfer.finishTransfer(false, null, null);
-            }
-        } else if (action.equals(ACTION_TRANSFER_PROGRESS)) {
-            float progress = intent.getFloatExtra(EXTRA_TRANSFER_PROGRESS, 0.0f);
-            transfer.updateFileProgress(progress);
-        } else if (action.equals(ACTION_HANDOVER_STARTED)) {
-            int count = intent.getIntExtra(EXTRA_OBJECT_COUNT, 0);
-            if (count > 0) {
-                transfer.setObjectCount(count);
-            }
-        }
-    }
-
-    private void handleCancelTransfer(Intent intent, int deviceType) {
-        String sourceAddress = intent.getStringExtra(EXTRA_ADDRESS);
-        int direction = intent.getIntExtra(EXTRA_INCOMING, -1);
-
-        if (direction == -1) {
-            return;
-        }
-
-        boolean incoming = direction == DIRECTION_INCOMING;
-        HandoverTransfer transfer = findHandoverTransfer(sourceAddress, incoming);
-
-        if (transfer != null) {
-            if (DBG) Log.d(TAG, "Cancelling transfer " + Integer.toString(transfer.mTransferId));
-            transfer.cancel();
-        }
-    }
-
-    private void handleBluetoothStateChanged(Intent intent) {
-        int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
-                BluetoothAdapter.ERROR);
-        if (state == BluetoothAdapter.STATE_ON) {
-            // If there is a pending device pairing, start it
-            if (mBluetoothPeripheralHandover != null &&
-                    !mBluetoothPeripheralHandover.hasStarted()) {
-                if (!mBluetoothPeripheralHandover.start()) {
-                    mNfcAdapter.resumePolling();
-                }
-            }
-
-            // Start any pending file transfers
-            startPendingTransfers();
-        } else if (state == BluetoothAdapter.STATE_OFF) {
-            mBluetoothEnabledByNfc = false;
-            mBluetoothHeadsetConnected = false;
-        }
-    }
-
-    void notifyClientTransferComplete(int transferId) {
-        if (mClient != null) {
-            Message msg = Message.obtain(null, HandoverManager.MSG_HANDOVER_COMPLETE);
-            msg.arg1 = transferId;
-            try {
-                mClient.send(msg);
-            } catch (RemoteException e) {
-                // Ignore
-            }
-        }
-    }
-
-    @Override
-    public boolean onUnbind(Intent intent) {
-        // prevent any future callbacks to the client, no rebind call needed.
-        mClient = null;
-        return false;
-    }
-
-    @Override
-    public void onTransferComplete(HandoverTransfer transfer, boolean success) {
-        // Called on the main thread
-
-        // First, remove the transfer from our list
-        synchronized (this) {
-            if (mWifiTransfer == transfer) {
-                mWifiTransfer = null;
-            }
-        }
-
-        if (mWifiTransfer == null) {
-            Iterator it = mBluetoothTransfers.entrySet().iterator();
-            while (it.hasNext()) {
-                Map.Entry hashPair = (Map.Entry)it.next();
-                HandoverTransfer transferEntry = (HandoverTransfer) hashPair.getValue();
-                if (transferEntry == transfer) {
-                    it.remove();
-                }
-            }
-        }
-
-        // Notify any clients of the service
-        notifyClientTransferComplete(transfer.getTransferId());
-
-        // Play success sound
-        if (success) {
-            mSoundPool.play(mSuccessSound, 1.0f, 1.0f, 0, 0, 1.0f);
-        } else {
-            if (DBG) Log.d(TAG, "Transfer failed, final state: " +
-                    Integer.toString(transfer.mState));
-        }
-        disableBluetoothIfNeeded();
-    }
-
-    @Override
-    public void onBluetoothPeripheralHandoverComplete(boolean connected) {
-        // Called on the main thread
-        int transport = mBluetoothPeripheralHandover.mTransport;
-        mBluetoothPeripheralHandover = null;
-        mBluetoothHeadsetConnected = connected;
-
-        // <hack> resume polling immediately if the connection failed,
-        // otherwise just wait for polling to come back up after the timeout
-        // This ensures we don't disconnect if the user left the volantis
-        // on the tag after pairing completed, which results in automatic
-        // disconnection </hack>
-        if (transport == BluetoothDevice.TRANSPORT_LE && !connected) {
-            if (mHandler.hasMessages(MSG_PAUSE_POLLING)) {
-                mHandler.removeMessages(MSG_PAUSE_POLLING);
-            }
-
-            // do this unconditionally as the polling could have been paused as we were removing
-            // the message in the handler. It's a no-op if polling is already enabled.
-            mNfcAdapter.resumePolling();
-        }
-
-        if (mClient != null) {
-            Message msg = Message.obtain(null,
-                    connected ? HandoverManager.MSG_HEADSET_CONNECTED
-                              : HandoverManager.MSG_HEADSET_NOT_CONNECTED);
-            msg.arg1 = mBluetoothEnabledByNfc ? 1 : 0;
-            try {
-                mClient.send(msg);
-            } catch (RemoteException e) {
-                // Ignore
-            }
-        }
-        disableBluetoothIfNeeded();
-    }
-}
diff --git a/src/com/android/nfc/handover/PendingHandoverTransfer.java b/src/com/android/nfc/handover/PendingHandoverTransfer.java
deleted file mode 100644
index 568b3ec..0000000
--- a/src/com/android/nfc/handover/PendingHandoverTransfer.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.nfc.handover;
-
-import android.bluetooth.BluetoothDevice;
-import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-public class PendingHandoverTransfer implements Parcelable {
-
-    public String remoteMacAddress; // For type WIFI only
-    public BluetoothDevice remoteDevice; // For type BLUETOOTH only
-    public int id;
-    public boolean incoming;
-    public boolean remoteActivating;
-    public Uri[] uris;
-    public int deviceType;
-
-    private PendingHandoverTransfer(int id, boolean incoming, BluetoothDevice remoteDevice,
-                            boolean remoteActivating, Uri[] uris) {
-        this.id = id;
-        this.incoming = incoming;
-        this.remoteDevice = remoteDevice;
-        this.remoteActivating = remoteActivating;
-        this.uris = uris;
-
-        this.deviceType = HandoverTransfer.DEVICE_TYPE_BLUETOOTH;
-    }
-
-    private PendingHandoverTransfer(int id, boolean incoming, String remoteMacAddress,
-                            boolean remoteActivating, Uri[] uris) {
-        this.id = id;
-        this.incoming = incoming;
-        this.remoteMacAddress = remoteMacAddress;
-        this.remoteActivating = remoteActivating;
-        this.uris = uris;
-
-        this.deviceType = HandoverTransfer.DEVICE_TYPE_WIFI;
-    }
-
-    public static final PendingHandoverTransfer forBluetoothDevice(
-            int id, boolean incoming, BluetoothDevice remoteDevice, boolean remoteActivating,
-            Uri[] uris) {
-       return new PendingHandoverTransfer(id, incoming, remoteDevice, remoteActivating, uris);
-    }
-
-    public static final PendingHandoverTransfer forWifiDevice(
-            int id, boolean incoming, String macAddress, boolean remoteActivating, Uri[] uris) {
-        return new PendingHandoverTransfer(id, incoming, macAddress, remoteActivating, uris);
-    }
-
-    public static final Parcelable.Creator<PendingHandoverTransfer> CREATOR
-            = new Parcelable.Creator<PendingHandoverTransfer>() {
-        public PendingHandoverTransfer createFromParcel(Parcel in) {
-            int id = in.readInt();
-            boolean incoming = (in.readInt() == 1) ? true : false;
-            int deviceType = in.readInt();
-            BluetoothDevice remoteDevice = null;
-            String remoteMac = null;
-            if (deviceType == HandoverTransfer.DEVICE_TYPE_BLUETOOTH) {
-                remoteDevice = in.readParcelable(getClass().getClassLoader());
-            } else {
-                remoteMac = in.readString();
-            }
-            boolean remoteActivating = (in.readInt() == 1) ? true : false;
-            int numUris = in.readInt();
-            Uri[] uris = null;
-            if (numUris > 0) {
-                uris = new Uri[numUris];
-                in.readTypedArray(uris, Uri.CREATOR);
-            }
-            if (deviceType == HandoverTransfer.DEVICE_TYPE_BLUETOOTH) {
-                return new PendingHandoverTransfer(id, incoming, remoteDevice,
-                        remoteActivating, uris);
-            } else {
-                return new PendingHandoverTransfer(id, incoming, remoteMac, remoteActivating, uris);
-            }
-        }
-
-        @Override
-        public PendingHandoverTransfer[] newArray(int size) {
-            return new PendingHandoverTransfer[size];
-        }
-    };
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(id);
-        dest.writeInt(incoming ? 1 : 0);
-        dest.writeInt(deviceType);
-        if (deviceType == HandoverTransfer.DEVICE_TYPE_BLUETOOTH) {
-            dest.writeParcelable(remoteDevice, 0);
-        } else {
-            dest.writeString(remoteMacAddress);
-        }
-        dest.writeInt(remoteActivating ? 1 : 0);
-        dest.writeInt(uris != null ? uris.length : 0);
-        if (uris != null && uris.length > 0) {
-            dest.writeTypedArray(uris, 0);
-        }
-    }
-}
diff --git a/src/com/android/nfc/handover/PeripheralHandoverService.java b/src/com/android/nfc/handover/PeripheralHandoverService.java
new file mode 100644
index 0000000..3e0f244
--- /dev/null
+++ b/src/com/android/nfc/handover/PeripheralHandoverService.java
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.nfc.handover;
+
+import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.media.SoundPool;
+import android.nfc.NfcAdapter;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.util.Log;
+
+import com.android.nfc.R;
+
+public class PeripheralHandoverService extends Service implements BluetoothPeripheralHandover.Callback {
+    static final String TAG = "PeripheralHandoverService";
+    static final boolean DBG = true;
+
+    static final int MSG_PAUSE_POLLING = 0;
+
+    public static final String BUNDLE_TRANSFER = "transfer";
+    public static final String EXTRA_PERIPHERAL_DEVICE = "device";
+    public static final String EXTRA_PERIPHERAL_NAME = "headsetname";
+    public static final String EXTRA_PERIPHERAL_TRANSPORT = "transporttype";
+
+    // Amount of time to pause polling when connecting to peripherals
+    private static final int PAUSE_POLLING_TIMEOUT_MS = 35000;
+    private static final int PAUSE_DELAY_MILLIS = 300;
+
+    // Variables below only accessed on main thread
+    final Messenger mMessenger;
+
+    SoundPool mSoundPool;
+    int mSuccessSound;
+    int mStartId;
+
+    BluetoothAdapter mBluetoothAdapter;
+    NfcAdapter mNfcAdapter;
+    Handler mHandler;
+    BluetoothPeripheralHandover mBluetoothPeripheralHandover;
+    boolean mBluetoothHeadsetConnected;
+    boolean mBluetoothEnabledByNfc;
+
+    class MessageHandler extends Handler {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_PAUSE_POLLING:
+                    mNfcAdapter.pausePolling(PAUSE_POLLING_TIMEOUT_MS);
+                    break;
+            }
+        }
+    }
+
+    final BroadcastReceiver mBluetoothStatusReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
+                handleBluetoothStateChanged(intent);
+            }
+        }
+    };
+
+    public PeripheralHandoverService() {
+        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        mHandler = new MessageHandler();
+        mMessenger = new Messenger(mHandler);
+        mBluetoothHeadsetConnected = false;
+        mBluetoothEnabledByNfc = false;
+        mStartId = 0;
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        if (mStartId != 0) {
+            // already running
+            return START_STICKY;
+        }
+
+        mStartId = startId;
+
+        if (intent == null) {
+            if (DBG) Log.e(TAG, "Intent is null, can't do peripheral handover.");
+            stopSelf(startId);
+            return START_NOT_STICKY;
+        }
+
+        if (doPeripheralHandover(intent.getExtras())) {
+            return START_STICKY;
+        } else {
+            stopSelf(startId);
+            return START_NOT_STICKY;
+        }
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+
+        mSoundPool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0);
+        mSuccessSound = mSoundPool.load(this, R.raw.end, 1);
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(getApplicationContext());
+
+        IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
+        registerReceiver(mBluetoothStatusReceiver, filter);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (mSoundPool != null) {
+            mSoundPool.release();
+        }
+        unregisterReceiver(mBluetoothStatusReceiver);
+    }
+
+    boolean doPeripheralHandover(Bundle msgData) {
+        if (mBluetoothPeripheralHandover != null) {
+            Log.d(TAG, "Ignoring pairing request, existing handover in progress.");
+            return true;
+        }
+
+        if (msgData == null) {
+            return false;
+        }
+
+        BluetoothDevice device = msgData.getParcelable(EXTRA_PERIPHERAL_DEVICE);
+        String name = msgData.getString(EXTRA_PERIPHERAL_NAME);
+        int transport = msgData.getInt(EXTRA_PERIPHERAL_TRANSPORT);
+
+        mBluetoothPeripheralHandover = new BluetoothPeripheralHandover(
+                this, device, name, transport, this);
+
+        if (transport == BluetoothDevice.TRANSPORT_LE) {
+            mHandler.sendMessageDelayed(
+                    mHandler.obtainMessage(MSG_PAUSE_POLLING), PAUSE_DELAY_MILLIS);
+        }
+        if (mBluetoothAdapter.isEnabled()) {
+            if (!mBluetoothPeripheralHandover.start()) {
+                mHandler.removeMessages(MSG_PAUSE_POLLING);
+                mNfcAdapter.resumePolling();
+            }
+        } else {
+            // Once BT is enabled, the headset pairing will be started
+            if (!enableBluetooth()) {
+                Log.e(TAG, "Error enabling Bluetooth.");
+                mBluetoothPeripheralHandover = null;
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private void handleBluetoothStateChanged(Intent intent) {
+        int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
+                BluetoothAdapter.ERROR);
+        if (state == BluetoothAdapter.STATE_ON) {
+            // If there is a pending device pairing, start it
+            if (mBluetoothPeripheralHandover != null &&
+                    !mBluetoothPeripheralHandover.hasStarted()) {
+                if (!mBluetoothPeripheralHandover.start()) {
+                    mNfcAdapter.resumePolling();
+                }
+            }
+        } else if (state == BluetoothAdapter.STATE_OFF) {
+            mBluetoothEnabledByNfc = false;
+            mBluetoothHeadsetConnected = false;
+        }
+    }
+
+    @Override
+    public void onBluetoothPeripheralHandoverComplete(boolean connected) {
+        // Called on the main thread
+        int transport = mBluetoothPeripheralHandover.mTransport;
+        mBluetoothPeripheralHandover = null;
+        mBluetoothHeadsetConnected = connected;
+
+        // <hack> resume polling immediately if the connection failed,
+        // otherwise just wait for polling to come back up after the timeout
+        // This ensures we don't disconnect if the user left the volantis
+        // on the tag after pairing completed, which results in automatic
+        // disconnection </hack>
+        if (transport == BluetoothDevice.TRANSPORT_LE && !connected) {
+            if (mHandler.hasMessages(MSG_PAUSE_POLLING)) {
+                mHandler.removeMessages(MSG_PAUSE_POLLING);
+            }
+
+            // do this unconditionally as the polling could have been paused as we were removing
+            // the message in the handler. It's a no-op if polling is already enabled.
+            mNfcAdapter.resumePolling();
+        }
+        disableBluetoothIfNeeded();
+        stopSelf(mStartId);
+    }
+
+
+    boolean enableBluetooth() {
+        if (!mBluetoothAdapter.isEnabled()) {
+            mBluetoothEnabledByNfc = true;
+            return mBluetoothAdapter.enableNoAutoConnect();
+        }
+        return true;
+    }
+
+    void disableBluetoothIfNeeded() {
+        if (!mBluetoothEnabledByNfc) return;
+
+        if (!mBluetoothHeadsetConnected) {
+            mBluetoothAdapter.disable();
+            mBluetoothEnabledByNfc = false;
+        }
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+
+    @Override
+    public boolean onUnbind(Intent intent) {
+        // prevent any future callbacks to the client, no rebind call needed.
+        return false;
+    }
+}