Merge mozilla-central to mozilla-inbound
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Thu, 20 Nov 2014 12:03:13 +0100
changeset 216634 7b7941988a83594e39548b9f855c774844b269ab
parent 216633 f52a81db4ecd7a59d65354c026478f9f278a236c (current diff)
parent 216587 6ce1b906c690fd60abfbf4c7dea60d9e405f0ad8 (diff)
child 216635 bd55fa110906ba994c3a1b10480164c2e54d9998
push idunknown
push userunknown
push dateunknown
milestone36.0a1
Merge mozilla-central to mozilla-inbound
--- a/b2g/config/dolphin/sources.xml
+++ b/b2g/config/dolphin/sources.xml
@@ -10,25 +10,25 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="3ab0d9c70f0b2e1ededc679112c392303f037361">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="8b880805d454664b3eed11d0f053cdeafa1ff06e"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="a1e239a0bb5cd1d69680bf1075883aa9a7bf2429"/>
   <project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="c7931763d41be602407ed9d71e2c0292c6597e00"/>
   <project groups="linux,x86" name="platform/prebuilts/python/linux-x86/2.7.5" path="prebuilts/python/linux-x86/2.7.5" revision="83760d213fb3bec7b4117d266fcfbf6fe2ba14ab"/>
   <project name="device/common" path="device/common" revision="6a2995683de147791e516aae2ccb31fdfbe2ad30"/>
--- a/b2g/config/emulator-ics/sources.xml
+++ b/b2g/config/emulator-ics/sources.xml
@@ -14,23 +14,23 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="df362ace56338da8173d30d3e09e08c42c1accfa">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d5d3f93914558b6f168447b805cd799c8233e300"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="a47dd04f8f66e42fd331711140f2c3e2fed0767d"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
   <project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>
   <project name="platform/bootable/recovery" path="bootable/recovery" revision="425f8b5fadf5889834c5acd27d23c9e0b2129c28"/>
   <project name="device/common" path="device/common" revision="42b808b7e93d0619286ae8e59110b176b7732389"/>
   <project name="device/sample" path="device/sample" revision="237bd668d0f114d801a8d6455ef5e02cc3577587"/>
   <project name="platform_external_apriori" path="external/apriori" remote="b2g" revision="11816ad0406744f963537b23d68ed9c2afb412bd"/>
   <project name="platform/external/bluetooth/bluez" path="external/bluetooth/bluez" revision="52a1a862a8bac319652b8f82d9541ba40bfa45ce"/>
--- a/b2g/config/emulator-jb/sources.xml
+++ b/b2g/config/emulator-jb/sources.xml
@@ -12,20 +12,20 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="0e94c080bee081a50aa2097527b0b40852f9143f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="9025e50b9d29b3cabbbb21e1dd94d0d13121a17e"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="b89fda71fcd0fa0cf969310e75be3ea33e048b44"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="2e7d5348f35575870b3c7e567a9a9f6d66f8d6c5"/>
--- a/b2g/config/emulator-kk/sources.xml
+++ b/b2g/config/emulator-kk/sources.xml
@@ -10,25 +10,25 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="3ab0d9c70f0b2e1ededc679112c392303f037361">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="f92a936f2aa97526d4593386754bdbf02db07a12"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="6e47ff2790f5656b5b074407829ceecf3e6188c4"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="1950e4760fa14688b83cdbb5acaa1af9f82ef434"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="ac6eb97a37035c09fb5ede0852f0881e9aadf9ad"/>
   <project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="737f591c5f95477148d26602c7be56cbea0cdeb9"/>
   <project groups="linux,x86" name="platform/prebuilts/python/linux-x86/2.7.5" path="prebuilts/python/linux-x86/2.7.5" revision="51da9b1981be481b92a59a826d4d78dc73d0989a"/>
   <project name="device/common" path="device/common" revision="798a3664597e6041985feab9aef42e98d458bc3d"/>
--- a/b2g/config/emulator/sources.xml
+++ b/b2g/config/emulator/sources.xml
@@ -14,23 +14,23 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="df362ace56338da8173d30d3e09e08c42c1accfa">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d5d3f93914558b6f168447b805cd799c8233e300"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="a47dd04f8f66e42fd331711140f2c3e2fed0767d"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
   <project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>
   <project name="platform/bootable/recovery" path="bootable/recovery" revision="425f8b5fadf5889834c5acd27d23c9e0b2129c28"/>
   <project name="device/common" path="device/common" revision="42b808b7e93d0619286ae8e59110b176b7732389"/>
   <project name="device/sample" path="device/sample" revision="237bd668d0f114d801a8d6455ef5e02cc3577587"/>
   <project name="platform_external_apriori" path="external/apriori" remote="b2g" revision="11816ad0406744f963537b23d68ed9c2afb412bd"/>
   <project name="platform/external/bluetooth/bluez" path="external/bluetooth/bluez" revision="52a1a862a8bac319652b8f82d9541ba40bfa45ce"/>
--- a/b2g/config/flame-kk/sources.xml
+++ b/b2g/config/flame-kk/sources.xml
@@ -10,25 +10,25 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="3ab0d9c70f0b2e1ededc679112c392303f037361">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="8b880805d454664b3eed11d0f053cdeafa1ff06e"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="a1e239a0bb5cd1d69680bf1075883aa9a7bf2429"/>
   <project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="c7931763d41be602407ed9d71e2c0292c6597e00"/>
   <project groups="linux,x86" name="platform/prebuilts/python/linux-x86/2.7.5" path="prebuilts/python/linux-x86/2.7.5" revision="a32003194f707f66a2d8cdb913ed1869f1926c5d"/>
   <project name="device/common" path="device/common" revision="96d4d2006c4fcb2f19a3fa47ab10cb409faa017b"/>
@@ -130,17 +130,17 @@
   <project name="platform/system/media" path="system/media" revision="c1332c21c608f4932a6d7e83450411cde53315ef"/>
   <!--original fetch url was git://github.com/t2m-foxfone/-->
   <remote fetch="https://git.mozilla.org/external/t2m-foxfone" name="t2m"/>
   <default remote="caf" revision="LNX.LA.3.5.2.1.1" sync-j="4"/>
   <!-- Flame specific things -->
   <project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="1bb28abbc215f45220620af5cd60a8ac1be93722"/>
   <project name="device/qcom/common" path="device/qcom/common" revision="54c32c2ddef066fbdf611d29e4b7c47e0363599e"/>
   <project name="device-flame" path="device/t2m/flame" remote="b2g" revision="48835395daa6a49b281db62c50805bd6ca24077e"/>
-  <project name="codeaurora_kernel_msm" path="kernel" remote="b2g" revision="3c4f041e3e3dc676f2111caf20a186ec0467dbdb"/>
+  <project name="codeaurora_kernel_msm" path="kernel" remote="b2g" revision="3d986de16450c382c97e092e7579df16928e35d5"/>
   <project name="kernel_lk" path="bootable/bootloader/lk" remote="b2g" revision="fda40423ffa573dc6cafd3780515010cb2a086be"/>
   <project name="platform/external/bluetooth/bluedroid" path="external/bluetooth/bluedroid" revision="30b96dfca99cb384bf520a16b81f3aba56f09907"/>
   <project name="platform/external/wpa_supplicant_8" path="external/wpa_supplicant_8" revision="5b71e40213f650459e95d35b6f14af7e88d8ab62"/>
   <project name="platform_external_libnfc-nci" path="external/libnfc-nci" remote="t2m" revision="4186bdecb4dae911b39a8202252cc2310d91b0be"/>
   <project name="platform/frameworks/av" path="frameworks/av" revision="c00de33ebfad57ae79ad5f93c2819ee2c40c8bcd"/>
   <project name="platform/frameworks/base" path="frameworks/base" revision="6b58ab45e3e56c1fc20708cc39fa2264c52558df"/>
   <project name="platform/frameworks/native" path="frameworks/native" revision="a46a9f1ac0ed5662d614c277cbb14eb3f332f365"/>
   <project name="platform/hardware/libhardware" path="hardware/libhardware" revision="7196881a0e9dd7bfbbcf0af64c8064e70f0fa094"/>
--- a/b2g/config/flame/sources.xml
+++ b/b2g/config/flame/sources.xml
@@ -12,20 +12,20 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="0e94c080bee081a50aa2097527b0b40852f9143f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="e95b4ce22c825da44d14299e1190ea39a5260bde"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="471afab478649078ad7c75ec6b252481a59e19b8"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="8b880805d454664b3eed11d0f053cdeafa1ff06e"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
 {
     "git": {
         "git_revision": "", 
         "remote": "", 
         "branch": ""
     }, 
-    "revision": "db25ffb7b2e825b20123fc11ccc8a5ebe597f378", 
+    "revision": "936d69a5e13f39fcf9cc99bceb50c8c0de6aa0fa", 
     "repo_path": "integration/gaia-central"
 }
--- a/b2g/config/hamachi/sources.xml
+++ b/b2g/config/hamachi/sources.xml
@@ -12,21 +12,21 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="b2g/ics_strawberry" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="df362ace56338da8173d30d3e09e08c42c1accfa">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
   <project name="platform/bionic" path="bionic" revision="d2eb6c7b6e1bc7643c17df2d9d9bcb1704d0b9ab"/>
   <project name="platform/bootable/recovery" path="bootable/recovery" revision="746bc48f34f5060f90801925dcdd964030c1ab6d"/>
   <project name="platform/development" path="development" revision="2460485184bc8535440bb63876d4e63ec1b4770c"/>
   <project name="device/common" path="device/common" revision="0dcc1e03659db33b77392529466f9eb685cdd3c7"/>
   <project name="device/sample" path="device/sample" revision="68b1cb978a20806176123b959cb05d4fa8adaea4"/>
   <project name="platform_external_apriori" path="external/apriori" remote="b2g" revision="11816ad0406744f963537b23d68ed9c2afb412bd"/>
--- a/b2g/config/helix/sources.xml
+++ b/b2g/config/helix/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <default remote="caf" revision="b2g/ics_strawberry" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="df362ace56338da8173d30d3e09e08c42c1accfa">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
   <project name="platform/bionic" path="bionic" revision="d2eb6c7b6e1bc7643c17df2d9d9bcb1704d0b9ab"/>
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -12,20 +12,20 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="0e94c080bee081a50aa2097527b0b40852f9143f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="9025e50b9d29b3cabbbb21e1dd94d0d13121a17e"/>
   <project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="b89fda71fcd0fa0cf969310e75be3ea33e048b44"/>
   <project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="2e7d5348f35575870b3c7e567a9a9f6d66f8d6c5"/>
--- a/b2g/config/wasabi/sources.xml
+++ b/b2g/config/wasabi/sources.xml
@@ -12,22 +12,22 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="ics_chocolate_rb4.2" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="df362ace56338da8173d30d3e09e08c42c1accfa">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="8e09627d75acd4abced0ab81983b5b5de6d15881"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1abe09b4925547699dfdb2d358aed019137c3aa6"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="45c54a55e31758f7e54e5eafe0d01d387f35897a"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
-  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="b6f8267794b8c7f2a33236d46a857a84388b8485"/>
+  <project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a8f8bd05043e7b8f8e26ad390c82021b995ee4d"/>
   <project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
   <project name="platform/bionic" path="bionic" revision="cd5dfce80bc3f0139a56b58aca633202ccaee7f8"/>
   <project name="platform/bootable/recovery" path="bootable/recovery" revision="e0a9ac010df3afaa47ba107192c05ac8b5516435"/>
   <project name="platform/development" path="development" revision="a384622f5fcb1d2bebb9102591ff7ae91fe8ed2d"/>
   <project name="device/common" path="device/common" revision="7c65ea240157763b8ded6154a17d3c033167afb7"/>
   <project name="device/sample" path="device/sample" revision="c328f3d4409db801628861baa8d279fb8855892f"/>
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -116,17 +116,17 @@ skip-if = os == "linux" || e10s # Bug 10
 skip-if = os == "linux" || e10s # Bug 1073339 - Investigate autocomplete test unreliability on Linux/e10s
 [browser_action_searchengine_alias.js]
 skip-if = os == "linux" || e10s # Bug 1073339 - Investigate autocomplete test unreliability on Linux/e10s
 [browser_addKeywordSearch.js]
 [browser_search_favicon.js]
 skip-if = os == "linux" || e10s # Bug 1073339 - Investigate autocomplete test unreliability on Linux/e10s
 [browser_alltabslistener.js]
 [browser_autocomplete_a11y_label.js]
