am e3bc8d8f: Update BTAds sample to use a service for advertising

* commit 'e3bc8d8f8ee6ed76066eac29e4fe042129c9f0bd':
  Update BTAds sample to use a service for advertising
diff --git a/media/Camera2Basic/Application/src/main/AndroidManifest.xml b/media/Camera2Basic/Application/src/main/AndroidManifest.xml
index 87d9af1..5b0b5b0 100644
--- a/media/Camera2Basic/Application/src/main/AndroidManifest.xml
+++ b/media/Camera2Basic/Application/src/main/AndroidManifest.xml
@@ -15,16 +15,14 @@
  limitations under the License.
 -->
 
-
-
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.example.android.camera2basic"
-    android:versionCode="1"
-    android:versionName="1.0">
+    package="com.example.android.camera2basic">
 
-    <!-- Min/target SDK versions (<uses-sdk>) managed by build.gradle -->
     <uses-permission android:name="android.permission.CAMERA" />
 
+    <uses-feature android:name="android.hardware.camera" />
+    <uses-feature android:name="android.hardware.camera.autofocus" />
+
     <application android:allowBackup="true"
         android:label="@string/app_name"
         android:icon="@drawable/ic_launcher"
diff --git a/media/Camera2Basic/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java b/media/Camera2Basic/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java
index 2414ed6..020ca14 100644
--- a/media/Camera2Basic/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java
+++ b/media/Camera2Basic/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java
@@ -55,7 +55,6 @@
 import android.widget.Toast;
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -264,14 +263,16 @@
                     break;
                 }
                 case STATE_WAITING_LOCK: {
-                    int afState = result.get(CaptureResult.CONTROL_AF_STATE);
-                    if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
+                    Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
+                    if (afState == null) {
+                        captureStillPicture();
+                    } else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
                             CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
                         // CONTROL_AE_STATE can be null on some devices
                         Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
                         if (aeState == null ||
                                 aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
-                            mState = STATE_WAITING_NON_PRECAPTURE;
+                            mState = STATE_PICTURE_TAKEN;
                             captureStillPicture();
                         } else {
                             runPrecaptureSequence();
@@ -636,6 +637,8 @@
                     (float) viewWidth / mPreviewSize.getWidth());
             matrix.postScale(scale, scale, centerX, centerY);
             matrix.postRotate(90 * (rotation - 2), centerX, centerY);
+        } else if (Surface.ROTATION_180 == rotation) {
+            matrix.postRotate(180, centerX, centerY);
         }
         mTextureView.setTransform(matrix);
     }
@@ -657,7 +660,7 @@
                     CameraMetadata.CONTROL_AF_TRIGGER_START);
             // Tell #mCaptureCallback to wait for the lock.
             mState = STATE_WAITING_LOCK;