-skip-if = e10s # Bug ????? - no e10s switch-to-tab support yet
+skip-if = e10s # Bug 1101993 - times out for unknown reasons when run in the dir (works on its own)
 [browser_backButtonFitts.js]
 skip-if = os != "win" || e10s # The Fitts Law back button is only supported on Windows (bug 571454) / e10s - Bug 1099154: test touches content (attempts to add an event listener directly to the contentWindow)
 [browser_blob-channelname.js]
 [browser_bookmark_titles.js]
 skip-if = buildapp == 'mulet' || toolkit == "windows" || e10s # Disabled on Windows due to frequent failures (bugs 825739, 841341) / e10s - Bug 1094205 - places doesn't return the right thing in e10s mode, for some reason
 [browser_bug304198.js]
 skip-if = e10s
 [browser_bug321000.js]
@@ -153,55 +153,55 @@ skip-if = e10s # Bug 1093155 - tries to 
 skip-if = e10s # Bug 1056146 - zoom tests use FullZoomHelper and break in e10s
 [browser_bug422590.js]
 [browser_bug846489.js]
 [browser_bug423833.js]
 skip-if = true # bug 428712
 [browser_bug424101.js]
 skip-if = e10s # Bug 1093155 - tries to use context menu from browser-chrome and gets in a mess when in e10s mode
 [browser_bug427559.js]
-skip-if = e10s # Bug ?????? - "content window is focused - Got [object ChromeWindow], expected [object XrayWrapper [object Window]]"
+skip-if = e10s # Bug 1102015 - "content window is focused - Got [object ChromeWindow], expected [object CPOW [object Window]]"
 [browser_bug431826.js]
 [browser_bug432599.js]
 [browser_bug435035.js]
 [browser_bug435325.js]
 skip-if = buildapp == 'mulet' || e10s # Bug 1099156 - test directly manipulates content
 [browser_bug441778.js]
 skip-if = buildapp == 'mulet' || e10s # Bug 1056146 - zoom tests use FullZoomHelper and break in e10s
 [browser_bug455852.js]
 skip-if = e10s
 [browser_bug460146.js]
 skip-if = e10s # Bug 866413 - PageInfo doesn't work in e10s
 [browser_bug462289.js]
-skip-if = toolkit == "cocoa" || e10s # Bug ?????? - not sure why this is timing out and crashing!!
+skip-if = toolkit == "cocoa" || e10s # Bug 1102017 - middle-button mousedown on selected tab2 does not activate tab - Didn't expect [object XULElement], but got it
 [browser_bug462673.js]
 skip-if = e10s # Bug 1093404 - test expects sync window opening from content and is disappointed in that expectation
 [browser_bug477014.js]
 skip-if = e10s # Bug 1093206 - need to re-enable tests relying on swapFrameLoaders et al for e10s
 [browser_bug479408.js]
 skip-if = buildapp == 'mulet'
 [browser_bug481560.js]
-skip-if = e10s # Bug ????? - This bug attached an event listener directly to the content
+skip-if = e10s # Bug 1102018 - This bug attaches an event listener directly to the content, which then never gets called.
 [browser_bug484315.js]
 skip-if = e10s
 [browser_bug491431.js]
 skip-if = buildapp == 'mulet'
 [browser_bug495058.js]
 skip-if = e10s # Bug 1093206 - need to re-enable tests relying on swapFrameLoaders et al (and thus replaceTabWithWindow) for e10s
 [browser_bug517902.js]
 skip-if = e10s # Bug 866413 - PageInfo doesn't work in e10s
 [browser_bug519216.js]
 skip-if = e10s # Bug ?????? - some weird timing issue with progress listeners that fails intermittently
 [browser_bug520538.js]
 [browser_bug521216.js]
 [browser_bug533232.js]
 [browser_bug537013.js]
 skip-if = buildapp == 'mulet' || e10s # Bug 1093206 - need to re-enable tests relying on swapFrameLoaders et al for e10s (test calls replaceTabWithWindow)
 [browser_bug537474.js]
-skip-if = e10s # Bug ?????? - test doesn't wait for document to be created before it checks it
+skip-if = e10s # Bug 1102020 - test tries to use browserDOMWindow.openURI to open a link, and gets a null rv where it expects a window
 [browser_bug550565.js]
 [browser_bug553455.js]
 skip-if = true # Bug 1094312
 #skip-if = buildapp == 'mulet' || e10s # Bug 1066070 - I don't think either popup notifications nor addon install stuff works on mulet? ; for e10s, indefinite waiting halfway through the test, tracked in bug 1093586
 [browser_bug555224.js]
 skip-if = e10s # Bug 1056146 - zoom tests use FullZoomHelper and break in e10s
 [browser_bug555767.js]
 skip-if = e10s # Bug 1093373 - relies on browser.sessionHistory
@@ -326,17 +326,17 @@ skip-if = buildapp == 'mulet' || e10s ||
 skip-if = e10s # Bug 863514 - no gesture support.
 [browser_getshortcutoruri.js]
 [browser_hide_removing.js]
 [browser_homeDrop.js]
 skip-if = buildapp == 'mulet'
 [browser_identity_UI.js]
 skip-if = e10s # Bug ?????? - this test fails for obscure reasons on non-windows builds only.
 [browser_keywordBookmarklets.js]
-skip-if = e10s # Bug ?????? - this test fails for obscure reasons on non-windows builds only.
+skip-if = e10s # Bug 1102025 - different principals for the bookmarklet only in e10s mode (unclear if test or 'real' issue)
 [browser_keywordSearch.js]
 skip-if = e10s # Bug 921957 - remote webprogress doesn't supply cancel method on the request object
 [browser_keywordSearch_postData.js]
 [browser_lastAccessedTab.js]
 skip-if = toolkit == "windows" # Disabled on Windows due to frequent failures (bug 969405)
 [browser_locationBarCommand.js]
 skip-if = os == "linux" || e10s # Linux: Intermittent failures, bug 917535; e10s: Bug 1094252 - Focus issues (There should be no focused element - Got [object XULElement], expected null)
 [browser_locationBarExternalLoad.js]
@@ -364,17 +364,17 @@ skip-if = asan # Disabled because it tak
 
 [browser_pinnedTabs.js]
 [browser_plainTextLinks.js]
 skip-if = e10s # Bug 1093155 - tries to use context menu from browser-chrome and gets in a mess when in e10s mode
 [browser_popupUI.js]
 skip-if = buildapp == 'mulet' || e10s # Bug 1100707 - test fails in e10s because it can't get accel-w to close the popup (?)
 [browser_popup_blocker.js]
 [browser_printpreview.js]
-skip-if = buildapp == 'mulet' || e10s # Bug ?????? - timeout after logging "Error: Channel closing: too late to send/recv, messages will be lost"
+skip-if = buildapp == 'mulet' || e10s # Bug 1101973 - breaks the next test in e10s, and may be responsible for later timeout after logging "Error: Channel closing: too late to send/recv, messages will be lost"
 [browser_private_browsing_window.js]
 skip-if = buildapp == 'mulet'
 [browser_private_no_prompt.js]
 skip-if = buildapp == 'mulet'
 [browser_relatedTabs.js]
 [browser_remoteTroubleshoot.js]
 support-files =
   test_remoteTroubleshoot.html
--- a/browser/components/loop/LoopRooms.jsm
+++ b/browser/components/loop/LoopRooms.jsm
@@ -155,20 +155,16 @@ let LoopRoomsInternal = {
    */
   getAll: function(version = null, callback) {
     if (!callback) {
       callback = version;
       version = null;
     }
 
     Task.spawn(function* () {
-      let deferredInitialization = Promise.defer();
-      MozLoopService.delayedInitialize(deferredInitialization);
-      yield deferredInitialization.promise;
-
       if (!gDirty) {
         callback(null, [...this.rooms.values()]);
         return;
       }
 
       // Fetch the rooms from the server.
       let url = "/rooms" + (version ? "?version=" + encodeURIComponent(version) : "");
       let response = yield MozLoopService.hawkRequest(this.sessionType, url, "GET");
@@ -195,16 +191,22 @@ let LoopRoomsInternal = {
           eventEmitter.emit("update" + ":" + room.roomToken, room);
         } else {
           // Next, request the detailed information for each room. If the request
           // fails the room data will not be added to the map.
           yield LoopRooms.promise("get", room.roomToken);
         }
       }
 
+      // If there's no rooms in the list, remove the guest created room flag, so that
+      // we don't keep registering for guest when we don't need to.
+      if (this.sessionType == LOOP_SESSION_TYPE.GUEST && !this.rooms.size) {
+        this.setGuestCreatedRoom(false);
+      }
+
       // Set the 'dirty' flag back to FALSE, since the list is as fresh as can be now.
       gDirty = false;
       callback(null, [...this.rooms.values()]);
     }.bind(this)).catch(error => {
       callback(error);
     });
   },
 
@@ -264,21 +266,49 @@ let LoopRoomsInternal = {
     MozLoopService.hawkRequest(this.sessionType, "/rooms", "POST", room)
       .then(response => {
         let data = JSON.parse(response.body);
         extend(room, data);
         // Do not keep this value - it is a request to the server.
         delete room.expiresIn;
         this.rooms.set(room.roomToken, room);
 
+        if (this.sessionType == LOOP_SESSION_TYPE.GUEST) {
+          this.setGuestCreatedRoom(true);
+        }
+
         eventEmitter.emit("add", room);
         callback(null, room);
       }, error => callback(error)).catch(error => callback(error));
   },
 
+  /**
+   * Sets whether or not the user has created a room in guest mode.
+   *
+   * @param {Boolean} created If the user has created the room.
+   */
+  setGuestCreatedRoom: function(created) {
+    if (created) {
+      Services.prefs.setBoolPref("loop.createdRoom", created);
+    } else {
+      Services.prefs.clearUserPref("loop.createdRoom");
+    }
+  },
+
+  /**
+   * Returns true if the user has a created room in guest mode.
+   */
+  getGuestCreatedRoom: function() {
+    try {
+      return Services.prefs.getBoolPref("loop.createdRoom");
+    } catch (x) {
+      return false;
+    }
+  },
+
   open: function(roomToken) {
     let windowData = {
       roomToken: roomToken,
       type: "room"
     };
 
     MozLoopService.openChatWindow(windowData);
   },