-            mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), mCaptureCallback,
+            mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback,
                     mBackgroundHandler);
         } catch (CameraAccessException e) {
             e.printStackTrace();
@@ -794,8 +797,6 @@
             try {
                 output = new FileOutputStream(mFile);
                 output.write(bytes);
-            } catch (FileNotFoundException e) {
-                e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             } finally {
diff --git a/media/Camera2Basic/Application/src/main/res/layout-land/fragment_camera2_basic.xml b/media/Camera2Basic/Application/src/main/res/layout-land/fragment_camera2_basic.xml
index 3a3e2ff..8b2e1ad 100644
--- a/media/Camera2Basic/Application/src/main/res/layout-land/fragment_camera2_basic.xml
+++ b/media/Camera2Basic/Application/src/main/res/layout-land/fragment_camera2_basic.xml
@@ -26,14 +26,14 @@
         android:layout_alignParentTop="true" />
 
     <FrameLayout
+        android:id="@+id/control"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_alignParentBottom="true"
         android:layout_alignParentEnd="true"
         android:layout_alignParentTop="true"
-        android:layout_below="@id/texture"
         android:layout_toRightOf="@id/texture"
-        android:background="#4285f4"
+        android:background="@color/control_background"
         android:orientation="horizontal">
 
         <Button
diff --git a/media/Camera2Basic/Application/src/main/res/layout/fragment_camera2_basic.xml b/media/Camera2Basic/Application/src/main/res/layout/fragment_camera2_basic.xml
index 7d05ab3..9c6dc65 100644
--- a/media/Camera2Basic/Application/src/main/res/layout/fragment_camera2_basic.xml
+++ b/media/Camera2Basic/Application/src/main/res/layout/fragment_camera2_basic.xml
@@ -25,12 +25,12 @@
         android:layout_alignParentTop="true" />
 
     <FrameLayout
+        android:id="@+id/control"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="112dp"
         android:layout_alignParentBottom="true"
         android:layout_alignParentStart="true"
-        android:layout_below="@id/texture"
-        android:background="#4285f4">
+        android:background="@color/control_background">
 
         <Button
             android:id="@+id/picture"
diff --git a/media/Camera2Basic/Application/src/main/res/values/colors.xml b/media/Camera2Basic/Application/src/main/res/values/colors.xml
new file mode 100644
index 0000000..4b75d2b
--- /dev/null
+++ b/media/Camera2Basic/Application/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+    <color name="control_background">#cc4285f4</color>
+</resources>
diff --git a/media/Camera2Basic/LICENSE b/media/Camera2Basic/LICENSE
index 1af981f..4f22946 100644
--- a/media/Camera2Basic/LICENSE
+++ b/media/Camera2Basic/LICENSE
@@ -1,4 +1,6 @@
-                                 Apache License
+Apache License
+--------------
+
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
 
@@ -178,7 +180,7 @@
    APPENDIX: How to apply the Apache License to your work.
 
       To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
+      boilerplate notice, with the fields enclosed by brackets "{}"
       replaced with your own identifying information. (Don't include
       the brackets!)  The text should be enclosed in the appropriate
       comment syntax for the file format. We also recommend that a
@@ -186,7 +188,7 @@
       same "printed page" as the copyright notice for easier
       identification within third-party archives.
 
-   Copyright 2014 The Android Open Source Project
+   Copyright {yyyy} {name of copyright owner}
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
@@ -199,3 +201,447 @@
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
+
+All image and audio files (including *.png, *.jpg, *.svg, *.mp3, *.wav 
+and *.ogg) are licensed under the CC-BY-NC license. All other files are 
+licensed under the Apache 2 license.
+
+CC-BY-NC License
+----------------
+
+Attribution-NonCommercial-ShareAlike 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+     Considerations for licensors: Our public licenses are
+     intended for use by those authorized to give the public
+     permission to use material in ways otherwise restricted by
+     copyright and certain other rights. Our licenses are
+     irrevocable. Licensors should read and understand the terms
+     and conditions of the license they choose before applying it.
+     Licensors should also secure all rights necessary before
+     applying our licenses so that the public can reuse the
+     material as expected. Licensors should clearly mark any
+     material not subject to the license. This includes other CC-
+     licensed material, or material used under an exception or
+     limitation to copyright. More considerations for licensors:
+	wiki.creativecommons.org/Considerations_for_licensors
+
+     Considerations for the public: By using one of our public
+     licenses, a licensor grants the public permission to use the
+     licensed material under specified terms and conditions. If
+     the licensor's permission is not necessary for any reason--for
+     example, because of any applicable exception or limitation to
+     copyright--then that use is not regulated by the license. Our
+     licenses grant only permissions under copyright and certain
+     other rights that a licensor has authority to grant. Use of
+     the licensed material may still be restricted for other
+     reasons, including because others have copyright or other
+     rights in the material. A licensor may make special requests,
+     such as asking that all changes be marked or described.
+     Although not required by our licenses, you are encouraged to
+     respect those requests where reasonable. More_considerations
+     for the public: 
+	wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
+Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution-NonCommercial-ShareAlike 4.0 International Public License
+("Public License"). To the extent this Public License may be
+interpreted as a contract, You are granted the Licensed Rights in
+consideration of Your acceptance of these terms and conditions, and the
+Licensor grants You such rights in consideration of benefits the
+Licensor receives from making the Licensed Material available under
+these terms and conditions.
+
+
+Section 1 -- Definitions.
+
+  a. Adapted Material means material subject to Copyright and Similar
+     Rights that is derived from or based upon the Licensed Material
+     and in which the Licensed Material is translated, altered,
+     arranged, transformed, or otherwise modified in a manner requiring
+     permission under the Copyright and Similar Rights held by the
+     Licensor. For purposes of this Public License, where the Licensed
+     Material is a musical work, performance, or sound recording,
+     Adapted Material is always produced where the Licensed Material is
+     synched in timed relation with a moving image.
+
+  b. Adapter's License means the license You apply to Your Copyright
+     and Similar Rights in Your contributions to Adapted Material in
+     accordance with the terms and conditions of this Public License.
+
+  c. BY-NC-SA Compatible License means a license listed at
+     creativecommons.org/compatiblelicenses, approved by Creative
+     Commons as essentially the equivalent of this Public License.
+
+  d. Copyright and Similar Rights means copyright and/or similar rights
+     closely related to copyright including, without limitation,
+     performance, broadcast, sound recording, and Sui Generis Database
+     Rights, without regard to how the rights are labeled or
+     categorized. For purposes of this Public License, the rights
+     specified in Section 2(b)(1)-(2) are not Copyright and Similar
+     Rights.
+
+  e. Effective Technological Measures means those measures that, in the
+     absence of proper authority, may not be circumvented under laws
+     fulfilling obligations under Article 11 of the WIPO Copyright
+     Treaty adopted on December 20, 1996, and/or similar international
+     agreements.
+
+  f. Exceptions and Limitations means fair use, fair dealing, and/or
+     any other exception or limitation to Copyright and Similar Rights
+     that applies to Your use of the Licensed Material.
+
+  g. License Elements means the license attributes listed in the name
+     of a Creative Commons Public License. The License Elements of this
+     Public License are Attribution, NonCommercial, and ShareAlike.
+
+  h. Licensed Material means the artistic or literary work, database,
+     or other material to which the Licensor applied this Public
+     License.
+
+  i. Licensed Rights means the rights granted to You subject to the
+     terms and conditions of this Public License, which are limited to
+     all Copyright and Similar Rights that apply to Your use of the
+     Licensed Material and that the Licensor has authority to license.
+
+  j. Licensor means the individual(s) or entity(ies) granting rights
+     under this Public License.
+
+  k. NonCommercial means not primarily intended for or directed towards
+     commercial advantage or monetary compensation. For purposes of
+     this Public License, the exchange of the Licensed Material for
+     other material subject to Copyright and Similar Rights by digital
+     file-sharing or similar means is NonCommercial provided there is
+     no payment of monetary compensation in connection with the
+     exchange.
+
+  l. Share means to provide material to the public by any means or
+     process that requires permission under the Licensed Rights, such
+     as reproduction, public display, public performance, distribution,
+     dissemination, communication, or importation, and to make material
+     available to the public including in ways that members of the
+     public may access the material from a place and at a time
+     individually chosen by them.
+
+  m. Sui Generis Database Rights means rights other than copyright
+     resulting from Directive 96/9/EC of the European Parliament and of
+     the Council of 11 March 1996 on the legal protection of databases,
+     as amended and/or succeeded, as well as other essentially
+     equivalent rights anywhere in the world.
+
+  n. You means the individual or entity exercising the Licensed Rights
+     under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+  a. License grant.
+
+       1. Subject to the terms and conditions of this Public License,
+          the Licensor hereby grants You a worldwide, royalty-free,
+          non-sublicensable, non-exclusive, irrevocable license to
+          exercise the Licensed Rights in the Licensed Material to:
+
+            a. reproduce and Share the Licensed Material, in whole or
+               in part, for NonCommercial purposes only; and
+
+            b. produce, reproduce, and Share Adapted Material for
+               NonCommercial purposes only.
+
+       2. Exceptions and Limitations. For the avoidance of doubt, where
+          Exceptions and Limitations apply to Your use, this Public
+          License does not apply, and You do not need to comply with
+          its terms and conditions.
+
+       3. Term. The term of this Public License is specified in Section
+          6(a).
+
+       4. Media and formats; technical modifications allowed. The
+          Licensor authorizes You to exercise the Licensed Rights in
+          all media and formats whether now known or hereafter created,
+          and to make technical modifications necessary to do so. The
+          Licensor waives and/or agrees not to assert any right or
+          authority to forbid You from making technical modifications
+          necessary to exercise the Licensed Rights, including
+          technical modifications necessary to circumvent Effective
+          Technological Measures. For purposes of this Public License,
+          simply making modifications authorized by this Section 2(a)
+          (4) never produces Adapted Material.
+
+       5. Downstream recipients.
+
+            a. Offer from the Licensor -- Licensed Material. Every
+               recipient of the Licensed Material automatically
+               receives an offer from the Licensor to exercise the
+               Licensed Rights under the terms and conditions of this
+               Public License.
+
+            b. Additional offer from the Licensor -- Adapted Material.
+               Every recipient of Adapted Material from You
+               automatically receives an offer from the Licensor to
+               exercise the Licensed Rights in the Adapted Material
+               under the conditions of the Adapter's License You apply.
+
+            c. No downstream restrictions. You may not offer or impose
+               any additional or different terms or conditions on, or
+               apply any Effective Technological Measures to, the
+               Licensed Material if doing so restricts exercise of the
+               Licensed Rights by any recipient of the Licensed
+               Material.
+
+       6. No endorsement. Nothing in this Public License constitutes or
+          may be construed as permission to assert or imply that You
+          are, or that Your use of the Licensed Material is, connected
+          with, or sponsored, endorsed, or granted official status by,
+          the Licensor or others designated to receive attribution as
+          provided in Section 3(a)(1)(A)(i).
+
+  b. Other rights.
+
+       1. Moral rights, such as the right of integrity, are not
+          licensed under this Public License, nor are publicity,
+          privacy, and/or other similar personality rights; however, to
+          the extent possible, the Licensor waives and/or agrees not to
+          assert any such rights held by the Licensor to the limited
+          extent necessary to allow You to exercise the Licensed
+          Rights, but not otherwise.
+
+       2. Patent and trademark rights are not licensed under this
+          Public License.
+
+       3. To the extent possible, the Licensor waives any right to
+          collect royalties from You for the exercise of the Licensed
+          Rights, whether directly or through a collecting society
+          under any voluntary or waivable statutory or compulsory
+          licensing scheme. In all other cases the Licensor expressly
+          reserves any right to collect such royalties, including when
+          the Licensed Material is used other than for NonCommercial
+          purposes.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+  a. Attribution.
+
+       1. If You Share the Licensed Material (including in modified
+          form), You must:
+
+            a. retain the following if it is supplied by the Licensor
+               with the Licensed Material:
+
+                 i. identification of the creator(s) of the Licensed
+                    Material and any others designated to receive
+                    attribution, in any reasonable manner requested by
+                    the Licensor (including by pseudonym if
+                    designated);
+
+                ii. a copyright notice;
+
+               iii. a notice that refers to this Public License;
+
+                iv. a notice that refers to the disclaimer of
+                    warranties;
+
+                 v. a URI or hyperlink to the Licensed Material to the
+                    extent reasonably practicable;
+
+            b. indicate if You modified the Licensed Material and
+               retain an indication of any previous modifications; and
+
+            c. indicate the Licensed Material is licensed under this
+               Public License, and include the text of, or the URI or
+               hyperlink to, this Public License.
+
+       2. You may satisfy the conditions in Section 3(a)(1) in any
+          reasonable manner based on the medium, means, and context in
+          which You Share the Licensed Material. For example, it may be
+          reasonable to satisfy the conditions by providing a URI or
+          hyperlink to a resource that includes the required
+          information.
+       3. If requested by the Licensor, You must remove any of the
+          information required by Section 3(a)(1)(A) to the extent
+          reasonably practicable.
+
+  b. ShareAlike.
+
+     In addition to the conditions in Section 3(a), if You Share
+     Adapted Material You produce, the following conditions also apply.
+
+       1. The Adapter's License You apply must be a Creative Commons
+          license with the same License Elements, this version or
+          later, or a BY-NC-SA Compatible License.
+
+       2. You must include the text of, or the URI or hyperlink to, the
+          Adapter's License You apply. You may satisfy this condition
+          in any reasonable manner based on the medium, means, and
+          context in which You Share Adapted Material.
+
+       3. You may not offer or impose any additional or different terms
+          or conditions on, or apply any Effective Technological
+          Measures to, Adapted Material that restrict exercise of the
+          rights granted under the Adapter's License You apply.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+  a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+     to extract, reuse, reproduce, and Share all or a substantial
+     portion of the contents of the database for NonCommercial purposes
+     only;
+
+  b. if You include all or a substantial portion of the database
+     contents in a database in which You have Sui Generis Database
+     Rights, then the database in which You have Sui Generis Database
+     Rights (but not its individual contents) is Adapted Material,
+     including for purposes of Section 3(b); and
+
+  c. You must comply with the conditions in Section 3(a) if You Share
+     all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+  a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+     EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+     AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+     ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+     IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+     WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+     PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+     ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+     KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+     ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+  b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+     TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+     NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+     INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+     COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+     USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+     ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+     DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+     IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+  c. The disclaimer of warranties and limitation of liability provided
+     above shall be interpreted in a manner that, to the extent
+     possible, most closely approximates an absolute disclaimer and
+     waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+  a. This Public License applies for the term of the Copyright and
+     Similar Rights licensed here. However, if You fail to comply with
+     this Public License, then Your rights under this Public License
+     terminate automatically.
+
+  b. Where Your right to use the Licensed Material has terminated under
+     Section 6(a), it reinstates:
+
+       1. automatically as of the date the violation is cured, provided
+          it is cured within 30 days of Your discovery of the
+          violation; or
+
+       2. upon express reinstatement by the Licensor.
+
+     For the avoidance of doubt, this Section 6(b) does not affect any
+     right the Licensor may have to seek remedies for Your violations
+     of this Public License.
+
+  c. For the avoidance of doubt, the Licensor may also offer the
+     Licensed Material under separate terms or conditions or stop
+     distributing the Licensed Material at any time; however, doing so
+     will not terminate this Public License.
+
+  d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+     License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+  a. The Licensor shall not be bound by any additional or different
+     terms or conditions communicated by You unless expressly agreed.
+
+  b. Any arrangements, understandings, or agreements regarding the
+     Licensed Material not stated herein are separate from and
+     independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+  a. For the avoidance of doubt, this Public License does not, and
+     shall not be interpreted to, reduce, limit, restrict, or impose
+     conditions on any use of the Licensed Material that could lawfully
+     be made without permission under this Public License.
+
+  b. To the extent possible, if any provision of this Public License is
+     deemed unenforceable, it shall be automatically reformed to the
+     minimum extent necessary to make it enforceable. If the provision
+     cannot be reformed, it shall be severed from this Public License
+     without affecting the enforceability of the remaining terms and
+     conditions.
+
+  c. No term or condition of this Public License will be waived and no
+     failure to comply consented to unless expressly agreed to by the
+     Licensor.
+
+  d. Nothing in this Public License constitutes or may be interpreted
+     as a limitation upon, or waiver of, any privileges and immunities
+     that apply to the Licensor or You, including from the legal
+     processes of any jurisdiction or authority.
+
+=======================================================================
+
+Creative Commons is not a party to its public licenses.
+Notwithstanding, Creative Commons may elect to apply one of its public
+licenses to material it publishes and in those instances will be
+considered the "Licensor." Except for the limited purpose of indicating
+that material is shared under a Creative Commons public license or as
+otherwise permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the public
+licenses.
+
+Creative Commons may be contacted at creativecommons.org.
+
diff --git a/media/Camera2Basic/README.md b/media/Camera2Basic/README.md
index b848e02..d5aa0a8 100644
--- a/media/Camera2Basic/README.md
+++ b/media/Camera2Basic/README.md
@@ -1,3 +1,4 @@
+
 Android Camera2Basic Sample
 ===================================
 
@@ -42,7 +43,7 @@
 --------------
 
 - Android SDK v21
-- Android Build Tools v21.1.1
+- Android Build Tools v22.0.1
 - Android Support Repository
 
 Screenshots
diff --git a/notification/MessagingService/Application/src/main/AndroidManifest.xml b/notification/MessagingService/Application/src/main/AndroidManifest.xml
index f8a5850..955f8d4 100644
--- a/notification/MessagingService/Application/src/main/AndroidManifest.xml
+++ b/notification/MessagingService/Application/src/main/AndroidManifest.xml
@@ -37,13 +37,17 @@
         <service android:name=".MessagingService">
         </service>
 
-        <receiver android:name=".MessageReadReceiver">
+        <receiver
+            android:name=".MessageReadReceiver"
+            android:exported="false">
             <intent-filter>
                 <action android:name="com.example.android.messagingservice.ACTION_MESSAGE_READ"/>
             </intent-filter>
         </receiver>
 
-        <receiver android:name=".MessageReplyReceiver">
+        <receiver
+            android:name=".MessageReplyReceiver"
+            android:exported="false">
             <intent-filter>
                 <action android:name="com.example.android.messagingservice.ACTION_MESSAGE_REPLY"/>
             </intent-filter>
diff --git a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/Conversations.java b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/Conversations.java
index 7425df4..88ef7aa 100644
--- a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/Conversations.java
+++ b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/Conversations.java
@@ -17,7 +17,6 @@
 package com.example.android.messagingservice;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ThreadLocalRandom;
diff --git a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageLogger.java b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageLogger.java
index d1007b5..3459178 100644
--- a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageLogger.java
+++ b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageLogger.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 
+import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
@@ -27,13 +28,13 @@
  * and replies. Don't use this in a real world application. This logger is only
  * used for displaying the messages in the text view.
  */
-public class MessageLogger {
+class MessageLogger {
 
     private static final String PREF_MESSAGE = "MESSAGE_LOGGER";
-    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private static final DateFormat DATE_FORMAT = SimpleDateFormat.getDateTimeInstance();
+    private static final String LINE_BREAKS = "\n\n";
 
     public static final String LOG_KEY = "message_data";
-    public static final String LINE_BREAKS = "\n\n";
 
     public static void logMessage(Context context, String message) {
         SharedPreferences prefs = getPrefs(context);
diff --git a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageReadReceiver.java b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageReadReceiver.java
index f28a3a7..63c244f 100644
--- a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageReadReceiver.java
+++ b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageReadReceiver.java
@@ -16,7 +16,6 @@
 
 package com.example.android.messagingservice;
 
-import android.app.NotificationManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -35,8 +34,8 @@
         if (conversationId != -1) {
             Log.d(TAG, "Conversation " + conversationId + " was read");
             MessageLogger.logMessage(context, "Conversation " + conversationId + " was read.");
-            NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
-            notificationManager.cancel(conversationId);
+            NotificationManagerCompat.from(context)
+                    .cancel(conversationId);
         }
     }
 }
diff --git a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingFragment.java b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingFragment.java
index f8efcc0..703bc80 100644
--- a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingFragment.java
+++ b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingFragment.java
@@ -51,7 +51,7 @@
     private Messenger mService;
     private boolean mBound;
 
-    private ServiceConnection mConnection = new ServiceConnection() {
+    private final ServiceConnection mConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName componentName, IBinder service) {
             mService = new Messenger(service);
@@ -67,7 +67,7 @@
         }
     };
 
-    private SharedPreferences.OnSharedPreferenceChangeListener listener =
+    private final SharedPreferences.OnSharedPreferenceChangeListener listener =
             new SharedPreferences.OnSharedPreferenceChangeListener() {
         @Override
         public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
diff --git a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingService.java b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingService.java
index f590061..73199ed 100644
--- a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingService.java
+++ b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingService.java
@@ -31,41 +31,24 @@
 import android.support.v4.app.RemoteInput;
 import android.util.Log;
 
+import java.lang.ref.WeakReference;
 import java.util.Iterator;
 
 public class MessagingService extends Service {
     private static final String TAG = MessagingService.class.getSimpleName();
-
-    public static final String READ_ACTION =
+    private static final String EOL = "\n";
+    private static final String READ_ACTION =
             "com.example.android.messagingservice.ACTION_MESSAGE_READ";
+
     public static final String REPLY_ACTION =
             "com.example.android.messagingservice.ACTION_MESSAGE_REPLY";
     public static final String CONVERSATION_ID = "conversation_id";
     public static final String EXTRA_VOICE_REPLY = "extra_voice_reply";
     public static final int MSG_SEND_NOTIFICATION = 1;
-    public static final String EOL = "\n";
 
     private NotificationManagerCompat mNotificationManager;
 
-    private final Messenger mMessenger = new Messenger(new IncomingHandler());
-
-    /**
-     * Handler of incoming messages from clients.
-     */
-    class IncomingHandler extends Handler {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_SEND_NOTIFICATION:
-                    int howManyConversations = msg.arg1 <= 0 ? 1 : msg.arg1;
-                    int messagesPerConv = msg.arg2 <= 0 ? 1 : msg.arg2;
-                    sendNotification(howManyConversations, messagesPerConv);
-                    break;
-                default:
-                    super.handleMessage(msg);
-            }
-        }
-    }
+    private final Messenger mMessenger = new Messenger(new IncomingHandler(this));
 
     @Override
     public void onCreate() {
@@ -79,18 +62,6 @@
         return mMessenger.getBinder();
     }
 
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-        Log.d(TAG, "onStartCommand");
-        return START_STICKY;
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        Log.d(TAG, "onDestroy");
-    }
-
     // Creates an intent that will be triggered when a message is marked as read.
     private Intent getMessageReadIntent(int id) {
         return new Intent()
@@ -171,4 +142,31 @@
 
         mNotificationManager.notify(conversation.getConversationId(), builder.build());
     }
+
+    /**
+     * Handler for incoming messages from clients.
+     */
+    private static class IncomingHandler extends Handler {
+        private final WeakReference<MessagingService> mReference;
+
+        IncomingHandler(MessagingService service) {
+            mReference = new WeakReference<>(service);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            MessagingService service = mReference.get();
+            switch (msg.what) {
+                case MSG_SEND_NOTIFICATION:
+                    int howManyConversations = msg.arg1 <= 0 ? 1 : msg.arg1;
+                    int messagesPerConversation = msg.arg2 <= 0 ? 1 : msg.arg2;
+                    if (service != null) {
+                        service.sendNotification(howManyConversations, messagesPerConversation);
+                    }
+                    break;
+                default:
+                    super.handleMessage(msg);
+            }
+        }
+    }
 }
diff --git a/notification/MessagingService/Application/src/main/res/layout-land/fragment_message_me.xml b/notification/MessagingService/Application/src/main/res/layout-land/fragment_message_me.xml
index 6f4f88b..0cfd1cf 100644
--- a/notification/MessagingService/Application/src/main/res/layout-land/fragment_message_me.xml
+++ b/notification/MessagingService/Application/src/main/res/layout-land/fragment_message_me.xml
@@ -21,7 +21,8 @@
               android:paddingBottom="@dimen/activity_vertical_margin"
               android:paddingLeft="@dimen/activity_horizontal_margin"
               android:paddingRight="@dimen/activity_horizontal_margin"
-              android:paddingTop="@dimen/activity_vertical_margin">
+              android:paddingTop="@dimen/activity_vertical_margin"
+              android:baselineAligned="false">
     <LinearLayout
         android:layout_width="0dp"
         android:layout_height="match_parent"
diff --git a/notification/MessagingService/Application/src/main/res/layout/fragment_message_me.xml b/notification/MessagingService/Application/src/main/res/layout/fragment_message_me.xml
index 29a8c44..404bd4d 100644
--- a/notification/MessagingService/Application/src/main/res/layout/fragment_message_me.xml
+++ b/notification/MessagingService/Application/src/main/res/layout/fragment_message_me.xml
@@ -14,7 +14,6 @@
   limitations under the License.
   -->
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
diff --git a/notification/MessagingService/Application/src/main/res/values/strings.xml b/notification/MessagingService/Application/src/main/res/values/strings.xml
index 001b10e..3f8390d 100644
--- a/notification/MessagingService/Application/src/main/res/values/strings.xml
+++ b/notification/MessagingService/Application/src/main/res/values/strings.xml
@@ -16,8 +16,6 @@
   -->
 <resources>
     <string name="app_name">Messaging Sample</string>