@@ -481,16 +511,20 @@ this.LoopRooms = {
   leave: function(roomToken, sessionToken, callback) {
     return LoopRoomsInternal.leave(roomToken, sessionToken, callback);
   },
 
   rename: function(roomToken, newRoomName, callback) {
     return LoopRoomsInternal.rename(roomToken, newRoomName, callback);
   },
 
+  getGuestCreatedRoom: function() {
+    return LoopRoomsInternal.getGuestCreatedRoom();
+  },
+
   promise: function(method, ...params) {
     return new Promise((resolve, reject) => {
       this[method](...params, (error, result) => {
         if (error) {
           reject(error);
         } else {
           resolve(result);
         }
--- a/browser/components/loop/MozLoopAPI.jsm
+++ b/browser/components/loop/MozLoopAPI.jsm
@@ -363,42 +363,16 @@ function injectLoopAPI(targetWindow) {
           callback(null, chosenButton == 0);
         } catch (ex) {
           callback(cloneValueInto(ex, targetWindow));
         }
       }
     },
 
     /**
-     * Call to ensure that any necessary registrations for the Loop Service
-     * have taken place.
-     *
-     * Callback parameters:
-     * - err null on successful registration, non-null otherwise.
-     *
-     * @param {LOOP_SESSION_TYPE} sessionType
-     * @param {Function} callback Will be called once registration is complete,
-     *                            or straight away if registration has already
-     *                            happened.
-     */
-    ensureRegistered: {
-      enumerable: true,
-      writable: true,
-      value: function(sessionType, callback) {
-        // We translate from a promise to a callback, as we can't pass promises from
-        // Promise.jsm across the priv versus unpriv boundary.
-        MozLoopService.promiseRegisteredWithServers(sessionType).then(() => {
-          callback(null);
-        }, err => {
-          callback(cloneValueInto(err, targetWindow));
-        }).catch(Cu.reportError);
-      }
-    },
-
-    /**
      * Used to note a call url expiry time. If the time is later than the current
      * latest expiry time, then the stored expiry time is increased. For times
      * sooner, this function is a no-op; this ensures we always have the latest
      * expiry time for a url.
      *
      * This is used to determine whether or not we should be registering with the
      * push server on start.
      *
--- a/browser/components/loop/MozLoopService.jsm
+++ b/browser/components/loop/MozLoopService.jsm
@@ -414,32 +414,32 @@ let MozLoopServiceInternal = {
       this.deferredRegistrations.delete(sessionType);
       log.debug("Cleared deferredRegistration for sessionType:", sessionType);
     });
 
     return result;
   },
 
   /**
-   * Performs a hawk based request to the loop server.
+   * Performs a hawk based request to the loop server - there is no pre-registration
+   * for this request, if this is required, use hawkRequest.
    *
    * @param {LOOP_SESSION_TYPE} sessionType The type of session to use for the request.
    *                                        This is one of the LOOP_SESSION_TYPE members.
    * @param {String} path The path to make the request to.
    * @param {String} method The request method, e.g. 'POST', 'GET'.
    * @param {Object} payloadObj An object which is converted to JSON and
    *                            transmitted with the request.
    * @returns {Promise}
    *        Returns a promise that resolves to the response of the API call,
    *        or is rejected with an error.  If the server response can be parsed
    *        as JSON and contains an 'error' property, the promise will be
    *        rejected with this JSON-parsed response.
    */
-  hawkRequest: function(sessionType, path, method, payloadObj) {
-    log.debug("hawkRequest: " + path, sessionType);
+  hawkRequestInternal: function(sessionType, path, method, payloadObj) {
     if (!gHawkClient) {
       gHawkClient = new HawkClient(this.loopServerUri);
     }
 
     let sessionToken;
     try {
       sessionToken = Services.prefs.getCharPref(this.getSessionTokenPrefName(sessionType));
     } catch (x) {
@@ -475,16 +475,42 @@ let MozLoopServiceInternal = {
           this.setError("registration", error);
         }
       }
       throw error;
     });
   },
 
   /**
+   * Performs a hawk based request to the loop server, registering if necessary.
+   *
+   * @param {LOOP_SESSION_TYPE} sessionType The type of session to use for the request.
+   *                                        This is one of the LOOP_SESSION_TYPE members.
+   * @param {String} path The path to make the request to.
+   * @param {String} method The request method, e.g. 'POST', 'GET'.
+   * @param {Object} payloadObj An object which is converted to JSON and
+   *                            transmitted with the request.
+   * @returns {Promise}
+   *        Returns a promise that resolves to the response of the API call,
+   *        or is rejected with an error.  If the server response can be parsed
+   *        as JSON and contains an 'error' property, the promise will be
+   *        rejected with this JSON-parsed response.
+   */
+  hawkRequest: function(sessionType, path, method, payloadObj) {
+    log.debug("hawkRequest: " + path, sessionType);
+    return new Promise((resolve, reject) => {
+      MozLoopService.promiseRegisteredWithServers(sessionType).then(() => {
+        this.hawkRequestInternal(sessionType, path, method, payloadObj).then(resolve, reject);
+      }, err => {
+        reject(err);
+      }).catch(reject);
+    });
+  },
+
+  /**
    * Generic hawkRequest onError handler for the hawkRequest promise.
    *
    * @param {Object} error - error reporting object
    *
    */
 
   _hawkRequestError: function(error) {
     log.error("Loop hawkRequest error:", error);
@@ -576,17 +602,17 @@ let MozLoopServiceInternal = {
     // that will register only the calls notification.
     let msg = {
         simplePushURL: callsPushURL,
         simplePushURLs: {
           calls: callsPushURL,
           rooms: roomsPushURL,
         },
     };
-    return this.hawkRequest(sessionType, "/registration", "POST", msg)
+    return this.hawkRequestInternal(sessionType, "/registration", "POST", msg)
       .then((response) => {
         // If this failed we got an invalid token.
         if (!this.storeSessionToken(sessionType, response.headers)) {
           return Promise.reject("session-token-wrong-size");
         }
 
         log.debug("Successfully registered with server for sessionType", sessionType);
         this.clearError("registration");
@@ -632,17 +658,17 @@ let MozLoopServiceInternal = {
    */
   unregisterFromLoopServer: function(sessionType, pushURL) {
     let prefType = Services.prefs.getPrefType(this.getSessionTokenPrefName(sessionType));
     if (prefType == Services.prefs.PREF_INVALID) {
       return Promise.resolve("already unregistered");
     }
 
     let unregisterURL = "/registration?simplePushURL=" + encodeURIComponent(pushURL);
-    return this.hawkRequest(sessionType, unregisterURL, "DELETE")
+    return this.hawkRequestInternal(sessionType, unregisterURL, "DELETE")
       .then(() => {
         log.debug("Successfully unregistered from server for sessionType", sessionType);
       },
       error => {
         if (error.code === 401) {
           // Authorization failed, invalid token. This is fine since it may mean we already logged out.
           return;
         }
@@ -821,17 +847,17 @@ let MozLoopServiceInternal = {
 
   /**
    * Fetch Firefox Accounts (FxA) OAuth parameters from the Loop Server.
    *
    * @return {Promise} resolved with the body of the hawk request for OAuth parameters.
    */
   promiseFxAOAuthParameters: function() {
     const SESSION_TYPE = LOOP_SESSION_TYPE.FXA;
-    return this.hawkRequest(SESSION_TYPE, "/fxa-oauth/params", "POST").then(response => {
+    return this.hawkRequestInternal(SESSION_TYPE, "/fxa-oauth/params", "POST").then(response => {
       if (!this.storeSessionToken(SESSION_TYPE, response.headers)) {
         throw new Error("Invalid FxA hawk token returned");
       }
       let prefType = Services.prefs.getPrefType(this.getSessionTokenPrefName(SESSION_TYPE));
       if (prefType == Services.prefs.PREF_INVALID) {
         throw new Error("No FxA hawk token returned and we don't have one saved");
       }
 
@@ -1021,16 +1047,17 @@ this.MozLoopService = {
       if (window) {
         window.LoopUI.playSound("room-joined");
       }
     });
 
     // If expiresTime is not in the future and the user hasn't
     // previously authenticated then skip registration.
     if (!MozLoopServiceInternal.urlExpiryTimeIsInFuture() &&
+        !LoopRooms.getGuestCreatedRoom() &&
         !MozLoopServiceInternal.fxAOAuthTokenData) {
       return Promise.resolve("registration not needed");
     }
 
     let deferredInitialization = Promise.defer();
     gInitializeTimerFunc(deferredInitialization);
 
     return deferredInitialization.promise;
@@ -1054,17 +1081,18 @@ this.MozLoopService = {
     error => {
       // If we get a non-object then setError was already called for a different error type.
       if (typeof(error) == "object") {
         MozLoopServiceInternal.setError("initialization", error, () => MozLoopService.delayedInitialize(Promise.defer()));
       }
     });
 
     try {
-      if (MozLoopServiceInternal.urlExpiryTimeIsInFuture()) {
+      if (MozLoopServiceInternal.urlExpiryTimeIsInFuture() ||
+          LoopRooms.getGuestCreatedRoom()) {
         yield this.promiseRegisteredWithServers(LOOP_SESSION_TYPE.GUEST);
       } else {
         log.debug("delayedInitialize: URL expiry time isn't in the future so not registering as a guest");
       }
     } catch (ex) {
       log.debug("MozLoopService: Failure of guest registration", ex);
       deferredInitialization.reject(ex);
       yield completedPromise;
--- a/browser/components/loop/content/js/client.js
+++ b/browser/components/loop/content/js/client.js
@@ -77,50 +77,39 @@ loop.Client = (function($) {
      */
     _failureHandler: function(cb, error) {
       var message = "HTTP " + error.code + " " + error.error + "; " + error.message;
       console.error(message);
       cb(error);
     },
 
     /**
-     * Ensures the client is registered with the push server.
+     * Requests a call URL from the Loop server. It will note the
+     * expiry time for the url with the mozLoop api.  It will select the
+     * appropriate hawk session to use based on whether or not the user
+     * is currently logged into a Firefox account profile.
      *
      * Callback parameters:
-     * - err null on successful registration, non-null otherwise.
-     *
-     * @param {LOOP_SESSION_TYPE} sessionType Guest or FxA
-     * @param {Function} cb Callback(err)
-     */
-    _ensureRegistered: function(sessionType, cb) {
-      this.mozLoop.ensureRegistered(sessionType, function(error) {
-        if (error) {
-          console.log("Error registering with Loop server, code: " + error);
-          cb(error);
-          return;
-        } else {
-          cb(null);
-        }
-      });
-    },
-
-    /**
-     * Internal handler for requesting a call url from the server.
-     *
-     * Callback parameters:
-     * - err null on successful registration, non-null otherwise.
+     * - err null on successful request, non-null otherwise.
      * - callUrlData an object of the obtained call url data if successful:
      * -- callUrl: The url of the call
      * -- expiresAt: The amount of hours until expiry of the url
      *
-     * @param {LOOP_SESSION_TYPE} sessionType
+     * @param  {String} simplepushUrl a registered Simple Push URL
      * @param  {string} nickname the nickname of the future caller
      * @param  {Function} cb Callback(err, callUrlData)
      */
-    _requestCallUrlInternal: function(sessionType, nickname, cb) {
+    requestCallUrl: function(nickname, cb) {
+      var sessionType;
+      if (this.mozLoop.userProfile) {
+        sessionType = this.mozLoop.LOOP_SESSION_TYPE.FXA;
+      } else {
+        sessionType = this.mozLoop.LOOP_SESSION_TYPE.GUEST;
+      }
+
       this.mozLoop.hawkRequest(sessionType, "/call-url/", "POST",
                                {callerId: nickname},
         function (error, responseText) {
           if (error) {
             this._telemetryAdd("LOOP_CLIENT_CALL_URL_REQUESTS_SUCCESS", false);
             this._failureHandler(cb, error);
             return;
           }
@@ -149,27 +138,16 @@ loop.Client = (function($) {
      * @param {mozLoop.LOOP_SESSION_TYPE} sessionType The type of session which
      *                                                the url belongs to.
      * @param {function} cb Callback function used for handling an error
      *                      response. XXX The incoming call panel does not
      *                      exist after the block button is clicked therefore
      *                      it does not make sense to display an error.
      **/
     deleteCallUrl: function(token, sessionType, cb) {
-      this._ensureRegistered(sessionType, function(err) {
-        if (err) {
-          cb(err);
-          return;
-        }
-
-        this._deleteCallUrlInternal(token, sessionType, cb);
-      }.bind(this));
-    },
-
-    _deleteCallUrlInternal: function(token, sessionType, cb) {
       function deleteRequestCallback(error, responseText) {
         if (error) {
           this._failureHandler(cb, error);
           return;
         }
 
         try {
           cb(null);
@@ -180,50 +158,16 @@ loop.Client = (function($) {
       }
 
       this.mozLoop.hawkRequest(sessionType,
                                "/call-url/" + token, "DELETE", null,
                                deleteRequestCallback.bind(this));
     },
 
     /**
-     * Requests a call URL from the Loop server. It will note the
-     * expiry time for the url with the mozLoop api.  It will select the
-     * appropriate hawk session to use based on whether or not the user
-     * is currently logged into a Firefox account profile.
-     *
-     * Callback parameters:
-     * - err null on successful registration, non-null otherwise.
-     * - callUrlData an object of the obtained call url data if successful:
-     * -- callUrl: The url of the call
-     * -- expiresAt: The amount of hours until expiry of the url
-     *
-     * @param  {String} simplepushUrl a registered Simple Push URL
-     * @param  {string} nickname the nickname of the future caller
-     * @param  {Function} cb Callback(err, callUrlData)
-     */
-    requestCallUrl: function(nickname, cb) {
-      var sessionType;
-      if (this.mozLoop.userProfile) {
-        sessionType = this.mozLoop.LOOP_SESSION_TYPE.FXA;
-      } else {
-        sessionType = this.mozLoop.LOOP_SESSION_TYPE.GUEST;
-      }
-
-      this._ensureRegistered(sessionType, function(err) {
-        if (err) {
-          cb(err);
-          return;
-        }
-
-        this._requestCallUrlInternal(sessionType, nickname, cb);
-      }.bind(this));
-    },
-
-    /**
      * Sets up an outgoing call, getting the relevant data from the server.
      *
      * Callback parameters:
      * - err null on successful registration, non-null otherwise.
      * - result an object of the obtained data for starting the call, if successful
      *
      * @param {Array} calleeIds an array of emails and phone numbers.
      * @param {String} callType the type of call.
--- a/browser/components/loop/test/desktop-local/client_test.js
+++ b/browser/components/loop/test/desktop-local/client_test.js
@@ -27,17 +27,16 @@ describe("loop.Client", function() {
     sandbox = sinon.sandbox.create();
     callback = sinon.spy();
     fakeToken = "fakeTokenText";
     mozLoop = {
       getLoopPref: sandbox.stub()
         .returns(null)
         .withArgs("hawk-session-token")
         .returns(fakeToken),
-      ensureRegistered: sinon.stub().callsArgWith(1, null),
       noteCallUrlExpiry: sinon.spy(),
       hawkRequest: sinon.stub(),
       LOOP_SESSION_TYPE: {
         GUEST: 1,
         FXA: 2
       },
       userProfile: null,
       telemetryAdd: sinon.spy()
@@ -50,31 +49,16 @@ describe("loop.Client", function() {
   });
 
   afterEach(function() {
     sandbox.restore();
   });
 
   describe("loop.Client", function() {
     describe("#deleteCallUrl", function() {
-      it("should ensure loop is registered", function() {
-        client.deleteCallUrl("fakeToken", mozLoop.LOOP_SESSION_TYPE.FXA, callback);
-
-        sinon.assert.calledOnce(mozLoop.ensureRegistered);
-      });
-
-      it("should send an error when registration fails", function() {
-        mozLoop.ensureRegistered.callsArgWith(1, "offline");
-
-        client.deleteCallUrl("fakeToken", mozLoop.LOOP_SESSION_TYPE.FXA, callback);
-
-        sinon.assert.calledOnce(callback);
-        sinon.assert.calledWithExactly(callback, "offline");
-      });
-
       it("should make a delete call to /call-url/{fakeToken}", function() {
         client.deleteCallUrl(fakeToken, mozLoop.LOOP_SESSION_TYPE.GUEST, callback);
 
         sinon.assert.calledOnce(hawkRequestStub);
         sinon.assert.calledWith(hawkRequestStub,
                                 mozLoop.LOOP_SESSION_TYPE.GUEST,
                                 "/call-url/" + fakeToken, "DELETE");
       });
@@ -101,31 +85,16 @@ describe("loop.Client", function() {
         sinon.assert.calledOnce(callback);
         sinon.assert.calledWithMatch(callback, sinon.match(function(err) {
           return err.code == 400 && "invalid token" == err.message;
         }));
       });
     });
 
     describe("#requestCallUrl", function() {
-      it("should ensure loop is registered", function() {
-        client.requestCallUrl("foo", callback);
-
-        sinon.assert.calledOnce(mozLoop.ensureRegistered);
-      });
-
-      it("should send an error when registration fails", function() {
-        mozLoop.ensureRegistered.callsArgWith(1, "offline");
-
-        client.requestCallUrl("foo", callback);
-
-        sinon.assert.calledOnce(callback);
-        sinon.assert.calledWithExactly(callback, "offline");
-      });
-
       it("should post to /call-url/", function() {
         client.requestCallUrl("foo", callback);
 
         sinon.assert.calledOnce(hawkRequestStub);
         sinon.assert.calledWithExactly(hawkRequestStub, sinon.match.number,
           "/call-url/", "POST", {callerId: "foo"}, sinon.match.func);
       });
 
--- a/browser/components/loop/test/desktop-local/conversation_test.js
+++ b/browser/components/loop/test/desktop-local/conversation_test.js
@@ -546,53 +546,54 @@ describe("loop.conversation", function()
 
           sinon.assert.calledOnce(navigator.mozLoop.calls.clearCallInProgress);
           sinon.assert.calledWithExactly(
             navigator.mozLoop.calls.clearCallInProgress, "8699");
         });
       });
 
       describe("#blocked", function() {
-        var mozLoop;
+        var mozLoop, deleteCallUrlStub;
 
         beforeEach(function() {
           icView = mountTestComponent();
 
           icView._websocket = {
             decline: sinon.spy(),
             close: sinon.stub()
           };
           sandbox.stub(window, "close");
 
           mozLoop = {
             LOOP_SESSION_TYPE: {
               GUEST: 1,
               FXA: 2
             }
           };
+
+          deleteCallUrlStub = sandbox.stub(loop.Client.prototype,
+                                           "deleteCallUrl");
         });
 
         it("should call mozLoop.stopAlerting", function() {
           icView.declineAndBlock();
 
           sinon.assert.calledOnce(navigator.mozLoop.stopAlerting);
         });
 
         it("should call delete call", function() {
           sandbox.stub(conversation, "get").withArgs("callToken")
                                            .returns("fakeToken")
                                            .withArgs("sessionType")
                                            .returns(mozLoop.LOOP_SESSION_TYPE.FXA);
 
-          var deleteCallUrl = sandbox.stub(loop.Client.prototype,
-                                           "deleteCallUrl");
           icView.declineAndBlock();
 
-          sinon.assert.calledOnce(deleteCallUrl);
-          sinon.assert.calledWithExactly(deleteCallUrl,
+          sinon.assert.calledOnce(deleteCallUrlStub);
+          sinon.assert.calledWithExactly(deleteCallUrlStub,
             "fakeToken", mozLoop.LOOP_SESSION_TYPE.FXA, sinon.match.func);
         });
 
         it("should get callToken from conversation model", function() {
           sandbox.stub(conversation, "get");
           icView.declineAndBlock();
 
           sinon.assert.called(conversation.get);
@@ -601,19 +602,17 @@ describe("loop.conversation", function()
         });
 
         it("should trigger error handling in case of error", function() {
           // XXX just logging to console for now
           var log = sandbox.stub(console, "log");
           var fakeError = {
             error: true
           };
-          sandbox.stub(loop.Client.prototype, "deleteCallUrl", function(_, __, cb) {
-            cb(fakeError);
-          });
+          deleteCallUrlStub.callsArgWith(2, fakeError);
           icView.declineAndBlock();
 
           sinon.assert.calledOnce(log);
           sinon.assert.calledWithExactly(log, fakeError);
         });
 
         it("should close the window", function() {
           icView.declineAndBlock();
--- a/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js
+++ b/browser/components/loop/test/xpcshell/test_loopservice_hawk_errors.js
@@ -32,17 +32,17 @@ add_task(function* setup_server() {
   loopServer.registerPathHandler("/401", errorRequestHandler);
   loopServer.registerPathHandler("/404", errorRequestHandler);
   loopServer.registerPathHandler("/500", errorRequestHandler);
   loopServer.registerPathHandler("/503", errorRequestHandler);
 });
 
 add_task(function* error_offline() {
   Services.io.offline = true;
-  yield MozLoopService.hawkRequest(LOOP_SESSION_TYPE.GUEST, "/offline", "GET").then(
+  yield MozLoopServiceInternal.hawkRequestInternal(LOOP_SESSION_TYPE.GUEST, "/offline", "GET").then(
     () => Assert.ok(false, "Should have rejected"),
     (error) => {
       MozLoopServiceInternal.setError("testing", error);
       Assert.strictEqual(MozLoopService.errors.size, 1, "Should be one error");
 
       // Network errors are converted to the "network" errorType.
       let err = MozLoopService.errors.get("network");
       Assert.strictEqual(err.code, null);
@@ -53,17 +53,17 @@ add_task(function* error_offline() {
   Services.io.offline = false;
 });
 
 add_task(cleanup_between_tests);
 
 add_task(function* guest_401() {
   Services.prefs.setCharPref("loop.hawk-session-token", "guest");
   Services.prefs.setCharPref("loop.hawk-session-token.fxa", "fxa");
-  yield MozLoopService.hawkRequest(LOOP_SESSION_TYPE.GUEST, "/401", "POST").then(
+  yield MozLoopServiceInternal.hawkRequestInternal(LOOP_SESSION_TYPE.GUEST, "/401", "POST").then(
     () => Assert.ok(false, "Should have rejected"),
     (error) => {
       Assert.strictEqual(Services.prefs.getPrefType("loop.hawk-session-token"),
                          Services.prefs.PREF_INVALID,
                          "Guest session token should have been cleared");
       Assert.strictEqual(Services.prefs.getCharPref("loop.hawk-session-token.fxa"),
                          "fxa",
                          "FxA session token should NOT have been cleared");
@@ -78,17 +78,17 @@ add_task(function* guest_401() {
   });
 });
 
 add_task(cleanup_between_tests);
 
 add_task(function* fxa_401() {
   Services.prefs.setCharPref("loop.hawk-session-token", "guest");
   Services.prefs.setCharPref("loop.hawk-session-token.fxa", "fxa");
-  yield MozLoopService.hawkRequest(LOOP_SESSION_TYPE.FXA, "/401", "POST").then(
+  yield MozLoopServiceInternal.hawkRequestInternal(LOOP_SESSION_TYPE.FXA, "/401", "POST").then(
     () => Assert.ok(false, "Should have rejected"),
     (error) => {
       Assert.strictEqual(Services.prefs.getCharPref("loop.hawk-session-token"),
                          "guest",
                          "Guest session token should NOT have been cleared");
       Assert.strictEqual(Services.prefs.getPrefType("loop.hawk-session-token.fxa"),
                          Services.prefs.PREF_INVALID,
                          "Fxa session token should have been cleared");
@@ -100,68 +100,68 @@ add_task(function* fxa_401() {
       Assert.strictEqual(err.friendlyDetails, getLoopString("password_changed_question"));
       Assert.strictEqual(err.friendlyDetailsButtonLabel, getLoopString("retry_button"));
   });
 });
 
 add_task(cleanup_between_tests);
 
 add_task(function* error_404() {
-  yield MozLoopService.hawkRequest(LOOP_SESSION_TYPE.GUEST, "/404", "GET").then(
+  yield MozLoopServiceInternal.hawkRequestInternal(LOOP_SESSION_TYPE.GUEST, "/404", "GET").then(
     () => Assert.ok(false, "Should have rejected"),
     (error) => {
       MozLoopServiceInternal.setError("testing", error);
       Assert.strictEqual(MozLoopService.errors.size, 1, "Should be one error");
 
       let err = MozLoopService.errors.get("testing");
       Assert.strictEqual(err.code, 404);
       Assert.strictEqual(err.friendlyMessage, getLoopString("generic_failure_title"));
       Assert.equal(err.friendlyDetails, null);
       Assert.equal(err.friendlyDetailsButtonLabel, null);
   });
 });
 
 add_task(cleanup_between_tests);
 
 add_task(function* error_500() {
-  yield MozLoopService.hawkRequest(LOOP_SESSION_TYPE.GUEST, "/500", "GET").then(
+  yield MozLoopServiceInternal.hawkRequestInternal(LOOP_SESSION_TYPE.GUEST, "/500", "GET").then(
     () => Assert.ok(false, "Should have rejected"),
     (error) => {
       MozLoopServiceInternal.setError("testing", error);
       Assert.strictEqual(MozLoopService.errors.size, 1, "Should be one error");
 
       let err = MozLoopService.errors.get("testing");
       Assert.strictEqual(err.code, 500);
       Assert.strictEqual(err.friendlyMessage, getLoopString("service_not_available"));
       Assert.strictEqual(err.friendlyDetails, getLoopString("try_again_later"));
       Assert.strictEqual(err.friendlyDetailsButtonLabel, getLoopString("retry_button"));
   });
 });
 
 add_task(cleanup_between_tests);
 
 add_task(function* profile_500() {
-  yield MozLoopService.hawkRequest(LOOP_SESSION_TYPE.GUEST, "/500", "GET").then(
+  yield MozLoopServiceInternal.hawkRequestInternal(LOOP_SESSION_TYPE.GUEST, "/500", "GET").then(
     () => Assert.ok(false, "Should have rejected"),
     (error) => {
       MozLoopServiceInternal.setError("profile", error);
       Assert.strictEqual(MozLoopService.errors.size, 1, "Should be one error");
 
       let err = MozLoopService.errors.get("profile");
       Assert.strictEqual(err.code, 500);
       Assert.strictEqual(err.friendlyMessage, getLoopString("problem_accessing_account"));
       Assert.equal(err.friendlyDetails, null);
       Assert.equal(err.friendlyDetailsButtonLabel, null);
   });
 });
 
 add_task(cleanup_between_tests);
 
 add_task(function* error_503() {
-  yield MozLoopService.hawkRequest(LOOP_SESSION_TYPE.GUEST, "/503", "GET").then(
+  yield MozLoopServiceInternal.hawkRequestInternal(LOOP_SESSION_TYPE.GUEST, "/503", "GET").then(
     () => Assert.ok(false, "Should have rejected"),
     (error) => {
       MozLoopServiceInternal.setError("testing", error);
       Assert.strictEqual(MozLoopService.errors.size, 1, "Should be one error");
 
       let err = MozLoopService.errors.get("testing");
       Assert.strictEqual(err.code, 503);
       Assert.strictEqual(err.friendlyMessage, getLoopString("service_not_available"));
--- a/browser/installer/windows/nsis/defines.nsi.in
+++ b/browser/installer/windows/nsis/defines.nsi.in
@@ -87,18 +87,20 @@ VIAddVersionKey "LegalTrademarks" "${Bra
 #endif
 VIAddVersionKey "LegalCopyright"  "${CompanyName}"
 VIAddVersionKey "FileVersion"     "${AppVersion}"
 VIAddVersionKey "ProductVersion"  "${AppVersion}"
 # Comments is not used but left below commented out for future reference
 # VIAddVersionKey "Comments"        "Comments"
 
 # It isn't possible to get the size of the installation prior to downloading
-# so the stub installer uses an estimate.
-!define APPROXIMATE_REQUIRED_SPACE_MB "42.2"
+# so the stub installer uses an estimate. The size is derived from the size of
+# the complete installer, the size of the extracted complete installer, and at
+# least 15 MB additional for working room.
+!define APPROXIMATE_REQUIRED_SPACE_MB "145"
 
 # Control positions in Dialog Units so they are placed correctly with
 # non-default DPI settings
 !define OPTIONS_ITEM_EDGE_DU 90u
 !define OPTIONS_ITEM_WIDTH_DU 356u
 !define OPTIONS_SUBITEM_EDGE_DU 119u
 !define OPTIONS_SUBITEM_WIDTH_DU 327u
 !define INSTALL_BLURB_TOP_DU 78u
--- a/browser/installer/windows/nsis/stub.nsi
+++ b/browser/installer/windows/nsis/stub.nsi
@@ -1742,54 +1742,34 @@ Function UpdateFreeSpaceLabel
   Call CheckSpace
 
   StrCpy $0 "$SpaceAvailableBytes"
 
   StrCpy $1 "$(BYTE)"
 
   ${If} $0 > 1024
   ${OrIf} $0 < 0
-    ; Multiply by 10 so it is possible to display a decimal in the size
-    System::Int64Op $0 * 10
-    Pop $0
     System::Int64Op $0 / 1024
     Pop $0
     StrCpy $1 "$(KILO)$(BYTE)"
-    ${If} $0 > 10240
+    ${If} $0 > 1024
     ${OrIf} $0 < 0
       System::Int64Op $0 / 1024
       Pop $0
       StrCpy $1 "$(MEGA)$(BYTE)"
-      ${If} $0 > 10240
+      ${If} $0 > 1024
       ${OrIf} $0 < 0
         System::Int64Op $0 / 1024
         Pop $0
         StrCpy $1 "$(GIGA)$(BYTE)"
       ${EndIf}
     ${EndIf}
-    StrLen $3 "$0"
-    ${If} $3 > 1
-      StrCpy $2 "$0" -1 ; All characters except the last one
-      StrCpy $0 "$0" "" -1 ; The last character
-      ${If} "$0" == "0"
-        StrCpy $0 "$2" ; Don't display the decimal if it is 0
-      ${Else}
-        StrCpy $0 "$2.$0"
-      ${EndIf}
-    ${ElseIf} $3 == 1
-      StrCpy $0 "0.$0"
-    ${Else}
-      ; This should never happen
-      System::Int64Op $0 / 10
-      Pop $0
-    ${EndIf}
   ${EndIf}
 
   SendMessage $LabelFreeSpace ${WM_SETTEXT} 0 "STR:$0 $1"
-
 FunctionEnd
 
 Function OnChange_DirRequest
   Pop $0
   System::Call 'user32::GetWindowTextW(i $DirRequest, w .r0, i ${NSIS_MAX_STRLEN})'
   StrCpy $1 "$0" 1 ; the first character
   ${If} "$1" == "$\""
     StrCpy $1 "$0" "" -1 ; the last character
new file mode 100644
--- /dev/null
+++ b/js/ipc/CPOWTimer.cpp
@@ -0,0 +1,18 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=4 sw=4 et tw=80:
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "jsfriendapi.h"
+#include "xpcprivate.h"
+#include "CPOWTimer.h"
+
+CPOWTimer::~CPOWTimer() {
+    /* This is a best effort to find the compartment responsible for this CPOW call */
+    xpc::CompartmentPrivate* compartment = xpc::CompartmentPrivate::Get(js::GetObjectCompartment(mozilla::dom::GetIncumbentGlobal()
+                                                                                                 ->GetGlobalJSObject()));
+    PRIntervalTime time = PR_IntervalNow() - startInterval;
+    compartment->CPOWTime += time;
+}
new file mode 100644
--- /dev/null
+++ b/js/ipc/CPOWTimer.h
@@ -0,0 +1,24 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=4 sw=4 et tw=80:
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef CPOWTIMER_H
+#define CPOWTIMER_H
+
+#include "prinrval.h"
+
+class JSObject;
+
+class MOZ_STACK_CLASS CPOWTimer {
+  public:
+    CPOWTimer(): startInterval(PR_IntervalNow()) {}
+    ~CPOWTimer();
+
+  private:
+    PRIntervalTime startInterval;
+};
+
+#endif
--- a/js/ipc/WrapperOwner.cpp
+++ b/js/ipc/WrapperOwner.cpp
@@ -6,16 +6,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "WrapperOwner.h"
 #include "JavaScriptLogging.h"
 #include "mozilla/unused.h"
 #include "mozilla/dom/BindingUtils.h"
 #include "jsfriendapi.h"
 #include "xpcprivate.h"
+#include "CPOWTimer.h"
 #include "WrapperFactory.h"
 
 #include "nsIRemoteTagService.h"
 
 using namespace js;
 using namespace JS;
 using namespace mozilla;
 using namespace mozilla::jsipc;
@@ -129,17 +130,20 @@ const char CPOWProxyHandler::family = 0;
 const CPOWProxyHandler CPOWProxyHandler::singleton;
 
 #define FORWARD(call, args)                                             \
     WrapperOwner *owner = OwnerOf(proxy);                               \
     if (!owner->active()) {                                             \
         JS_ReportError(cx, "cannot use a CPOW whose process is gone");  \
         return false;                                                   \
     }                                                                   \
-    return owner->call args;
+    {                                                                   \
+        CPOWTimer timer;                                                \
+        return owner->call args;                                        \
+    }
 
 bool
 CPOWProxyHandler::getPropertyDescriptor(JSContext *cx, HandleObject proxy, HandleId id,
                                         MutableHandle<JSPropertyDescriptor> desc) const
 {
     FORWARD(getPropertyDescriptor, (cx, proxy, id, desc));
 }
 
--- a/js/ipc/moz.build
+++ b/js/ipc/moz.build
@@ -1,15 +1,16 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 UNIFIED_SOURCES += [
+    'CPOWTimer.cpp',
     'JavaScriptChild.cpp',
     'JavaScriptParent.cpp',
     'JavaScriptShared.cpp',
     'WrapperAnswer.cpp',
     'WrapperOwner.cpp',
 ]
 
 IPDL_SOURCES += [
--- a/js/xpconnect/src/xpcprivate.h
+++ b/js/xpconnect/src/xpcprivate.h
@@ -3624,16 +3624,17 @@ public:
     };
 
     explicit CompartmentPrivate(JSCompartment *c)
         : wantXrays(false)
         , writeToGlobalPrototype(false)
         , skipWriteToGlobalPrototype(false)
         , universalXPConnectEnabled(false)
         , forcePermissiveCOWs(false)
+        , CPOWTime(0)
         , skipCOWCallableChecks(false)
         , scriptability(c)
         , scope(nullptr)
     {
         MOZ_COUNT_CTOR(xpc::CompartmentPrivate);
         mozilla::PodArrayZero(wrapperDenialWarnings);
     }
 
@@ -3677,16 +3678,19 @@ public:
     // This is only ever set during mochitest runs when enablePrivilege is called.
     // It allows the SpecialPowers scope to waive the normal chrome security
     // wrappers and expose properties directly to content. This lets us avoid a
     // bunch of overhead and complexity in our SpecialPowers automation glue.
     //
     // Using it in production is inherently unsafe.
     bool forcePermissiveCOWs;
 
+    // A running count of how much time we've spent processing CPOWs.
+    PRIntervalTime               CPOWTime;
+
     // Disables the XPConnect security checks that deny access to callables and
     // accessor descriptors on COWs. Do not use this unless you are bholley.
     bool skipCOWCallableChecks;
 
     // Whether we've emitted a warning about a property that was filtered out
     // by a security wrapper. See XrayWrapper.cpp.
     bool wrapperDenialWarnings[WrapperDenialTypeCount];
 
--- a/mobile/android/base/BrowserApp.java
+++ b/mobile/android/base/BrowserApp.java
@@ -2732,17 +2732,17 @@ public class BrowserApp extends GeckoApp
 
             return true;
         }
 
         bookmark.setEnabled(!AboutPages.isAboutReader(tab.getURL()));
         bookmark.setVisible(!GeckoProfile.get(this).inGuestMode());
         bookmark.setCheckable(true);
         bookmark.setChecked(tab.isBookmark());
-        bookmark.setIcon(tab.isBookmark() ? R.drawable.ic_menu_bookmark_remove : R.drawable.ic_menu_bookmark_add);
+        bookmark.setIcon(resolveBookmarkIconID(tab.isBookmark()));
 
         back.setEnabled(tab.canDoBack());
         forward.setEnabled(tab.canDoForward());
         desktopMode.setChecked(tab.getDesktopMode());
         desktopMode.setIcon(tab.getDesktopMode() ? R.drawable.ic_menu_desktop_mode_on : R.drawable.ic_menu_desktop_mode_off);
 
         String url = tab.getURL();
         if (AboutPages.isAboutReader(url)) {
@@ -2831,16 +2831,32 @@ public class BrowserApp extends GeckoApp
             exitGuestMode.setVisible(true);
         } else {
             enterGuestMode.setVisible(true);
         }
 
         return true;
     }
 
+    private int resolveBookmarkIconID(final boolean isBookmark) {
+        if (NewTabletUI.isEnabled(this) && HardwareUtils.isLargeTablet()) {
+            if (isBookmark) {
+                return R.drawable.new_tablet_ic_menu_bookmark_remove;
+            } else {
+                return R.drawable.new_tablet_ic_menu_bookmark_add;
+            }
+        }
+
+        if (isBookmark) {
+            return R.drawable.ic_menu_bookmark_remove;
+        } else {
+            return R.drawable.ic_menu_bookmark_add;
+        }
+    }
+
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         Tab tab = null;
         Intent intent = null;
 
         final int itemId = item.getItemId();
 
         // Track the menu action. We don't know much about the context, but we can use this to determine
@@ -2852,21 +2868,21 @@ public class BrowserApp extends GeckoApp
         }
 
         if (itemId == R.id.bookmark) {
             tab = Tabs.getInstance().getSelectedTab();
             if (tab != null) {
                 if (item.isChecked()) {
                     Telemetry.sendUIEvent(TelemetryContract.Event.UNSAVE, TelemetryContract.Method.MENU, "bookmark");
                     tab.removeBookmark();
-                    item.setIcon(R.drawable.ic_menu_bookmark_add);
+                    item.setIcon(resolveBookmarkIconID(false));
                 } else {
                     Telemetry.sendUIEvent(TelemetryContract.Event.SAVE, TelemetryContract.Method.MENU, "bookmark");
                     tab.addBookmark();
-                    item.setIcon(R.drawable.ic_menu_bookmark_remove);
+                    item.setIcon(resolveBookmarkIconID(true));
                 }
             }
             return true;
         }
 
         if (itemId == R.id.share) {
             shareCurrentUrl();
             return true;
--- a/mobile/android/base/GeckoAppShell.java
+++ b/mobile/android/base/GeckoAppShell.java
@@ -223,16 +223,17 @@ public class GeckoAppShell
     private static Sensor gAccelerometerSensor;
     private static Sensor gLinearAccelerometerSensor;
     private static Sensor gGyroscopeSensor;
     private static Sensor gOrientationSensor;
     private static Sensor gProximitySensor;
     private static Sensor gLightSensor;
 
     private static final String GECKOREQUEST_RESPONSE_KEY = "response";
+    private static final String GECKOREQUEST_ERROR_KEY = "error";
 
     /*
      * Keep in sync with constants found here:
      * http://mxr.mozilla.org/mozilla-central/source/uriloader/base/nsIWebProgressListener.idl
     */
     static public final int WPL_STATE_START = 0x00000001;
     static public final int WPL_STATE_STOP = 0x00000010;
     static public final int WPL_STATE_IS_DOCUMENT = 0x00020000;
@@ -429,17 +430,17 @@ public class GeckoAppShell
     public static void sendRequestToGecko(final GeckoRequest request) {
         final String responseMessage = "Gecko:Request" + request.getId();
 
         EventDispatcher.getInstance().registerGeckoThreadListener(new NativeEventListener() {
             @Override
             public void handleMessage(String event, NativeJSObject message, EventCallback callback) {
                 EventDispatcher.getInstance().unregisterGeckoThreadListener(this, event);
                 if (!message.has(GECKOREQUEST_RESPONSE_KEY)) {
-                    request.onError();
+                    request.onError(message.getObject(GECKOREQUEST_ERROR_KEY));
                     return;
                 }
                 request.onResponse(message.getObject(GECKOREQUEST_RESPONSE_KEY));
             }
         }, responseMessage);
 
         sendEventToGecko(GeckoEvent.createBroadcastEvent(request.getName(), request.getData()));
     }
--- a/mobile/android/base/menu/GeckoMenuInflater.java
+++ b/mobile/android/base/menu/GeckoMenuInflater.java
@@ -2,16 +2,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.menu;
 
 import java.io.IOException;
 
 import org.mozilla.gecko.AppConstants.Versions;
+import org.mozilla.gecko.util.HardwareUtils;
 import org.mozilla.gecko.NewTabletUI;
 import org.mozilla.gecko.R;
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
@@ -127,22 +128,30 @@ public class GeckoMenuInflater extends M
         item.title = a.getText(R.styleable.MenuItem_android_title);
         item.checkable = a.getBoolean(R.styleable.MenuItem_android_checkable, false);
         item.checked = a.getBoolean(R.styleable.MenuItem_android_checked, false);
         item.visible = a.getBoolean(R.styleable.MenuItem_android_visible, true);
         item.enabled = a.getBoolean(R.styleable.MenuItem_android_enabled, true);
         item.hasSubMenu = false;
 
         // TODO: (bug 1058909) Remove this branch when we remove old tablet. We do this to
-        // avoid using a new menu resource for new tablet (which only has a new reload button).
-        if (item.id == R.id.reload && NewTabletUI.isEnabled(mContext)) {
-            item.iconRes = R.drawable.new_tablet_ic_menu_reload;
+        // avoid using a new menu resource for new tablet.
+        final int iconResID;
+        if (!NewTabletUI.isEnabled(mContext)) {
+            iconResID = a.getResourceId(R.styleable.MenuItem_android_icon, 0);
         } else {
-            item.iconRes = a.getResourceId(R.styleable.MenuItem_android_icon, 0);
+            if (item.id == R.id.reload) {
+                iconResID = R.drawable.new_tablet_ic_menu_reload;
+            } else if (HardwareUtils.isLargeTablet() && item.id == R.id.bookmark) {
+                iconResID = R.drawable.new_tablet_ic_menu_bookmark_add;
+            } else {
+                iconResID = a.getResourceId(R.styleable.MenuItem_android_icon, 0);
+            }
         }
+        item.iconRes = iconResID;
 
         if (Versions.feature11Plus) {
             item.showAsAction = a.getInt(R.styleable.MenuItem_android_showAsAction, 0);
         }
 
         a.recycle();
     }
 
index 802af44f1596d5162feab910ad868a03fa145c30..5bd9a95a161377502d0e64865b5e3e74a414a55f
GIT binary patch
literal 775
zc%17D@N?(olHy`uVBq!ia0vp^(m*WB!3-pGf}dA0FfdvN_=LCuxp7Gu(TVBt$?0*4
z8F4@|3B-;~0;06&gfx(X#B^ihG>9xv+#w+WB$%8Lo0t-xlmXNZRPW&602GN!N&{;L
zGSVU9AO?s8DT_@`1?fsk4^2n_GUDS?ViQ0LVq;@N6BB`ofhZy=38W@DEh;$~s3j&T
zDJmfyXiGfU90UnNKz2+_8pvUZ88I=*V2jd2!5}^!XkA)-a$0O+ny+tKXeh)BAeR7T
zA$p;PKphPBa&!vVmW;T#xEP4<z-EHTWUxyT)BTc?fLcB=>D>ngL`F%FUob<fR>|D0
zC$=vv)@7W)ntmsPgK4(Y-3N9oOH2R!z0mOD@P-2~V;7i6d^QgHCnkFSm(;aB`OWI8
zkFMU^bLIWMFFS8ZmY1pQILOASJ)<R$i$CYxBIcFfCr$maY+ixP%-_P%=brz3dUAOr
z?+yDIUBIXl_H=O!sbE}t;iZ{VqR6q2x~(!^9U2QgUd(7;a%Sdp$JBYY-|JbwNuK+b
zwO9V{zJJ%_&PUDu7thQYzu5l5l{-Q?s<SV$nQv)7^r6LC$z^VAL3Fvus(JS!<nLUQ
zKOW!7xI>ro_=5`tTD*x{1tT6UmTZntTd-y08e2oZd7Yk_bsIALCRwVM?__DnoWEpd
zqz8B7S<hMg&KH<&ESf%T+QKb14Wc)-)@ZFbvDT$3`_47b{O0I+U%2iF&HlBGb=%r}
z>jc+e`O^uztG{I1yR2)rh&VYVWm!SSgvT7yzI^12^gDl!F(zix*&R)9chyYZqZ^*U
zJxMvpb#GLUO}XfbO^!i#>}|YOUU?P&@k>l?Wo`BUAAf$SUFYZVsYx@|mbC#!34^Dr
KpUXO@geCxrZ$pm&
index cc01566a8da04aeeb3b6488b713beac498feb69e..20678853b8465345d5c76ab85bd3bd38d4934b5c
GIT binary patch
literal 555
zc%17D@N?(olHy`uVBq!ia0vp^LO?9S!3-p~d(N!@QuhLULR^8ggM&kKbV@{GVrXb+
zTvD2+r)O+ZT6}UwTvB>`a=Jr80+0kDAU7!^CLsl=CN2>ylAIBpkP1?nm=PD3;p>|g
z2LwP_uwJ0aKs9k7Eg-!>Eip-{@j#VH86YlD3Zx8bOKdFASfFWOy@?>H*u=D`1h7<6
zS`0*4B3M~sT6}y;ELbEaF*P<RJt`>)WM+I?Y$C`IpkAQ)F$oz!hyAp!DhIm5vn0qb
zn1Mw`maU#W`_P{w95r_LAK6xg|N3kCW3CyOu;YS%jOX8Y%=8Z~T(my_c3|#T&5yd*
zVy5M(?kb4>S*aLroUqTzL}{<G(~Zwp9VQ;RG9PH@W=|K#kP61qQ`du990c4Rh6%D9
z<w=tXJd+e~=HS`td;eRvy-3u%vC3Bb^4EG(quo1yvifgvt^J#z*<!#o%{6R=YTVMy
z+}h?@X4?;J_4W1Sdh_PpTX`8dP46<EXD(arT+%E^TYBJ<WlY4*B@4B8gzY?dQTL8!
zW!>Z{1^RF09u#)XQ#f@?g!z2lo*TiAzq0=C-CO_SuZhE#uXF$WVQRfK|6uD+@wJyr
lgT5ZQdY=7o(UksDABN1kTIIZZCxMa!gQu&X%Q~loCIHb%<d*;d
index 92e88fd92c9eb9c8e6c189c1ac5c77c5a5e61163..1f22612cef7a301a43a33433a2e3a132b084654c
GIT binary patch
literal 995
zc%17D@N?(olHy`uVBq!ia0vp^DnP8k!3-o9%B;A^z`)oa;1l8s<i;hX1tcUyC#J_F
zq{k<v#l@w>#>N80<CD{)qM~AxQ{$3>;^}co8SzOOu}SHn2?;<g(a|X&!Q_m1uxvy^
z22c>F5vUA|(nCW-V-qtX5)(lRk~3mrl4F6o5>miiplRumk!fHPK<wDq6o-U_*u>O$
zuwJMk$>|Ob4spp~!MHf68<I1Ojnm>1!O9?d!GdvdX|c&^@rmg`DG)a?4Qvj`t{AAx
zGk{Ktj*bSIlL&G%&@b^I1hgn4CMh*84&)cGXH(;nQo$ONfDQvWH31kb5VxhpfJ_EC
zFD5Y+7)sG#?*P39atzo3U^l?L07mi2AjibVr^Y5gf)PZ<g53tzl>re1I{Wy1lhr^&
zTS|ibf*I-sv|Qcv#F%OXW7mHAxF%VmN@o7=Uo#adxZA(=vX#l6KciA?@#5<jk^7G)
zDRQ{?JUQ?(izVrm@bw3)SkwRIpHBTD*O!>{H-6=@Bhhygc=+D?U(MJvadxoTuC0D9
zAJjE-HPoJ$8og<<VszeKuwh1IW%#+h8#i|z)b`!IK5*gwo1b^gId*Pw2r#MCd%8G=
zR50$ne6yZAQR3*w%a_VHuC7|<%Bw1-tGP9}IU>r(SG9>{qkdAn$D8iY?Y}GRChs}F
zNAi8@e)H$g%Bwf5*p=`yZqt_K+s`*|>Is;Z9=2x5i+EFmjvHC4GBVB@Onq}g<6oq=
z@Y-m5H}A4${+uP9X1&HopXpl8%6M(I?3SPK*LMrLU98n5X5YEG+4?=d@7tT%?)OYI
zzrD3@m{I>B!06P3q+bS8_9<I^>JO5c-B@OG;UZ_(<jRcYA<hXg+YGpJ9n6npb{Std
z$9AQ_FRe`A)Eyn+g1Bc)Q+lonh^OvKXeo0(b2_F;Q1^y`+C`B$dfp)|!Jdn>3$(mT
zME$O-%xbt?+Qk*KsL3VN;_iYSoYSL4w%*=wXD9b!FT;9%&hPRc6mQ9~ifmPy^1<+=
z%&mC_VRcdMALiLEuV|e1%X^#8zEgYo?)S`a-|OoArSJboyQY<P23L>Uh^!afaJV3u
z&2y@n?pgmAUw(RD6KP$4f5JNJKmQ&-U;ppYd;4PUfPYL4f6QuQPw)Q@Od1THu6{1-
HoD!M<@M5Rs
index 107c77e8c3feb7d213a4f5c39fff08b76f16a475..2eb454333e88ae0ba338647ccb0bfe6b86fdfc54
GIT binary patch
literal 1323
zc%17D@N?(olHy`uVBq!ia0vp^W<YGo!3-q5&T3dOFfe`%@Ck7Ra^sRRKxATiR8&-4
zQhHosT3k{Zh>@HTpOg`sm;n@tO-PSTO!G@h0;x>SaBy&lOG*W+Nr$KelCg>Dp`oEb
zc0^JVP&__4JvKHLB$AXKnwSVA<AExH2F9iU1%a|a5~u~LH#yzd7-(rm3`j4~-t@?X
zw19*Jpj1pUNIV{FAjC#6BO?wdo}3z=m=1O!NF+WfH6CbMaz<=2*b8wPF^Op)jbM92
zL(`(8qhpiOKx&dQqN7uQ;;}#m%&9=n#wDc1K=dYp?Mlpmr~xTRg4+vZfWjvxCOIDL
zDF^}wMFzw!FoHW0Xbw;TC@^DSApn$(N=S{2Oo>fS2C0n8h>J@FsRa8SgyKPd0ed9F
z)6)}d8pP!wi$W6;A`%nh!M22kCPyTIT;-6E0CZstFs72gmIBo$Wkg1%#U!PI-3(G3
z5A;!T#trqo8o-ELRubeF%+Sg>LC`Y3wrkqN>J(pdUZ&YBo>Q;<`+c~Md8yRvw_<GT
zM0>w~Q{>#v)BO2Q8|wk}YiBhCP6T``IX@}?!^X);iDliJ{r<k|b2Kyh`l*SZulUS1
znJo#<zqp@9c~^vdnH!h-BI8J4d1r^pluPrkuXvf(@ZjL?8Cl_L9_jDZ+-V@L^F&(h
z@q+2Mv{!|`VV`C5W8Xaq*|5_>3O6}wJhGpaz7h#ud+2B3otL|}F)%RMd%8G=R50E>
z|1-QNQ0Dl@^F3`LSy8jHf}*^Pl0^)+M6A;6_G#IqBBWLA6e)Bn$m!dgiRbUXlsR5o
zHShVo^jH60eZBmBPW8R#HG2Qz^<Ferb1oEl9=S`WuF@&#Qr8oa8<oK;Ph7fWY*cHK
zlKQ;j&$RC`r*58VvGMv8yIMg+B<NIEm-mX0SsSJ5r><RSs~s=BVDW=p0u7(OZb=uN
z+LL+MEhKl5?QNN7OkUe_mg;`qRdYpQQ`ReiNZz$sueYh@-QT!*pQ4O*cF%<+D=Wh}
z{{JX9Z=bu#w%Rg3{&Zc0OLX?snZFsH%jz^Oc{@SN+NXK_QSMgdw?)?qOZHi@O?|97
zWwV%+pTpA4bBn}mJr{CoEpG}*S*}^K+~HwQ|Ee|ZPC_D4E1R^EotBAjlF@po(^@=X
z?sBOr%`XSf-SuZ*A$*<nMy38GPQ6ZT@v^zoWgm8(c(ibFNQ&u&iK?4cU%05UDf@z<
z!lsZHJM=a=zSyC-X;M+f4$p^TCLsY5O?`<IUGtosZCkA`6ijdP%h=(rXu#zD{q6=S
z-k^#P0(^44y}uK`&S+EjUubg6*N*$(A`Kts1ST%w$tpKL$cUMmoP68tJO9Vu1a_Tc
znUhRY<6hNG{5Z+UUnFf|_?8*#@?<LC`c^-#jJ9#xT>d^WEY#D}z{xXBTF0*DiBih(
zgKAO7Sw+t|Jo+b+nDaMoMU7kn&*7H^0Uw@f%d*617KDAvoy2v&x?W-1%$o}tbhGNu
wwQb<YJh?V@KijA0&ps{Nyu7aZ&xF5>>%5IlnD(VS115e3Pgg&ebxsLQ0FSdbYXATM
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..79aea57bc797602fbb01191f315abfa28ff388a8
GIT binary patch
literal 897
zc%17D@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z6#fV2lj#32|ir0|y5OW8*Z3goM!0
zP+#9PAQ>GU9RT7c$Hm1(My7=(CdS6bMn<NDCL}~8B}FACM<is##->Cjqyfq3#Ps<1
z)VR2msD#wG<mA}Iw78`7n8eiR_>7o@jJTw<*u<2Wg!I^i^qAzdIH2OBjF_a1*rbg3
z#Pqo2)Yzo-xWu&h#I)EXpe#r*HW8#NE-3>E0o9~KNTBw(<g|DoI~gpVoB=WcBnVaj
zK_GTUd@>RP*{Gy+un3TZm;hqLLl|HK<Dn)%>;fr9Vt@^V+YV+!%mG`M5f4Vo1VrM1
zAzM@u<QL4q$im9O$;HDbAS5gzDkd%=C9j~Up{b><XJBY<X=Ux;=;Yz$9TFCukeHO5
zl9`=TSzX`I)Y{(B-8*68<SEnUEm*i{@ygZfHf-Fqb=&scdk-8ueB{{i6DQAHx^nf}
z{fAGUK6~-%_1pI!KYjl4?fZ|PzkdJCEz?{8jN(*J7sn6@$<l*=t%DO8jz3&K{ifn!
zk!81>G^b2oGQBrRb;*Vk(LIa&_-;M>{Qv)j%j=$7J%4!XUG(*e``c`<eiys9a@{)b
zAG1SjBYPsR7HS{Z@ggKwKe1SN)2fr76DuUn-3~ond?P>OMtk@w#X2tKOB{bPC$C=l
z{$qFl{nG(CQ>3~BEMsO>PRg2eaeqO;u~}0LJ3}oaUW5y3--zxx*`fQ6HNrJF;fXri
z<RX=JwNDb#yZ$oY_*l}so%_!o<*)OYq6=e%?=#hXJ-OpGbE}wT6jwvNf9QASguRgq
zpOq?joR-?bV5j|sb%#vIi$u;o5v!(8%9fipEW04}<jE;#zlAb26SAe}oqX|fq9Nbz
zqQ7lDR}AA<o+<Z`{O~k`Ju3Nfx<vZrjbRE4J=px*`ZxBu`#)$@N{(=B_!=_tddSpg
zLY+H>Li0r;kL{?sue;c~zIEdo55^x;CQXfE+^1#qbp5iY9_xPv|9UTfT&M8~r+(;0
PP)_o6^>bP0l+XkKjlzI7
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..67654c5d76800a5bcd2844bd2aa17224679a12cf
GIT binary patch
literal 641
zc%17D@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGp96eCTp7S1G&I!LH_b08DLOhj
zG&C(LDk?TMHZ&n2CMGQ|E+Z;AIU*q=Dk&)@DJecaH98?JK0YNjDLpzNH6}4NIzA&l
zIXyNpB`z@|COIuWF+DChJuV3-k^y2TrNx5DxTK6&kaz}ADjrHg89<G(U~XJ8R2D1_
zLh(>7U}a!7R2SF^h%AUq28lytp@zT}Be)<o5ItD7#tP`?fRZ4;U<O7`E?z!<K`{wQ
zX?X=Db!}Z^6H_Z|J13uj$gJG5%G$d6rndHup5Fe6ljbg5vUJ(<HJi8X+I#fa$;-Fy
zK7R7z&D(eHKYsfB<?FZaKYsrD^VfgTaYdlnZ#`WcLnI_?4|aw%IWVwZm>w1pm=PHn
zb*oEvi*}@1(h|?^_y6}V>oj(Elh`9}{At~6_ie$SWM=m8f7;xjb6g}RB|;`ZV!gxr
z2@|<9p4zw_3Vk6Hu&c@KUGJsoos!Su{=R$K9z6Ma`{KX7tQ=vNc~_X$<VC$G>eIV5
zXEE>Q<36^+8*I`(=y0gckE-LGxVAy+pxTnTg28ULXRK=R;m{7a;j>}kuGB-kA+l;E
z3qH+!;GAf1)M3q;DMm@5UVrVDY9;Zy9ZNs$t?uk5)nO@8xBj|<h~9opi;k@xc4CTa
ot%WzWM!fx-Dc<$y?}E1a`m$5~mNi|Q4}(&Yr>mdKI;Vst00M{w+W-In
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0098b76bd26ab501d846fee8e477e60691979e4b
GIT binary patch
literal 629
zc%17D@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQae*%0$Tp3`%!NDOkG&DLoIv^n-
zDk>^8G&wRdEi^GPHa0dQDJd>4BQ7p2A|WF-HYGkj4M;{Oq{YRh#3d)kB&NnEr^hCy
zM1#oGnB=tBg!H(?^q8a!AQ_vK9-o*I2PBiz<C4;1LF_azJ0liM#sj5*DuD>XMIyln
zq7j7RLE>Qb$q;UO9GD9xq1xk;;VR+W41_X>Y%;{yjPLbHF+iUOmjw9*GcYo-aPkQV
z3W<n{NlD8oC@O2}>KR(uIXSy~`-VivWE2*al$KRBHnp|)Ph7NN<E9<EcJDoW<k*Q*
zXU?9#aOv9h+js9hc=+V$i<ht8ynFxo>(9UclAk431C77x>Eak7A<24>)yavGfptUT
zb|$4);Tv~v;I`ga`+a}6G{f%Qz?eD7!_aW~i3~%6(edLm*%)M&Y7{Xs_&nJavg@44
zg2mTv+}Qp5tW5FGz4!0uT(OE#J6WE+eDb-u*UBfwWT>rHR&BU+BJ0wX;;H>o3|srR
zR7vhQSuMKY*Sy<|61&bvv#!|lG*LpL_MDBu{ON`b%~u+$_!w=L%`cky&xWz&@7Axm
zfB)os&HP`=xXLp6m(Qg0OE>p0r%hh6cgF?4Ns$MNK5f0{`~6n<CMJ!z?d**Q-(F|>
YulGTn@4_zYbWqaqboFyt=akR{0H)6buK)l5
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..112c5af885ac1c6e9fd445f97dbd6453b01a771c
GIT binary patch
literal 436
zc%17D@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQa^8<WBT!FNwr>C!PT4-o!Kte)f
zWLjioN@zktL}FrGTxx7=N_>1uOk!$ua(ZlHYFtukY(hE^#V4i4C8ozFr^P0v$AP5M
zfMi@!Mm&fOW+VaCWW*(b*bs3D8J`Rh1d9W?Anh4o5{f`7fogz)V6-(LX%o<iCM7|B
z!3^wNJOU!(60&NV##YYmo?gCwA)y&rdF2g_&FxdxtlPM4``-P>Pn<q?<<{-{4<A2!
z@$U2Af82jw0QFDsba4!kkW4+;D%9k_z;eOW@sNYg8-_q0r<?!(o8?>VQM}h&WV0yQ
z$L~U!YJP@f;EY8togVhJDS8`+y!rX<i<ZXT^SfJlUEXvEY*22H+pKzx@$td7cE*D>
zo1SGZN?95b#65L_SI7PqucofB08JAQzHAu}xz?JkXEZ7%)O_0gl6mjf_AiP%e<n6e
d+IK#N!G7;@&83%Le^zDyg}<wx%Q~loCII;Wt+fCE
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9cf55fb750949e3209eca683c740a9a5efb82d71
GIT binary patch
literal 1108
zc%17D@N?(olHy`uVBq!ia0vp^8X(NU3?z3ec*FxK#^NA%Cx&(BWL^T<Z2>+Zt_&~`
z8XD^0;9zW=24W;607+k85IZ0tAu=*8HZ~<bJ}o9DIVvF?$c|1-kB?7{OHPhSOp8rQ
zk4{L5Nl1xLPLEDbk4s980jfy^ksx+*T3ljAY(jc`QfgdcI*=QioED#y0c6JmxgZA6
zgp9c4RG>LPMm&g2k4pxUV2z1saUe6HBv1>8Oiqsn8Vl3~R0%W(!T=eY4rYK10g@nd
zKqjX{xIn3RkQ7J+Y#LZu5=0!%g|Z=v;~)k?HG<VZOhYmji3GU>f*=ae%#4Sb3F0Or
ztN@ZOHH$w1<Dju5$S;_Ik%^gwm5qawi$_32QCUS*Q%l>>$i%|d&e_G)-NVz{$Jft4
zAT%sIGCDpXDLFMQBP%;6FTb?BqOz*7rM;`WXVT;;Q>RT|uyE1hB}<pBTC;Y;#x2`+
z?%KU)-~Iy!4;?;n`pnsL=PzBpa`oD++xH(ndiwn3>yMwleEs(Q$IoBC|NQ;;|LV<t
zVDfnH>Eak7A=!Jd+djCE;n>6PZ*tD43QqFU-Fj)4L@bBsE``<@rRgDU9kWh%bk+X<
zT$i3Rf3ESidG0&4#Kp9}%D<5~k|SCst-PpdO=?f*d@jz(Mc%D7im4}q>Ua<Qu@MNX
zo8J(?5fKn4-k^FqiplBJb7p~wN(a)P7Rp6@_x@M<V3S{JFXLJxIfl>MihgQI-M(LQ
zm({G<sA=|rdyjUXlTNR-3cGZ}P~x|1)bb!J&)d;8w=YI0xeBFtPtjbe<G9VmrSKBp
zwPV$@vP;%1+nHYTwqeVTv_hWk?W>ti39jJU&i{Bu=vTgDJ^{-)&LzAF^A`VZpw?Zw
z=#gj7UvHyze-F;kxWw6|X7DdA{M1?Io{bGfEXNG^W|zG26G}d!&;Osp?bAG?s6w8b
zMH|}-Y(l1)$uJj59{A{@7b{V?^N8WRQ;%5<RHth`n7Zd3)83+&tnW_0mb{=eUF^Zm
zJ@=Tu7OiA=d-|1EWBTGPt5=8g6(xkq?W?^pDbd|LK{@O6ji&qC?wn&Np5&yxWKE08
zSw_*KY=&PU*1pF|*8XZ(T~y6d!moC6lFS=6xzle|CENf0ZBN-V?Y2nf;;WZ-241o|
z^_JZ|?e&x(^TQM87kNMGhz)de=5fCiWOko#!?hI6?yFy9Z+twtG`HIF)%14zU3=~>
bQ~uBJO8v`%CefG*P+{Qd>gTe~DWM4f=D69O
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5b9299437465db3a539517136cc476c003c476ac
GIT binary patch
literal 744
zc%17D@N?(olHy`uVBq!ia0vp^8X(NU3?z3ec*HX>F!BZXgt#)mKxk;FLqbAmLPB(O
zN<?B}L_$VvY)VX0QgmW^Oj3GWa&l}^dUQf+Y+_nWLPlItT5MuUOhP&k#U-W2B&WrL
z$+)D9SfF51YJ5^gJV;|kTykn$Vp=Rv9B4>l22gukQhF>%J4iu1NMi;_1i}E3=`fTL
zpA3?UO9r8MFp2{!hLG`4@r-zwNE}Fg21pPr5)alJ4-<iCkB2D(tAVi7<6-2@!_u>W
zVG&sp<QL4q$i&7WAtS4xsIH}NXku#a;OOM);py!c5Ev9378#wClA4i|S5#b9+1b<E
zH*xZu`Ae3sTD^9|rd_-D9XNR8<e9VQE?m5P<?4<5kDtGO|Ka1O&)>fP{Qc+eKjy>C
zz+h)I@N{tuk&x^?$gO-RfPw8o{%4PSODA|}d41+_?V7NtLvGdk|NjLejql#PTgLbA
zbGTMrMWEX04+(RXXBU(opXkn-$8^Q@!7`7#lbO<2o8%n6Y07(^YmUyPEzIiEO|FKX
zILrS-olVp9IH&&Q4Ti#27VAqiUR>AbGq3rvblsb|clHIo+FLU#BCs)IvYg4{j0=<5
zyuK`HX*ILW&}V4mi!Ei6;Qan#k$9WlCs+4)L5U=0D~TfsUHqD+J;_d8L7E&!Q%)Rk
zTCB?(=6TEOkQa!-dQ0oTDz|9U2#wfVue1byYCLS#@aR-<;q+2bICbfYwcV>rQ(86r
z4;z@XpPBbH^MrHA(;H`nN<N3ntakcxP`+Pr#<cD~9~m#IpS&K+I{Df=&pM|mc~`$L
gPuTkPf>-hz>36ea{QsTQE&-)hPgg&ebxsLQ0C0^k#{d8T
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fdf1ae32a3586ecb9b45bb8c690272868607b24b
GIT binary patch
literal 1579
zc%17D@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bO2I}#X;^)4C~IxykuZtVhQjGab<vk
z(9lo^2M1&0G$6y%)6*d#0mz7rjRlf^NlBrhX#oidadB~xk!hici9qql$du58gqWDL
zh@_;5#KgF`w1|X^sHCL$__Uaq<hZ!hn53lW#Ps<1)aZn?n56Wmgw&YCwAiHdxTN&x
z_>8!uw3vjH_~i81#8e<VHZdhSIXxx;!cC1$NRLTQi%ZOiON21eW0TY3lQLqHQ{zCU
zWyAx`Nlc3aazSQ7xEb*v5fB4N#wMl314V#bkl{cnC?gi=B#<D80V2WdIIyeY62T<M
zA_xO)EIKy>q&_(v#s*2nLl_W2kZBN=AU4D<m^jpGxE6FSj2#b^g4hDJ3(k&5H~`9y
zg9}0ogj<~qbqv%Qa7&Ys-H@@*{`g&B3Rqnd<QL4q$i&RT%Er#Y$<4#dFCZ);Dkd%=
zDJ3hXprov#rmm%}t8ZXrVrgw-YiIB1<m~G1>E-R?9}p5677-O47oU`pnwFlKm6Kmk
zSW;S6Syf%v*wozG*51+8-8*^8)M?Xa%$zlQ{(?n|mn>bja@Fd!>o;!RvUS_`-Fx=#
z+kfETp~FXx9y@;G)af&4&tJH7<?6NTH*ej&cmLs|$4{O<d-3x1o44;ie){_D$IoBC
z|NQ;;_4m?h1_ow1PZ!4!3CXz!yPbnmW!N5k&oPeGGCi_{!O+L`bhJh$<J7{F4uYq=
z`2+&Jq+C^JO<Fngk-_Ilr<?>5wNBit-*mrx-{Uf~eTU8Fv2(BNKKg2d$5l?Fz+TtL
zUmcGw2I(9V-(s2|$n^ixw*t;j;oirepP2ogPxd?WiR*G|R~6#}yG~EneD`a@d@Zfe
z&=5Pvx^;nfHm!*k*{=H}S$nF~g0@rcCyujru`?=sXh=HZ^v*0Ovms-_Ch48OrzY8O
z2+Azq(Ku)A@*;t4%^_t<;r2m3;s?SEd_SreZK>;fBq4KrMTp{T^X*sK^=+1Ysxg&W
zJwJHnpT{nbuZ0?L?!AA((B#|{IhC&lPfsot?v)o&TDfQ6>+hUtGqhcUUdkBT?7R{h
z&$r-%jjvKc=Y=OVisuUVZS20A{czK^-;X4oTen-pK2o0eZ5FR~!iFSg-|7?<zv&ij
zD|uU`w~I%gIHYy&o`l?@GU44TUH_bzXz#RE%EISu55MKdxeLog7EQjD$!)p8FZgv^
z($^sCOhxV2DqG*{-uUzP%ApflK5y0SWxVSamdQlQEI0chHEG&kx3?T(B`voC1oYO&
zFTK{rx+QS;Hkr&YzToWE<zZPDnNlhq=VzV$aKY#8e1T`0yWH1uy7^vtx1Y87QTrC(
zLm88{UEH1+V&(Rft7lz6WegktQ+<u9ge%U5zxDR82#fqq+%o@EQN_vyo0#3KSL|We
zuU@gH@uHNL{9$kHqb4>!!7@$L-)pQpe7LmBuHt9+B5}>x=E_T_KVsWsvozzNb}I7|
z2g$h1g)^Gk1*XPcaFX3DvRPI!WA_S?gKH*vaZY*AsA;u~k7ePMfSXL4{Wa(PWcZQg
z{?aJwHS>dNw~vx%`hr{-bGnV3OQah#j&3)QUhv}ZE=MVzb<Xlf&l~Lay;%85b#fk`
z@yn+x{kp6TKJ8D~Rb8!{{XTZt?2m_^$S(VtAJ3q)LI0S^QiGeG)0gWyS~Q)VT=G*u
z&DW<(Ua#Twsr*Mizl7A@mYgXORdfz~&LbOtcuDWJBmAlc8ZW&sTw|N;8*(n}fb-Ev
qt*HjTw9GEXce3WZn%`ln{Ip&{dXq-3-*Gum8Sm-p=d#Wzp$P!v$f834
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d2baeed443d989754b3312c85f2b3b792dcf472d
GIT binary patch
literal 1123
zc%17D@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bYNg$To~XJ;>rL6p`oD;4i3h~X&^>I
z0+5W2jRlf^NlDSs(V?Mf0SO6FQBk3x$#HRUk&$UY*~rM0(1e7zxQw{Cw1|X^sHCK*
zg!H($)Y#aR*kquxl(^*N*rfE>#I(4i^thz7_+%hEB|14hCLujODJ?cJH7+SNJ}EUW
zF+DapEj}p&%t(z(NQ;57W0Nv~Cd4JC#ezgK;*!&WC>CfGkPS977Q_IV3?$=#YJln!
z)4>d&uJm{aBN@U4ks#BOK<325#gm}Qz#<U68S!9cU=pk#8D?fOgbPyu=ElLea7H{-
zFe4tW1!8G3)OM)e<P3-#;=%3#8JnCA6M>TVb$&Gfqo=DR$S;_Ik%^gwm5qawn}?T=
zUqDbuSVT-*LRwBiNmWf#N6*m2+|tI*$=TJ--P125G%P$KDmo@MAvq;AJuAPUu&A`G
zqNcW?skyal!o;c5X3d?qaM9u=OP8%)vu^!{jhnaZ*t758k)tP0o<4K--1!R^FI~QN
z{l=}^cke%Z^7Pq@m#^QvefRmx*Y7`m{r>a!pZ!OvAHXE^+|$J|L_%`z!QOc8L<aT`
z_seGcn5s_NvxT=)bn_nVu2z+$u2Z~BJ)MlWB_~Dx{g<`*UGclT^QGsD@9URMii!0-
zwD_8D(Pq(kKg1$G9b?yjq?6q)t{?gB9DC{V71r#f##i=!cfMLEb<X*!2(P@!ip~p9
zn6B6?KH0@4>b^arOi)YivXXSeo@YvH^&Iax->Ttqx^|H1?K+2R4BAi19M3)E4coQw
zpsPmJ&wt(dBDX3`uap+ayKGTTf8Ue7{l&A>SN5Juc9i(G?QYGMAG5i*@-N%wCNgYY
z>{=Bhv-T*9t@Lp#+vwv=w$ToA<{fRctGd!Ysjli$|0c&OgO1#Pf?CoaotO6pUYx<^
zTrkN?t=VAZtYu9vwIW*5G;_^ZX3whhnzi1sb(gAF<f>+e!$zt)<_;?iy~A(1S!8Hk
za^1-3_v+;;Ilo0EqOFttc6lB0>{=I8FlpIplQ}6bw3yW^cbz)yI78@=KzD!>OA@D-
zhr=5))jLf$3{-iXbNb58t7n+AZ#0cc^<&s58MW4N#Vj%Hw;I-;XNg@E$Xs~xdN$*W
zn$CWc%tjA(Ui;wc1fd<jX14Kllmvc%ez5Mwn|D7Q@0NCaDY`v5jicrLzobZgm!v=G
yYFzB>Y+O2>jw`Ic|9zSH=D~#kyX(FG|1s$%JfE;z-TN-6pzw6{b6Mw<&;$Vcved%>
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/resources/drawable/new_tablet_ic_menu_bookmark_add.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+        android:src="@null"/>
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/resources/drawable/new_tablet_ic_menu_bookmark_remove.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+        android:src="@null"/>
--- a/mobile/android/base/resources/values-large-v11/styles.xml
+++ b/mobile/android/base/resources/values-large-v11/styles.xml
@@ -102,25 +102,20 @@
         <item name="android:layout_width">wrap_content</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:scaleType">center</item>
         <item name="android:background">@drawable/new_tablet_action_bar_button</item>
 
         <!-- layout_width/height doesn't work here, likely because it's
              an ImageButton, so we use padding instead.
 
-             Because the curve of the reload button is lower than the end of the arrow and thus
-             the top of the view, it is perceived to be slighly lower than the other buttons.
-             Thus we use padding to fill a slightly smaller height than the toolbar and let
-             android:gravity center the image with a slight offset (.5dp higher) instead. Note that
-             this offset also affects the pressed state, but it's hardly noticeable and thus negligible.
-
-             Note: the above change is done on a generic style and thus any other items added
-             to the menu bar may appear to be offset. -->
-        <item name="android:paddingTop">20dp</item>
+             Notes:
+                 * The bookmarks star is larger than the reload button
+                 * The reload button contains whitespace at the top of the image to lower it -->
+        <item name="android:paddingTop">19dp</item>
         <item name="android:paddingBottom">21dp</item>
         <item name="android:paddingLeft">@dimen/new_tablet_browser_toolbar_menu_item_padding_horizontal</item>
         <item name="android:paddingRight">@dimen/new_tablet_browser_toolbar_menu_item_padding_horizontal</item>
     </style>
 
     <style name="Widget.BookmarksListView" parent="Widget.HomeListView">
         <item name="android:scrollbarStyle">outsideOverlay</item>
     </style>
--- a/mobile/android/base/tests/testGeckoRequest.java
+++ b/mobile/android/base/tests/testGeckoRequest.java
@@ -91,17 +91,17 @@ public class testGeckoRequest extends UI
 
         GeckoAppShell.sendRequestToGecko(new GeckoRequest(REQUEST_EXCEPTION_EVENT, null) {
             @Override
             public void onResponse(NativeJSObject nativeJSObject) {
                 responseReceived.set(true);
             }
 
             @Override
-            public void onError() {
+            public void onError(NativeJSObject error) {
                 errorReceived.set(true);
             }
         });
 
         WaitHelper.waitFor("Received error for listener with exception", new Condition() {
             @Override
             public boolean isSatisfied() {
                 return errorReceived.get();
--- a/mobile/android/base/util/GeckoRequest.java
+++ b/mobile/android/base/util/GeckoRequest.java
@@ -1,8 +1,11 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 package org.mozilla.gecko.util;
 
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.json.JSONException;
 import org.json.JSONObject;
 
 import org.mozilla.gecko.mozglue.RobocopTarget;
@@ -72,20 +75,20 @@ public abstract class GeckoRequest {
      * @param nativeJSObject The response data from Gecko
      */
     @RobocopTarget
     public abstract void onResponse(NativeJSObject nativeJSObject);
 
     /**
      * Callback executed when the request fails.
      *
-     * In general, this should not be overridden since there's no way to differentiate between
-     * expected errors and logic errors in JS. If the Gecko-side request handler wants to send a
-     * recoverable error to Java, it should include any error data in the response object that the
-     * {@link #onResponse(NativeJSObject)} callback can handle as necessary.
+     * By default, an exception is thrown. This should be overridden if the
+     * GeckoRequest is able to recover from the error.
      *
      * @throws RuntimeException
      */
     @RobocopTarget
-    public void onError() {
-        throw new RuntimeException("Unhandled error for GeckoRequest: " + name);
+    public void onError(NativeJSObject error) {
+        final String message = error.optString("message", "<no message>");
+        final String stack = error.optString("stack", "<no stack>");
+        throw new RuntimeException("Unhandled error for GeckoRequest " + name + ": " + message + "\nJS stack:\n" + stack);
     }
-}
\ No newline at end of file
+}
--- a/mobile/android/modules/Messaging.jsm
+++ b/mobile/android/modules/Messaging.jsm
@@ -138,29 +138,31 @@ let requestHandler = {
     delete this._listeners[aMessage];
     Services.obs.removeObserver(this, aMessage);
   },
 
   observe: Task.async(function* (aSubject, aTopic, aData) {
     let wrapper = JSON.parse(aData);
     let listener = this._listeners[aTopic];
 
-    // A null response indicates an error. If an error occurs in the callback
-    // below, the response will remain null, and Java will fire onError for
-    // this request.
-    let response = null;
-
     try {
-      let result = yield listener(wrapper.data);
-      if (typeof result !== "object" || result === null) {
+      let response = yield listener(wrapper.data);
+      if (typeof response !== "object" || response === null) {
         throw new Error("Gecko request listener did not return an object");
       }
-      response = result;
+
+      Messaging.sendRequest({
+        type: "Gecko:Request" + wrapper.id,
+        response: response
+      });
     } catch (e) {
-      Cu.reportError(e);
-    }
+      Cu.reportError("Error in Messaging handler for " + aTopic + ": " + e);
 
-    Messaging.sendRequest({
-      type: "Gecko:Request" + wrapper.id,
-      response: response
-    });
+      Messaging.sendRequest({
+        type: "Gecko:Request" + wrapper.id,
+        error: {
+          message: e.message || (e && e.toString()),
+          stack: e.stack || Components.stack.formattedStack,
+        }
+      });
+    }
   })
 };