-    <string name="action_settings">Settings</string>
-    <string name="title">Messaging Sample</string>
     <string name="notification_reply">Reply by Voice</string>
     <string name="send_2_conversations">Send 2 conversations with 1 message</string>
     <string name="send_1_conversation">Send 1 conversation with 1 message</string>
diff --git a/wearable/wear/AgendaData/Application/src/main/java/com/example/android/wearable/agendadata/MainActivity.java b/wearable/wear/AgendaData/Application/src/main/java/com/example/android/wearable/agendadata/MainActivity.java
index 62dc349..34e327b 100644
--- a/wearable/wear/AgendaData/Application/src/main/java/com/example/android/wearable/agendadata/MainActivity.java
+++ b/wearable/wear/AgendaData/Application/src/main/java/com/example/android/wearable/agendadata/MainActivity.java
@@ -33,7 +33,6 @@
 import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
 import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
 import com.google.android.gms.common.api.ResultCallback;
-import com.google.android.gms.common.data.FreezableUtils;
 import com.google.android.gms.wearable.DataApi;
 import com.google.android.gms.wearable.DataItem;
 import com.google.android.gms.wearable.DataItemBuffer;
@@ -98,11 +97,7 @@
                         public void onResult(DataItemBuffer result) {
                             try {
                                 if (result.getStatus().isSuccess()) {
-                                    // Store the DataItem URIs in a List and release the buffer.
-                                    // Then use these URIs to delete the DataItems.
-                                    List<DataItem> dataItemList = FreezableUtils
-                                            .freezeIterable(result);
-                                    deleteDataItems(dataItemList);
+                                    deleteDataItems(result);
                                 } else {
                                     if (Log.isLoggable(TAG, Log.DEBUG)) {
                                         Log.d(TAG,"onDeleteEventsClicked(): failed to get Data "
@@ -121,7 +116,7 @@
         }
     }
 
-    private void deleteDataItems(final List<DataItem> dataItemList) {
+    private void deleteDataItems(final DataItemBuffer dataItemList) {
         if (mGoogleApiClient.isConnected()) {
             for (final DataItem dataItem : dataItemList) {
                 final Uri dataItemUri = dataItem.getUri();
diff --git a/wearable/wear/DataLayer/Application/src/main/java/com/example/android/wearable/datalayer/MainActivity.java b/wearable/wear/DataLayer/Application/src/main/java/com/example/android/wearable/datalayer/MainActivity.java
index 2a4a353..1c67c0e 100644
--- a/wearable/wear/DataLayer/Application/src/main/java/com/example/android/wearable/datalayer/MainActivity.java
+++ b/wearable/wear/DataLayer/Application/src/main/java/com/example/android/wearable/datalayer/MainActivity.java
@@ -216,6 +216,7 @@
     @Override //DataListener
     public void onDataChanged(DataEventBuffer dataEvents) {
         LOGD(TAG, "onDataChanged: " + dataEvents);
+        // Need to freeze the dataEvents so they will exist later on the UI thread
         final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
         runOnUiThread(new Runnable() {
             @Override
diff --git a/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/DataLayerListenerService.java b/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/DataLayerListenerService.java
index 18e7127..67dcef9 100644
--- a/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/DataLayerListenerService.java
+++ b/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/DataLayerListenerService.java
@@ -22,7 +22,6 @@
 
 import com.google.android.gms.common.ConnectionResult;
 import com.google.android.gms.common.api.GoogleApiClient;
-import com.google.android.gms.common.data.FreezableUtils;
 import com.google.android.gms.wearable.DataEvent;
 import com.google.android.gms.wearable.DataEventBuffer;
 import com.google.android.gms.wearable.MessageEvent;
@@ -59,7 +58,6 @@
     @Override
     public void onDataChanged(DataEventBuffer dataEvents) {
         LOGD(TAG, "onDataChanged: " + dataEvents);
-        final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
         if (!mGoogleApiClient.isConnected() || !mGoogleApiClient.isConnecting()) {
             ConnectionResult connectionResult = mGoogleApiClient
                     .blockingConnect(30, TimeUnit.SECONDS);
@@ -71,7 +69,7 @@
         }
 
         // Loop through the events and send a message back to the node that created the data item.
-        for (DataEvent event : events) {
+        for (DataEvent event : dataEvents) {
             Uri uri = event.getDataItem().getUri();
             String path = uri.getPath();
             if (COUNT_PATH.equals(path)) {
diff --git a/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/MainActivity.java b/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/MainActivity.java
index e8c86ef..678e428 100644
--- a/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/MainActivity.java
+++ b/wearable/wear/DataLayer/Wearable/src/main/java/com/example/android/wearable/datalayer/MainActivity.java
@@ -42,7 +42,6 @@
 import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
 import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
 import com.google.android.gms.common.api.ResultCallback;
-import com.google.android.gms.common.data.FreezableUtils;
 import com.google.android.gms.wearable.Asset;
 import com.google.android.gms.wearable.CapabilityApi;
 import com.google.android.gms.wearable.CapabilityInfo;
@@ -151,8 +150,7 @@
     public void onDataChanged(DataEventBuffer dataEvents) {
         LOGD(TAG, "onDataChanged(): " + dataEvents);
 
-        final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
-        for (DataEvent event : events) {
+        for (DataEvent event : dataEvents) {
             if (event.getType() == DataEvent.TYPE_CHANGED) {
                 String path = event.getDataItem().getUri().getPath();
                 if (DataLayerListenerService.IMAGE_PATH.equals(path)) {
diff --git a/wearable/wear/Quiz/Application/src/main/java/com/example/android/wearable/quiz/MainActivity.java b/wearable/wear/Quiz/Application/src/main/java/com/example/android/wearable/quiz/MainActivity.java
index 171b8b4..de8eb74 100644
--- a/wearable/wear/Quiz/Application/src/main/java/com/example/android/wearable/quiz/MainActivity.java
+++ b/wearable/wear/Quiz/Application/src/main/java/com/example/android/wearable/quiz/MainActivity.java
@@ -325,6 +325,7 @@
 
     @Override
     public void onDataChanged(DataEventBuffer dataEvents) {
+        // Need to freeze the dataEvents so they will exist later on the UI thread
         final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
         runOnUiThread(new Runnable() {
             @Override
@@ -446,9 +447,7 @@
                         public void onResult(DataItemBuffer result) {
                             try {
                                 if (result.getStatus().isSuccess()) {
-                                    List<DataItem> dataItemList = FreezableUtils
-                                            .freezeIterable(result);
-                                    resetDataItems(dataItemList);
+                                    resetDataItems(result);
                                 } else {
                                     if (Log.isLoggable(TAG, Log.DEBUG)) {
                                         Log.d(TAG, "Reset quiz: failed to get Data Items to reset");
@@ -469,7 +468,7 @@
         mNumSkipped = 0;
     }
 
-    private void resetDataItems(List<DataItem> dataItemList) {
+    private void resetDataItems(DataItemBuffer dataItemList) {
         if (mGoogleApiClient.isConnected()) {
             for (final DataItem dataItem : dataItemList) {
                 final Uri dataItemUri = dataItem.getUri();
diff --git a/wearable/wear/Quiz/Wearable/src/main/java/com/example/android/wearable/quiz/QuizListenerService.java b/wearable/wear/Quiz/Wearable/src/main/java/com/example/android/wearable/quiz/QuizListenerService.java
index 327c4b8..5a4b906 100644
--- a/wearable/wear/Quiz/Wearable/src/main/java/com/example/android/wearable/quiz/QuizListenerService.java
+++ b/wearable/wear/Quiz/Wearable/src/main/java/com/example/android/wearable/quiz/QuizListenerService.java
@@ -40,7 +40,6 @@
 
 import com.google.android.gms.common.ConnectionResult;
 import com.google.android.gms.common.api.GoogleApiClient;
-import com.google.android.gms.common.data.FreezableUtils;
 import com.google.android.gms.wearable.DataEvent;
 import com.google.android.gms.wearable.DataEventBuffer;
 import com.google.android.gms.wearable.DataItem;
@@ -80,8 +79,6 @@
 
     @Override
     public void onDataChanged(DataEventBuffer dataEvents) {
-        final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
-
         GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
                 .addApi(Wearable.API)
                 .build();
@@ -93,7 +90,7 @@
             return;
         }
 
-        for (DataEvent event : events) {
+        for (DataEvent event : dataEvents) {
             if (event.getType() == DataEvent.TYPE_CHANGED) {
                 DataItem dataItem = event.getDataItem();
                 DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/AttractionListFragment.java b/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/AttractionListFragment.java
index 0f1bc8b..28f9127 100644
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/AttractionListFragment.java
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/AttractionListFragment.java
@@ -216,7 +216,7 @@
 
         @Override
         public void onClick(View v) {
-            mItemClickListener.onItemClick(v, getPosition());
+            mItemClickListener.onItemClick(v, getAdapterPosition());
         }
     }
 
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/DetailFragment.java b/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/DetailFragment.java
index 4d21009..1ab7326 100644
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/DetailFragment.java
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/DetailFragment.java
@@ -21,12 +21,11 @@
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
+import android.support.design.widget.FloatingActionButton;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.NavUtils;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
@@ -83,6 +82,7 @@
         TextView descTextView = (TextView) view.findViewById(R.id.descriptionTextView);
         TextView distanceTextView = (TextView) view.findViewById(R.id.distanceTextView);
         ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
+        FloatingActionButton mapFab = (FloatingActionButton) view.findViewById(R.id.mapFab);
 
         LatLng location = Utils.getLocation(getActivity());
         String distance = Utils.formatDistanceBetween(location, mAttraction.location);
@@ -102,13 +102,18 @@
                 .placeholder(R.color.lighter_gray)
                 .override(imageSize, imageSize)
                 .into(imageView);
-        return view;
-    }
 
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        inflater.inflate(R.menu.detail, menu);
-        super.onCreateOptionsMenu(menu, inflater);
+        mapFab.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent(Intent.ACTION_VIEW);
+                intent.setData(Uri.parse(Constants.MAPS_INTENT_URI +
+                        Uri.encode(mAttraction.name + ", " + mAttraction.city)));
+                startActivity(intent);
+            }
+        });
+
+        return view;
     }
 
     @Override
@@ -139,12 +144,6 @@
 
                 // Otherwise let the system handle navigating "up"
                 return false;
-            case R.id.map:
-                Intent intent = new Intent(Intent.ACTION_VIEW);
-                intent.setData(Uri.parse(Constants.MAPS_INTENT_URI +
-                        Uri.encode(mAttraction.name + ", " + mAttraction.city)));
-                startActivity(intent);
-                return true;
         }
         return super.onOptionsItemSelected(item);
     }
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/ScaleTransition.java b/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/ScaleTransition.java
new file mode 100644
index 0000000..a7e4b2e
--- /dev/null
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/java/com/example/android/xyztouristattractions/ui/ScaleTransition.java
@@ -0,0 +1,46 @@
+package com.example.android.xyztouristattractions.ui;
+
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.transition.TransitionValues;
+import android.transition.Visibility;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+
+/**
+ * A simple scale transition class to allow an element to scale in or out.
+ * This is used by the floating action button on the attraction detail screen
+ * when it appears and disappears during the Activity transitions.
+ */
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+public class ScaleTransition extends Visibility {
+
+    public ScaleTransition(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public Animator createAnimation(View view, float startScale, float endScale) {
+        view.setScaleX(startScale);
+        view.setScaleY(startScale);
+        PropertyValuesHolder holderX = PropertyValuesHolder.ofFloat("scaleX", startScale, endScale);
+        PropertyValuesHolder holderY = PropertyValuesHolder.ofFloat("scaleY", startScale, endScale);
+        return ObjectAnimator.ofPropertyValuesHolder(view, holderX, holderY);
+    }
+
+    @Override
+    public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+                             TransitionValues endValues) {
+        return createAnimation(view, 0, 1);
+    }
+
+    @Override
+    public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues,
+                                TransitionValues endValues) {
+        return createAnimation(view, 1, 0);
+    }
+}
\ No newline at end of file
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/layout/fragment_detail.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/layout/fragment_detail.xml
index dffeb4e..6e280fd 100644
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/res/layout/fragment_detail.xml
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/layout/fragment_detail.xml
@@ -16,67 +16,86 @@
   limitations under the License.
   -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
+<android.support.design.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:weightSum="100">
-
-    <ImageView
-        android:id="@+id/imageView"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="50"
-        android:scaleType="centerCrop"
-        android:transitionName="image" />
+    android:layout_height="match_parent">
 
     <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="?colorPrimary"
         android:orientation="vertical"
-        android:paddingStart="@dimen/keyline2"
-        android:paddingEnd="@dimen/keyline3"
-        android:paddingTop="@dimen/standard_margin"
-        android:paddingBottom="@dimen/standard_margin"
-        android:elevation="2dp">
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:weightSum="100">
 
-        <TextView
-            android:id="@+id/nameTextView"
+        <ImageView
+            android:id="@+id/imageView"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="50"
+            android:scaleType="centerCrop"
+            android:transitionName="image" />
+
+        <LinearLayout
+            android:id="@+id/textLayout"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:maxLines="2"
-            android:ellipsize="end"
-            android:textIsSelectable="true"
-            style="@style/TextAppearance.AppCompat.Title.Inverse"
-            android:transitionName="title" />
+            android:background="?colorPrimary"
+            android:orientation="vertical"
+            android:paddingStart="@dimen/keyline2"
+            android:paddingEnd="@dimen/keyline3"
+            android:paddingTop="@dimen/standard_margin"
+            android:paddingBottom="@dimen/standard_margin"
+            android:elevation="2dp">
 
-        <TextView
-            android:id="@+id/distanceTextView"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            style="@style/TextAppearance.AppCompat.Subhead.Inverse" />
+            <TextView
+                android:id="@+id/nameTextView"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:maxLines="2"
+                android:ellipsize="end"
+                android:textIsSelectable="true"
+                style="@style/TextAppearance.AppCompat.Title.Inverse" />
+
+            <TextView
+                android:id="@+id/distanceTextView"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                style="@style/TextAppearance.AppCompat.Subhead.Inverse" />
+
+        </LinearLayout>
+
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="50"
+            android:paddingTop="@dimen/standard_margin"
+            android:paddingBottom="@dimen/standard_margin"
+            android:scrollbarStyle="outsideOverlay"
+            android:clipToPadding="false">
+
+            <TextView
+                android:id="@+id/descriptionTextView"
+                android:layout_height="wrap_content"
+                android:layout_width="match_parent"
+                android:textIsSelectable="true"
+                style="@style/TextAppearance.AppCompat.Body1"
+                android:paddingStart="@dimen/keyline2"
+                android:paddingEnd="@dimen/keyline3" />
+
+        </ScrollView>
 
     </LinearLayout>
-    
-    <ScrollView
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="50"
-        android:paddingTop="@dimen/standard_margin"
-        android:paddingBottom="@dimen/standard_margin"
-        android:scrollbarStyle="outsideOverlay"
-        android:clipToPadding="false">
 
-        <TextView
-            android:id="@+id/descriptionTextView"
-            android:layout_height="wrap_content"
-            android:layout_width="match_parent"
-            android:textIsSelectable="true"
-            style="@style/TextAppearance.AppCompat.Body1"
-            android:paddingStart="@dimen/keyline2"
-            android:paddingEnd="@dimen/keyline3" />
+    <android.support.design.widget.FloatingActionButton
+        android:id="@+id/mapFab"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:src="@drawable/ic_action_map"
+        app:layout_anchor="@id/textLayout"
+        app:layout_anchorGravity="bottom|start"
+        app:rippleColor="@color/colorFabRipple"
+        android:layout_marginStart="@dimen/fab_margin"
+        android:clickable="true" />
 
-    </ScrollView>
-
-</LinearLayout>
\ No newline at end of file
+</android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/layout/list_row.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/layout/list_row.xml
index 25f55d0..b2cef57 100644
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/res/layout/list_row.xml
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/layout/list_row.xml
@@ -49,21 +49,20 @@
             android:id="@android:id/text1"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_toRightOf="@android:id/icon"
+            android:layout_toEndOf="@android:id/icon"
             android:paddingTop="@dimen/small_margin"
             android:paddingLeft="@dimen/small_margin"
             android:paddingRight="@dimen/small_margin"
             android:maxLines="1"
             android:ellipsize="end"
             style="?android:textAppearanceMedium"
-            tools:text="Title 1"
-            android:transitionName="image" />
+            tools:text="Title 1" />
 
         <TextView
             android:id="@android:id/text2"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_toRightOf="@android:id/icon"
+            android:layout_toEndOf="@android:id/icon"
             android:layout_below="@android:id/text1"
             android:padding="@dimen/small_margin"
             android:ellipsize="end"
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/menu/detail.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/menu/detail.xml
deleted file mode 100644
index aeb5c98..0000000
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/res/menu/detail.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-  Copyright 2015 Google Inc. All rights reserved.
-
-  Licensed under the Apache License, Version 2.0 (the "License");
-  you may not use this file except in compliance with the License.
-  You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
-  -->
-
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context=".MainActivity" >
-
-    <item android:id="@+id/map"
-        android:title="@string/action_map"
-        android:orderInCategory="100"
-        android:icon="@drawable/ic_action_map"
-        app:showAsAction="ifRoom" />
-
-</menu>
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/shared_move.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/shared_move.xml
new file mode 100644
index 0000000..3debfa0
--- /dev/null
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/shared_move.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
+    android:startDelay="@android:integer/config_shortAnimTime">
+
+    <changeBounds>
+        <arcMotion />
+    </changeBounds>
+    <changeTransform/>
+    <changeClipBounds/>
+    <changeImageTransform/>
+
+</transitionSet>
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/explode.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/window_enter.xml
similarity index 77%
rename from wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/explode.xml
rename to wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/window_enter.xml
index 5dfa717..619ffdf 100644
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/explode.xml
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/window_enter.xml
@@ -14,7 +14,8 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
+<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
+    android:transitionOrdering="sequential">
 
     <explode>
         <targets>
@@ -25,4 +26,11 @@
         </targets>
     </explode>
 
+    <transition class="com.example.android.xyztouristattractions.ui.ScaleTransition"
+        android:interpolator="@android:interpolator/overshoot">
+        <targets>
+            <target android:targetId="@id/mapFab" />
+        </targets>
+    </transition>
+
 </transitionSet>
\ No newline at end of file
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/explode.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/window_return.xml
similarity index 70%
copy from wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/explode.xml
copy to wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/window_return.xml
index 5dfa717..0dae377 100644
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/explode.xml
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/transition-v21/window_return.xml
@@ -14,7 +14,16 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
+<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
+    android:transitionOrdering="sequential">
+
+    <transition class="com.example.android.xyztouristattractions.ui.ScaleTransition"
+        android:interpolator="@android:interpolator/fast_out_linear_in"
+        android:duration="@android:integer/config_shortAnimTime">
+        <targets>
+            <target android:targetId="@id/mapFab" />
+        </targets>
+    </transition>
 
     <explode>
         <targets>
@@ -22,6 +31,7 @@
             <target android:targetClass="android.widget.FrameLayout" />
             <target android:targetClass="android.widget.LinearLayout" />
             <target android:targetClass="android.widget.ImageView" />
+            <target android:excludeId="@id/mapFab" />
         </targets>
     </explode>
 
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-sw400dp-v21/dimens.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-sw400dp-v21/dimens.xml
new file mode 100644
index 0000000..ce539e4
--- /dev/null
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-sw400dp-v21/dimens.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2015 Google Inc. All rights reserved.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<resources>
+
+    <dimen name="fab_margin">12dp</dimen>
+
+</resources>
\ No newline at end of file
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-sw400dp/dimens.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-sw400dp/dimens.xml
index ad90eaa..701be7d 100644
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-sw400dp/dimens.xml
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-sw400dp/dimens.xml
@@ -20,5 +20,6 @@
     <dimen name="small_margin">12dp</dimen>
     <dimen name="tiny_margin">8dp</dimen>
     <dimen name="image_size">140dp</dimen>
+    <dimen name="fab_margin">0dp</dimen>
 
 </resources>
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-v21/dimens.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-v21/dimens.xml
new file mode 100644
index 0000000..2704c45
--- /dev/null
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-v21/dimens.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2015 Google Inc. All rights reserved.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<resources>
+
+    <dimen name="fab_margin">8dp</dimen>
+
+</resources>
\ No newline at end of file
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-v21/styles.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-v21/styles.xml
index 319d664..d1221c5 100644
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-v21/styles.xml
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values-v21/styles.xml
@@ -21,8 +21,10 @@
         <item name="android:windowActivityTransitions">true</item>
         <item name="android:windowExitTransition">@transition/fade</item>
         <item name="android:windowReenterTransition">@transition/fade</item>
-        <item name="android:windowEnterTransition">@transition/explode</item>
-        <item name="android:windowReturnTransition">@transition/explode</item>
+        <item name="android:windowEnterTransition">@transition/window_enter</item>
+        <item name="android:windowReturnTransition">@transition/window_return</item>
+        <item name="android:windowSharedElementEnterTransition">@transition/shared_move</item>
+        <item name="android:windowSharedElementExitTransition">@transition/shared_move</item>
         <item name="android:windowAllowEnterTransitionOverlap">false</item>
         <item name="android:windowAllowReturnTransitionOverlap">false</item>
         <item name="android:windowSharedElementsUseOverlay">false</item>
diff --git a/wearable/wear/XYZTouristAttractions/Application/src/main/res/values/dimens.xml b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values/dimens.xml
index 03acfef..9cfc825 100644
--- a/wearable/wear/XYZTouristAttractions/Application/src/main/res/values/dimens.xml
+++ b/wearable/wear/XYZTouristAttractions/Application/src/main/res/values/dimens.xml
@@ -21,6 +21,7 @@
     <dimen name="small_margin">8dp</dimen>
     <dimen name="tiny_margin">4dp</dimen>
     <dimen name="image_size">120dp</dimen>
+    <dimen name="fab_margin">-8dp</dimen>
     <item type="dimen" name="keyline1">@dimen/standard_margin</item>
     <dimen name="keyline2">72dp</dimen>
     <item type="dimen" name="keyline3">@dimen/standard_margin</item>
diff --git a/wearable/wear/XYZTouristAttractions/Shared/src/main/res/values/colors.xml b/wearable/wear/XYZTouristAttractions/Shared/src/main/res/values/colors.xml
index 73c2b6c..2260336 100644
--- a/wearable/wear/XYZTouristAttractions/Shared/src/main/res/values/colors.xml
+++ b/wearable/wear/XYZTouristAttractions/Shared/src/main/res/values/colors.xml
@@ -20,5 +20,6 @@
     <color name="colorPrimary">#4e6cef</color>
     <color name="colorPrimaryDark">#2a36b1</color>
     <color name="colorAccent">#ff7043</color>
+    <color name="colorFabRipple">#D84315</color>
 
 </resources>
\ No newline at end of file
diff --git a/wearable/wear/XYZTouristAttractions/Wearable/src/main/AndroidManifest.xml b/wearable/wear/XYZTouristAttractions/Wearable/src/main/AndroidManifest.xml
index 24328b3..80d0c92 100644
--- a/wearable/wear/XYZTouristAttractions/Wearable/src/main/AndroidManifest.xml
+++ b/wearable/wear/XYZTouristAttractions/Wearable/src/main/AndroidManifest.xml
@@ -22,7 +22,7 @@
 
     <uses-sdk
         android:minSdkVersion="21"
-        android:targetSdkVersion="21" />
+        android:targetSdkVersion="22" />
 
     <application
         android:allowBackup="true"
@@ -32,9 +32,6 @@
 
         <activity
             android:name=".ui.AttractionsActivity"
-            android:exported="true"
-            android:allowEmbedded="true"
-            android:taskAffinity=""
             android:label="@string/app_name" />
 
         <activity
diff --git a/wearable/wear/XYZTouristAttractions/Wearable/src/main/java/com/example/android/xyztouristattractions/service/ListenerService.java b/wearable/wear/XYZTouristAttractions/Wearable/src/main/java/com/example/android/xyztouristattractions/service/ListenerService.java
index 3908414..d228251 100644
--- a/wearable/wear/XYZTouristAttractions/Wearable/src/main/java/com/example/android/xyztouristattractions/service/ListenerService.java
+++ b/wearable/wear/XYZTouristAttractions/Wearable/src/main/java/com/example/android/xyztouristattractions/service/ListenerService.java
@@ -30,7 +30,6 @@
 import com.example.android.xyztouristattractions.ui.AttractionsActivity;
 import com.google.android.gms.common.ConnectionResult;
 import com.google.android.gms.common.api.GoogleApiClient;
-import com.google.android.gms.common.data.FreezableUtils;
 import com.google.android.gms.wearable.DataEvent;
 import com.google.android.gms.wearable.DataEventBuffer;
 import com.google.android.gms.wearable.DataMap;
@@ -54,9 +53,7 @@
     public void onDataChanged(DataEventBuffer dataEvents) {
         Log.d(TAG, "onDataChanged: " + dataEvents);
 
-        final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
-
-        for (DataEvent event : events) {
+        for (DataEvent event : dataEvents) {
             if (event.getType() == DataEvent.TYPE_CHANGED
                     && event.getDataItem() != null
                     && Constants.ATTRACTION_PATH.equals(event.getDataItem().getUri().getPath())) {
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/composite-1-hires.png b/wearable/wear/XYZTouristAttractions/screenshots/composite-1-hires.png
index 6facbfe..1f9c58d 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/composite-1-hires.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/composite-1-hires.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/composite-1.png b/wearable/wear/XYZTouristAttractions/screenshots/composite-1.png
index c66df32..46dd9b7 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/composite-1.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/composite-1.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/mobile-1-list-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/mobile-1-list-unframed.png
deleted file mode 100644
index db88dc3..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/mobile-1-list-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/mobile-1-list.png b/wearable/wear/XYZTouristAttractions/screenshots/mobile-1-list.png
index 6a2f777..b74edab 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/mobile-1-list.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/mobile-1-list.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/mobile-2-detail-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/mobile-2-detail-unframed.png
deleted file mode 100644
index 088c756..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/mobile-2-detail-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/mobile-2-detail.png b/wearable/wear/XYZTouristAttractions/screenshots/mobile-2-detail.png
index dc70ee6..45d7946 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/mobile-2-detail.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/mobile-2-detail.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-1-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-1-unframed.png
deleted file mode 100644
index 4dede5c..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-1-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-1.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-1.png
index 49bd581..a83f501 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-1.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-1.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-2-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-2-unframed.png
deleted file mode 100644
index 85e8492..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-2-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-2.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-2.png
index 7c166e7..bffb84e 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-2.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-2.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-3-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-3-unframed.png
deleted file mode 100644
index 4542f1f..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-3-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-3.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-3.png
index b294efe..51b39bf 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-3.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-3.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-4-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-4-unframed.png
deleted file mode 100644
index b866186..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-4-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-4.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-4.png
index bcc3ff3..1383159 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-4.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-4.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-5-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-5-unframed.png
deleted file mode 100644
index df82ae0..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-5-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-5.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-5.png
index d3cd76d..35407ef 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-5.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-5.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-6-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-6-unframed.png
deleted file mode 100644
index 31f271c..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-6-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-6.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-6.png
index ecbaf57..fd7a7c0 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-round-6.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-round-6.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-1-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-1-unframed.png
deleted file mode 100644
index c816f77..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-1-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-1.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-1.png
index 24e5534..f6824e8 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-1.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-1.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-2-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-2-unframed.png
deleted file mode 100644
index d549151..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-2-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-2.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-2.png
index a7d72c5..4c14ffa 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-2.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-2.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-3-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-3-unframed.png
deleted file mode 100644
index 2c252e6..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-3-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-3.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-3.png
index b0ead30..d312633 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-3.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-3.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-4-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-4-unframed.png
deleted file mode 100644
index c4ed121..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-4-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-4.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-4.png
index d3a35aa..7d1bb8b 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-4.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-4.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-5-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-5-unframed.png
deleted file mode 100644
index 1bfcd1d..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-5-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-5.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-5.png
index 56acaa4..40d6b9b 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-5.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-5.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-6-unframed.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-6-unframed.png
deleted file mode 100644
index aa5127f..0000000
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-6-unframed.png
+++ /dev/null
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-6.png b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-6.png
index 3bda193..25110b8 100644
--- a/wearable/wear/XYZTouristAttractions/screenshots/wear-square-6.png
+++ b/wearable/wear/XYZTouristAttractions/screenshots/wear-square-6.png
Binary files differ
diff --git a/wearable/wear/XYZTouristAttractions/template-params.xml b/wearable/wear/XYZTouristAttractions/template-params.xml
index 51882ac..033e59e 100644
--- a/wearable/wear/XYZTouristAttractions/template-params.xml
+++ b/wearable/wear/XYZTouristAttractions/template-params.xml
@@ -24,15 +24,16 @@
         <has_handheld_app>true</has_handheld_app>
     </wearable>
 
-    <dependency>com.android.support:appcompat-v7:22.1.1</dependency>
-    <dependency>com.google.android.gms:play-services-location:7.3.0</dependency>
-    <dependency>com.google.maps.android:android-maps-utils:0.3.2</dependency>
-    <dependency>com.github.bumptech.glide:glide:3.5.2</dependency>
-    <dependency>com.android.support:recyclerview-v7:22.1.1</dependency>
-    <dependency_wearable>com.google.android.gms:play-services-location:7.3.0</dependency_wearable>
-    <dependency_shared>com.google.android.gms:play-services-wearable:7.3.0</dependency_shared>
-    <dependency_shared>com.google.android.gms:play-services-location:7.3.0</dependency_shared>
-    <dependency_shared>com.google.maps.android:android-maps-utils:0.3.2</dependency_shared>
+    <dependency>com.google.android.gms:play-services-location</dependency>
+    <dependency>com.google.maps.android:android-maps-utils:0.3.4</dependency>
+    <dependency>com.github.bumptech.glide:glide:3.6.0</dependency>
+    <dependency>com.android.support:appcompat-v7:22.2.0</dependency>
+    <dependency>com.android.support:recyclerview-v7:22.2.0</dependency>
+    <dependency>com.android.support:design:22.2.0</dependency>
+    <dependency_wearable>com.google.android.gms:play-services-location</dependency_wearable>
+    <dependency_shared>com.google.android.gms:play-services-wearable</dependency_shared>
+    <dependency_shared>com.google.android.gms:play-services-location</dependency_shared>
+    <dependency_shared>com.google.maps.android:android-maps-utils:0.3.4</dependency_shared>
 
     <strings>
         <intro>
@@ -81,6 +82,8 @@
             <android>android.support.v7.appcompat</android>
             <android>android.support.v7.widget.RecyclerView</android>
             <android>android.support.v7.widget.GridLayoutManager</android>
+            <android>android.support.design.widget.FloatingActionButton</android>
+            <android>android.support.design.widget.CoordinatorLayout</android>
             <android>com.google.android.gms.common.api.GoogleApiClient</android>
             <android>com.google.android.gms.wearable.Wearable</android>
             <android>com.google.android.gms.wearable.DataApi</android>
@@ -163,6 +166,8 @@
 * Window content and activity transitions based on the
 [Material guidelines][11]
 * Use of the [RecyclerView][12] widget
+* CoordinatorLayout[23] and FloatingActionButton[24] from the Design Support library[25]
+* Material animations such as activity and shared element transitions
 
 The wearable app uses a number of techniques and UI widgets as well:
 * Full screen app built off [GridViewPager][13] and [DotsPageIndicator][14]
@@ -170,7 +175,7 @@
 [WatchViewStub][15] and [OnApplyWindowInsetsListener][16]
 * Use of a variety of other widgets from the [Wearable UI Library][17]
 ([DismissOverlayView][18], [ConfirmationActivity][19],
-[CardScrollView][20], [CircledImageView][21])
+[CardScrollView][20], [CircledImageView][21], [ActionPage][26])
 
 [1]: http://developer.android.com/wear/
 [2]: https://developer.android.com/google/play-services/
@@ -194,6 +199,10 @@
 [20]: http://developer.android.com/reference/android/support/wearable/view/CardScrollView.html
 [21]: http://developer.android.com/reference/android/support/wearable/view/CircledImageView.html
 [22]: https://developer.android.com/training/wearables/apps/creating.html#Install
+[23]: https://developer.android.com/reference/android/support/design/widget/CoordinatorLayout.html
+[24]: https://developer.android.com/reference/android/support/design/widget/FloatingActionButton.html
+[25]: http://android-developers.blogspot.com/2015/05/android-design-support-library.html
+[26]: http://developer.android.com/reference/android/support/wearable/view/ActionPage.html
 ]]>
         </intro>
     </metadata>