am 579a3418: am 35ef6aae: am 0655904a: Fixing regression in reordering (issue 10994971)

* commit '579a34186f801f7d70ac05feb380b1a3480e6d31':
diff --git a/Android.mk b/Android.mk
index 10c9f24..3bd20a7 100644
--- a/Android.mk
+++ b/Android.mk
@@ -15,28 +15,48 @@
 #
 
 LOCAL_PATH := $(call my-dir)
+
+#
+# Build app code.
+#
 include $(CLEAR_VARS)
 
 LOCAL_MODULE_TAGS := optional
 
 LOCAL_STATIC_JAVA_LIBRARIES := android-support-v13
 
-LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src) \
+LOCAL_SRC_FILES := $(call all-java-files-under, src) \
+    $(call all-renderscript-files-under, src) \
     $(call all-proto-files-under, protos)
 
 LOCAL_PROTOC_OPTIMIZE_TYPE := nano
+LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/
 
-LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos
-
-LOCAL_SDK_VERSION := 17
+LOCAL_SDK_VERSION := 19
 
 LOCAL_PACKAGE_NAME := Launcher3
 #LOCAL_CERTIFICATE := shared
 
-LOCAL_OVERRIDES_PACKAGES := Home
+LOCAL_OVERRIDES_PACKAGES := Launcher2
 
 LOCAL_PROGUARD_FLAG_FILES := proguard.flags
 
 include $(BUILD_PACKAGE)
 
 include $(call all-makefiles-under,$(LOCAL_PATH))
+
+#
+# Protocol Buffer Debug Utility in Java
+#
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := $(call all-java-files-under, util) \
+    $(call all-proto-files-under, protos)
+
+LOCAL_PROTOC_OPTIMIZE_TYPE := nano
+LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/
+
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE := protoutil
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/protos/backup.proto b/protos/backup.proto
index 3780bc5..7ba2937 100644
--- a/protos/backup.proto
+++ b/protos/backup.proto
@@ -23,7 +23,8 @@
   enum Type {
     FAVORITE = 1;
     SCREEN = 2;
-    IMAGE = 3;
+    ICON = 3;
+    WIDGET = 4;
   }
   required Type type = 1;
   optional string name = 2;  // keep this short
@@ -71,6 +72,14 @@
  }
 
 message Resource {
-  required int32 dpi = 2;
-  required bytes data = 3;
+  required int32 dpi = 1;
+  required bytes data = 2;
+ }
+
+message Widget {
+  required string provider = 1;
+  optional string label = 2;
+  optional bool configure = 3;
+  optional Resource icon = 4;
+  optional Resource preview = 5;
  }
diff --git a/res/drawable-hdpi/cling.9.png b/res/drawable-hdpi/cling.9.png
index 42a889f..36fbfc8 100644
--- a/res/drawable-hdpi/cling.9.png
+++ b/res/drawable-hdpi/cling.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cling_button.9.png b/res/drawable-hdpi/cling_button.9.png
index 4dbe564..e308382 100644
--- a/res/drawable-hdpi/cling_button.9.png
+++ b/res/drawable-hdpi/cling_button.9.png
Binary files differ
diff --git a/res/drawable-hdpi/cling_button_pressed.9.png b/res/drawable-hdpi/cling_button_pressed.9.png
index 2a85cab..4f9ca6f 100644
--- a/res/drawable-hdpi/cling_button_pressed.9.png
+++ b/res/drawable-hdpi/cling_button_pressed.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_allapps.png b/res/drawable-hdpi/ic_allapps.png
index f55aabf..e7677d5 100644
--- a/res/drawable-hdpi/ic_allapps.png
+++ b/res/drawable-hdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_allapps_pressed.png b/res/drawable-hdpi/ic_allapps_pressed.png
index bbc4d7d..863eeba 100644
--- a/res/drawable-hdpi/ic_allapps_pressed.png
+++ b/res/drawable-hdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_pageindicator_add.png b/res/drawable-hdpi/ic_pageindicator_add.png
index c77a4f9..c37d622 100644
--- a/res/drawable-hdpi/ic_pageindicator_add.png
+++ b/res/drawable-hdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-hdpi/widget_preview_tile.png b/res/drawable-hdpi/widget_preview_tile.png
deleted file mode 100644
index caeddd1..0000000
--- a/res/drawable-hdpi/widget_preview_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/widget_tile.png b/res/drawable-hdpi/widget_tile.png
new file mode 100644
index 0000000..310ff8b
--- /dev/null
+++ b/res/drawable-hdpi/widget_tile.png
Binary files differ
diff --git a/res/drawable-mdpi/cling.9.png b/res/drawable-mdpi/cling.9.png
index f6f730d..4c0f139 100644
--- a/res/drawable-mdpi/cling.9.png
+++ b/res/drawable-mdpi/cling.9.png
Binary files differ
diff --git a/res/drawable-mdpi/cling_button.9.png b/res/drawable-mdpi/cling_button.9.png
index 38de60a..a0b6f97 100644
--- a/res/drawable-mdpi/cling_button.9.png
+++ b/res/drawable-mdpi/cling_button.9.png
Binary files differ
diff --git a/res/drawable-mdpi/cling_button_pressed.9.png b/res/drawable-mdpi/cling_button_pressed.9.png
index c60837d..986e669 100644
--- a/res/drawable-mdpi/cling_button_pressed.9.png
+++ b/res/drawable-mdpi/cling_button_pressed.9.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps.png b/res/drawable-mdpi/ic_allapps.png
index d95f1bf..e0fd9c0 100644
--- a/res/drawable-mdpi/ic_allapps.png
+++ b/res/drawable-mdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps_pressed.png b/res/drawable-mdpi/ic_allapps_pressed.png
index e24b9d7..3bd87b1 100644
--- a/res/drawable-mdpi/ic_allapps_pressed.png
+++ b/res/drawable-mdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_pageindicator_add.png b/res/drawable-mdpi/ic_pageindicator_add.png
index 22420bd..8e05e64 100644
--- a/res/drawable-mdpi/ic_pageindicator_add.png
+++ b/res/drawable-mdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-mdpi/widget_preview_tile.png b/res/drawable-mdpi/widget_preview_tile.png
deleted file mode 100644
index 9c7c4f7..0000000
--- a/res/drawable-mdpi/widget_preview_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/widget_tile.png b/res/drawable-mdpi/widget_tile.png
new file mode 100644
index 0000000..1ba559d
--- /dev/null
+++ b/res/drawable-mdpi/widget_tile.png
Binary files differ
diff --git a/res/drawable-xhdpi/cling.9.png b/res/drawable-xhdpi/cling.9.png
index 9cc03c9..1cb4681 100644
--- a/res/drawable-xhdpi/cling.9.png
+++ b/res/drawable-xhdpi/cling.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/cling_button.9.png b/res/drawable-xhdpi/cling_button.9.png
index 1c93bc4..4192563 100644
--- a/res/drawable-xhdpi/cling_button.9.png
+++ b/res/drawable-xhdpi/cling_button.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/cling_button_pressed.9.png b/res/drawable-xhdpi/cling_button_pressed.9.png
index b5d4aae..d3ce469 100644
--- a/res/drawable-xhdpi/cling_button_pressed.9.png
+++ b/res/drawable-xhdpi/cling_button_pressed.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps.png b/res/drawable-xhdpi/ic_allapps.png
index 0e4316c..f71964c 100644
--- a/res/drawable-xhdpi/ic_allapps.png
+++ b/res/drawable-xhdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps_pressed.png b/res/drawable-xhdpi/ic_allapps_pressed.png
index 2b13330..d678f02 100644
--- a/res/drawable-xhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_pageindicator_add.png b/res/drawable-xhdpi/ic_pageindicator_add.png
index 9647b8f..28e164b 100644
--- a/res/drawable-xhdpi/ic_pageindicator_add.png
+++ b/res/drawable-xhdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-xhdpi/widget_preview_tile.png b/res/drawable-xhdpi/widget_preview_tile.png
deleted file mode 100644
index 6023867..0000000
--- a/res/drawable-xhdpi/widget_preview_tile.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/widget_tile.png b/res/drawable-xhdpi/widget_tile.png
new file mode 100644
index 0000000..9730f35
--- /dev/null
+++ b/res/drawable-xhdpi/widget_tile.png
Binary files differ
diff --git a/res/drawable-xxhdpi/cling.9.png b/res/drawable-xxhdpi/cling.9.png
index 3dcf121..7beae03 100644
--- a/res/drawable-xxhdpi/cling.9.png
+++ b/res/drawable-xxhdpi/cling.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/cling_button.9.png b/res/drawable-xxhdpi/cling_button.9.png
index 4f68a03..e412876 100644
--- a/res/drawable-xxhdpi/cling_button.9.png
+++ b/res/drawable-xxhdpi/cling_button.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/cling_button_pressed.9.png b/res/drawable-xxhdpi/cling_button_pressed.9.png
index 4bc0337..55e89da 100644
--- a/res/drawable-xxhdpi/cling_button_pressed.9.png
+++ b/res/drawable-xxhdpi/cling_button_pressed.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps.png b/res/drawable-xxhdpi/ic_allapps.png
index 9d5d80c..624e0ef 100644
--- a/res/drawable-xxhdpi/ic_allapps.png
+++ b/res/drawable-xxhdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps_pressed.png b/res/drawable-xxhdpi/ic_allapps_pressed.png
index b6a34a8..77b45ae 100644
--- a/res/drawable-xxhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xxhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pageindicator_add.png b/res/drawable-xxhdpi/ic_pageindicator_add.png
index 591b189..fd8a662 100644
--- a/res/drawable-xxhdpi/ic_pageindicator_add.png
+++ b/res/drawable-xxhdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-xxhdpi/widget_tile.png b/res/drawable-xxhdpi/widget_tile.png
new file mode 100644
index 0000000..3a3790d
--- /dev/null
+++ b/res/drawable-xxhdpi/widget_tile.png
Binary files differ
diff --git a/res/drawable-xxhdpi/widget_tile_jb.png b/res/drawable-xxhdpi/widget_tile_jb.png
deleted file mode 100644
index 363fe84..0000000
--- a/res/drawable-xxhdpi/widget_tile_jb.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/cling_arrow_end.xml b/res/drawable/cling_arrow_end.xml
new file mode 100644
index 0000000..3f63c7d
--- /dev/null
+++ b/res/drawable/cling_arrow_end.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+        android:src="@drawable/cling_arrow_right"
+        android:autoMirrored="true">
+</bitmap>
diff --git a/res/drawable/cling_arrow_start.xml b/res/drawable/cling_arrow_start.xml
new file mode 100644
index 0000000..ebe9183
--- /dev/null
+++ b/res/drawable/cling_arrow_start.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
+        android:src="@drawable/cling_arrow_left"
+        android:autoMirrored="true">
+</bitmap>
diff --git a/res/layout-land/first_run_cling.xml b/res/layout-land/first_run_cling.xml
index 3b21e14..9baee64 100644
--- a/res/layout-land/first_run_cling.xml
+++ b/res/layout-land/first_run_cling.xml
@@ -25,26 +25,31 @@
         android:layout_height="match_parent">
         <LinearLayout
             android:id="@+id/bubble_content"
-            android:layout_width="wrap_content"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
+            android:layout_marginLeft="100dp"
+            android:layout_marginRight="100dp"
             android:orientation="vertical">
             <TextView
                 style="@style/ClingAltTitleText"
-                android:layout_width="wrap_content"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_horizontal"
                 android:layout_marginBottom="10dp"
                 android:text="@string/first_run_cling_title"
                 android:textColor="#FFFFFFFF"
-                android:textSize="30sp" />
+                android:textSize="30sp"
+                android:gravity="center" />
             <TextView
                 style="@style/ClingAltTitleText"
-                android:layout_width="wrap_content"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
                 android:text="@string/first_run_cling_description"
                 android:textColor="#80000000"
-                android:textSize="16sp" />
+                android:textSize="16sp"
+                android:gravity="center" />
         </LinearLayout>
         <TextView
             style="@style/ClingHintText"
@@ -53,7 +58,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="top|end"
             android:layout_marginEnd="10dp"
-            android:layout_marginTop="80dp"
+            android:layout_marginTop="65dp"
             android:visibility="gone"
             android:drawableTop="@drawable/cling_arrow_up"
             android:drawablePadding="5dp"
@@ -76,7 +81,7 @@
             android:layout_height="wrap_content"
             android:layout_gravity="bottom|end"
             android:layout_marginEnd="10dp"
-            android:layout_marginBottom="100dp"
+            android:layout_marginBottom="85dp"
             android:drawableEnd="@drawable/cling_arrow_right"
             android:drawablePadding="5dp"
             android:text="@string/first_run_cling_create_screens_hint" />
diff --git a/res/layout-land/folder_cling.xml b/res/layout-land/folder_cling.xml
index 1f4a115..86286d7 100644
--- a/res/layout-land/folder_cling.xml
+++ b/res/layout-land/folder_cling.xml
@@ -27,22 +27,31 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:paddingLeft="20dp"
-            android:paddingRight="20dp"
-            android:paddingTop="20dp"
-            android:paddingBottom="20dp"
-            android:orientation="vertical"
-            android:background="@drawable/cling">
-            <TextView
-                style="@style/ClingTitleText"
-                android:id="@+id/folder_cling_title"
-                android:text="@string/folder_cling_title" />
-            <TextView
-                style="@style/ClingText"
-                android:id="@+id/folder_cling_create_folder"
+            android:orientation="vertical">
+            <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="@string/folder_cling_create_folder" />
+                android:paddingLeft="20dp"
+                android:paddingRight="20dp"
+                android:paddingTop="20dp"
+                android:paddingBottom="20dp"
+                android:orientation="vertical"
+                android:background="@drawable/cling">
+                <TextView
+                    style="@style/ClingTitleText"
+                    android:id="@+id/folder_cling_title"
+                    android:text="@string/folder_cling_title" />
+                <TextView
+                    style="@style/ClingText"
+                    android:id="@+id/folder_cling_create_folder"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="@string/folder_cling_create_folder" />
+            </LinearLayout>
+            <ImageView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:src="@drawable/cling_arrow_down" />
         </LinearLayout>
     </FrameLayout>
     <Button
diff --git a/res/layout-land/workspace_cling.xml b/res/layout-land/workspace_cling.xml
index 08fb8cf..db33db0 100644
--- a/res/layout-land/workspace_cling.xml
+++ b/res/layout-land/workspace_cling.xml
@@ -25,13 +25,11 @@
         android:layout_height="match_parent"
         android:layout_marginStart="25dp"
         android:layout_marginEnd="25dp"
-        android:layout_marginTop="20dp"
-        android:layout_marginBottom="100dp">
+        android:layout_marginTop="310dp">
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_gravity="bottom"
-            android:layout_marginBottom="40dp"
+            android:layout_gravity="top"
             android:orientation="vertical">
             <ImageView
                 android:layout_width="wrap_content"
diff --git a/res/layout-port/first_run_cling.xml b/res/layout-port/first_run_cling.xml
index 3b21e14..4830e5d 100644
--- a/res/layout-port/first_run_cling.xml
+++ b/res/layout-port/first_run_cling.xml
@@ -25,35 +25,42 @@
         android:layout_height="match_parent">
         <LinearLayout
             android:id="@+id/bubble_content"
-            android:layout_width="wrap_content"
+            android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
+            android:layout_marginLeft="100dp"
+            android:layout_marginRight="100dp"
             android:orientation="vertical">
             <TextView
                 style="@style/ClingAltTitleText"
-                android:layout_width="wrap_content"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_horizontal"
                 android:layout_marginBottom="10dp"
                 android:text="@string/first_run_cling_title"
                 android:textColor="#FFFFFFFF"
-                android:textSize="30sp" />
+                android:textSize="30sp"
+                android:gravity="center" />
             <TextView
                 style="@style/ClingAltTitleText"
-                android:layout_width="wrap_content"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
                 android:text="@string/first_run_cling_description"
                 android:textColor="#80000000"
-                android:textSize="16sp" />
+                android:textSize="16sp"
+                android:gravity="center" />
         </LinearLayout>
         <TextView
             style="@style/ClingHintText"
             android:id="@+id/search_bar_hint"
-            android:layout_width="160dp"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="top|end"
             android:layout_marginEnd="10dp"
-            android:layout_marginTop="80dp"
+            android:layout_marginTop="65dp"
+            android:gravity="center_horizontal"
+            android:maxWidth="160dp"
             android:visibility="gone"
             android:drawableTop="@drawable/cling_arrow_up"
             android:drawablePadding="5dp"
@@ -61,23 +68,26 @@
         <TextView
             style="@style/ClingHintText"
             android:id="@+id/custom_content_hint"
-            android:layout_width="160dp"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_gravity="top"
+            android:layout_gravity="top|start"
             android:layout_marginStart="10dp"
+            android:layout_marginEnd="10dp"
             android:layout_marginTop="100dp"
+            android:maxWidth="160dp"
             android:visibility="gone"
-            android:drawableStart="@drawable/cling_arrow_left"
+            android:drawableStart="@drawable/cling_arrow_start"
             android:drawablePadding="10dp"
             android:text="@string/first_run_cling_custom_content_hint" />
         <TextView
             style="@style/ClingHintText"
-            android:layout_width="160dp"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="bottom|end"
             android:layout_marginEnd="10dp"
-            android:layout_marginBottom="100dp"
-            android:drawableEnd="@drawable/cling_arrow_right"
+            android:layout_marginBottom="85dp"
+            android:maxWidth="180dp"
+            android:drawableEnd="@drawable/cling_arrow_end"
             android:drawablePadding="5dp"
             android:text="@string/first_run_cling_create_screens_hint" />
     </FrameLayout>
diff --git a/res/layout-port/folder_cling.xml b/res/layout-port/folder_cling.xml
index 1f4a115..86286d7 100644
--- a/res/layout-port/folder_cling.xml
+++ b/res/layout-port/folder_cling.xml
@@ -27,22 +27,31 @@
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:paddingLeft="20dp"
-            android:paddingRight="20dp"
-            android:paddingTop="20dp"
-            android:paddingBottom="20dp"
-            android:orientation="vertical"
-            android:background="@drawable/cling">
-            <TextView
-                style="@style/ClingTitleText"
-                android:id="@+id/folder_cling_title"
-                android:text="@string/folder_cling_title" />
-            <TextView
-                style="@style/ClingText"
-                android:id="@+id/folder_cling_create_folder"
+            android:orientation="vertical">
+            <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:text="@string/folder_cling_create_folder" />
+                android:paddingLeft="20dp"
+                android:paddingRight="20dp"
+                android:paddingTop="20dp"
+                android:paddingBottom="20dp"
+                android:orientation="vertical"
+                android:background="@drawable/cling">
+                <TextView
+                    style="@style/ClingTitleText"
+                    android:id="@+id/folder_cling_title"
+                    android:text="@string/folder_cling_title" />
+                <TextView
+                    style="@style/ClingText"
+                    android:id="@+id/folder_cling_create_folder"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:text="@string/folder_cling_create_folder" />
+            </LinearLayout>
+            <ImageView
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:src="@drawable/cling_arrow_down" />
         </LinearLayout>
     </FrameLayout>
     <Button
diff --git a/res/layout-port/workspace_cling.xml b/res/layout-port/workspace_cling.xml
index 38d3858..b926ca9 100644
--- a/res/layout-port/workspace_cling.xml
+++ b/res/layout-port/workspace_cling.xml
@@ -22,21 +22,15 @@
     <FrameLayout
         android:id="@+id/content"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_marginStart="25dp"
-        android:layout_marginEnd="25dp"
-        android:layout_marginTop="20dp"
-        android:layout_marginBottom="120dp">
+        android:layout_height="match_parent">
         <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_gravity="bottom"
+            android:layout_gravity="top"
+            android:layout_marginStart="25dp"
+            android:layout_marginEnd="25dp"
+            android:layout_marginTop="30dp"
             android:orientation="vertical">
-            <ImageView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_horizontal"
-                android:src="@drawable/cling_arrow_up" />
             <LinearLayout
                 android:paddingLeft="20dp"
                 android:paddingRight="20dp"
@@ -57,14 +51,57 @@
                     android:layout_height="wrap_content"
                     android:text="@string/workspace_cling_move_item" />
             </LinearLayout>
+            <ImageView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:src="@drawable/cling_arrow_down" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/focused_hotseat_app_bubble"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="bottom|left"
+            android:layout_marginLeft="25dp"
+            android:layout_marginBottom="90dp"
+            android:orientation="vertical"
+            android:visibility="gone">
+            <LinearLayout
+                android:paddingLeft="20dp"
+                android:paddingRight="20dp"
+                android:paddingTop="20dp"
+                android:paddingBottom="20dp"
+                android:layout_width="240dp"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:background="@drawable/cling">
+                <TextView
+                    android:id="@+id/focused_hotseat_app_title"
+                    style="@style/ClingTitleText"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content" />
+                <TextView
+                    android:id="@+id/focused_hotseat_app_description"
+                    style="@style/ClingText"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content" />
+            </LinearLayout>
+            <ImageView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="left"
+                android:layout_marginLeft="78dp"
+                android:src="@drawable/cling_arrow_down" />
         </LinearLayout>
     </FrameLayout>
+
     <Button
         style="@style/ClingButton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginBottom="15dp"
-        android:layout_marginEnd="20dp"
-        android:layout_gravity="bottom|end"
+        android:layout_marginRight="20dp"
+        android:layout_gravity="bottom|right"
         android:onClick="dismissWorkspaceCling" />
 </com.android.launcher3.Cling>
diff --git a/res/layout/all_apps_button.xml b/res/layout/all_apps_button.xml
new file mode 100644
index 0000000..1b9ea08
--- /dev/null
+++ b/res/layout/all_apps_button.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2008 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+   style="@style/WorkspaceIcon"
+   android:focusable="true"
+   android:background="@drawable/focusable_view_bg" />
diff --git a/res/layout/apps_customize_pane.xml b/res/layout/apps_customize_pane.xml
index e488601..11a938f 100644
--- a/res/layout/apps_customize_pane.xml
+++ b/res/layout/apps_customize_pane.xml
@@ -78,10 +78,4 @@
                 android:layout_marginBottom="@dimen/apps_customize_page_indicator_margin" />
         </FrameLayout>
     </LinearLayout>
-
-    <include layout="@layout/all_apps_cling"
-        android:id="@+id/all_apps_cling"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:visibility="gone" />
 </com.android.launcher3.AppsCustomizeTabHost>
diff --git a/res/layout/user_folder.xml b/res/layout/user_folder.xml
index d01e2eb..5d5f33b 100644
--- a/res/layout/user_folder.xml
+++ b/res/layout/user_folder.xml
@@ -45,7 +45,7 @@
         android:hint="@string/folder_hint_text"
         android:textSize="14sp"
         android:textColor="#ff777777"
-        android:textColorHighlight="#ff333333"
+        android:textColorHighlight="#ffCCCCCC"
         android:textCursorDrawable="@null"
         android:gravity="center_horizontal"
         android:singleLine="true"
diff --git a/res/layout/wallpaper_picker.xml b/res/layout/wallpaper_picker.xml
index 53c529c..c91cc7e 100644
--- a/res/layout/wallpaper_picker.xml
+++ b/res/layout/wallpaper_picker.xml
@@ -18,7 +18,8 @@
 */
 -->
 
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<com.android.launcher3.WallpaperRootView
+    xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/wallpaper_root"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
@@ -41,23 +42,19 @@
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_alignParentBottom="true"
-        android:orientation="vertical"
-        android:fitsSystemWindows="true" >
+        android:orientation="vertical" >
         <View
             android:layout_width="match_parent"
             android:layout_height="2dp"
             android:background="@drawable/tile_shadow_top" />
         <HorizontalScrollView
+            android:id="@+id/wallpaper_scroll_container"
             android:layout_width="match_parent"
             android:layout_height="wrap_content" >
             <LinearLayout android:id="@+id/master_wallpaper_list"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:orientation="horizontal" >
-                <LinearLayout android:id="@+id/third_party_wallpaper_list"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:orientation="horizontal" />
                 <LinearLayout android:id="@+id/wallpaper_list"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
@@ -66,6 +63,10 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:orientation="horizontal" />
+                <LinearLayout android:id="@+id/third_party_wallpaper_list"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal" />
             </LinearLayout>
         </HorizontalScrollView>
         <View
@@ -73,4 +74,4 @@
             android:layout_height="2dp"
             android:background="@drawable/tile_shadow_bottom" />
     </LinearLayout>
-</RelativeLayout>
+</com.android.launcher3.WallpaperRootView>
diff --git a/res/layout/wallpaper_picker_gallery_item.xml b/res/layout/wallpaper_picker_image_picker_item.xml
similarity index 95%
rename from res/layout/wallpaper_picker_gallery_item.xml
rename to res/layout/wallpaper_picker_image_picker_item.xml
index d14ab3e..ae3c43d 100644
--- a/res/layout/wallpaper_picker_gallery_item.xml
+++ b/res/layout/wallpaper_picker_image_picker_item.xml
@@ -32,6 +32,8 @@
         android:id="@+id/wallpaper_item_label"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:ellipsize="marquee"
+        android:gravity="center"
         android:layout_gravity="center"
         android:text="@string/pick_image"
         android:drawableTop="@drawable/ic_images"
diff --git a/res/layout/live_wallpaper_picker_item.xml b/res/layout/wallpaper_picker_live_wallpaper_item.xml
similarity index 90%
rename from res/layout/live_wallpaper_picker_item.xml
rename to res/layout/wallpaper_picker_live_wallpaper_item.xml
index 29aa12c..29fdb1b 100644
--- a/res/layout/live_wallpaper_picker_item.xml
+++ b/res/layout/wallpaper_picker_live_wallpaper_item.xml
@@ -31,14 +31,16 @@
         android:scaleType="centerCrop" />
     <ImageView
         android:id="@+id/wallpaper_icon"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_width="@dimen/wallpaperItemIconSize"
+        android:layout_height="@dimen/wallpaperItemIconSize"
         android:layout_gravity="center"
         android:visibility="gone" />
     <TextView
         android:id="@+id/wallpaper_item_label"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:singleLine="true"
+        android:ellipsize="marquee"
         android:gravity="center"
         android:padding="4dp"
         android:layout_gravity="bottom"
diff --git a/res/layout/third_party_wallpaper_picker_item.xml b/res/layout/wallpaper_picker_third_party_item.xml
similarity index 95%
rename from res/layout/third_party_wallpaper_picker_item.xml
rename to res/layout/wallpaper_picker_third_party_item.xml
index c2aeade..68661bc 100644
--- a/res/layout/third_party_wallpaper_picker_item.xml
+++ b/res/layout/wallpaper_picker_third_party_item.xml
@@ -32,6 +32,8 @@
         android:id="@+id/wallpaper_item_label"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:ellipsize="marquee"
+        android:gravity="center"
         android:layout_gravity="center"
         android:drawablePadding="4dp"
         android:textColor="@android:color/white"/>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index bb8492a..e167189 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d gekies"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d gekies"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Muurpapier %1$d van %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Het <xliff:g id="LABEL">%1$s</xliff:g> gekies"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Vee uit"</string>
     <string name="pick_image" msgid="1272073934062909527">"Kies prent"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Muurpapiere"</string>
@@ -38,7 +40,7 @@
     <string name="widget_adder" msgid="3201040140710381657">"Legstukke"</string>
     <string name="toggle_weight_watcher" msgid="5645299835184636119">"Wys Mem"</string>
     <string name="long_press_widget_to_add" msgid="7699152356777458215">"Raak en hou om \'n legstuk op te tel."</string>
-    <string name="market" msgid="2619650989819296998">"Soek-en-koop"</string>
+    <string name="market" msgid="2619650989819296998">"Winkel"</string>
     <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
     <string name="external_drop_widget_error" msgid="3165821058322217155">"Kan nie item op hierdie Tuisskerm laat los nie."</string>
     <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Kies legstuk om te skep"</string>
@@ -51,7 +53,7 @@
     <string name="group_shortcuts" msgid="6012256992764410535">"Kortpaaie"</string>
     <string name="group_widgets" msgid="1569030723286851002">"Legstukke"</string>
     <string name="completely_out_of_space" msgid="6106288382070760318">"Niks meer spasie op jou Tuisskerms nie."</string>
-    <string name="out_of_space" msgid="4691004494942118364">"Niks meer spasie op tuisskerm nie."</string>
+    <string name="out_of_space" msgid="4691004494942118364">"Niks meer spasie op die tuisskerm nie."</string>
     <string name="hotseat_out_of_space" msgid="9139760413395605841">"Niks meer plek op die warmlaai nie."</string>
     <string name="invalid_hotseat_item" msgid="1211534262129849507">"Hierdie legstuk is te groot vir die warmlaai."</string>
     <string name="shortcut_installed" msgid="1701742129426969556">"Kortpad \"<xliff:g id="NAME">%s</xliff:g>\" is geskep."</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Programme-bladsy %1$d van %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Legstukke-bladsy %1$d van %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Welkom!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Maak jouself tuis"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Maak jouself tuis."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Skep meer skerms vir programme en vouers"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organiseer jou spasie"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Raak en hou agtergrond om muurpapier, legstukke en instellings te bestuur"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Raak en hou agtergrond om muurpapier, legstukke en instellings te bestuur."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Kies \'n paar programme"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Om \'n program by jou Tuisskerm te voeg, raak en hou dit."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Skep nuwe vouers vir jou programme"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Raak en hou \'n program, en skuif dit dan bo-op \'n ander programikoon."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Hier\'s \'n vouer"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Om een soos dié te skep, raak en hou \'n program en skuif dit dan oor \'n ander een."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Vouer oopgemaak, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Raak om vouer toe te maak"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 2d040b5..6e8aaa4 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d ተመርጧል"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d ተመርጧል"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"የግድግዳ ወረቀት %1$d ከ%2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> ተመርጧል"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"ሰርዝ"</string>
     <string name="pick_image" msgid="1272073934062909527">"ምስል ምረጥ"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"የግድግዳ ወረቀቶች"</string>
@@ -45,7 +47,7 @@
     <string name="rename_folder_label" msgid="3727762225964550653">"አቃፊ ስም"</string>
     <string name="rename_folder_title" msgid="3771389277707820891">"አቃፊ ዳግም ሰይም"</string>
     <string name="rename_action" msgid="5559600076028658757">"እሺ"</string>
-    <string name="cancel_action" msgid="7009134900002915310">"ይቅር"</string>
+    <string name="cancel_action" msgid="7009134900002915310">"ተው"</string>
     <string name="menu_item_add_item" msgid="1264911265836810421">"ወደ መነሻ ማያ ገጽ ያክሉ"</string>
     <string name="group_applications" msgid="3797214114206693605">"መተግበሪያዎች"</string>
     <string name="group_shortcuts" msgid="6012256992764410535">"አቋራጮች"</string>
@@ -78,11 +80,11 @@
     <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 አቃፊ ተመርጧል"</string>
     <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 አቋራጭ ተመርጧል"</string>
     <string name="permlab_install_shortcut" msgid="5632423390354674437">"አቋራጮችን ይጭናል"</string>
-    <string name="permdesc_install_shortcut" msgid="923466509822011139">"አንድ መተግበሪያው ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ እንዲያክል ያስችለዋል።"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"መተግበሪያው ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ እንዲያክል ያስችለዋል።"</string>
     <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"አቋራጮችን ያራግፋል"</string>
     <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"መተግበሪያው አቋራጮችን ያለተጠቃሚ ጣልቃ ገብነት እንዲያስወግድ ያስችለዋል።"</string>
     <string name="permlab_read_settings" msgid="1941457408239617576">"የመነሻ ቅንብሮች እና አቋራጮችን ያነባል"</string>
-    <string name="permdesc_read_settings" msgid="5833423719057558387">"መተግበሪያው በመነሻ ውስጥ ያኡ ቅንብሮችን እና አቋራጮችን እንዲያነብ ያስችለዋል።"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"መተግበሪያው በመነሻ ውስጥ ያሉ ቅንብሮችን እና አቋራጮችን እንዲያነብ ያስችለዋል።"</string>
     <string name="permlab_write_settings" msgid="3574213698004620587">"የመነሻ ቅንብሮችን እና አቋራጮችን ይጽፋል"</string>
     <string name="permdesc_write_settings" msgid="5440712911516509985">"መተግብሪያው ቅንብሮችን እና አቋራጮችን በመነሻ ውስጥ እንዲቀይራቸው ያስችለዋል።"</string>
     <string name="gadget_error_text" msgid="6081085226050792095">"ፍርግም የመጫን ችግር"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"የመተግበሪያዎች ገጽ %1$d ከ%2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"የመግብሮች ገጽ %1$d ከ%2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"እንኳን ደህና መጡ!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"እቤትዎ እንዳሉ ሆነው ዘና ይበሉ"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"ልክ እቤትዎ እንዳሉ ሆነው ዘና ይበሉ።"</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"ለመተግበሪያዎች እና አቃፊዎች ተጨማሪ ማያ ገጾችን ይፍጠሩ"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"ቦታዎን ያደራጁ"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"የግድግዳ ወረቀት፣ መግብሮችን እና ቅንብሮችን ለማቀናበር ጀርባውን ይንኩ እና ይያዙት"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"የግድግዳ ወረቀት፣ ምግብሮችን እና ቅንብሮችን ለማቀናበር ጀርባውን ይንኩ እና ይያዙት።"</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"አንዳንድ መተግበሪያዎችን ይምረጡ"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"አንድ መተግበሪያ ወደ መነሻ ማያ ገጽዎ ለማከል ይንኩት እና ይያዙት።"</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"ለመተግበሪያዎችዎ አዲስ አቃፊዎችን ይፍጠሩ"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"አንድ መተግበሪያ ነክተውት ይያዙት፣ ወደ የሌላ መተግበሪያ አዶ ላይ ይውሰዱት"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"አንድ አቃፊ እነሆ"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"አንድ እንደዚህ አይነት ለመፍጠር መተግበሪያውን ነክተው ይያዙት እና ወደ ሌላ ያንቀሳቅሱት።"</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"እሺ"</string>
     <string name="folder_opened" msgid="94695026776264709">"አቃፊ ተከፍቷል፣ <xliff:g id="WIDTH">%1$d</xliff:g> በ<xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"አቃፊን ለመዝጋት ይንኩ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index cfb1012..73ee690 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -20,7 +20,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
-    <string name="home" msgid="7658288663002113681">"الشاشة الرئيسية"</string>
+    <string name="home" msgid="7658288663002113681">"الرئيسية"</string>
     <string name="uid_name" msgid="7820867637514617527">"تطبيقات Android الأساسية"</string>
     <string name="folder_name" msgid="7371454440695724752"></string>
     <string name="wallpaper_instructions" msgid="563973358787555519">"تعيين خلفية"</string>
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"تم تحديد %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"تم تحديد %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"الخلفية %1$d من %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"تم تحديد <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"حذف"</string>
     <string name="pick_image" msgid="1272073934062909527">"اختيار صورة"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"الخلفيات"</string>
@@ -60,7 +62,7 @@
     <string name="title_select_shortcut" msgid="6680642571148153868">"اختيار اختصار"</string>
     <string name="title_select_application" msgid="3280812711670683644">"اختيار تطبيق"</string>
     <string name="all_apps_button_label" msgid="9110807029020582876">"التطبيقات"</string>
-    <string name="all_apps_home_button_label" msgid="252062713717058851">"الشاشة الرئيسية"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"الرئيسية"</string>
     <string name="delete_zone_label_workspace" msgid="4009607676751398685">"إزالة"</string>
     <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"إزالة"</string>
     <string name="delete_target_label" msgid="1822697352535677073">"إزالة"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"صفحة التطبيقات %1$d من %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"صفحة الأدوات %1$d من %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"مرحبًا!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"تصرف على راحتك"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"تصرف على راحتك."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"إنشاء المزيد من الشاشات للتطبيقات والمجلدات"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"تنظيم مساحتك"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"المس مع الاستمرار الجزء الخلفي من صورة الشاشة لإدارة الخلفية والأدوات والإعدادات"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"المس مع الاستمرار الجزء الخلفي من صورة الشاشة لإدارة الخلفية والأدوات والإعدادات."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"اختيار بعض التطبيقات"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"لإضافة تطبيق إلى الشاشة الرئيسية، المسه مع الاستمرار."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"إنشاء مجلدات جديدة لتطبيقاتك"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"المس مع الاستمرار تطبيقًا ثم انقله ليكون فوق رمز تطبيق آخر"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"إليك المجلد"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"لإنشاء مجلد مثل هذا، المس أحد التطبيقات مع استمرار اللمس، ثم حركه فوق آخر."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"موافق"</string>
     <string name="folder_opened" msgid="94695026776264709">"تم فتح المجلد، بمقاس <xliff:g id="WIDTH">%1$d</xliff:g> في <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"المس لإغلاق المجلد"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index e4f0424..ddcf404 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -31,6 +31,10 @@
     <!-- no translation found for number_of_items_selected:zero (7464587177007785408) -->
     <!-- no translation found for number_of_items_selected:one (142482526010824029) -->
     <!-- no translation found for number_of_items_selected:other (1418352074806573570) -->
+    <!-- no translation found for wallpaper_accessibility_name (1655953108132967972) -->
+    <skip />
+    <!-- no translation found for announce_selection (8338254712932127413) -->
+    <skip />
     <!-- no translation found for wallpaper_delete (8095005658756613921) -->
     <skip />
     <!-- no translation found for pick_image (1272073934062909527) -->
@@ -163,7 +167,7 @@
     <skip />
     <!-- no translation found for first_run_cling_title (7257389003637362144) -->
     <skip />
-    <!-- no translation found for first_run_cling_description (658815204153067813) -->
+    <!-- no translation found for first_run_cling_description (6447072552696253358) -->
     <skip />
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
@@ -171,15 +175,15 @@
     <skip />
     <!-- no translation found for workspace_cling_title (5626202359865825661) -->
     <skip />
-    <!-- no translation found for workspace_cling_move_item (2243369117709858844) -->
+    <!-- no translation found for workspace_cling_move_item (528201129978005352) -->
     <skip />
     <!-- no translation found for all_apps_cling_title (34929250753095858) -->
     <skip />
     <!-- no translation found for all_apps_cling_add_item (400866858451850784) -->
     <skip />
-    <!-- no translation found for folder_cling_title (294708344826056909) -->
+    <!-- no translation found for folder_cling_title (3894908818693254164) -->
     <skip />
-    <!-- no translation found for folder_cling_create_folder (3245124301268588807) -->
+    <!-- no translation found for folder_cling_create_folder (6158215559475836131) -->
     <skip />
     <!-- no translation found for cling_dismiss (8962359497601507581) -->
     <skip />
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 2039b74..2f53fa3 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Избрахте %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Избрахте %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Тапет %1$d от %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Избрахте <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Изтриване"</string>
     <string name="pick_image" msgid="1272073934062909527">"Избиране на изображение"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Тапети"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Страница с приложения %1$d от %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Страница с приспособления %1$d от %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Добре дошли!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Персонализиране и приспособяване"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Персонализиране и приспособяване."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Създаване на още екрани за приложения и папки"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Организиране на мястото ви"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Докоснете и задръжте фона, за да управлявате тапета, приспособленията и настройките"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Докоснете и задръжте фона, за да управлявате тапета, приспособленията и настройките."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Изберете някои приложения"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"За да добавите приложение към началния си екран, го докоснете и задръжте."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Създаване на нови папки за приложенията ви"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Докоснете и задръжте приложение, след което го преместете върху иконата на друго."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Ето една папка"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"За да създадете подобна, докоснете и задръжте приложение, след което го преместете върху друго."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"ОK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Папката е отворена – <xliff:g id="WIDTH">%1$d</xliff:g> на <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Докоснете, за да затворите папката"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 704cf7a..3400482 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Seleccionats: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Seleccionats: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fons de pantalla %1$d de %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"S\'ha seleccionat <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Suprimeix"</string>
     <string name="pick_image" msgid="1272073934062909527">"Selecciona una imatge"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Fons de pantalla"</string>
@@ -87,7 +89,7 @@
     <string name="permdesc_write_settings" msgid="5440712911516509985">"Permet que l\'aplicació canviï la configuració i les dreceres de la pantalla d\'inici."</string>
     <string name="gadget_error_text" msgid="6081085226050792095">"S\'ha produït un problema en carregar el widget"</string>
     <string name="uninstall_system_app_text" msgid="4172046090762920660">"Aquesta aplicació és una aplicació del sistema i no es pot desinstal·lar."</string>
-    <string name="dream_name" msgid="1530253749244328964">"Llançamíssils"</string>
+    <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
     <string name="folder_hint_text" msgid="6617836969016293992">"Carpeta sense nom"</string>
     <string name="workspace_description_format" msgid="2950174241104043327">"Pantalla d\'inici %1$d"</string>
     <string name="default_scroll_format" msgid="7475544710230993317">"Pàgina %1$d de %2$d"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Pàgina d\'aplicacions %1$d de %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Pàgina de widgets %1$d de %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Hola!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Posa\'t còmode"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Personalitza la pantalla d\'inici"</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crea més pantalles per a aplicacions i carpetes"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organitza el teu espai"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Toca i mantén premut el fons per gestionar el fons de pantalla, els widgets i la configuració"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Toca i mantén premut el fons per gestionar el fons de pantalla, els widgets i la configuració."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Tria unes quantes aplicacions"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Per afegir una aplicació a la pantalla d\'inici, mantén-la premuda."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Crea carpetes per a les aplicacions"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Toca i mantén premuda una aplicació i, a continuació, mou-la a sobre de la icona d\'una altra aplicació."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Aquí hi ha una carpeta"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Per crear-ne una com aquesta, mantén premuda una aplicació i, a continuació, mou-la sobre una altra."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"D\'acord"</string>
     <string name="folder_opened" msgid="94695026776264709">"S\'ha obert la carpeta, <xliff:g id="WIDTH">%1$d</xliff:g> per <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Toca per tancar la carpeta"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index a5478f9..1061e79 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Vybráno: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Vybráno: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Tapeta %1$d z %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Vybrána položka <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Smazat"</string>
     <string name="pick_image" msgid="1272073934062909527">"Vybrat obrázek"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Tapety"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Stránka aplikací %1$d z %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Stránka widgetů %1$d z %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Vítejte!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Udělejte si pohodlí"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Udělejte si pohodlí."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Vytvořte několik obrazovek pro aplikace a složky"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organizace prostoru"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Chcete-li spravovat tapetu, widgety a nastavení, dotkněte se pozadí a přidržte je."</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Chcete-li spravovat tapetu, widgety a nastavení, dotkněte se pozadí a přidržte je."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Vyberte nějaké aplikace"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Chcete-li na plochu přidat aplikaci, dotkněte se jí a přidržte ji."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Vytvořit pro aplikace nové složky"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Dotkněte se aplikace, přidržte ji a poté ji přesuňte na ikonu jiné aplikace"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Toto je složka"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Chcete-li vytvořit složku, přetáhněte aplikaci na jinou aplikaci."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Složka otevřena, rozměry <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Dotykem složku zavřete"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index f2a7763..5db246e 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d er valgt"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d er valgt"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Baggrund %1$d af %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> blev valgt"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Slet"</string>
     <string name="pick_image" msgid="1272073934062909527">"Vælg billede"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Baggrunde"</string>
@@ -37,8 +39,8 @@
     <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string>
     <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string>
     <string name="toggle_weight_watcher" msgid="5645299835184636119">"Vis Mem"</string>
-    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Tryk på en widget, og hold fingeren nede for at vælge den."</string>
-    <string name="market" msgid="2619650989819296998">"Køb"</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Tryk på en widget, og hold den nede for at vælge."</string>
+    <string name="market" msgid="2619650989819296998">"Køb i Google Play Butik"</string>
     <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
     <string name="external_drop_widget_error" msgid="3165821058322217155">"Elementet kunne ikke trækkes til startskærmen."</string>
     <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Vælg den widget, du vil oprette"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps-side %1$d ud af %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgets-side %1$d ud af %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Velkommen"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Tilpas din startskærm"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Føl dig hjemme."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Opret flere skærme til apps og mapper"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organiser din arbejdsplads"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Tryk på en baggrund, og hold fingeren nede for at håndtere baggrunde, widgets og indstillinger."</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Tryk på en baggrund, og hold fingeren nede for at administrere baggrunde, widgets og indstillinger."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Vælge nogle apps"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Tryk på en app, og hold fingeren nede for at føje appen til startskærmen."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Opret nye mapper til dine apps"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Tryk på en app, og hold fingeren nede, og flyt den over til et andet appikon"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Her kan du se en mappe"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Du kan oprette en mappe magen til denne ved at trykke på en app og holde fingeren nede, mens du flytter appen til en anden mappe."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Mappen er åben, <xliff:g id="WIDTH">%1$d</xliff:g> gange <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Tryk for at lukke mappen"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index b67f0e0..7a5e7e6 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d ausgewählt"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d ausgewählt"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Hintergrund %1$d von %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> ausgewählt"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Entfernen"</string>
     <string name="pick_image" msgid="1272073934062909527">"Bild auswählen"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Hintergründe"</string>
@@ -78,16 +80,16 @@
     <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 Ordner ausgewählt"</string>
     <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 Verknüpfung ausgewählt"</string>
     <string name="permlab_install_shortcut" msgid="5632423390354674437">"Verknüpfungen installieren"</string>
-    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Ermöglicht einer App das Hinzufügen von Verknüpfungen ohne Eingriff des Nutzers"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Ermöglicht einer App das Hinzufügen von Verknüpfungen ohne Eingreifen des Nutzers"</string>
     <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"Verknüpfungen deinstallieren"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Ermöglicht einer App das Entfernen von Verknüpfungen ohne Eingriff des Nutzers"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Ermöglicht einer App das Entfernen von Verknüpfungen ohne Eingreifen des Nutzers"</string>
     <string name="permlab_read_settings" msgid="1941457408239617576">"Einstellungen und Verknüpfungen auf dem Startbildschirm lesen"</string>
     <string name="permdesc_read_settings" msgid="5833423719057558387">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu lesen"</string>
     <string name="permlab_write_settings" msgid="3574213698004620587">"Einstellungen und Verknüpfungen für den Startbildschirm schreiben"</string>
     <string name="permdesc_write_settings" msgid="5440712911516509985">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu ändern"</string>
     <string name="gadget_error_text" msgid="6081085226050792095">"Problem beim Laden des Widgets"</string>
     <string name="uninstall_system_app_text" msgid="4172046090762920660">"Dies ist eine Systemanwendung, die nicht deinstalliert werden kann."</string>
-    <string name="dream_name" msgid="1530253749244328964">"Raketenstartgerät"</string>
+    <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
     <string name="folder_hint_text" msgid="6617836969016293992">"Unbenannter Ordner"</string>
     <string name="workspace_description_format" msgid="2950174241104043327">"Startbildschirm %1$d"</string>
     <string name="default_scroll_format" msgid="7475544710230993317">"Seite %1$d von %2$d"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps-Seite %1$d von %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgets-Seite %1$d von %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Willkommen!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Gerät personalisieren"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Gerät personalisieren"</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Weitere Bildschirme für Apps und Ordner erstellen"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Arbeitsbereich organisieren"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Hintergrund berühren und halten, um Hintergrund, Widgets und Einstellungen zu verwalten"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Hintergrund berühren und halten, um Hintergrund, Widgets und Einstellungen zu verwalten"</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Apps auswählen"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Berühren und halten Sie eine App, um sie zum Startbildschirm hinzuzufügen."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Neue Ordner für Ihre Apps erstellen"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Berühren und halten Sie eine App und verschieben Sie sie dann auf das Symbol einer anderen App."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Hier ist ein Ordner"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Um einen Ordner zu erstellen, berühren und halten Sie eine App und verschieben Sie sie auf eine andere."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Ordner geöffnet, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Ordner durch Berühren schließen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 673f7bf..74322e0 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d επιλεγμένα"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d επιλεγμένα"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Ταπετσαρία %1$d από %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Επιλέχθηκε το <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Διαγραφή"</string>
     <string name="pick_image" msgid="1272073934062909527">"Επιλογή εικόνας"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Ταπετσαρίες"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Σελίδα εφαρμογών %1$d από %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Σελίδα γραφικών στοιχείων %1$d από %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Καλώς ορίσατε!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Νιώστε σαν στο σπίτι σας"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Νιώστε σαν στο σπίτι σας."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Δημιουργία περισσότερων οθονών για εφαρμογές και φακέλους"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Οργανώστε το χώρο σας"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Αγγίξτε παρατεταμένα το φόντο για να διαχειριστείτε την ταπετσαρία, τα γραφικά στοιχεία και τις ρυθμίσεις"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Αγγίξτε παρατεταμένα το φόντο για να διαχειριστείτε την ταπετσαρία, τα γραφικά στοιχεία και τις ρυθμίσεις."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Επιλέξτε ορισμένες εφαρμογές"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Για να προσθέσετε μια εφαρμογή στην αρχική σας οθόνη, αγγίξτε την παρατεταμένα."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Δημιουργήστε νέους φακέλους για τις εφαρμογές σας"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Αγγίξτε παρατεταμένα μια εφαρμογή και, στη συνέχεια, μετακινήστε τη πάνω από κάποιο άλλο εικονίδιο εφαρμογής"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Ορίστε ένας φάκελος"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Για να δημιουργήσετε έναν φάκελο σαν κι αυτόν, πατήστε παρατεταμένα μια εφαρμογή και στη συνέχεια, μετακινήστε τη πάνω σε μια άλλη."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Άνοιγμα φακέλου, <xliff:g id="WIDTH">%1$d</xliff:g> επί <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Αγγίξτε για να κλείσετε τον φάκελο"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index ef27031..316585e 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d selected"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d selected"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Wallpaper %1$d of %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Selected <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Delete"</string>
     <string name="pick_image" msgid="1272073934062909527">"Pick image"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Wallpapers"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps page %1$d of %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgets page %1$d of %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Welcome!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Make yourself at Home"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Make yourself at home."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Create more screens for apps and folders"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organise your space"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Touch &amp; hold background to manage wallpaper, widgets and settings"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Touch &amp; hold background to manage wallpaper, widgets and settings."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Choose some apps"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"To add an app to your Home screen, touch &amp; hold it."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Create new folders for your apps"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Touch &amp; hold an app, then move it on top of another app icon"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Here\'s a folder"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"To create one like this, touch &amp; hold an app, then move it over another."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Folder opened, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Touch to close folder"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
new file mode 100644
index 0000000..316585e
--- /dev/null
+++ b/res/values-en-rIN/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+* Copyright (C) 2008 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+    <string name="home" msgid="7658288663002113681">"Home"</string>
+    <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string>
+    <string name="folder_name" msgid="7371454440695724752"></string>
+    <string name="wallpaper_instructions" msgid="563973358787555519">"Set wallpaper"</string>
+  <plurals name="number_of_items_selected">
+    <item quantity="zero" msgid="7464587177007785408">"%1$d selected"</item>
+    <item quantity="one" msgid="142482526010824029">"%1$d selected"</item>
+    <item quantity="other" msgid="1418352074806573570">"%1$d selected"</item>
+  </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Wallpaper %1$d of %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Selected <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+    <string name="wallpaper_delete" msgid="8095005658756613921">"Delete"</string>
+    <string name="pick_image" msgid="1272073934062909527">"Pick image"</string>
+    <string name="pick_wallpaper" msgid="8179698221502010609">"Wallpapers"</string>
+    <string name="crop_wallpaper" msgid="8334345984491368009">"Crop wallpaper"</string>
+    <string name="activity_not_found" msgid="8071924732094499514">"App isn\'t installed."</string>
+    <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string>
+    <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"Show Mem"</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Touch &amp; hold to pick up a widget."</string>
+    <string name="market" msgid="2619650989819296998">"Shop"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"Couldn\'t drop item on this Home screen."</string>
+    <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Choose widget to create"</string>
+    <string name="rename_folder_label" msgid="3727762225964550653">"Folder name"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"Rename folder"</string>
+    <string name="rename_action" msgid="5559600076028658757">"OK"</string>
+    <string name="cancel_action" msgid="7009134900002915310">"Cancel"</string>
+    <string name="menu_item_add_item" msgid="1264911265836810421">"Add to Home screen"</string>
+    <string name="group_applications" msgid="3797214114206693605">"Apps"</string>
+    <string name="group_shortcuts" msgid="6012256992764410535">"Shortcuts"</string>
+    <string name="group_widgets" msgid="1569030723286851002">"Widgets"</string>
+    <string name="completely_out_of_space" msgid="6106288382070760318">"No more room on your Home screens."</string>
+    <string name="out_of_space" msgid="4691004494942118364">"No more room on this Home screen."</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"No more room on the hot seat."</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"This widget is too large for the hot seat."</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"Shortcut \"<xliff:g id="NAME">%s</xliff:g>\" created."</string>
+    <string name="shortcut_uninstalled" msgid="8176767991305701821">"Shortcut \"<xliff:g id="NAME">%s</xliff:g>\" was removed."</string>
+    <string name="shortcut_duplicate" msgid="9167217446062498127">"Shortcut \"<xliff:g id="NAME">%s</xliff:g>\" already exists."</string>
+    <string name="title_select_shortcut" msgid="6680642571148153868">"Choose shortcut"</string>
+    <string name="title_select_application" msgid="3280812711670683644">"Choose app"</string>
+    <string name="all_apps_button_label" msgid="9110807029020582876">"Apps"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"Home"</string>
+    <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Remove"</string>
+    <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Uninstall"</string>
+    <string name="delete_target_label" msgid="1822697352535677073">"Remove"</string>
+    <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Uninstall"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"App info"</string>
+    <string name="accessibility_search_button" msgid="1628520399424565142">"Search"</string>
+    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Voice Search"</string>
+    <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Apps"</string>
+    <string name="accessibility_delete_button" msgid="6466114477993744621">"Remove"</string>
+    <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Uninstall update"</string>
+    <string name="cab_menu_delete_app" msgid="7435191475867183689">"Uninstall app"</string>
+    <string name="cab_menu_app_info" msgid="8593722221450362342">"App details"</string>
+    <string name="cab_app_selection_text" msgid="374688303047985416">"1 app selected"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 widget selected"</string>
+    <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 folder selected"</string>
+    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 shortcut selected"</string>
+    <string name="permlab_install_shortcut" msgid="5632423390354674437">"install shortcuts"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Allows an app to add shortcuts without user intervention."</string>
+    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"uninstall shortcuts"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Allows the app to remove shortcuts without user intervention."</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"read Home settings and shortcuts"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"Allows the app to read the settings and shortcuts in Home."</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"write Home settings and shortcuts"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"Allows the app to change the settings and shortcuts in Home."</string>
+    <string name="gadget_error_text" msgid="6081085226050792095">"Problem loading widget"</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"This is a system app and can\'t be uninstalled."</string>
+    <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
+    <string name="folder_hint_text" msgid="6617836969016293992">"Unnamed Folder"</string>
+    <string name="workspace_description_format" msgid="2950174241104043327">"Home screen %1$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"Page %1$d of %2$d"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"Home screen %1$d of %2$d"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps page %1$d of %2$d"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgets page %1$d of %2$d"</string>
+    <string name="first_run_cling_title" msgid="7257389003637362144">"Welcome!"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Make yourself at home."</string>
+    <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+    <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Create more screens for apps and folders"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"Organise your space"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Touch &amp; hold background to manage wallpaper, widgets and settings."</string>
+    <string name="all_apps_cling_title" msgid="34929250753095858">"Choose some apps"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"To add an app to your Home screen, touch &amp; hold it."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Here\'s a folder"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"To create one like this, touch &amp; hold an app, then move it over another."</string>
+    <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
+    <string name="folder_opened" msgid="94695026776264709">"Folder opened, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1884479294466410023">"Touch to close folder"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"Touch to save rename"</string>
+    <string name="folder_closed" msgid="4100806530910930934">"Folder closed"</string>
+    <string name="folder_renamed" msgid="1794088362165669656">"Folder renamed to <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="6629239338071103179">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+    <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+    <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+    <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+    <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
+    <string name="wallpaper_button_text" msgid="8404103075899945851">"Wallpapers"</string>
+    <string name="settings_button_text" msgid="8119458837558863227">"Settings"</string>
+</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 7346215..c9a44a9 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -20,7 +20,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
-    <string name="home" msgid="7658288663002113681">"Página principal"</string>
+    <string name="home" msgid="7658288663002113681">"Pantalla principal"</string>
     <string name="uid_name" msgid="7820867637514617527">"Aplicaciones básicas de Android"</string>
     <string name="folder_name" msgid="7371454440695724752"></string>
     <string name="wallpaper_instructions" msgid="563973358787555519">"Establecer como fondo de pantalla"</string>
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d seleccionado"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d seleccionados"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fondo de pantalla %1$d de %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> seleccionado"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Eliminar"</string>
     <string name="pick_image" msgid="1272073934062909527">"Elegir imagen"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Fondos de pantalla"</string>
@@ -39,7 +41,7 @@
     <string name="toggle_weight_watcher" msgid="5645299835184636119">"Mostrar memoria"</string>
     <string name="long_press_widget_to_add" msgid="7699152356777458215">"Mantén presionado el widget que desees elegir."</string>
     <string name="market" msgid="2619650989819296998">"Comprar"</string>
-    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d x %2$d"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
     <string name="external_drop_widget_error" msgid="3165821058322217155">"Error al soltar elemento en la pantalla principal"</string>
     <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Elegir los widgets para crear"</string>
     <string name="rename_folder_label" msgid="3727762225964550653">"Nombre de carpeta"</string>
@@ -60,7 +62,7 @@
     <string name="title_select_shortcut" msgid="6680642571148153868">"Elegir acceso directo"</string>
     <string name="title_select_application" msgid="3280812711670683644">"Elegir aplicación"</string>
     <string name="all_apps_button_label" msgid="9110807029020582876">"Aplicaciones"</string>
-    <string name="all_apps_home_button_label" msgid="252062713717058851">"Inicio"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"Pantalla principal"</string>
     <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Eliminar"</string>
     <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Desinstalar"</string>
     <string name="delete_target_label" msgid="1822697352535677073">"Eliminar"</string>
@@ -81,10 +83,10 @@
     <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite que una aplicación agregue accesos directos sin que el usuario intervenga."</string>
     <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"desinstalar accesos directos"</string>
     <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Permite que la aplicación elimine accesos directos sin que el usuario intervenga."</string>
-    <string name="permlab_read_settings" msgid="1941457408239617576">"leer configuración y accesos directos de la página principal"</string>
-    <string name="permdesc_read_settings" msgid="5833423719057558387">"Permite que la aplicación lea la configuración y los accesos directos de la página principal."</string>
-    <string name="permlab_write_settings" msgid="3574213698004620587">"escribir configuración y accesos directos de la página principal"</string>
-    <string name="permdesc_write_settings" msgid="5440712911516509985">"Permite que la aplicación cambie la configuración y los accesos directos de la página principal."</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"leer configuración y accesos directos de la pantalla principal"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"Permite que la aplicación lea la configuración y los accesos directos de la pantalla principal."</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"escribir configuración y accesos directos de la pantalla principal"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"Permite que la aplicación cambie la configuración y los accesos directos de la pantalla principal."</string>
     <string name="gadget_error_text" msgid="6081085226050792095">"Problema al cargar el widget"</string>
     <string name="uninstall_system_app_text" msgid="4172046090762920660">"Esta es una aplicación del sistema y no se puede desinstalar."</string>
     <string name="dream_name" msgid="1530253749244328964">"Lanzacohetes"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Página de aplicaciones %1$d de %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Página de widgets %1$d de %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"¡Bienvenido/a!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Siéntete como en casa"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Siéntete como en casa."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crea más pantallas para aplicaciones y carpetas."</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organiza tu espacio"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Mantén presionado el fondo para administrar el fondo de pantalla, los widgets y la configuración."</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Mantén presionado el fondo para administrar el fondo de pantalla, los widgets y la configuración."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Elige algunas aplicaciones"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Para agregar una aplicación a tu pantalla principal, mantenla presionada."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Crea nuevas carpetas para tus aplicaciones"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Toca la aplicación y, sin levantar el dedo, colócala encima del ícono de otra aplicación."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Aquí tienes una carpeta"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Para crear una carpeta como esta, mantén presionada una aplicación y luego muévela sobre otra."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"Aceptar"</string>
     <string name="folder_opened" msgid="94695026776264709">"Carpeta abierta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Toca para cerrar la carpeta."</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 96d6d58..193e096 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Seleccionados: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Seleccionados: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fondo de pantalla %1$d de %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> seleccionado"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Eliminar"</string>
     <string name="pick_image" msgid="1272073934062909527">"Seleccionar imagen"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Fondos de pantalla"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Página de aplicaciones %1$d de %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Página de widgets %1$d de %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Te damos la bienvenida"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Personaliza la pantalla de inicio"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Personaliza tu pantalla de inicio."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crea más pantallas para aplicaciones y carpetas"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organiza tu espacio"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Mantén pulsado el fondo para administrar el fondo de pantalla, los widgets y los ajustes"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Mantén pulsado el fondo para gestionar el fondo de pantalla, los widgets y los ajustes."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Selecciona algunas aplicaciones"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Para añadir una aplicación a tu pantalla de inicio, solo tienes que mantenerla pulsada."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Crea nuevas carpetas para tus aplicaciones"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Mantén pulsada la aplicación y colócala sobre el icono de otra aplicación"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Esto es una carpeta"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Para crear una carpeta como esta, mantén pulsada una aplicación y muévela sobre otra."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"Aceptar"</string>
     <string name="folder_opened" msgid="94695026776264709">"Carpeta abierta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Toca para cerrar la carpeta"</string>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index fdba5e6c..f026b08 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Valitud on %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Valitud on %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d/%2$d taustapildist"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Valitud on <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Kustuta"</string>
     <string name="pick_image" msgid="1272073934062909527">"Vali kujutis"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Taustapildid"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Rakenduste leht %1$d/%2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Vidinate leht %1$d/%2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Tere tulemast!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Tundke end nagu kodus"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Tundke end nagu kodus."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Looge rakenduste ja kaustade jaoks rohkem ekraanikuvasid"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Korraldage oma ruumi"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Taustapildi, vidinate ja seadete haldamiseks puudutage tausta ning hoidke seda all"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Taustapildi, vidinate ja seadete haldamiseks puudutage tausta ning hoidke seda all."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Valige mõned rakendused"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Rakenduse lisamiseks avaekraanile vajutage ja hoidke seda all."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Rakenduste jaoks uute kaustade loomine"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Puudutage rakendust ja hoidke seda all, seejärel liigutage see teise rakenduse ikooni peale"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Siin on kaust"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Sarnase loomiseks vajutage ja hoidke rakendust all, seejärel viige see teise peale."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Kaust on avatud, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Puudutage kausta sulgemiseks"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 978c201..3a0d0b8 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d انتخاب شد"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d انتخاب شد"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"کاغذ دیواری %1$d از %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> انتخاب شده"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"حذف"</string>
     <string name="pick_image" msgid="1272073934062909527">"انتخاب تصویر"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"کاغذدیواری‌ها"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"صفحه برنامه‌ها %1$d از %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"صفحه ابزارک‌ها %1$d از %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"خوش آمدید!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"راحت باشید"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"راحت باشید."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"صفحات بیشتری را برای برنامه‌ها و پوشه‌ها ایجاد کنید"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"فضای خود را سازماندهی کنید"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"برای مدیریت کاغذدیواری‌ها، ابزارک‌ها و تنظیمات، پس‌زمینه را لمس کنید و نگه‌دارید"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"برای مدیریت کاغذدیواری، ابزارک‌ها و تنظیمات، پس‌زمینه را لمس کرده و نگه‌دارید."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"چند برنامه انتخاب کنید"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"اگر می‌خواهید برنامه‌ای را به صفحه اصلی خود اضافه کنید، آن را لمس کرده، نگه‌دارید."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"ایجاد پوشه‌های جدید برای برنامه‌هایتان"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"برنامه‌ای را لمس کرده، نگه‌دارید، سپس آن را به بالای نماد برنامه‌ای دیگر حرکت دهید"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"اینجا یک پوشه است"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"برای ایجاد پوشه‌ای مثل این، یک برنامه را لمس کرده و نگه‌دارید، سپس آن را روی برنامه دیگر بیاندازید."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"تأیید"</string>
     <string name="folder_opened" msgid="94695026776264709">"پوشه باز شده، <xliff:g id="WIDTH">%1$d</xliff:g> در <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"برای بستن پوشه لمس کنید"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 750fd50..d327250 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d valittu"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d valittu"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Taustakuva %1$d/%2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Valittu: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Poista"</string>
     <string name="pick_image" msgid="1272073934062909527">"Valitse kuva"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Taustakuvat"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Apps-sivu %1$d / %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgetit-sivu %1$d / %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Tervetuloa!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Ole kuin kotonasi"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Ole kuin kotonasi."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Luo lisää ruutuja sovelluksille ja kansioille"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Järjestä tilasi"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Hallitse taustakuvaa, widgetejä ja asetuksia koskettamalla taustakuvaa pitkään"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Hallitse taustakuvaa, widgetejä ja asetuksia koskettamalla taustaa pitkään."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Valitse joitakin sovelluksia"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Voit lisätä sovelluksen aloitusruutuun koskettamalla sitä pitkään."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Luo uusia kansioita sovelluksillesi"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Kosketa sovellusta pitkään ja siirrä se sitten toisen sovelluskuvakkeen päälle"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Tässä on kansio"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Luo se seuraavasti: kosketa sovellusta pitkään ja siirrä se sitten toisen päälle."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Kansio avattu, koko <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Sulje kansio koskettamalla"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..9d8dbeb
--- /dev/null
+++ b/res/values-fr-rCA/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+* Copyright (C) 2008 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name" msgid="5181331383435256801">"Lanceur3"</string>
+    <string name="home" msgid="7658288663002113681">"Accueil"</string>
+    <string name="uid_name" msgid="7820867637514617527">"Applications de base Android"</string>
+    <string name="folder_name" msgid="7371454440695724752"></string>
+    <string name="wallpaper_instructions" msgid="563973358787555519">"Définir le fond d\'écran"</string>
+  <plurals name="number_of_items_selected">
+    <item quantity="zero" msgid="7464587177007785408">"%1$d sélectionné"</item>
+    <item quantity="one" msgid="142482526010824029">"%1$d sélectionné"</item>
+    <item quantity="other" msgid="1418352074806573570">"%1$d sélectionné(s)"</item>
+  </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fond d\'écran %1$d sur %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Sélection : <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+    <string name="wallpaper_delete" msgid="8095005658756613921">"Supprimer"</string>
+    <string name="pick_image" msgid="1272073934062909527">"Sélectionner une image"</string>
+    <string name="pick_wallpaper" msgid="8179698221502010609">"Fonds d\'écran"</string>
+    <string name="crop_wallpaper" msgid="8334345984491368009">"Rogner le fond d\'écran"</string>
+    <string name="activity_not_found" msgid="8071924732094499514">"L\'application n\'est pas installée."</string>
+    <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string>
+    <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"Afficher la mémoire"</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Maintenez un doigt sur le widget pour l\'ajouter."</string>
+    <string name="market" msgid="2619650989819296998">"Magasiner"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"Imposs. de déposer l\'élément sur l\'écran d\'accueil"</string>
+    <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Sélectionnez le widget à créer"</string>
+    <string name="rename_folder_label" msgid="3727762225964550653">"Nom du dossier"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"Renommer le dossier"</string>
+    <string name="rename_action" msgid="5559600076028658757">"OK"</string>
+    <string name="cancel_action" msgid="7009134900002915310">"Annuler"</string>
+    <string name="menu_item_add_item" msgid="1264911265836810421">"Ajouter à l\'écran d\'accueil"</string>
+    <string name="group_applications" msgid="3797214114206693605">"Applications"</string>
+    <string name="group_shortcuts" msgid="6012256992764410535">"Raccourcis"</string>
+    <string name="group_widgets" msgid="1569030723286851002">"Widgets"</string>
+    <string name="completely_out_of_space" msgid="6106288382070760318">"Vous n\'avez plus d\'espace libre sur vos écrans d\'accueil."</string>
+    <string name="out_of_space" msgid="4691004494942118364">"Pas d\'espace libre sur l\'écran d\'accueil."</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"Vous n\'avez plus de place sur la barre d\'accès rapide."</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"Ce widget est trop volumineux pour la barre d\'accès rapide."</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"Le raccourci « <xliff:g id="NAME">%s</xliff:g> » a été créé."</string>
+    <string name="shortcut_uninstalled" msgid="8176767991305701821">"Le raccourci « <xliff:g id="NAME">%s</xliff:g> » a été supprimé."</string>
+    <string name="shortcut_duplicate" msgid="9167217446062498127">"Le raccourci « <xliff:g id="NAME">%s</xliff:g> » existe déjà."</string>
+    <string name="title_select_shortcut" msgid="6680642571148153868">"Sélectionner un raccourci"</string>
+    <string name="title_select_application" msgid="3280812711670683644">"Sélectionner une application"</string>
+    <string name="all_apps_button_label" msgid="9110807029020582876">"Applications"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"Accueil"</string>
+    <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Supprimer"</string>
+    <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Désinstaller"</string>
+    <string name="delete_target_label" msgid="1822697352535677073">"Supprimer"</string>
+    <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Désinstaller"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"Détails de l\'application"</string>
+    <string name="accessibility_search_button" msgid="1628520399424565142">"Rechercher"</string>
+    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Recherche vocale"</string>
+    <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Applications"</string>
+    <string name="accessibility_delete_button" msgid="6466114477993744621">"Supprimer"</string>
+    <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Désinstaller la mise à jour"</string>
+    <string name="cab_menu_delete_app" msgid="7435191475867183689">"Désinstaller l\'application"</string>
+    <string name="cab_menu_app_info" msgid="8593722221450362342">"Détails de l\'application"</string>
+    <string name="cab_app_selection_text" msgid="374688303047985416">"1 application sélectionnée"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 widget sélectionné"</string>
+    <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 dossier sélectionné"</string>
+    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 raccourci sélectionné"</string>
+    <string name="permlab_install_shortcut" msgid="5632423390354674437">"installer des raccourcis"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permet à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur."</string>
+    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"désinstaller des raccourcis"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Permet à l\'application de supprimer des raccourcis sans l\'intervention de l\'utilisateur."</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"lire les paramètres et les raccourcis de la page d\'accueil"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"Permet à l\'application de lire les paramètres et les raccourcis de l\'écran d\'accueil."</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"enregistrer les paramètres de la page d\'accueil et des raccourcis"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"Permet à l\'application de modifier les paramètres et les raccourcis de l\'écran d\'accueil."</string>
+    <string name="gadget_error_text" msgid="6081085226050792095">"Problème lors du chargement du widget"</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"Impossible de désinstaller cette application, car il s\'agit d\'une application système."</string>
+    <string name="dream_name" msgid="1530253749244328964">"Lance-missile"</string>
+    <string name="folder_hint_text" msgid="6617836969016293992">"Dossier sans nom"</string>
+    <string name="workspace_description_format" msgid="2950174241104043327">"Écran d\'accueil %1$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"Page %1$d sur %2$d"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"Écran d\'accueil %1$d sur %2$d"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Page des applications : %1$d sur %2$d"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Page des widgets : %1$d sur %2$d"</string>
+    <string name="first_run_cling_title" msgid="7257389003637362144">"Bienvenue!"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Faites comme chez vous."</string>
+    <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+    <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Créer plus d\'écrans pour les applications et les dossiers"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"Organiser son espace personnel"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Maintenez votre doigt sur l\'arrière-plan pour gérer les fonds d\'écran, les widgets et les paramètres."</string>
+    <string name="all_apps_cling_title" msgid="34929250753095858">"Sélectionner des applications"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Pour ajouter une application à votre écran d\'accueil, maintenez votre doigt dessus."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Voici un dossier"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Pour créer un dossier comme ça, maintenez votre doigt sur une application, puis déplacez-la sur une autre."</string>
+    <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
+    <string name="folder_opened" msgid="94695026776264709">"Dossier ouvert, <xliff:g id="WIDTH">%1$d</xliff:g> par <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1884479294466410023">"Toucher pour fermer le dossier"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"Toucher pour enregistrer le nouveau nom"</string>
+    <string name="folder_closed" msgid="4100806530910930934">"Dossier fermé"</string>
+    <string name="folder_renamed" msgid="1794088362165669656">"Nouveau nom du dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="6629239338071103179">"Dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+    <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+    <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+    <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+    <string name="widget_button_text" msgid="2880537293434387943">"Widgets"</string>
+    <string name="wallpaper_button_text" msgid="8404103075899945851">"Fonds d\'écran"</string>
+    <string name="settings_button_text" msgid="8119458837558863227">"Paramètres"</string>
+</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a6c75be..b1b0a79 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d fond d\'écran sélectionné"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d fonds d\'écran sélectionnés"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Fond d\'écran %1$d sur %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> est sélectionné."</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Supprimer"</string>
     <string name="pick_image" msgid="1272073934062909527">"Sélectionner une image"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Fonds d\'écran"</string>
@@ -37,10 +39,10 @@
     <string name="widgets_tab_label" msgid="2921133187116603919">"Widgets"</string>
     <string name="widget_adder" msgid="3201040140710381657">"Widgets"</string>
     <string name="toggle_weight_watcher" msgid="5645299835184636119">"Afficher la mémoire"</string>
-    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Appuyez manière prolongée pour sélectionner widget."</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"App. de manière prolongée pour sélectionner widget."</string>
     <string name="market" msgid="2619650989819296998">"Boutique"</string>
     <string name="widget_dims_format" msgid="2370757736025621599">"%1$d x %2$d"</string>
-    <string name="external_drop_widget_error" msgid="3165821058322217155">"Impossible de déposer l\'élément sur écran d\'accueil."</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"Impossible de déposer élément sur écran d\'accueil."</string>
     <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Sélectionner le widget à créer"</string>
     <string name="rename_folder_label" msgid="3727762225964550653">"Nom du dossier"</string>
     <string name="rename_folder_title" msgid="3771389277707820891">"Renommer le dossier"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Page des applications %1$d sur %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Page des widgets %1$d sur %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Bienvenue !"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Se familiariser avec l\'écran d\'accueil"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Familiarisez-vous avec l\'écran d\'accueil."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
-    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Créer plus d\'écrans pour les applications et les dossiers"</string>
-    <string name="workspace_cling_title" msgid="5626202359865825661">"Organiser son espace"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Appuyez de manière prolongée sur l\'arrière-plan pour gérer les fonds d\'écran, les widgets et les paramètres."</string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Créez des écrans personnalisés pour vos applis et dossiers"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"Organisez votre espace"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Appuyez de manière prolongée sur l\'arrière-plan pour gérer les fonds d\'écran, les widgets et les paramètres."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Sélectionner des applications"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Pour ajouter une application à votre écran d\'accueil, appuyez dessus de manière prolongée."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Créer des dossiers pour vos applications"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Appuyez de manière prolongée sur l\'icône d\'une application, puis déplacez-la sur une autre icône d\'application."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Voici un dossier"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Pour en créer un, appuyez de manière prolongée sur une application, puis déplacez-la vers une autre."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Dossier ouvert, <xliff:g id="WIDTH">%1$d</xliff:g> par <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Appuyez pour fermer le dossier."</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 9dbf4d9..eddd75c 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d चयनित"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d चयनित"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"वॉलपेपर %2$d में से %1$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"चयनित <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"हटाएं"</string>
     <string name="pick_image" msgid="1272073934062909527">"चित्र चुनें"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"वॉलपेपर"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"एप्लिकेशन पृष्ठ %2$d में से %1$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"विजेट पृष्ठ %2$d में से %1$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"स्वागत है!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"जैसा चाहें वैसा उपयोग करें"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"जैसा चाहें वैसा उपयोग करें."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"एप्लिकेशन और फ़ोल्डर के लिए और अधिक स्क्रीन बनाएं"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"अपने स्थान को व्यवस्थित करें"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"वॉलपेपर, विजेट और सेटिंग प्रबंधित करने के लिए पृष्ठभूमि को स्पर्श करके रखें"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"वॉलपेपर, विजेट और सेटिंग प्रबंधित करने के लिए पृष्ठभूमि को स्पर्श करके रखें."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"कुछ एप्लिकेशन चुनें"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"किसी एप्लिकेशन को अपनी होम स्‍क्रीन से जोड़ने के लिए, उसे स्‍पर्श करके रखें."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"अपने एप्लिकेशन के लिए नए फ़ोल्डर बनाएं"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"एक एप्लिकेशन को स्पर्श करके रखें, फिर उसे किसी दूसरे एप्लिकेशन आइकन के शीर्ष पर ले जाएं"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"यहां एक फ़ोल्डर है"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"इसके जैसा कोई एक बनाने के लिए, किसी एप्लिकेशन को स्पर्श करके रखें, फिर इसे किसी दूसरे पर ले जाएं."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"ठीक"</string>
     <string name="folder_opened" msgid="94695026776264709">"फ़ोल्डर खोला गया, <xliff:g id="WIDTH">%1$d</xliff:g> गुणा <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"फ़ोल्‍डर बंद करने के लिए स्‍पर्श करें"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index a3f7fe2..783946d 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Odabrano: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Odabrano: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d. pozadinska slika od %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Odabrana je stavka <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Izbriši"</string>
     <string name="pick_image" msgid="1272073934062909527">"Odaberi sliku"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Pozadinske slike"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Stranica aplikacija %1$d od %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Stranica widgeta %1$d od %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Dobro došli!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Osjećajte se kao kod kuće"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Osjećajte se kao kod kuće."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Izradite više zaslona za aplikacije i mape"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organizirajte svoj prostor"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Dodirnite i zadržite pozadinu da biste upravljali pozadinskom slikom, widgetima i postavkama"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Dodirnite i držite pozadinu da biste upravljali pozadinskom slikom, widgetima i postavkama."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Odaberite neke aplikacije"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Da biste dodali aplikaciju na početni zaslon, dodirnite je i zadržite."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Izradite nove mape za svoje aplikacije"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Dodirnite i zadržite aplikaciju pa je premjestite na ikonu neke druge aplikacije"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Evo mape"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Da biste izradili ovakvu mapu, dodirnite i držite aplikaciju pa je pomaknite preko druge aplikacije."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"U redu"</string>
     <string name="folder_opened" msgid="94695026776264709">"Mapa je otvorena, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Dodirnite da biste zatvorili mapu"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index d5f41af..8876652 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d kiválasztva"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d kiválasztva"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%2$d/%1$d. háttérkép"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> kiválasztva"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Törlés"</string>
     <string name="pick_image" msgid="1272073934062909527">"Kép választása"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Háttérképek"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%2$d/%1$d. alkalmazásoldal"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%2$d/%1$d. moduloldal"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Üdvözöljük!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Szabja személyre készülékét"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Varázsolja egyedivé készülékét."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Hozzon létre további képernyőket az alkalmazásoknak és mappáknak"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Munkaterület rendezése"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Érintse meg a hátteret, és tartsa lenyomva a háttérkép, modulok és beállítások kezeléséhez."</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Érintse meg és tartsa lenyomva a hátteret a háttérkép, modulok és beállítások kezeléséhez."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Válasszon ki néhány alkalmazást"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ha egy alkalmazást szeretne elhelyezni a kezdőképernyőn, érintse meg, és tartsa lenyomva."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Hozzon létre új mappákat az alkalmazásoknak"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Érintse meg és tartsa lenyomva az alkalmazást, majd mozgassa azt egy másik alkalmazásikon tetejére."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Itt egy mappa"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Mappa létrehozásához érintse meg és tartsa lenyomva az alkalmazást, majd húzza egy másik fölé."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Mappa megnyitva – szélesség: <xliff:g id="WIDTH">%1$d</xliff:g>; magasság: <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Érintse meg a mappa bezárásához"</string>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..ab7388a
--- /dev/null
+++ b/res/values-hy-rAM/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+* Copyright (C) 2008 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+    <string name="home" msgid="7658288663002113681">"Հիմնական"</string>
+    <string name="uid_name" msgid="7820867637514617527">"Android Core Apps"</string>
+    <string name="folder_name" msgid="7371454440695724752"></string>
+    <string name="wallpaper_instructions" msgid="563973358787555519">"Սահմանել պաստառը"</string>
+  <plurals name="number_of_items_selected">
+    <item quantity="zero" msgid="7464587177007785408">"%1$d ընտրված"</item>
+    <item quantity="one" msgid="142482526010824029">"%1$d ընտրված"</item>
+    <item quantity="other" msgid="1418352074806573570">"%1$d ընտրված"</item>
+  </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d պաստառ՝ %2$d-ից"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Ընտրված է <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+    <string name="wallpaper_delete" msgid="8095005658756613921">"Ջնջել"</string>
+    <string name="pick_image" msgid="1272073934062909527">"Ընտրել պատկեր"</string>
+    <string name="pick_wallpaper" msgid="8179698221502010609">"Պաստառներ"</string>
+    <string name="crop_wallpaper" msgid="8334345984491368009">"Եզրատել պաստառը"</string>
+    <string name="activity_not_found" msgid="8071924732094499514">"Ծրագիրը տեղադրված չէ:"</string>
+    <string name="widgets_tab_label" msgid="2921133187116603919">"Վիջեթներ"</string>
+    <string name="widget_adder" msgid="3201040140710381657">"Վիջեթներ"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"Ցուցադրել մեմը"</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Հպեք և պահեք՝ վիջեթն ընտրելու համար:"</string>
+    <string name="market" msgid="2619650989819296998">"Խանութ"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"Հնարավոր չէ տեղադրել տարրն այս հիմնական էկրանին:"</string>
+    <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Ստեղծելու համար ընտրեք վիջեթը"</string>
+    <string name="rename_folder_label" msgid="3727762225964550653">"Թղթապանակի անունը"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"Վերանվանել թղթապանակը"</string>
+    <string name="rename_action" msgid="5559600076028658757">"Լավ"</string>
+    <string name="cancel_action" msgid="7009134900002915310">"Չեղարկել"</string>
+    <string name="menu_item_add_item" msgid="1264911265836810421">"Ավելացնել հիմնական էկրանին"</string>
+    <string name="group_applications" msgid="3797214114206693605">"Ծրագրեր"</string>
+    <string name="group_shortcuts" msgid="6012256992764410535">"Դյուրանցումներ"</string>
+    <string name="group_widgets" msgid="1569030723286851002">"Վիջեթներ"</string>
+    <string name="completely_out_of_space" msgid="6106288382070760318">"Այլևս տեղ չկա ձեր հիմնական էկրաններին:"</string>
+    <string name="out_of_space" msgid="4691004494942118364">"Այլևս տեղ չկա այս հիմնական էկրանին:"</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"Թեժ նստատեղերում այլևս տեղ չկա:"</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"Այս վիջեթը չափազանց մեծ է թեժ նստատեղերի համար:"</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"«<xliff:g id="NAME">%s</xliff:g>» դյուրանցումը ստեղծված է:"</string>
+    <string name="shortcut_uninstalled" msgid="8176767991305701821">"«<xliff:g id="NAME">%s</xliff:g>» դյուրանցումը հեռացվեց:"</string>
+    <string name="shortcut_duplicate" msgid="9167217446062498127">"«<xliff:g id="NAME">%s</xliff:g>» դյուրանցումն արդեն գոյություն ունի:"</string>
+    <string name="title_select_shortcut" msgid="6680642571148153868">"Ընտրել դյուրանցումը"</string>
+    <string name="title_select_application" msgid="3280812711670683644">"Ընտրել ծրագիրը"</string>
+    <string name="all_apps_button_label" msgid="9110807029020582876">"Ծրագրեր"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"Հիմնական"</string>
+    <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Հեռացնել"</string>
+    <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Ապատեղադրել"</string>
+    <string name="delete_target_label" msgid="1822697352535677073">"Հեռացնել"</string>
+    <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Ապատեղադրել"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"Ծրագրի տեղեկություններ"</string>
+    <string name="accessibility_search_button" msgid="1628520399424565142">"Որոնել"</string>
+    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Ձայնային որոնում"</string>
+    <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Ծրագրեր"</string>
+    <string name="accessibility_delete_button" msgid="6466114477993744621">"Հեռացնել"</string>
+    <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Ապատեղադրել թարմացումը"</string>
+    <string name="cab_menu_delete_app" msgid="7435191475867183689">"Ապատեղադրել ծրագիրը"</string>
+    <string name="cab_menu_app_info" msgid="8593722221450362342">"Ծրագրի մանրամասներ"</string>
+    <string name="cab_app_selection_text" msgid="374688303047985416">"1 ընտրված ծրագիր"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 ընտրված վիջեթ"</string>
+    <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 ընտրված թղթապանակ"</string>
+    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 ընտրված դյուրանցում"</string>
+    <string name="permlab_install_shortcut" msgid="5632423390354674437">"տեղադրել դյուրանցումներ"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Ծրագրին թույլ է տալիս ավելացնել դյուրանցումներ՝ առանց օգտագործողի միջամտության:"</string>
+    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"ապատեղադրել դյուրանցումները"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Ծրագրին թույլ է տալիս հեռացնել դյուրանցումներ՝ առանց օգտագործողի միջամտության:"</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"կարդալ հիմնաէջի կարգավորումներն ու դյուրանցումները"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"Ծրագրին թույլ է տալիս կարդալ հիմնաէջի կարգավորումներն ու դյուրանցումները:"</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"ստեղծել հիմնաէջի կարգավորումներ ու դյուրանցումներ"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"Ծրագրին թույլ է տալիս փոփոխել հիմնաէջի կարգավորումներն ու դյուրանցումները:"</string>
+    <string name="gadget_error_text" msgid="6081085226050792095">"Վիջեթի բեռնման խնդիր կա"</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"Սա համակարգային ծրագիր է և չի կարող ապատեղադրվել:"</string>
+    <string name="dream_name" msgid="1530253749244328964">"Հրթիռային թողարկիչ"</string>
+    <string name="folder_hint_text" msgid="6617836969016293992">"Անանուն թղթապանակ"</string>
+    <string name="workspace_description_format" msgid="2950174241104043327">"Հիմնական էկրան %1$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"Էջ %1$d՝ %2$d-ից"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"Հիմնական էկրան %1$d` %2$d-ից"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Ծրագրերի էջերը՝ %1$d %2$d-ից"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Վիջեթների էջերը՝ %1$d %2$d-ից"</string>
+    <string name="first_run_cling_title" msgid="7257389003637362144">"Բարի գալուստ:"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Զգացեք ձեզ ինչպես տանը:"</string>
+    <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+    <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Ստեղծեք նոր էկրաններ ծրագրերի և թղթապանակների համար"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"Կառավարեք ձեր տարածությունը"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Հպեք և պահեք հետնաշերտի վրա՝ պաստառները, վիջեթներն ու կարգավորումները կառավարելու համար:"</string>
+    <string name="all_apps_cling_title" msgid="34929250753095858">"Ընտրեք ինչ-որ ծրագիր"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ձեր հիմնական էկրանին ծրագիր ավելացնելու համար հպեք և պահեք այն:"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Ահա մի թղթապանակ"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Նման թղթապանակ ստեղծելու համար հպեք և պահեք որևէ ծրագրի վրա, ապա տեղաշարժեք այն մեկ ուրիշ ծրագրի վրա:"</string>
+    <string name="cling_dismiss" msgid="8962359497601507581">"Լավ"</string>
+    <string name="folder_opened" msgid="94695026776264709">"Թղթապանակը բաց է, <xliff:g id="WIDTH">%1$d</xliff:g>-ից <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1884479294466410023">"Հպեք՝ թղթապանակը փակելու համար"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"Հպեք՝ վերանվանումը պահելու համար"</string>
+    <string name="folder_closed" msgid="4100806530910930934">"Թղթապանակը փակ է"</string>
+    <string name="folder_renamed" msgid="1794088362165669656">"Թղթապանակը վերանվանվեց <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="6629239338071103179">"Թղթապանակ՝ <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+    <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+    <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+    <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+    <string name="widget_button_text" msgid="2880537293434387943">"Վիջեթներ"</string>
+    <string name="wallpaper_button_text" msgid="8404103075899945851">"Պաստառներ"</string>
+    <string name="settings_button_text" msgid="8119458837558863227">"Կարգավորումներ"</string>
+</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 3dc7be1..e1e93f7 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d dipilih"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d dipilih"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Wallpaper %1$d dari %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> terpilih"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Hapus"</string>
     <string name="pick_image" msgid="1272073934062909527">"Pilih gambar"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Wallpaper"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Laman aplikasi %1$d dari %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Laman widget %1$d dari %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Selamat datang!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Serasa di rumah sendiri"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Serasa di rumah sendiri."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Buat lebih banyak layar untuk aplikasi dan folder"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Kelola ruang Anda"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Sentuh lama latar belakang untuk mengelola wallpaper, widget, dan setelan"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Sentuh lama latar belakang untuk mengelola wallpaper, widget, dan setelan."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Pilih beberapa aplikasi"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Untuk menambah aplikasi ke layar Utama Anda, sentuh lama aplikasi tersebut."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Buat folder baru untuk aplikasi Anda"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Sentuh lama suatu aplikasi, lalu tumpukkan ke ikon aplikasi lain"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Ini adalah folder"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Untuk membuat seperti yang ini, sentuh lama aplikasi, lalu pindahkan ke atas aplikasi lain."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"Oke"</string>
     <string name="folder_opened" msgid="94695026776264709">"Folder dibuka, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Sentuh untuk menutup folder"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 7c27b74..d5ada8f 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -29,11 +29,13 @@
     <item quantity="one" msgid="142482526010824029">"%1$d selezionato"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d selezionati"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Sfondo %1$d di %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Elemento selezionato: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Elimina"</string>
     <string name="pick_image" msgid="1272073934062909527">"Scegli immagine"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Sfondi"</string>
     <string name="crop_wallpaper" msgid="8334345984491368009">"Ritaglia sfondo"</string>
-    <string name="activity_not_found" msgid="8071924732094499514">"Applicazione non installata."</string>
+    <string name="activity_not_found" msgid="8071924732094499514">"App non installata."</string>
     <string name="widgets_tab_label" msgid="2921133187116603919">"Widget"</string>
     <string name="widget_adder" msgid="3201040140710381657">"Widget"</string>
     <string name="toggle_weight_watcher" msgid="5645299835184636119">"Mostra Mem"</string>
@@ -58,22 +60,22 @@
     <string name="shortcut_uninstalled" msgid="8176767991305701821">"La scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" è stata rimossa."</string>
     <string name="shortcut_duplicate" msgid="9167217446062498127">"Scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" già presente."</string>
     <string name="title_select_shortcut" msgid="6680642571148153868">"Scegli scorciatoia"</string>
-    <string name="title_select_application" msgid="3280812711670683644">"Scegli applicazione"</string>
+    <string name="title_select_application" msgid="3280812711670683644">"Scegli app"</string>
     <string name="all_apps_button_label" msgid="9110807029020582876">"App"</string>
     <string name="all_apps_home_button_label" msgid="252062713717058851">"Home page"</string>
     <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Rimuovi"</string>
     <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Disinstalla"</string>
     <string name="delete_target_label" msgid="1822697352535677073">"Rimuovi"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Disinstalla"</string>
-    <string name="info_target_label" msgid="8053346143994679532">"Informazioni applicazione"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"Informazioni app"</string>
     <string name="accessibility_search_button" msgid="1628520399424565142">"Cerca"</string>
     <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Ricerca vocale"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"App"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Rimuovi"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Disinstalla aggiornamento"</string>
-    <string name="cab_menu_delete_app" msgid="7435191475867183689">"Disinstalla applicazione"</string>
+    <string name="cab_menu_delete_app" msgid="7435191475867183689">"Disinstalla app"</string>
     <string name="cab_menu_app_info" msgid="8593722221450362342">"Dettagli sull\'app"</string>
-    <string name="cab_app_selection_text" msgid="374688303047985416">"1 applicazione selezionata"</string>
+    <string name="cab_app_selection_text" msgid="374688303047985416">"1 app selezionata"</string>
     <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 widget selezionato"</string>
     <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 cartella selezionata"</string>
     <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 scorciatoia selezionata"</string>
@@ -86,7 +88,7 @@
     <string name="permlab_write_settings" msgid="3574213698004620587">"creazione di impostazioni e scorciatoie in Home"</string>
     <string name="permdesc_write_settings" msgid="5440712911516509985">"Consente all\'app di modificare le impostazioni e le scorciatoie in Home."</string>
     <string name="gadget_error_text" msgid="6081085226050792095">"Errore durante il caricamento del widget"</string>
-    <string name="uninstall_system_app_text" msgid="4172046090762920660">"Questa è un\'applicazione di sistema e non può essere disinstallata."</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"Questa è un\'app di sistema e non può essere disinstallata."</string>
     <string name="dream_name" msgid="1530253749244328964">"Lanciamissili"</string>
     <string name="folder_hint_text" msgid="6617836969016293992">"Cartella senza nome"</string>
     <string name="workspace_description_format" msgid="2950174241104043327">"Schermata Home %1$d"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Pagina di applicazioni %1$d di %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Pagina di widget %1$d di %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Benvenuto!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Personalizza la schermata Home"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Personalizza la schermata Home."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Creare più schermate per app e cartelle"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organizza il tuo spazio"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Tocca e tieni premuto lo sfondo per gestire sfondi, widget e impostazioni"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Tocca e tieni premuto lo sfondo per gestire sfondi, widget e impostazioni."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Scegli alcune applicazioni"</string>
-    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Per aggiungere un\'applicazione alla schermata Home, tocca e tieni premuto."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Crea nuove cartelle per le tue app"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Tocca e tieni premuto su un\'app, quindi spostala sull\'icona di un\'altra app"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Per aggiungere un\'app alla schermata Home, tocca e tieni premuto."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Ecco una cartella"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Per crearne una simile, tocca un\'app e tieni premuto, dopodiché spostala sopra un\'altra."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Cartella aperta, <xliff:g id="WIDTH">%1$d</xliff:g> per <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Tocca per chiudere la cartella"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 913df1b..603dbb5 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d נבחרו"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d נבחרו"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"טפט %1$d מתוך %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"בחרת <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"מחק"</string>
     <string name="pick_image" msgid="1272073934062909527">"בחר תמונה"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"טפטים"</string>
@@ -36,7 +38,7 @@
     <string name="activity_not_found" msgid="8071924732094499514">"האפליקציה לא מותקנת."</string>
     <string name="widgets_tab_label" msgid="2921133187116603919">"רכיבי ווידג\'ט"</string>
     <string name="widget_adder" msgid="3201040140710381657">"רכיבי ווידג\'ט"</string>
-    <string name="toggle_weight_watcher" msgid="5645299835184636119">"הצג מם"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"הצג זכרון"</string>
     <string name="long_press_widget_to_add" msgid="7699152356777458215">"גע נגיעה רציפה בווידג\'ט כדי לבחור בו."</string>
     <string name="market" msgid="2619650989819296998">"קנה"</string>
     <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"דף אפליקציות %1$d מתוך %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"דף רכיבי ווידג\'ט ‏%1$d מתוך %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"ברוך הבא!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"להרגיש בבית"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"להרגיש בבית."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"צור מסכים נוספים עבור אפליקציות ותיקיות"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"ארגן את אזור העבודה שלך"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"גע נגיעה רציפה ברקע כדי לנהל את הטפט, רכיבי ווידג\'ט ואת ההגדרות"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"גע נגיעה רציפה ברקע כדי לנהל את הטפט, רכיבי הווידג\'ט וההגדרות."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"בחר כמה אפליקציות"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"כדי להוסיף אפליקציה למסך דף הבית, גע בה נגיעה רציפה."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"צור תיקיות חדשות עבור האפליקציות שלך"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"גע נגיעה רציפה באפליקציה והזז אותה אל מעל סמל של אפליקציה אחרת"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"הנה תיקייה"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"כדי ליצור תיקייה כזו, גע נגיעה רציפה באפליקציה, ולאחר מכן גרור ושחרר אותו על-גבי אפליקציה אחרת."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"אישור"</string>
     <string name="folder_opened" msgid="94695026776264709">"תיקיה פתוחה, <xliff:g id="WIDTH">%1$d</xliff:g> על <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"גע כדי לסגור את התיקיה"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index b6d0ffb..6e39c54 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d件選択済み"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d件選択済み"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"壁紙: %1$d/%2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"選択: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"削除"</string>
     <string name="pick_image" msgid="1272073934062909527">"画像を選択"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"壁紙"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"アプリの%1$d/%2$dページ"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"ウィジェットの%1$d/%2$dページ"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"ようこそ!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"ホームをカスタマイズします"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"ホームをカスタマイズします。"</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"アプリとフォルダの画面をもっと作成します"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"スペースを整理"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"壁紙、ウィジェット、設定を管理するには、背景を押し続けます"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"壁紙、ウィジェット、設定を管理するには、背景を押し続けます。"</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"アプリの選択"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"アプリをホーム画面に追加するにはアプリを押し続けます。"</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"アプリの新しいフォルダを作成"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"アプリを押し続け、別のアプリアイコンの上に移動します"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"これがフォルダです"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"これと同じフォルダを作成するには、アプリを押し続けてから別のアプリの上に移動します。"</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"フォルダが開いています。<xliff:g id="WIDTH">%1$d</xliff:g>x<xliff:g id="HEIGHT">%2$d</xliff:g>の大きさです"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"タップしてフォルダを閉じます"</string>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..a2e3374
--- /dev/null
+++ b/res/values-ka-rGE/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+* Copyright (C) 2008 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+    <string name="home" msgid="7658288663002113681">"მთავარი"</string>
+    <string name="uid_name" msgid="7820867637514617527">"Android-ის ბირთვის აპები"</string>
+    <string name="folder_name" msgid="7371454440695724752"></string>
+    <string name="wallpaper_instructions" msgid="563973358787555519">"ფონის დაყენება"</string>
+  <plurals name="number_of_items_selected">
+    <item quantity="zero" msgid="7464587177007785408">"არჩეულია %1$d"</item>
+    <item quantity="one" msgid="142482526010824029">"არჩეულია %1$d"</item>
+    <item quantity="other" msgid="1418352074806573570">"არჩეულია %1$d"</item>
+  </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"ფონი %1$d %2$d-დან"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"არჩეულია <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+    <string name="wallpaper_delete" msgid="8095005658756613921">"წაშლა"</string>
+    <string name="pick_image" msgid="1272073934062909527">"სურათის ამორჩევა"</string>
+    <string name="pick_wallpaper" msgid="8179698221502010609">"ფონები"</string>
+    <string name="crop_wallpaper" msgid="8334345984491368009">"ფონის ჩამოჭრა"</string>
+    <string name="activity_not_found" msgid="8071924732094499514">"აპი არ არის დაყენებული."</string>
+    <string name="widgets_tab_label" msgid="2921133187116603919">"ვიჯეტები"</string>
+    <string name="widget_adder" msgid="3201040140710381657">"ვიჯეტები"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"Mem-ის ჩვენება"</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"შეეხეთ და დააყოვნეთ ვიჯეტის ასარჩევად."</string>
+    <string name="market" msgid="2619650989819296998">"მაღაზია"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"ერთეულის მთავარ ეკრანზე ჩაგდება ვერ მოხერხდა."</string>
+    <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"აირჩიეთ ვიჯეტი შესაქმნელად"</string>
+    <string name="rename_folder_label" msgid="3727762225964550653">"საქაღალდის სახელი"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"საქაღალდის გადარქმევა"</string>
+    <string name="rename_action" msgid="5559600076028658757">"კარგი"</string>
+    <string name="cancel_action" msgid="7009134900002915310">"გაუქმება"</string>
+    <string name="menu_item_add_item" msgid="1264911265836810421">"მთავარ ეკრანზე დამატება"</string>
+    <string name="group_applications" msgid="3797214114206693605">"აპები"</string>
+    <string name="group_shortcuts" msgid="6012256992764410535">"მალსახმობები"</string>
+    <string name="group_widgets" msgid="1569030723286851002">"ვიჯეტები"</string>
+    <string name="completely_out_of_space" msgid="6106288382070760318">"მთავარ ეკრანებზე ადგილი აღარ არის."</string>
+    <string name="out_of_space" msgid="4691004494942118364">"ამ მთავარ ეკრანზე ადგილი აღარ არის."</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"hotseat-ში მეტი ადგილი არ არის."</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"ეს ვიჯეტი ძალიან დიდია hotseat-ისთვის."</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"შეიქმნა მალსახმობი „<xliff:g id="NAME">%s</xliff:g>“."</string>
+    <string name="shortcut_uninstalled" msgid="8176767991305701821">"მასლახმობი „<xliff:g id="NAME">%s</xliff:g>“ წაშლილია."</string>
+    <string name="shortcut_duplicate" msgid="9167217446062498127">"მალსახმობი „<xliff:g id="NAME">%s</xliff:g>“ უკვე არსებობს."</string>
+    <string name="title_select_shortcut" msgid="6680642571148153868">"აირჩიეთ მალსახმობი"</string>
+    <string name="title_select_application" msgid="3280812711670683644">"აირჩიეთ აპი"</string>
+    <string name="all_apps_button_label" msgid="9110807029020582876">"აპები"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"მთავარი"</string>
+    <string name="delete_zone_label_workspace" msgid="4009607676751398685">"წაშლა"</string>
+    <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"დეინსტალაცია"</string>
+    <string name="delete_target_label" msgid="1822697352535677073">"წაშლა"</string>
+    <string name="delete_target_uninstall_label" msgid="5100785476250872595">"დეინსტალაცია"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"აპის შესახებ"</string>
+    <string name="accessibility_search_button" msgid="1628520399424565142">"ძიება"</string>
+    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ხმოვანი ძიება"</string>
+    <string name="accessibility_all_apps_button" msgid="2603132375383800483">"აპები"</string>
+    <string name="accessibility_delete_button" msgid="6466114477993744621">"წაშლა"</string>
+    <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"განახლების დეინსტალაცია"</string>
+    <string name="cab_menu_delete_app" msgid="7435191475867183689">"აპის დეინსტალაცია"</string>
+    <string name="cab_menu_app_info" msgid="8593722221450362342">"აპის შესახებ"</string>
+    <string name="cab_app_selection_text" msgid="374688303047985416">"არჩეულია 1 აპი"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"არჩეულია 1 ვიჯეტი"</string>
+    <string name="cab_folder_selection_text" msgid="7999992513806132118">"არჩეულია 1 საქაღალდე"</string>
+    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"არჩეულია 1 მალსახმობი"</string>
+    <string name="permlab_install_shortcut" msgid="5632423390354674437">"მალსახმობების დაყენება"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"აპისთვის მალსახმობების დამოუკიდებლად დამატების უფლების მიცემა."</string>
+    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"მალსახმობების წაშლა"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"აპისთვის მალსახმობების დამოუკიდებლად წაშლის უფლების მიცემა."</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"მთავარი ეკრანის პარამეტრებისა და მალსახმობების წაკითხვა"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"აპისთვის მთავარი ეკრანის პარამეტრებისა და მალსახმობების წაკითხვის უფლების მიცემა."</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"მთავარი ეკრანის პარამეტრებისა და მალსახმობების ჩაწერა"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"აპისთვის მთავარი ეკრანის პარამეტრებისა და მალსახმობების შეცვლის უფლების მიცემა."</string>
+    <string name="gadget_error_text" msgid="6081085226050792095">"პრობლემა ვიჯეტის ჩატვირთვისას"</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"ეს სისტემური აპია და მისი წაშლა შეუძლებელია."</string>
+    <string name="dream_name" msgid="1530253749244328964">"ფეიერვერკი"</string>
+    <string name="folder_hint_text" msgid="6617836969016293992">"უსახელო საქაღალდე"</string>
+    <string name="workspace_description_format" msgid="2950174241104043327">"მთავარი ეკრანი %1$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"გვერდი %1$d %2$d-დან"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"მთავარი ეკრანი %1$d, %2$d-დან"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"აპების გვერდი %1$d, %2$d-დან"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"ვიჯეტების გვერდი %1$d, %2$d-დან"</string>
+    <string name="first_run_cling_title" msgid="7257389003637362144">"კეთილი იყოს თქვენი მობრძანება!"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"იგრძენით თავი საკუთარ სახლში"</string>
+    <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+    <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"აპებისა და საქაღალდეებისთვის კიდევ ერთი ეკრანის შექმნა"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"თქვენი სივრცის ორგანიზება"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"თუ გსურთ ფონების, ვიჯეტების და პარამეტრების მართვა, შეეხეთ და არ აუშვათ ფონს."</string>
+    <string name="all_apps_cling_title" msgid="34929250753095858">"აირჩიეთ რამდენიმე აპი"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"აპის მთავარ ეკრანზე დასამატებლად შეეხეთ მის ხატულას და არ აუშვათ."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"აი, საქაღალდე"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"ასეთის შესაქმნელად, შეეხეთ და დააყოვნეთ აპზე, ხოლო შემდეგ გადააჩოჩეთ შემდეგზე."</string>
+    <string name="cling_dismiss" msgid="8962359497601507581">"კარგი"</string>
+    <string name="folder_opened" msgid="94695026776264709">"საქაღალდე გახსნილია, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1884479294466410023">"შეეხეთ საქაღალდის დასახურად"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"შეეხეთ ახალი სახელის შესანახად"</string>
+    <string name="folder_closed" msgid="4100806530910930934">"საქაღალდე დაიხურა"</string>
+    <string name="folder_renamed" msgid="1794088362165669656">"საქაღალდეს შეეცვალა სახელი „<xliff:g id="NAME">%1$s</xliff:g>“-ად"</string>
+    <string name="folder_name_format" msgid="6629239338071103179">"საქაღალდე: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+    <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+    <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+    <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+    <string name="widget_button_text" msgid="2880537293434387943">"ვიჯეტები"</string>
+    <string name="wallpaper_button_text" msgid="8404103075899945851">"ფონები"</string>
+    <string name="settings_button_text" msgid="8119458837558863227">"პარამეტრები"</string>
+</resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..977b2dd
--- /dev/null
+++ b/res/values-km-rKH/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+* Copyright (C) 2008 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+    <string name="home" msgid="7658288663002113681">"ដើម"</string>
+    <string name="uid_name" msgid="7820867637514617527">"កម្មវិធី​​សំខាន់​ៗ​របស់ Android"</string>
+    <string name="folder_name" msgid="7371454440695724752"></string>
+    <string name="wallpaper_instructions" msgid="563973358787555519">"កំណត់​ផ្ទាំង​រូបភាព"</string>
+  <plurals name="number_of_items_selected">
+    <item quantity="zero" msgid="7464587177007785408">"បាន​ជ្រើស %1$d"</item>
+    <item quantity="one" msgid="142482526010824029">"បាន​ជ្រើស %1$d"</item>
+    <item quantity="other" msgid="1418352074806573570">"បាន​ជ្រើស %1$d"</item>
+  </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"ផ្ទាំង​រូបភាព %1$d នៃ %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"​បាន​ជ្រើស <xliff:g id="LABEL">%1$s</xliff:g>"</string>
+    <string name="wallpaper_delete" msgid="8095005658756613921">"លុប"</string>
+    <string name="pick_image" msgid="1272073934062909527">"ជ្រើស​យក​រូបភាព"</string>
+    <string name="pick_wallpaper" msgid="8179698221502010609">"ផ្ទាំង​រូបភាព"</string>
+    <string name="crop_wallpaper" msgid="8334345984491368009">"ច្រឹប​ផ្ទាំង​រូបភាព"</string>
+    <string name="activity_not_found" msgid="8071924732094499514">"មិន​បាន​ដំឡើង​កម្មវិធី។"</string>
+    <string name="widgets_tab_label" msgid="2921133187116603919">"ធាតុ​ក្រាហ្វិក"</string>
+    <string name="widget_adder" msgid="3201040140710381657">"ធាតុ​ក្រាហ្វិក"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"បង្ហាញ​ Mem"</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"ប៉ះ &amp; សង្កត់ ដើម្បី​ជ្រើស​ធាតុ​ក្រាហ្វិក។"</string>
+    <string name="market" msgid="2619650989819296998">"ហាងទំនិញ"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"មិន​អាច​ទម្លាក់​ធាតុ​លើ​អេក្រង់​ដើម​នេះ​ទេ"</string>
+    <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"ជ្រើស​ធាតុ​ក្រាហ្វិក ដើម្បី​​​បង្កើត"</string>
+    <string name="rename_folder_label" msgid="3727762225964550653">"ឈ្មោះ​ថត"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"ប្ដូរ​ឈ្មោះ​ថត"</string>
+    <string name="rename_action" msgid="5559600076028658757">"យល់ព្រម"</string>
+    <string name="cancel_action" msgid="7009134900002915310">"បោះបង់"</string>
+    <string name="menu_item_add_item" msgid="1264911265836810421">"បន្ថែម​ទៅ​អេក្រង់​ដើម"</string>
+    <string name="group_applications" msgid="3797214114206693605">"កម្មវិធី"</string>
+    <string name="group_shortcuts" msgid="6012256992764410535">"ផ្លូវកាត់"</string>
+    <string name="group_widgets" msgid="1569030723286851002">"ធាតុ​ក្រាហ្វិក"</string>
+    <string name="completely_out_of_space" msgid="6106288382070760318">"គ្មាន​បន្ទប់​នៅ​លើ​អេក្រង់​ដើម​រស់​អ្នក​ទៀត​ទេ។"</string>
+    <string name="out_of_space" msgid="4691004494942118364">"គ្មាន​បន្ទប់​នៅ​លើ​អេក្រង់​ដើម​នេះ​ទៀត​ទេ។"</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"គ្មាន​បន្ទប់​នៅ​ក្នុង​មជ្ឈមណ្ឌល​ទៀត​ទេ។"</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"ធាតុ​ក្រាហ្វិក​នេះ​ធំ​ពេក​សម្រាប់​មជ្ឈមណ្ឌល។"</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"បាន​បង្កើត​ផ្លូវកាត់ \"<xliff:g id="NAME">%s</xliff:g>\" ។"</string>
+    <string name="shortcut_uninstalled" msgid="8176767991305701821">"បាន​លុប​ផ្លូវកាត់ \"<xliff:g id="NAME">%s</xliff:g>\" ។"</string>
+    <string name="shortcut_duplicate" msgid="9167217446062498127">"មាន​ផ្លូវកាត់ \"<xliff:g id="NAME">%s</xliff:g>\" រួច​ហើយ។"</string>
+    <string name="title_select_shortcut" msgid="6680642571148153868">"ជ្រើស​ផ្លូវកាត់"</string>
+    <string name="title_select_application" msgid="3280812711670683644">"ជ្រើស​កម្មវិធី"</string>
+    <string name="all_apps_button_label" msgid="9110807029020582876">"កម្មវិធី"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"ដើម"</string>
+    <string name="delete_zone_label_workspace" msgid="4009607676751398685">"លុប​ចេញ"</string>
+    <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"លុប"</string>
+    <string name="delete_target_label" msgid="1822697352535677073">"លុប​ចេញ"</string>
+    <string name="delete_target_uninstall_label" msgid="5100785476250872595">"លុប"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"ព័ត៌មាន​កម្មវិធី"</string>
+    <string name="accessibility_search_button" msgid="1628520399424565142">"ស្វែងរក"</string>
+    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ស្វែងរក​តាម​សំឡេង"</string>
+    <string name="accessibility_all_apps_button" msgid="2603132375383800483">"កម្មវិធី"</string>
+    <string name="accessibility_delete_button" msgid="6466114477993744621">"លុប​ចេញ"</string>
+    <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"លុប​បច្ចុប្បន្នភាព"</string>
+    <string name="cab_menu_delete_app" msgid="7435191475867183689">"លុប​កម្មវិធី"</string>
+    <string name="cab_menu_app_info" msgid="8593722221450362342">"ព័ត៌មាន​លម្អិត​កម្មវិធី"</string>
+    <string name="cab_app_selection_text" msgid="374688303047985416">"បាន​ជ្រើស​កម្មវិធី ១"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"បាន​ជ្រើស​ធាតុ ១"</string>
+    <string name="cab_folder_selection_text" msgid="7999992513806132118">"បាន​ជ្រើស​ថត ១"</string>
+    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"បាន​ជ្រើស​ផ្លូវកាត់ ១"</string>
+    <string name="permlab_install_shortcut" msgid="5632423390354674437">"ដំឡើង​ផ្លូវកាត់"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"អនុញ្ញាត​ឲ្យ​កម្មវិធី​បន្ថែម​ផ្លូវកាត់​ ដោយ​មិន​ចាំបាច់​​អំពើ​ពី​អ្នក​ប្រើ។"</string>
+    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"លុប​ផ្លូវកាត់"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"អនុញ្ញាត​ឲ្យ​កម្មវិធី​លុប​ផ្លូវកាត់​ដោយ​មិន​ចាំបាច់​អំពើ​ពី​អ្នក​ប្រើ។"</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"អាន​ការ​កំណត់​ និង​ផ្លូវកាត់​​អេក្រង់​ដើម"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"អនុញ្ញាត​ឲ្យ​កម្មវិធី​អាន​ការ​កំណត់ និង​ផ្លូវកាត់​ក្នុង​អេក្រង់​ដើម។"</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"សរសេរ​ការ​កំណត់ ​និង​ផ្លូវកាត់​​លើ​អេក្រង់​ដើម"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"អនុញ្ញាត​ឲ្យ​កម្មវិធី​ប្ដូរ​ការ​កំណត់ និង​ផ្លូវ​កាត់​ក្នុង​អេក្រង់​ដើម។"</string>
+    <string name="gadget_error_text" msgid="6081085226050792095">"បញ្ហា​ក្នុង​ការ​ផ្ទុក​ធាតុ​​ក្រាហ្វិក"</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"នេះ​​​ជា​កម្មវិធី​ប្រព័ន្ធ មិន​អាច​លុប​បាន​ទេ។"</string>
+    <string name="dream_name" msgid="1530253749244328964">"កម្មវិធី​ចាប់ផ្ដើម​រ៉ូកែត"</string>
+    <string name="folder_hint_text" msgid="6617836969016293992">"ថត​គ្មាន​ឈ្មោះ"</string>
+    <string name="workspace_description_format" msgid="2950174241104043327">"អេក្រង់​ដើម %1$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"ទំព័រ %1$d នៃ %2$d"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"អេក្រង់​ដើម %1$d នៃ %2$d"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"ទំព័រ​កម្មវិធី %1$d នៃ %2$d"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"ទំព័រ​ធាតុ​ក្រាហ្វិក ​%1$d នៃ %2$d"</string>
+    <string name="first_run_cling_title" msgid="7257389003637362144">"សូម​ស្វាគមន៍​!"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"ធ្វើ​ដោយ​ខ្លួន​ឯង​នៅ​លើ​អេក្រង់​ដើម។"</string>
+    <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+    <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"បង្កើត​អេក្រង់​ច្រើន​សម្រាប់​កម្មវិធី​ ​និង​ថតឯកសារ"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"រៀបចំ​ចន្លោះ​របស់​អ្នក"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"ប៉ះ &amp; សង្កត់​លើ​ផ្ទៃ​ខាង​ក្រោម ដើម្បី​គ្រប់គ្រង​ផ្ទាំង​រូបភាព, ធាតុ​ក្រាហ្វិក និង​ការ​កំណត់។"</string>
+    <string name="all_apps_cling_title" msgid="34929250753095858">"ជ្រើស​កម្មវិធី​មួយ​ចំនួន"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"ប៉ះ​ &amp; សង្កត់​វា ដើម្បី​បន្ថែម​កម្មវិធី​ទៅ​​​អេក្រង់​ដើម​របស់​អ្នក"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"នេះ​ជា​ថត"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"ដើម្បី​បង្កើត​មួយ​ដូច​នេះ ប៉ះ &amp; សង្កត់​​លើ​កម្មវិធី បន្ទាប់​មក​ផ្លាស់ទី​វា​ទៅ​លើ​ធាតុ​មួយ​ផ្សេង​ទៀត។"</string>
+    <string name="cling_dismiss" msgid="8962359497601507581">"យល់ព្រម"</string>
+    <string name="folder_opened" msgid="94695026776264709">"បាន​បើក​ថត <xliff:g id="WIDTH">%1$d</xliff:g> ដោយ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1884479294466410023">"ប៉ះ ដើម្បី​បិទ​ថត"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"ប៉ះ ដើម្បី​រក្សាទុក​ការ​ប្ដូរ​ឈ្មោះ"</string>
+    <string name="folder_closed" msgid="4100806530910930934">"បាន​បិទ​ថត"</string>
+    <string name="folder_renamed" msgid="1794088362165669656">"បាន​ប្ដូរ​ឈ្មោះ​ថត​ជា <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="6629239338071103179">"ថត៖ <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+    <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+    <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+    <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+    <string name="widget_button_text" msgid="2880537293434387943">"ធាតុ​ក្រាហ្វិក"</string>
+    <string name="wallpaper_button_text" msgid="8404103075899945851">"ផ្ទាំង​រូបភាព"</string>
+    <string name="settings_button_text" msgid="8119458837558863227">"ការកំណត់"</string>
+</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 5e77f95..31c2d69 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d개 선택됨"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d개 선택됨"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"배경화면 %1$d/%2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> 선택함"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"삭제"</string>
     <string name="pick_image" msgid="1272073934062909527">"이미지 선택"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"배경화면"</string>
@@ -90,21 +92,21 @@
     <string name="dream_name" msgid="1530253749244328964">"로켓 실행기"</string>
     <string name="folder_hint_text" msgid="6617836969016293992">"이름이 없는 폴더"</string>
     <string name="workspace_description_format" msgid="2950174241104043327">"홈 화면 %1$d"</string>
-    <string name="default_scroll_format" msgid="7475544710230993317">"페이지 %2$d 중 %1$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"페이지 %1$d/%2$d"</string>
     <string name="workspace_scroll_format" msgid="8458889198184077399">"홈 화면 %1$d/%2$d"</string>
-    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"앱 페이지 %2$d 중 %1$d"</string>
-    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"위젯 페이지 %2$d 중 %1$d"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"앱 페이지 %1$d/%2$d"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"위젯 페이지 %1$d/%2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"환영합니다!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"쉽게 사용하기"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"편리한 사용 환경을 만드세요."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"앱 및 폴더를 표시할 화면 더 만들기"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"공간 관리하기"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"배경화면, 위젯, 설정을 관리하려면 백그라운드를 길게 터치합니다."</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"배경화면, 위젯, 설정을 관리하려면 백그라운드를 길게 터치합니다."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"앱 선택하기"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"홈 화면에 앱을 추가하려면 길게 터치합니다."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"앱에 사용할 새 폴더 만들기"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"앱을 길게 누른 다음 다른 앱 아이콘 위로 이동합니다."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"폴더"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"폴더를 만들려면 앱을 길게 터치한 다음 다른 앱 위에 올려 놓으세요."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"확인"</string>
     <string name="folder_opened" msgid="94695026776264709">"폴더 열림(<xliff:g id="WIDTH">%1$d</xliff:g>X<xliff:g id="HEIGHT">%2$d</xliff:g>)"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"터치하여 폴더를 닫음"</string>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..e3a95dd
--- /dev/null
+++ b/res/values-lo-rLA/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+* Copyright (C) 2008 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+    <string name="home" msgid="7658288663002113681">"ໜ້າຫຼັກ"</string>
+    <string name="uid_name" msgid="7820867637514617527">"ແອັບພລິເຄຊັນຫຼັກຂອງ Android"</string>
+    <string name="folder_name" msgid="7371454440695724752"></string>
+    <string name="wallpaper_instructions" msgid="563973358787555519">"ຕັ້ງເປັນພາບພື້ນຫຼັງ"</string>
+  <plurals name="number_of_items_selected">
+    <item quantity="zero" msgid="7464587177007785408">"ເລືອກ %1$d ລາຍການແລ້ວ"</item>
+    <item quantity="one" msgid="142482526010824029">"ເລືອກ %1$d ລາຍການແລ້ວ"</item>
+    <item quantity="other" msgid="1418352074806573570">"ເລືອກ %1$d ລາຍການແລ້ວ"</item>
+  </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"ຮູບພືື້ນຫຼັງ %1$d ໃນ %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"ເລືອກແລ້ວ <xliff:g id="LABEL">%1$s</xliff:g> ອັນ"</string>
+    <string name="wallpaper_delete" msgid="8095005658756613921">"ລຶບ"</string>
+    <string name="pick_image" msgid="1272073934062909527">"ເລືອກຮູບ"</string>
+    <string name="pick_wallpaper" msgid="8179698221502010609">"ພາບພື້ນຫຼັງ"</string>
+    <string name="crop_wallpaper" msgid="8334345984491368009">"ຕັດຮູບພື້ນຫຼັງ"</string>
+    <string name="activity_not_found" msgid="8071924732094499514">"ແອັບຯບໍ່ໄດ້ຖືກຕິດຕັ້ງ."</string>
+    <string name="widgets_tab_label" msgid="2921133187116603919">"ວິດເຈັດ"</string>
+    <string name="widget_adder" msgid="3201040140710381657">"ວິດເຈັດ"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"ສະແດງຄວາມຈຳ"</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"ສຳພັດຄ້າງໄວ້ ເພື່ອຈັບວິດເຈັດ."</string>
+    <string name="market" msgid="2619650989819296998">"ຮ້ານຄ້າ"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"ບໍ່ສາມາດວາງລາຍການໃສ່ໜ້າຈໍຫຼັກນີ້ໄດ້"</string>
+    <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"ເລືອກວິດເຈັດເພື່ອສ້າງມັນ"</string>
+    <string name="rename_folder_label" msgid="3727762225964550653">"ຊື່ໂຟນເດີ"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"ປ່ຽນຊື່ໂຟນເດີ"</string>
+    <string name="rename_action" msgid="5559600076028658757">"ຕົກລົງ"</string>
+    <string name="cancel_action" msgid="7009134900002915310">"ຍົກ​ເລີກ"</string>
+    <string name="menu_item_add_item" msgid="1264911265836810421">"ເພີ່ມໃສ່ໜ້າຈໍຫຼັກ"</string>
+    <string name="group_applications" msgid="3797214114206693605">"ແອັບຯ"</string>
+    <string name="group_shortcuts" msgid="6012256992764410535">"ທາງລັດ"</string>
+    <string name="group_widgets" msgid="1569030723286851002">"ວິດເຈັດ"</string>
+    <string name="completely_out_of_space" msgid="6106288382070760318">"ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກຂອງທ່ານ."</string>
+    <string name="out_of_space" msgid="4691004494942118364">"ບໍ່ມີຫ້ອງເຫຼືອໃນໜ້າຈໍຫຼັກນີ້."</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"ບໍ່ມີຫ້ອງຫວ່າງໃນ hotseat ແລ້ວ."</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"ວິດເຈັດ ມີຂະໜາດໃຫຍ່ເກີນໄປສຳລັບ hotseat."</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"ທາງລັດ \"<xliff:g id="NAME">%s</xliff:g>\" ຖືກສ້າງແລ້ວ."</string>
+    <string name="shortcut_uninstalled" msgid="8176767991305701821">"ທາງລັດ \"<xliff:g id="NAME">%s</xliff:g>\" ຖືກລຶບແລ້ວ."</string>
+    <string name="shortcut_duplicate" msgid="9167217446062498127">"ທາງລັດ \"<xliff:g id="NAME">%s</xliff:g>\" ມີຢູ່ແລ້ວ."</string>
+    <string name="title_select_shortcut" msgid="6680642571148153868">"ເລືອກທາງລັດ"</string>
+    <string name="title_select_application" msgid="3280812711670683644">"ເລືອກແອັບຯ"</string>
+    <string name="all_apps_button_label" msgid="9110807029020582876">"ແອັບຯ"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"ໜ້າຫຼັກ"</string>
+    <string name="delete_zone_label_workspace" msgid="4009607676751398685">"ລຶບ"</string>
+    <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"ຖອນການຕິດຕັ້ງ"</string>
+    <string name="delete_target_label" msgid="1822697352535677073">"ລຶບ"</string>
+    <string name="delete_target_uninstall_label" msgid="5100785476250872595">"ຖອນການຕິດຕັ້ງ"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"ຂໍ້ມູນແອັບຯ"</string>
+    <string name="accessibility_search_button" msgid="1628520399424565142">"ຊອກຫາ"</string>
+    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"ຊອກຫາດ້ວຍສຽງ"</string>
+    <string name="accessibility_all_apps_button" msgid="2603132375383800483">"ແອັບຯ"</string>
+    <string name="accessibility_delete_button" msgid="6466114477993744621">"ລຶບ"</string>
+    <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"ຖອນອັບເດດ"</string>
+    <string name="cab_menu_delete_app" msgid="7435191475867183689">"ຖອນແອັບຯ"</string>
+    <string name="cab_menu_app_info" msgid="8593722221450362342">"ລາຍລະອຽດແອັບຯ"</string>
+    <string name="cab_app_selection_text" msgid="374688303047985416">"1 ແອັບຯຖືກເລືອກ"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 ວິດເຈັດຖືກເລືອກ"</string>
+    <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 ໂຟນເດີຖືກເລືອກ"</string>
+    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 ທາງລັດຖືກເລືອກ"</string>
+    <string name="permlab_install_shortcut" msgid="5632423390354674437">"ຕິດຕັ້ງທາງລັດ"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"ອະນຸຍາດໃຫ້ແອັບຯ ເພີ່ມທາງລັດໂດຍບໍ່ຕ້ອງຮັບການຢືນຢັນຈາກຜູ່ໃຊ້."</string>
+    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"ຖອນທາງລັດ"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວ ລຶບທາງລັດໂດຍບໍ່ຕ້ອງຮັບການຢືນຢັນຈາກຜູ່ໃຊ້."</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"ອ່ານການຕັ້ງຄ່າໜ້າຫຼັກ ແລະທາງລັດ"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວອ່ານການຕັ້ງຄ່າ ແລະທາງລັດໃນໜ້າຫຼັກ."</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"ຂຽນການຕັ້ງຄ່າໜ້າຫຼັກ ແລະທາງລັດ"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"ອະນຸຍາດໃຫ້ແອັບຯດັ່ງກ່າວ ປ່ຽນການຕັ້ງຄ່າ ແລະທາງລັດໃນໜ້າຫຼັກ."</string>
+    <string name="gadget_error_text" msgid="6081085226050792095">"ມີບັນຫາໃນການໂຫລດວິດເຈັດ"</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"ນີ້ແມ່ນແອັບຯຂອງລະບົບ ແລະບໍ່ສາມາດຖອນການຕິດຕັ້ງອອກໄດ້."</string>
+    <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
+    <string name="folder_hint_text" msgid="6617836969016293992">"ໂຟນເດີຍັງບໍ່ຖືກຕັ້ງຊື່"</string>
+    <string name="workspace_description_format" msgid="2950174241104043327">"ໜ້າຈໍຫຼັກ %1$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"ໜ້າ %1$d ຈາກ %2$d"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"ໜ້າຈໍຫຼັກ %1$d ໃນ %2$d"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"ແອັບຯໜ້າ %1$d ໃນ %2$d"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"ວິດເຈັດໜ້າ %1$d ໃນ %2$d"</string>
+    <string name="first_run_cling_title" msgid="7257389003637362144">"ຍິນດີຕ້ອນຮັບ!"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"ເຮັດໂຕໃຫ້ຄືຢູ່ໃນບ້ານ"</string>
+    <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+    <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"ສ້າງຈໍເພີ່ມເຕີມສຳລັບແອັບຯ ແລະໂຟນເດີ"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"ຈັດການພື້ນທີ່ຂອງທ່ານ"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"ແຕະຄ້າງໄວ້ທີ່ພາບພື້ນຫຼັງເພື່ອຈັດການພາບພື້ນຫຼັງ, ວິດເຈັດແລະການຕັ້ງຄ່າ."</string>
+    <string name="all_apps_cling_title" msgid="34929250753095858">"ເລືອກແອັບຯ"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"ເພື່ອເພີ່ມແອັບຯໃສ່ໜ້າຈໍຫຼັກຂອງທ່ານ, ໃຫ້ແຕະຄ້າງໄວ້."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"ນີ້ແມ່ນໂຟນເດີ່"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"ເພື່ອສ້າງອັນໃໝ່ແບບນີ້, ແຕະຄ້າງໄວ້ທີ່ແອັບຯ ແລ້ວຍ້າຍມັນໄປຫາໂຕອື່ນ."</string>
+    <string name="cling_dismiss" msgid="8962359497601507581">"ຕົກລົງ"</string>
+    <string name="folder_opened" msgid="94695026776264709">"ເປີດໂຟນເດີແລ້ວ, <xliff:g id="WIDTH">%1$d</xliff:g> ຄູນ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1884479294466410023">"ສຳພັດເພື່ອປິດໂຟນເດີ"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"ສຳພັດເພື່ອບັນທຶກການປ່ຽນຊື່"</string>
+    <string name="folder_closed" msgid="4100806530910930934">"ປິດໂຟນເດີແລ້ວ"</string>
+    <string name="folder_renamed" msgid="1794088362165669656">"ປ່ຽນຊື່ໂຟນເດີເປັນ <xliff:g id="NAME">%1$s</xliff:g> ແລ້ວ"</string>
+    <string name="folder_name_format" msgid="6629239338071103179">"ໂຟນເດີ: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+    <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+    <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+    <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+    <string name="widget_button_text" msgid="2880537293434387943">"ວິດເຈັດ"</string>
+    <string name="wallpaper_button_text" msgid="8404103075899945851">"ພາບພື້ນຫຼັງ"</string>
+    <string name="settings_button_text" msgid="8119458837558863227">"ການຕັ້ງຄ່າ"</string>
+</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 5886ed3..80d4412 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Pasirinkta: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Pasirinkta: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d iš %2$d ekrano fonų"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Pasirinkta: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Ištrinti"</string>
     <string name="pick_image" msgid="1272073934062909527">"Pasirinkti vaizdą"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Ekrano fonai"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%1$d programų psl. iš %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%1$d valdiklių psl. iš %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Sveiki!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Jauskitės kaip namie"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Jauskitės kaip namie."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Sukurkite daugiau programų ir aplankų ekrano kopijų"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Tvarkykite savo vietą"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Jei norite tvarkyti ekrano foną, valdiklius ir nustatymus, palieskite foną ir laikykite"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Palieskite ir laikykite foną, jei norite tvarkyti ekrano foną, valdiklius ir nustatymus."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Pasirinkite kelias programas"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Jei norite prie pagrindinio ekrano pridėti programą, palieskite ją ir laikykite."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Sukurkite naujus programų aplankus"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Palieskite programą ir laikykite. Tada perkelkite ją ant kitos programos piktogramos"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Štai aplankas"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Kad sukurtumėte tokį patį, palieskite ir laikykite programą, tada perkelkite ją virš kitos programos."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"Gerai"</string>
     <string name="folder_opened" msgid="94695026776264709">"Atidarytas aplankas, <xliff:g id="WIDTH">%1$d</xliff:g> ir <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Palieskite, kad uždarytumėte aplanką"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 3841b33..b70f5dc 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Atlasīti: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Atlasīti: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%1$d. fona tapete no %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Atlasīts: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Dzēst"</string>
     <string name="pick_image" msgid="1272073934062909527">"Izvēlēties attēlu"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Fona tapetes"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%1$d. lietotņu lapa no %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%1$d. logrīku lapa no %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Laipni lūdzam!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Informācija par pamatfunkcijām"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Informācija par pamatfunkcijām"</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Izveidojiet vairāk ekrānu lietotnēm un mapēm."</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Kārtojiet savu darbvietu"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Pieskarieties fonam un turiet to, lai pārvaldītu fona tapeti, logrīkus un iestatījumus."</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Pieskarieties fonam un turiet to, lai pārvaldītu fona tapeti, logrīkus un iestatījumus."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Izvēlieties dažas lietotnes"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Lai sākuma ekrānam pievienotu lietotni, pieskarieties tai un turiet to."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Veidojiet jaunas mapes savām lietotnēm"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Pieskarieties lietotnei un turiet to, pēc novietojiet to virs citas lietotnes ikonas."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Lūk, mape!"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Lai izveidotu tādu pašu, pieskarieties lietotnei un turiet to, pēc tam pārvietojiet to virs citas lietotnes."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"Labi"</string>
     <string name="folder_opened" msgid="94695026776264709">"Atvērta mape: <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Pieskarieties, lai aizvērtu mapi."</string>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..7cf7a9c
--- /dev/null
+++ b/res/values-mn-rMN/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+* Copyright (C) 2008 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+    <string name="home" msgid="7658288663002113681">"Нүүр"</string>
+    <string name="uid_name" msgid="7820867637514617527">"Андройд үндсэн апп"</string>
+    <string name="folder_name" msgid="7371454440695724752"></string>
+    <string name="wallpaper_instructions" msgid="563973358787555519">"Ханын зургийг тохируулах"</string>
+  <plurals name="number_of_items_selected">
+    <item quantity="zero" msgid="7464587177007785408">"%1$d сонгогдсон"</item>
+    <item quantity="one" msgid="142482526010824029">"%1$d сонгогдсон"</item>
+    <item quantity="other" msgid="1418352074806573570">"%1$d сонгогдсон"</item>
+  </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"%2$d ханын цаасны %1$d нь"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> сонгогдсон"</string>
+    <string name="wallpaper_delete" msgid="8095005658756613921">"Устгах"</string>
+    <string name="pick_image" msgid="1272073934062909527">"Зураг сонгох"</string>
+    <string name="pick_wallpaper" msgid="8179698221502010609">"Ханын зураг"</string>
+    <string name="crop_wallpaper" msgid="8334345984491368009">"Ханын зургийг тайрах"</string>
+    <string name="activity_not_found" msgid="8071924732094499514">"Апп суугаагүй байна."</string>
+    <string name="widgets_tab_label" msgid="2921133187116603919">"Виджет"</string>
+    <string name="widget_adder" msgid="3201040140710381657">"Виджет"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"Мем харуулах"</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Виджетийг авах бол хүрээд барина уу."</string>
+    <string name="market" msgid="2619650989819296998">"Дэлгүүр"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"Энэ Нүүр дэлгэцэнд буулгах боломжгүй."</string>
+    <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Үүсгэх виджетээ сонгоно уу"</string>
+    <string name="rename_folder_label" msgid="3727762225964550653">"Фолдерын нэр"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"Фолдерын нэр өөрчлөх"</string>
+    <string name="rename_action" msgid="5559600076028658757">"Тийм"</string>
+    <string name="cancel_action" msgid="7009134900002915310">"Цуцлах"</string>
+    <string name="menu_item_add_item" msgid="1264911265836810421">"Нүүр дэлгэцэнд нэмэх"</string>
+    <string name="group_applications" msgid="3797214114206693605">"Апп"</string>
+    <string name="group_shortcuts" msgid="6012256992764410535">"Товчлол"</string>
+    <string name="group_widgets" msgid="1569030723286851002">"Виджет"</string>
+    <string name="completely_out_of_space" msgid="6106288382070760318">"Таны Нүүр дэлгэц зайгүй."</string>
+    <string name="out_of_space" msgid="4691004494942118364">"Энэ Нүүр дэлгэц зайгүй."</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"Суурь зайгүй."</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"Энэ виджет сууринд хэт томдож байна."</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"\"<xliff:g id="NAME">%s</xliff:g>\" товчлол үүсэв."</string>
+    <string name="shortcut_uninstalled" msgid="8176767991305701821">"\"<xliff:g id="NAME">%s</xliff:g>\" товчлол устгагдав."</string>
+    <string name="shortcut_duplicate" msgid="9167217446062498127">"\"<xliff:g id="NAME">%s</xliff:g>\" товчлол өмнө үүссэн байна."</string>
+    <string name="title_select_shortcut" msgid="6680642571148153868">"Товчлол сонгох"</string>
+    <string name="title_select_application" msgid="3280812711670683644">"Апп сонгох"</string>
+    <string name="all_apps_button_label" msgid="9110807029020582876">"Апп"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"Нүүр"</string>
+    <string name="delete_zone_label_workspace" msgid="4009607676751398685">"Устгах"</string>
+    <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Устгах"</string>
+    <string name="delete_target_label" msgid="1822697352535677073">"Устгах"</string>
+    <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Устгах"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"Апп мэдээлэл"</string>
+    <string name="accessibility_search_button" msgid="1628520399424565142">"Хайх"</string>
+    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Дуун хайлт"</string>
+    <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Апп"</string>
+    <string name="accessibility_delete_button" msgid="6466114477993744621">"Устгах"</string>
+    <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"Шинэчлэлийг устгах"</string>
+    <string name="cab_menu_delete_app" msgid="7435191475867183689">"Апп устгах"</string>
+    <string name="cab_menu_app_info" msgid="8593722221450362342">"Апп дэлгэрэнгүй"</string>
+    <string name="cab_app_selection_text" msgid="374688303047985416">"1 апп сонгогдсон"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 виджет сонгогдсон"</string>
+    <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 фолдер сонгогдсон"</string>
+    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 товчлол сонгогдсон"</string>
+    <string name="permlab_install_shortcut" msgid="5632423390354674437">"товчлол суулгах"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Апп нь хэрэглэгчийн оролцоогүйгээр товчлолыг нэмэж чадна"</string>
+    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"товчлолыг устгах"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Апп нь хэрэглэгчийн оролцоогүйгээр товчлолыг устгаж чадна"</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"Нүүрний тохиргоо болон товчлолыг унших"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"Апп нь Нүүрэндэх товчлол болон тохиргоог уншиж чадна."</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"Нүүрний тохиргоо болон товчлолыг бичих"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"Апп нь Нүүрэндэх товчлол болон тохиргоог өөрчилж чадна."</string>
+    <string name="gadget_error_text" msgid="6081085226050792095">"Виджет ачаалахад асуудал гарав"</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"Энэ апп нь системийн апп ба устгах боломжгүй."</string>
+    <string name="dream_name" msgid="1530253749244328964">"Пуужин хөөргөгч"</string>
+    <string name="folder_hint_text" msgid="6617836969016293992">"Нэргүй фолдер"</string>
+    <string name="workspace_description_format" msgid="2950174241104043327">"Нүүр дэлгэц %1$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"%2$d-н %1$d хуудас"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d-н Нүүр дэлгэц %1$d"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%2$d-н %1$d апп хуудас"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%2$d-н %1$d виджет хуудас"</string>
+    <string name="first_run_cling_title" msgid="7257389003637362144">"Тавтай морилно уу!"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Гэртээ байгаа мэт тухлаарай."</string>
+    <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+    <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Апп болон фолдеруудад зориулан өөр дэлгэцүүд үүсгээрэй"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"Өөрийнхөө зайг тохируулаарай"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Арын дэвсгэр дээр хүрээд &amp; дарснаар ханын зураг, виджет болон тохиргоог өөрчилж болно."</string>
+    <string name="all_apps_cling_title" msgid="34929250753095858">"Апп сонгоно уу"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Нүүр дэлгэцэнд апп нэмэх бол хүрээд барина уу."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Фолдер энд байна"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Үүнтэй адилханыг үүсгэхийн тулд апп дээр хүрч &amp; бариад нөгөөхийн дээр зөөнө үү."</string>
+    <string name="cling_dismiss" msgid="8962359497601507581">"Тийм"</string>
+    <string name="folder_opened" msgid="94695026776264709">"<xliff:g id="WIDTH">%1$d</xliff:g> <xliff:g id="HEIGHT">%2$d</xliff:g> фолдер нээгдэв"</string>
+    <string name="folder_tap_to_close" msgid="1884479294466410023">"Фолдер хаах бол хүрнэ үү"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"Шинэ нэрийг хадгалах бол хүрнэ үү"</string>
+    <string name="folder_closed" msgid="4100806530910930934">"Фолдер хаагдав"</string>
+    <string name="folder_renamed" msgid="1794088362165669656">"Фолдерын нэр <xliff:g id="NAME">%1$s</xliff:g> болов"</string>
+    <string name="folder_name_format" msgid="6629239338071103179">"Фолдер: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+    <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+    <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+    <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+    <string name="widget_button_text" msgid="2880537293434387943">"Виджет"</string>
+    <string name="wallpaper_button_text" msgid="8404103075899945851">"Ханын зураг"</string>
+    <string name="settings_button_text" msgid="8119458837558863227">"Тохиргоо"</string>
+</resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 90fd420..4ee3545 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d dipilih"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d dipilih"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Kertas dinding %1$d daripada %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Memilih <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Padam"</string>
     <string name="pick_image" msgid="1272073934062909527">"Pilih imej"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Kertas dinding"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Halaman apl %1$d daripada %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Halaman widget %1$d daripada %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Selamat datang!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Buat seperti berada di rumah sendiri"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Buat seperti berada di rumah sendiri."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Buat lebih banyak skrin untuk apl dan folder"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Susun ruang anda"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Sentuh &amp; tahan latar belakang untuk mengurus kertas dinding, widget dan tetapan"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Sentuh &amp; tahan latar belakang untuk mengurus kertas dinding, widget dan tetapan."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Pilih beberapa apl"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Untuk menambahkan apl pada skrin Laman Utama anda, sentuh &amp; tahan apl."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Buat folder baharu untuk apl anda"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Sentuh &amp; tahan apl, kemudian alihkan ke atas ikon apl lain"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Ini ada folder"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Untuk membuat satu folder seperti ini, sentuh &amp; tahan apl, kemudian alihkan ke atas folder lain."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Folder dibuka, <xliff:g id="WIDTH">%1$d</xliff:g> kali <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Sentuh untuk menutup folder"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 3ebb7fa..ce50754 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -21,14 +21,16 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
     <string name="home" msgid="7658288663002113681">"Startside"</string>
-    <string name="uid_name" msgid="7820867637514617527">"Kjerneprogrammer for Android"</string>
+    <string name="uid_name" msgid="7820867637514617527">"Kjerneapper for Android"</string>
     <string name="folder_name" msgid="7371454440695724752"></string>
-    <string name="wallpaper_instructions" msgid="563973358787555519">"Angi bakgrunnsbilde"</string>
+    <string name="wallpaper_instructions" msgid="563973358787555519">"Angi bakgrunn"</string>
   <plurals name="number_of_items_selected">
     <item quantity="zero" msgid="7464587177007785408">"%1$d valgt"</item>
     <item quantity="one" msgid="142482526010824029">"%1$d valgt"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d valgt"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Bakgrunn %1$d of %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Valgt <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Slett"</string>
     <string name="pick_image" msgid="1272073934062909527">"Velg bilde"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Bakgrunner"</string>
@@ -43,7 +45,7 @@
     <string name="external_drop_widget_error" msgid="3165821058322217155">"Kunne ikke slippe elementet på denne startsiden."</string>
     <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Velg modul for oppretting"</string>
     <string name="rename_folder_label" msgid="3727762225964550653">"Mappenavn"</string>
-    <string name="rename_folder_title" msgid="3771389277707820891">"Gi mappe nytt navn"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"Gi mappen nytt navn"</string>
     <string name="rename_action" msgid="5559600076028658757">"OK"</string>
     <string name="cancel_action" msgid="7009134900002915310">"Avbryt"</string>
     <string name="menu_item_add_item" msgid="1264911265836810421">"Legg til på startsiden"</string>
@@ -54,8 +56,8 @@
     <string name="out_of_space" msgid="4691004494942118364">"Denne startsiden er full."</string>
     <string name="hotseat_out_of_space" msgid="9139760413395605841">"Dokksonen er full."</string>
     <string name="invalid_hotseat_item" msgid="1211534262129849507">"Denne modulen er for stor for dokksonen."</string>
-    <string name="shortcut_installed" msgid="1701742129426969556">"Opprettet snarveien «<xliff:g id="NAME">%s</xliff:g>»."</string>
-    <string name="shortcut_uninstalled" msgid="8176767991305701821">"Fjernet snarveien «<xliff:g id="NAME">%s</xliff:g>»."</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"Snarveien «<xliff:g id="NAME">%s</xliff:g>» er opprettet."</string>
+    <string name="shortcut_uninstalled" msgid="8176767991305701821">"Snarveien «<xliff:g id="NAME">%s</xliff:g>» er fjernet."</string>
     <string name="shortcut_duplicate" msgid="9167217446062498127">"Snarveien «<xliff:g id="NAME">%s</xliff:g>» fins allerede."</string>
     <string name="title_select_shortcut" msgid="6680642571148153868">"Valg av snarvei"</string>
     <string name="title_select_application" msgid="3280812711670683644">"Velg app"</string>
@@ -74,9 +76,9 @@
     <string name="cab_menu_delete_app" msgid="7435191475867183689">"Avinstaller appen"</string>
     <string name="cab_menu_app_info" msgid="8593722221450362342">"Informasjon om appen"</string>
     <string name="cab_app_selection_text" msgid="374688303047985416">"Én app er valgt"</string>
-    <string name="cab_widget_selection_text" msgid="1833458597831541241">"Én modul valgt"</string>
-    <string name="cab_folder_selection_text" msgid="7999992513806132118">"Én mappe valgt"</string>
-    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"Én snarvei valgt"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"Én modul er valgt"</string>
+    <string name="cab_folder_selection_text" msgid="7999992513806132118">"Én mappe er valgt"</string>
+    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"Én snarvei er valgt"</string>
     <string name="permlab_install_shortcut" msgid="5632423390354674437">"installere snarveier"</string>
     <string name="permdesc_install_shortcut" msgid="923466509822011139">"Gir apper tillatelse til å legge til snarveier uten innblanding fra brukeren."</string>
     <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"avinstallere snarveier"</string>
@@ -95,20 +97,20 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Appside %1$d av %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Modulside %1$d av %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Velkommen!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Sånn blir du kjent med startsiden"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Føl deg som hjemme."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Opprett flere sider for apper og mapper"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organiser plassen din"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Trykk og hold inne på bakgrunnen for å administrere bakgrunnen, moduler og innstillinger"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Trykk og hold på bakgrunnen for å administrere bakgrunnen, moduler og innstillinger."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Velg noen apper"</string>
-    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Trykk og hold inne på en app for å legge den til på startsiden."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Lag nye mapper for apper"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Trykk og hold inne på en app, og flytt den så oppå et annet appikon"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Trykk og hold på en app for å legge den til på startsiden."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Dette er en mappe"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"For å opprette en som denne, trykker og holder du på en app og flytter den over en annen."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Mappen er åpnet – <xliff:g id="WIDTH">%1$d</xliff:g> ganger <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Trykk for å lukke mappen"</string>
-    <string name="folder_tap_to_rename" msgid="9191075570492871147">"Trykk for å lagre nytt navn"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"Trykk for å lagre det nye navnet"</string>
     <string name="folder_closed" msgid="4100806530910930934">"Mappen ble lukket"</string>
     <string name="folder_renamed" msgid="1794088362165669656">"Mappen heter nå <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="folder_name_format" msgid="6629239338071103179">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 9a935de..e2a2a07 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -19,7 +19,7 @@
 
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="application_name" msgid="5181331383435256801">"Opstartprogramma3"</string>
+    <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
     <string name="home" msgid="7658288663002113681">"Startpagina"</string>
     <string name="uid_name" msgid="7820867637514617527">"Android-kernapps"</string>
     <string name="folder_name" msgid="7371454440695724752"></string>
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d geselecteerd"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d geselecteerd"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Achtergrond %1$d van %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> is geselecteerd"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Verwijderen"</string>
     <string name="pick_image" msgid="1272073934062909527">"Afbeelding kiezen"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Achtergronden"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"App-pagina %1$d van %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widgetpagina %1$d van %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Welkom!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Het startscherm personaliseren"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Personaliseer uw startscherm."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Meer schermen maken voor apps en mappen"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Uw ruimte indelen"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Blijf de achtergrond aanraken om de achtergrond, widgets en instellingen te beheren"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Blijf de achtergrond aanraken om de achtergrond, widgets en instellingen te beheren."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Selecteer een aantal apps"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Als u een app wilt toevoegen aan het startscherm, blijft u de app aanraken."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Nieuwe mappen maken voor uw apps"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Blijf een app aanraken en plaats deze boven op een ander app-pictogram"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Dit is een map"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Als u een map zoals deze wilt maken, blijft u een app aanraken en schuift u deze boven op een andere app."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Map geopend, <xliff:g id="WIDTH">%1$d</xliff:g> bij <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Raak dit aan om de map te sluiten"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 8528af6..b629f3d 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Wybrane: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Wybrane: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Tapeta %1$d z %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Wybrano <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Usuń"</string>
     <string name="pick_image" msgid="1272073934062909527">"Wybierz obraz"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Tapety"</string>
@@ -94,17 +96,17 @@
     <string name="workspace_scroll_format" msgid="8458889198184077399">"Ekran główny %1$d z %2$d"</string>
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Strona aplikacji: %1$d z %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Strona widżetów: %1$d z %2$d"</string>
-    <string name="first_run_cling_title" msgid="7257389003637362144">"Witamy!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Poczuj się jak u siebie"</string>
+    <string name="first_run_cling_title" msgid="7257389003637362144">"Witamy"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Poczuj się jak u siebie."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Dodaj więcej ekranów na aplikacje i foldery"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Uporządkuj obszar roboczy"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Kliknij i przytrzymaj tło, by zmienić tapetę, widżety lub ustawienia"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Kliknij i przytrzymaj tło, by zmienić tapetę, widżety lub ustawienia."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Wybierz kilka aplikacji"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Aby dodać aplikację na ekran główny, dotknij i przytrzymaj jej ikonę."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Utwórz nowe foldery z aplikacjami"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Kliknij i przytrzymaj aplikację, a potem przesuń ją na ikonę innej aplikacji"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Tu jest folder"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Aby utworzyć taki sam, kliknij i przytrzymaj aplikację, a następnie przenieś ją na następną."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Folder otwarty, <xliff:g id="WIDTH">%1$d</xliff:g> na <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Kliknij, by zamknąć folder"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 1050665..1ef3982 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d selecionado(s)"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d selecionado(s)"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Imagem de fundo %1$d de %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> selecionado"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Eliminar"</string>
     <string name="pick_image" msgid="1272073934062909527">"Escolher imagem"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Imagens de fundo"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Página de aplicações %1$d de %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Página de widgets %1$d de %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Bem-vindo(a)!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Sinta-se em casa"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Sinta-se em casa."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crie mais ecrãs para aplicações e pastas"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organizar o seu espaço"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Toque sem soltar na imagem de fundo para gerir a imagem de fundo, os widgets e as definições"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Toque sem soltar no fundo para gerir a imagem de fundo, os widgets e as definições."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Escolher algumas aplicações"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Para adicionar uma aplicação ao Ecrã principal, toque na mesma sem soltar."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Criar pastas novas para as suas aplicações"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Toque sem soltar numa aplicação e mova-a para a parte superior de outro ícone de aplicação"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Eis uma pasta"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Para criar uma pasta, toque sem soltar numa aplicação e arraste-a para cima de outra aplicação."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Pasta aberta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Toque para fechar a pasta"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 1971634..4d40388 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d selecionados"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d selecionados"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Plano de fundo %1$d de %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> selecionado"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Excluir"</string>
     <string name="pick_image" msgid="1272073934062909527">"Escolher imagem"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Planos de fundo"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Página de aplicativos, %1$d de %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Página de widgets, %1$d de %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Bem-vindo!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Sinta-se em casa"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Fique à vontade."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Crie mais telas para aplicativos e pastas"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organize seu espaço"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Toque e mantenha pressionada a tela de fundo para gerenciar o plano de fundo, os widgets e as configurações"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Toque e mantenha pressionada a tela de fundo para gerenciar o plano de fundo, os widgets e as configurações."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Escolha alguns aplicativos"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Para adicionar um aplicativo a sua tela inicial, toque e mantenha-o pressionado."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Crie novas pastas para seus aplicativos"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Toque e mantenha pressionado um aplicativo e então mova-o sobre outro ícone de aplicativo"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Aqui está uma pasta"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Para criar uma pasta como esta, mantenha pressionado um aplicativo e mova-o para cima de outro."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"Ok"</string>
     <string name="folder_opened" msgid="94695026776264709">"Pasta aberta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Toque para fechar a pasta"</string>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index e4f0424..ddcf404 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -31,6 +31,10 @@
     <!-- no translation found for number_of_items_selected:zero (7464587177007785408) -->
     <!-- no translation found for number_of_items_selected:one (142482526010824029) -->
     <!-- no translation found for number_of_items_selected:other (1418352074806573570) -->
+    <!-- no translation found for wallpaper_accessibility_name (1655953108132967972) -->
+    <skip />
+    <!-- no translation found for announce_selection (8338254712932127413) -->
+    <skip />
     <!-- no translation found for wallpaper_delete (8095005658756613921) -->
     <skip />
     <!-- no translation found for pick_image (1272073934062909527) -->
@@ -163,7 +167,7 @@
     <skip />
     <!-- no translation found for first_run_cling_title (7257389003637362144) -->
     <skip />
-    <!-- no translation found for first_run_cling_description (658815204153067813) -->
+    <!-- no translation found for first_run_cling_description (6447072552696253358) -->
     <skip />
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
@@ -171,15 +175,15 @@
     <skip />
     <!-- no translation found for workspace_cling_title (5626202359865825661) -->
     <skip />
-    <!-- no translation found for workspace_cling_move_item (2243369117709858844) -->
+    <!-- no translation found for workspace_cling_move_item (528201129978005352) -->
     <skip />
     <!-- no translation found for all_apps_cling_title (34929250753095858) -->
     <skip />
     <!-- no translation found for all_apps_cling_add_item (400866858451850784) -->
     <skip />
-    <!-- no translation found for folder_cling_title (294708344826056909) -->
+    <!-- no translation found for folder_cling_title (3894908818693254164) -->
     <skip />
-    <!-- no translation found for folder_cling_create_folder (3245124301268588807) -->
+    <!-- no translation found for folder_cling_create_folder (6158215559475836131) -->
     <skip />
     <!-- no translation found for cling_dismiss (8962359497601507581) -->
     <skip />
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 1d72a60..78d9da4 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -25,10 +25,12 @@
     <string name="folder_name" msgid="7371454440695724752"></string>
     <string name="wallpaper_instructions" msgid="563973358787555519">"Setați imaginea de fundal"</string>
   <plurals name="number_of_items_selected">
-    <item quantity="zero" msgid="7464587177007785408">"%1$d selectat"</item>
+    <item quantity="zero" msgid="7464587177007785408">"%1$d selectate"</item>
     <item quantity="one" msgid="142482526010824029">"%1$d selectat"</item>
-    <item quantity="other" msgid="1418352074806573570">"%1$d selectat"</item>
+    <item quantity="other" msgid="1418352074806573570">"%1$d selectate"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Imaginea de fundal %1$d din %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"S-a selectat <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Ștergeți"</string>
     <string name="pick_image" msgid="1272073934062909527">"Alegeți imaginea"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Imagini de fundal"</string>
@@ -37,10 +39,10 @@
     <string name="widgets_tab_label" msgid="2921133187116603919">"Widgeturi"</string>
     <string name="widget_adder" msgid="3201040140710381657">"Widgeturi"</string>
     <string name="toggle_weight_watcher" msgid="5645299835184636119">"Afișați memoria"</string>
-    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Atingeți/mențineți apăsat un widget pt. a-l alege."</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Atingeți lung un widget pentru a-l alege."</string>
     <string name="market" msgid="2619650989819296998">"Cumpărați"</string>
     <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
-    <string name="external_drop_widget_error" msgid="3165821058322217155">"Nu am putut plasa articolul pe ecranul de pornire."</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"Nu se poate plasa articolul pe ecranul de pornire."</string>
     <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Alegeți widgetul de creat"</string>
     <string name="rename_folder_label" msgid="3727762225964550653">"Numele dosarului"</string>
     <string name="rename_folder_title" msgid="3771389277707820891">"Redenumiți dosarul"</string>
@@ -54,10 +56,10 @@
     <string name="out_of_space" msgid="4691004494942118364">"Nu mai este loc pe acest Ecran de pornire."</string>
     <string name="hotseat_out_of_space" msgid="9139760413395605841">"Nu mai este loc în bara de lansare rapidă."</string>
     <string name="invalid_hotseat_item" msgid="1211534262129849507">"Acest widget este prea mare pentru bara de lansare rapidă."</string>
-    <string name="shortcut_installed" msgid="1701742129426969556">"A fost creată comanda rapidă „<xliff:g id="NAME">%s</xliff:g>\"."</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>\" a fost creată."</string>
     <string name="shortcut_uninstalled" msgid="8176767991305701821">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>” a fost eliminată."</string>
     <string name="shortcut_duplicate" msgid="9167217446062498127">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>” există deja."</string>
-    <string name="title_select_shortcut" msgid="6680642571148153868">"Alegeți o comandă rapidă"</string>
+    <string name="title_select_shortcut" msgid="6680642571148153868">"Alegeți comanda rapidă"</string>
     <string name="title_select_application" msgid="3280812711670683644">"Alegeți aplicația"</string>
     <string name="all_apps_button_label" msgid="9110807029020582876">"Aplicații"</string>
     <string name="all_apps_home_button_label" msgid="252062713717058851">"Ecran de pornire"</string>
@@ -74,18 +76,18 @@
     <string name="cab_menu_delete_app" msgid="7435191475867183689">"Dezinstalați aplicația"</string>
     <string name="cab_menu_app_info" msgid="8593722221450362342">"Detalii despre aplicație"</string>
     <string name="cab_app_selection_text" msgid="374688303047985416">"1 aplicație selectată"</string>
-    <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 obiect widget selectat"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"1 widget selectat"</string>
     <string name="cab_folder_selection_text" msgid="7999992513806132118">"1 dosar selectat"</string>
     <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"1 comandă rapidă selectată"</string>
-    <string name="permlab_install_shortcut" msgid="5632423390354674437">"instalați comenzi rapide"</string>
-    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite unei aplicații să adauge comenzi rapide, fără intervenția utilizatorului."</string>
-    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"dezinstalați comenzi rapide"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Permite aplicației să elimine comenzile rapide, fără intervenția utilizatorului."</string>
-    <string name="permlab_read_settings" msgid="1941457408239617576">"citiți setările și comenzile rapide pentru ecranul de pornire"</string>
+    <string name="permlab_install_shortcut" msgid="5632423390354674437">"instalează comenzi rapide"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite unei aplicații să adauge comenzi rapide fără intervenția utilizatorului."</string>
+    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"dezinstalează comenzi rapide"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Permite aplicației să elimine comenzi rapide fără intervenția utilizatorului."</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"citește setări și comenzi rapide pentru ecranul de pornire"</string>
     <string name="permdesc_read_settings" msgid="5833423719057558387">"Permite aplicației să citească setările și comenzile rapide din ecranul de pornire."</string>
-    <string name="permlab_write_settings" msgid="3574213698004620587">"scrieți setările și comenzile rapide pentru ecranul de pornire"</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"scrie setări și comenzi rapide pentru ecranul de pornire"</string>
     <string name="permdesc_write_settings" msgid="5440712911516509985">"Permite aplicației să modifice setările și comenzile rapide din ecranul de pornire."</string>
-    <string name="gadget_error_text" msgid="6081085226050792095">"Probleme la încărcarea obiectului widget"</string>
+    <string name="gadget_error_text" msgid="6081085226050792095">"Problemă la încărcarea widgetului"</string>
     <string name="uninstall_system_app_text" msgid="4172046090762920660">"Aceasta este o aplicație de sistem și nu poate fi dezinstalată."</string>
     <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
     <string name="folder_hint_text" msgid="6617836969016293992">"Dosar fără nume"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Pagina de aplicații %1$d din %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Pagina de widgeturi %1$d din %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Bun venit!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Simțiți-vă ca acasă"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Simțiți-vă ca acasă."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Creați mai multe ecrane pentru aplicații și dosare"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organizați-vă spațiul"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Atingeți și mențineți apăsat fundalul pentru a gestiona imaginea de fundal, widgeturile și setările"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Atingeți lung fundalul pentru a gestiona imaginea de fundal, widgeturile și setările."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Alegeți unele aplicații"</string>
-    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Atingeți o aplicație și mențineți-o apăsată pentru a o adăuga pe ecranul de pornire."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Creați dosare noi pentru aplicațiile dvs."</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Atingeți și țineți apăsată o aplicație, apoi mutați-o deasupra pictogramei altei aplicații"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Atingeți lung o aplicație pentru a o adăuga pe ecranul de pornire."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Iată un dosar"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Pentru a crea un dosar similar, atingeți și țineți degetul pe o aplicație, apoi mutați-o deasupra alteia."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Dosar deschis, <xliff:g id="WIDTH">%1$d</xliff:g> pe <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Atingeți pentru a închide dosarul"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 8fd7c34..06fbd26 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Выбрано: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Выбрано: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Обои %1$d из %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Выбран элемент \"<xliff:g id="LABEL">%1$s</xliff:g>\""</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Удалить"</string>
     <string name="pick_image" msgid="1272073934062909527">"Выбрать изображение"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Обои"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Приложения: стр. %1$d из %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Виджеты: стр. %1$d из %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Добро пожаловать!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Будьте как дома"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Будьте как дома"</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Создание дополнительных экранов для приложений и папок"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Организация рабочего пространства"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Чтобы перейти к управлению обоями, виджетами и настройками, нажмите на фоновое изображение и удерживайте его."</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Чтобы перейти к управлению обоями, виджетами и настройками, нажмите на фоновое изображение и удерживайте его."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Выберите приложения"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Чтобы добавить приложение на главный экран, нажмите на значок и удерживайте его."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Создание папок для приложений"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Нажмите на значок приложения и удерживайте его, затем перенесите его на значок другого приложения."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Это папка"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Чтобы создать папку, нажмите и удерживайте значок приложения, а затем перетащите его на другой значок."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"ОК"</string>
     <string name="folder_opened" msgid="94695026776264709">"Папка открыта, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Нажмите, чтобы закрыть папку"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index f477b42..29de526 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Počet vybratých položiek: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Počet vybratých položiek: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Tapeta %1$d z %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Vybratá položka <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Odstrániť"</string>
     <string name="pick_image" msgid="1272073934062909527">"Vybrať obrázok"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Tapety"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Stránka aplikácií %1$d z %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Stránka miniaplikácií %1$d z %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Vitajte!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Prispôsobte si zariadenie na mieru"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Cíťte sa tu ako doma."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Vytvorte viac obrazoviek pre aplikácie a priečinky"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Usporiadajte svoj priestor"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Ak chcete spravovať tapetu, miniaplikácie a nastavenia, dotknite sa pozadia a podržte"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Ak chcete spravovať tapetu, miniaplikácie a nastavenia, dotknite sa pozadia a podržte."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Vyberte niektoré aplikácie"</string>
-    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ak chcete pridať aplikáciu na plochu, dotknite sa jej a podržte ju."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Vytvorte nové priečinky pre aplikácie"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Dotknite sa aplikácie a podržte ju. Potom ju presuňte na inú aplikáciu."</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ak chcete pridať aplikáciu na plochu, dotknite sa jej a podržte."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Tu je priečinok"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Ak chcete vytvoriť takýto priečinok, dotknite sa príslušnej aplikácie a podržte ju. Potom ju presuňte na druhú aplikáciu."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Otvorený priečinok, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Dotykom zavriete priečinok"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 40c1634..021eca8 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Št. izbranih: %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Št. izbranih: %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Ozadje %1$d od %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Izbrano: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Izbriši"</string>
     <string name="pick_image" msgid="1272073934062909527">"Izberi sliko"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Ozadja"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Stran aplikacij %1$d od %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Stran pripomočkov %1$d od %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Pozdravljeni!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Počutite se kot doma"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Počutite se kot doma."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Ustvarite več zaslonov za aplikacije in mape"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organizirajte svoj prostor"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Če želite upravljati ozadje, pripomočke in nastavitve, se dotaknite ozadja in ga pridržite."</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Če želite upravljati ozadje, pripomočke in nastavitve, se dotaknite ozadja in ga pridržite."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Izberite nekaj aplikacij"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Če želite dodati aplikacijo na začetni zaslon, se je dotaknite in jo pridržite."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Ustvarite nove mape za aplikacije"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Dotaknite se aplikacije in jo pridržite ter jo nato premaknite na vrh druge ikone aplikacije"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"To je mapa"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Če želite ustvariti mapo, podobno tej, se dotaknite aplikacije in jo pridržite, nato pa jo premaknite nad drugo."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"V redu"</string>
     <string name="folder_opened" msgid="94695026776264709">"Mapa je odprta, <xliff:g id="WIDTH">%1$d</xliff:g> krat <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Dotaknite se, da zaprete mapo"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index f94fb25..06d80ef 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Изабрана je %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Изабранo je %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Позадина %1$d од %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Изабрано је <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Избриши"</string>
     <string name="pick_image" msgid="1272073934062909527">"Изабери слику"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Позадине"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"%1$d. страница апликација од %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"%1$d. страница виџета од %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Добро дошли!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Осећајте се као код куће"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Осећајте се као код куће."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Направите још екрана за апликације и директоријуме"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Организујте простор"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Додирните и задржите позадину да бисте управљали позадином, виџетима и подешавањима"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Додирните позадину и задржите да бисте управљали позадином, виџетима и подешавањима."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Изаберите неколико апликација"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Да бисте додали апликацију на почетни екран, додирните је и задржите."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Направите нове директоријуме за апликације"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Додирните и задржите апликацију, па је преместите на икону друге апликације"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Ево једног директоријума"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Да бисте направили директоријум попут овога, додирните и задржите апликацију, па је превуците преко друге."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"Потврди"</string>
     <string name="folder_opened" msgid="94695026776264709">"Директоријум је отворен, <xliff:g id="WIDTH">%1$d</xliff:g> пута <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Додирните да бисте затворили директоријум"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 85e86fb..bf75200 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d har valts"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d har valts"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Bakgrund %1$d av %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> har valts"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Ta bort"</string>
     <string name="pick_image" msgid="1272073934062909527">"Välj bild"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Bakgrunder"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Appsida %1$d av %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widget-sida %1$d av %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Välkommen!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Känn dig som hemma"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Känn dig som hemma."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Skapa fler skärmar för appar och mappar"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Organisera ditt utrymme"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Tryck och håll ned bakgrunden för att hantera widgetar, inställningar och bakgrundsbilder"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Tryck länge på bakgrunden om du vill hantera bakgrundsbilder, widgetar och inställningar."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Välj några appar"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Om du vill lägga till en app på startskärmen trycker du länge på den."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Skapa nya mappar för dina appar"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Tryck och håll ned en app och placera den sedan på en annan appikon"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Det här är en mapp"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Om du vill skapa en till mapp av det här slaget trycker du länge på en app och drar den sedan ovanpå en annan."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Mappen är öppen, <xliff:g id="WIDTH">%1$d</xliff:g> gånger <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Tryck om du vill stänga mappen"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 39f8424..606a80d 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d zimechaguliwa"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d zimechaguliwa"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Mandhari %1$d ya %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> iliyochaguliwa"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Futa"</string>
     <string name="pick_image" msgid="1272073934062909527">"Chukua picha"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Mandhari"</string>
@@ -36,24 +38,24 @@
     <string name="activity_not_found" msgid="8071924732094499514">"Programu haijasakinishwa."</string>
     <string name="widgets_tab_label" msgid="2921133187116603919">"Wijeti"</string>
     <string name="widget_adder" msgid="3201040140710381657">"Wijeti"</string>
-    <string name="toggle_weight_watcher" msgid="5645299835184636119">"Onyesha Mem"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"Onyesha Kumbukumbu"</string>
     <string name="long_press_widget_to_add" msgid="7699152356777458215">"Gusa na ushikilie ili kuteua wijeti."</string>
     <string name="market" msgid="2619650989819296998">"Nunua"</string>
     <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
-    <string name="external_drop_widget_error" msgid="3165821058322217155">"Haikuweza kudondosha kipengee kwenye skrini hii ya Nyumbani."</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"Haikuweza kudondosha kipengee kwenye skrini hii ya Kwanza."</string>
     <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Chagua wijeti ili uunde"</string>
     <string name="rename_folder_label" msgid="3727762225964550653">"Jina la folda"</string>
-    <string name="rename_folder_title" msgid="3771389277707820891">"Ipe jina jipya folda"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"lipe folda jina jipya"</string>
     <string name="rename_action" msgid="5559600076028658757">"SAWA"</string>
     <string name="cancel_action" msgid="7009134900002915310">"Ghairi"</string>
-    <string name="menu_item_add_item" msgid="1264911265836810421">"Ongeza kwenye skrini ya Nyumbani"</string>
+    <string name="menu_item_add_item" msgid="1264911265836810421">"Ongeza kwenye skrini ya Mwanzo"</string>
     <string name="group_applications" msgid="3797214114206693605">"Programu"</string>
     <string name="group_shortcuts" msgid="6012256992764410535">"Njia za mkato"</string>
     <string name="group_widgets" msgid="1569030723286851002">"Wijeti"</string>
     <string name="completely_out_of_space" msgid="6106288382070760318">"Hakuna nafasi zaidi kwenye skrini zako za Nyumbani."</string>
-    <string name="out_of_space" msgid="4691004494942118364">"Hakuna nafasi katika skrini hii ya Nyumbani."</string>
-    <string name="hotseat_out_of_space" msgid="9139760413395605841">"Hakuna nafasi zaidi kwenye hotseat."</string>
-    <string name="invalid_hotseat_item" msgid="1211534262129849507">"Wijeti hii ni kubwa zaidi kwa hotseat."</string>
+    <string name="out_of_space" msgid="4691004494942118364">"Hakuna nafasi katika skrini hii ya Mwanzo."</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"Hakuna nafasi zaidi kwenye eneo kali."</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"Wijeti hii ni kubwa zaidi kwa eneo kali."</string>
     <string name="shortcut_installed" msgid="1701742129426969556">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" imeundwa."</string>
     <string name="shortcut_uninstalled" msgid="8176767991305701821">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" iliondolewa."</string>
     <string name="shortcut_duplicate" msgid="9167217446062498127">"\"<xliff:g id="NAME">%s</xliff:g>\" la njia ya mkato tayari lipo."</string>
@@ -66,7 +68,7 @@
     <string name="delete_target_label" msgid="1822697352535677073">"Ondoa"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Ondoa"</string>
     <string name="info_target_label" msgid="8053346143994679532">"Maelezo ya programu"</string>
-    <string name="accessibility_search_button" msgid="1628520399424565142">"Tafuta na Google"</string>
+    <string name="accessibility_search_button" msgid="1628520399424565142">"Tafuta"</string>
     <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Kutafuta kwa Kutamka"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Programu"</string>
     <string name="accessibility_delete_button" msgid="6466114477993744621">"Ondoa"</string>
@@ -82,14 +84,14 @@
     <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"ondoa njia za mikato"</string>
     <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Huruhusu programu kuondoa njia za mikato bila mtumiaji kuingilia kati."</string>
     <string name="permlab_read_settings" msgid="1941457408239617576">"soma mipangilio ya Mwanzo na njia za mkato"</string>
-    <string name="permdesc_read_settings" msgid="5833423719057558387">"Huruhusu programu kusoma mipangilio na njia za mikato katika Mwanzo."</string>
-    <string name="permlab_write_settings" msgid="3574213698004620587">"andika mipangilio ya Mwanzo na njia za mkato"</string>
-    <string name="permdesc_write_settings" msgid="5440712911516509985">"Huruhusu programu kubadilisha mipangilio na njia za mkato katika Mwanzo."</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"Huruhusu programu kusoma mipangilio na njia za mikato zilizo katika skirini ya Mwanzo."</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"andika mipangilio ya skrini ya Mwanzo na njia za mkato"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"Huruhusu programu kubadilisha mipangilio na njia za mkato katika skrini ya Mwanzo."</string>
     <string name="gadget_error_text" msgid="6081085226050792095">"Tatizo la kupakia wijeti"</string>
-    <string name="uninstall_system_app_text" msgid="4172046090762920660">"Hii ni programu ya mfumo na haiwezi kusaniduliwa."</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"Hii ni programu ya mfumo na haiwezi kuondolewa."</string>
     <string name="dream_name" msgid="1530253749244328964">"Kizinduzi cha Roketi"</string>
     <string name="folder_hint_text" msgid="6617836969016293992">"Folda isiyo na jina"</string>
-    <string name="workspace_description_format" msgid="2950174241104043327">"Skrini ya nyumbani %1$d"</string>
+    <string name="workspace_description_format" msgid="2950174241104043327">"Skrini ya mwazo %1$d"</string>
     <string name="default_scroll_format" msgid="7475544710230993317">"Ukurasa%1$d wa %2$d"</string>
     <!-- String.format failed for translation -->
     <!-- no translation found for workspace_scroll_format (8458889198184077399) -->
@@ -97,22 +99,22 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Ukurasa wa programu %1$d ya %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Ukurasa wa wijeti %1$d ya %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Karibu!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Jisikie huru"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Jisikie huru."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Unda skrini zaidi za programu na folda"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Panga nafasi yako"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Gusa na ushikile mandharinyuma ili kusimamia mandhari, wijeti, na mipangilio"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Gusa na ushikile mandharinyuma ili udhibiti mandhari, wijeti, na mipangilio."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Chagua programu kadhaa"</string>
-    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ili kuongeza programu kwenye Skrini yako ya nyumbani, iguse na uishikilie."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Unda folda mpya za programu zako"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Gusa na ushikilie programu, kisha isogeze juu ya ikoni ya programu nyingine"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ili kuongeza programu kwenye Skrini yako Kuu, iguse na uishikilie."</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Folda hii hapa"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Ili kuunda kama hii, gusa na ushikilie programu, kisha ipitishe juu ya nyingine."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"SAWA"</string>
     <string name="folder_opened" msgid="94695026776264709">"Folda imefunguliwa, <xliff:g id="WIDTH">%1$d</xliff:g> kwa <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Gusa ili ufunge folda"</string>
-    <string name="folder_tap_to_rename" msgid="9191075570492871147">"Gusa kuhifadhi upaji jina jipya"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"Gusa ili uhifadhi jina jipya"</string>
     <string name="folder_closed" msgid="4100806530910930934">"Folda imefungwa"</string>
-    <string name="folder_renamed" msgid="1794088362165669656">"Folda imebadilishwa jina hadi <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_renamed" msgid="1794088362165669656">"Folda imebadilishwa jina kuwa <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="folder_name_format" msgid="6629239338071103179">"Folda: <xliff:g id="NAME">%1$s</xliff:g>"</string>
     <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
     <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
diff --git a/res/values-sw720dp/styles.xml b/res/values-sw720dp/styles.xml
index 7269e8d..9738a12 100644
--- a/res/values-sw720dp/styles.xml
+++ b/res/values-sw720dp/styles.xml
@@ -53,6 +53,8 @@
 <!-- Workspace -->
     <style name="Theme" parent="android:Theme.Holo.Wallpaper.NoTitleBar">
         <item name="android:windowActionModeOverlay">true</item>
+        <item name="android:windowTranslucentStatus">true</item>
+        <item name="android:windowTranslucentNavigation">true</item>
     </style>
 
     <style name="TabIndicator.AppsCustomize">
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index c68c66b..68118a7 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"เลือกไว้ %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"เลือกไว้ %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"วอลเปเปอร์ %1$d จาก %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"เลือก <xliff:g id="LABEL">%1$s</xliff:g> แล้ว"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"ลบ"</string>
     <string name="pick_image" msgid="1272073934062909527">"เลือกภาพ"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"วอลเปเปอร์"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"แอปหน้า %1$d จาก %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"วิดเจ็ตหน้า %1$d จาก %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"ยินดีต้อนรับ!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"ทำตัวตามสบาย"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"ทำตัวตามสบาย"</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"สร้างหน้าจอเพิ่มสำหรับแอปและโฟลเดอร์"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"จัดระเบียบพื้นที่ของคุณ"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"แตะพื้นหลังค้างไว้เพื่อจัดการวอลล์เปเปอร์ วิดเจ็ต และการตั้งค่า"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"แตะพื้นหลังค้างไว้เพื่อจัดการวอลเปเปอร์ วิดเจ็ต และการตั้งค่า"</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"เลือกบางแอป"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"หากต้องการเพิ่มแอปลงในหน้าจอหลัก ให้แตะแอปค้างไว้"</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"สร้างโฟลเดอร์ใหม่สำหรับแอปของคุณ"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"แตะแอปค้างไว้แล้วย้ายไปที่ด้านบนของอีกไอคอนแอป"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"นี่คือโฟลเดอร์"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"หากต้องการสร้างโฟลเดอร์ลักษณะนี้ แตะแอปค้างไว้ แล้วย้ายไปทับอีกแอปหนึ่ง"</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"ตกลง"</string>
     <string name="folder_opened" msgid="94695026776264709">"เปิดโฟลเดอร์ <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"แตะเพื่อปิดโฟลเดอร์"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 44bab7a..56801b4 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d ang napili"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d ang napili"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Wallpaper %1$d ng %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Napili ang <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Tanggalin"</string>
     <string name="pick_image" msgid="1272073934062909527">"Pumili ng larawan"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Mga Wallpaper"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Pahina ng apps %1$d ng %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Pahina ng widget %1$d ng %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Maligayang pagdating!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Gawing kumportable ang iyong sarili"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Gawing kumportable ang iyong sarili."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Gumawa ng higit pang mga screen para sa apps at mga folder"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Ayusin ang iyong espasyo"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Pindutin nang matagal ang background upang pamahalaan ang wallpaper, mga widget at mga setting"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Pindutin nang matagal ang background upang pamahalaan ang wallpaper, mga widget at setting"</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Pumili ng ilang apps"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Upang magdagdag ng app sa iyong Home screen, pindutin ito nang matagal."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Gumawa ng mga bagong folder para sa iyong apps"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Pindutin nang matagal ang isang app, pagkatapos ay ilipat ito sa itaas ng isa pang icon ng app"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Narito ang isang folder"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Upang gumawa ng katulad nito, pindutin nang matagal ang isang app, pagkatapos ay ilipat ito sa isa pang folder."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Binuksan ang folder, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Pindutin upang isara ang folder"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index e9e0d1d..dbbdee2 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d tane seçildi"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d tane seçildi"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Duvar kağıdı %1$d / %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> seçildi"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Sil"</string>
     <string name="pick_image" msgid="1272073934062909527">"Resim seç"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Duvar Kağıtları"</string>
@@ -51,9 +53,9 @@
     <string name="group_shortcuts" msgid="6012256992764410535">"Kısayollar"</string>
     <string name="group_widgets" msgid="1569030723286851002">"Widget\'lar"</string>
     <string name="completely_out_of_space" msgid="6106288382070760318">"Ana ekranlarınızda yer kalmadı."</string>
-    <string name="out_of_space" msgid="4691004494942118364">"Bu Ana ekranda başka yer yok."</string>
-    <string name="hotseat_out_of_space" msgid="9139760413395605841">"Favori kısayollarda yer yok"</string>
-    <string name="invalid_hotseat_item" msgid="1211534262129849507">"Bu widget, favori kısayollar için çok büyük."</string>
+    <string name="out_of_space" msgid="4691004494942118364">"Bu Ana ekranda yer kalmadı."</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"Favori kısa yollarda yer yok"</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"Bu widget, favori kısa yollar için çok büyük."</string>
     <string name="shortcut_installed" msgid="1701742129426969556">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu oluşturuldu."</string>
     <string name="shortcut_uninstalled" msgid="8176767991305701821">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu kaldırıldı."</string>
     <string name="shortcut_duplicate" msgid="9167217446062498127">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu zaten var."</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Uygulama sayfası %1$d / %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Widget sayfası %1$d / %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Hoş geldiniz!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Kendinizi Evinizde Hissedin"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Rahatınıza bakın."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Uygulamalar ve klasörler için daha fazla ekran oluşturun"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Alanınızı düzenleyin"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Duvar kağıdını, widget\'ları ve ayarları yönetmek için arka plana dokunun ve basılı tutun"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Duvar kağıdını, widget\'ları ve ayarları yönetmek için arka plana uzun basın."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"İstediğiniz uygulamaları seçin"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Bir uygulamayı Ana ekranınıza eklemek için, ilgili uygulamayı basılı tutun."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Uygulamalarınız için yeni klasörler oluşturun"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Bir uygulamayı basılı tutun ve sonra, başka bir uygulama simgesinin üzerine taşıyın"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"İşte bir klasör"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Buna benzer bir klasör oluşturmak için uygulamaya uzun basın ve sonra uygulamayı başka bir uygulamanın üzerine taşıyın."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"Tamam"</string>
     <string name="folder_opened" msgid="94695026776264709">"Klasör açıldı, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Klasörü kapatmak için dokunun"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index dbe020b..e0f3211 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Вибрано %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Вибрано %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Фоновий малюнок %1$d з %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"Вибрано <xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Видалити"</string>
     <string name="pick_image" msgid="1272073934062909527">"Вибрати зображення"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Фонові малюнки"</string>
@@ -37,10 +39,10 @@
     <string name="widgets_tab_label" msgid="2921133187116603919">"Віджети"</string>
     <string name="widget_adder" msgid="3201040140710381657">"Віджети"</string>
     <string name="toggle_weight_watcher" msgid="5645299835184636119">"Показати пам’ять"</string>
-    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Торкніться й утримуйте, щоб вибрати віджет."</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"Натисніть і утримуйте, щоб вибрати віджет."</string>
     <string name="market" msgid="2619650989819296998">"Магазин"</string>
     <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
-    <string name="external_drop_widget_error" msgid="3165821058322217155">"Не вдалося помістити елемент на цей головний екран"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"Не вдалося додати елемент на цей головний екран."</string>
     <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"Вибрати віджет для створення"</string>
     <string name="rename_folder_label" msgid="3727762225964550653">"Назва папки"</string>
     <string name="rename_folder_title" msgid="3771389277707820891">"Перейменувати папку"</string>
@@ -52,8 +54,8 @@
     <string name="group_widgets" msgid="1569030723286851002">"Віджети"</string>
     <string name="completely_out_of_space" msgid="6106288382070760318">"На головних екранах більше немає місця."</string>
     <string name="out_of_space" msgid="4691004494942118364">"На цьому головному екрані більше немає місця."</string>
-    <string name="hotseat_out_of_space" msgid="9139760413395605841">"На гарячій панелі більше немає місця."</string>
-    <string name="invalid_hotseat_item" msgid="1211534262129849507">"Цей віджет завеликий для гарячої панелі."</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"Немає вільного місця."</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"Цей віджет завеликий."</string>
     <string name="shortcut_installed" msgid="1701742129426969556">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" створено."</string>
     <string name="shortcut_uninstalled" msgid="8176767991305701821">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" вилучено."</string>
     <string name="shortcut_duplicate" msgid="9167217446062498127">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" уже існує."</string>
@@ -65,7 +67,7 @@
     <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"Видалити"</string>
     <string name="delete_target_label" msgid="1822697352535677073">"Вилучити"</string>
     <string name="delete_target_uninstall_label" msgid="5100785476250872595">"Видалити"</string>
-    <string name="info_target_label" msgid="8053346143994679532">"Інформація про програму"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"Про програму"</string>
     <string name="accessibility_search_button" msgid="1628520399424565142">"Пошук"</string>
     <string name="accessibility_voice_search_button" msgid="4637324840434406584">"Голосовий пошук"</string>
     <string name="accessibility_all_apps_button" msgid="2603132375383800483">"Програми"</string>
@@ -78,9 +80,9 @@
     <string name="cab_folder_selection_text" msgid="7999992513806132118">"Вибрано 1 папку"</string>
     <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"Вибрано 1 ярлик"</string>
     <string name="permlab_install_shortcut" msgid="5632423390354674437">"установлювати ярлики"</string>
-    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Дозволяє програмі додавати ярлики без втручання користувача."</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"Дозволяє програмі самостійно додавати ярлики."</string>
     <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"видаляти ярлики"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Дозволяє програмі вилучати ярлики без втручання користувача."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"Дозволяє програмі самостійно вилучати ярлики."</string>
     <string name="permlab_read_settings" msgid="1941457408239617576">"читати налаштування та ярлики головного екрана"</string>
     <string name="permdesc_read_settings" msgid="5833423719057558387">"Дозволяє програмі читати налаштування та ярлики на головному екрані."</string>
     <string name="permlab_write_settings" msgid="3574213698004620587">"записувати налаштування та ярлики головного екрана"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Сторінка програм %1$d з %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Сторінка віджетів %1$d з %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Вітаємо!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Ознайомтеся з пристроєм"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Будьте як удома."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Створюйте нові екрани для програм і папок"</string>
-    <string name="workspace_cling_title" msgid="5626202359865825661">"Упорядкуйте свій простір"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Торкніться й утримуйте фон, щоб керувати фоновим малюнком, віджетами та налаштуваннями"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"Організуйте робочий простір"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Натисніть і утримуйте фон, щоб керувати фоновим малюнком, віджетами та налаштуваннями."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Виберіть програми"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Щоб додати програму на головний екран, торкніться й утримуйте її."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Створюйте нові папки для своїх програм"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Торкніться й утримуйте програму, а потім перемістіть її на піктограму іншої програми"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Це папка"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Щоб створити папку, натисніть і утримуйте програму, а потім перетягніть її на іншу."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OК"</string>
     <string name="folder_opened" msgid="94695026776264709">"Папку відкрито (<xliff:g id="WIDTH">%1$d</xliff:g> х <xliff:g id="HEIGHT">%2$d</xliff:g>)"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Торкніться, щоб закрити папку"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 16bceeb..3b081d0 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"Đã chọn %1$d"</item>
     <item quantity="other" msgid="1418352074806573570">"Đã chọn %1$d"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Hình nền %1$d / %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"<xliff:g id="LABEL">%1$s</xliff:g> được chọn"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Xóa"</string>
     <string name="pick_image" msgid="1272073934062909527">"Chọn hình ảnh"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Hình nền"</string>
@@ -90,21 +92,21 @@
     <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
     <string name="folder_hint_text" msgid="6617836969016293992">"Thư mục chưa đặt tên"</string>
     <string name="workspace_description_format" msgid="2950174241104043327">"Màn hình chính %1$d"</string>
-    <string name="default_scroll_format" msgid="7475544710230993317">"Trang %1$d trong tổng số %2$d"</string>
-    <string name="workspace_scroll_format" msgid="8458889198184077399">"Màn hình chính %1$d trong tổng số %2$d"</string>
-    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Trang ứng dụng %1$d trong tổng số %2$d"</string>
-    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Trang tiện ích con %1$d trong tổng số %2$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"Trang %1$d / %2$d"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"Màn hình chính %1$d / %2$d"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Trang ứng dụng %1$d / %2$d"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Trang tiện ích con %1$d / %2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Xin chào!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Tự nhiên như ở nhà"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Tự nhiên như ở nhà."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Tạo thêm màn hình cho ứng dụng và thư mục"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Sắp xếp không gian của bạn"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Chạm và giữ nền để quản lý hình nền, tiện ích con và cài đặt"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Chạm và giữ nền để quản lý hình nền, tiện ích con và cài đặt."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Chọn một số ứng dụng"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Để thêm ứng dụng vào Màn hình chính của bạn, chạm và giữ ứng dụng đó."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Tạo thư mục mới cho ứng dụng của bạn"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Chạm và giữ ứng dụng, sau đó di chuyển ứng dụng lên trên biểu tượng ứng dụng khác"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Đây là một thư mục"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Để tạo thư mục như thế này, hãy chạm và giữ một ứng dụng, sau đó di chuyển ứng dụng đó lên trên một ứng dụng khác."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"OK"</string>
     <string name="folder_opened" msgid="94695026776264709">"Đã mở thư mục, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Chạm để đóng thư mục"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 564c772..43a57c4 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -20,7 +20,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
-    <string name="home" msgid="7658288663002113681">"主屏幕"</string>
+    <string name="home" msgid="7658288663002113681">"主屏"</string>
     <string name="uid_name" msgid="7820867637514617527">"Android 核心应用"</string>
     <string name="folder_name" msgid="7371454440695724752"></string>
     <string name="wallpaper_instructions" msgid="563973358787555519">"设置壁纸"</string>
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"已选择%1$d项"</item>
     <item quantity="other" msgid="1418352074806573570">"已选择%1$d项"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"第%1$d张壁纸,共%2$d张"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"已选择<xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"删除"</string>
     <string name="pick_image" msgid="1272073934062909527">"选择图片"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"壁纸"</string>
@@ -39,8 +41,8 @@
     <string name="toggle_weight_watcher" msgid="5645299835184636119">"显示内存空间"</string>
     <string name="long_press_widget_to_add" msgid="7699152356777458215">"触摸并按住小部件即可选择。"</string>
     <string name="market" msgid="2619650989819296998">"商店"</string>
-    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d×%2$d"</string>
-    <string name="external_drop_widget_error" msgid="3165821058322217155">"无法将相关项拖放到此主屏幕上。"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"无法将相关内容拖放到此主屏幕上。"</string>
     <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"选择要创建的小部件"</string>
     <string name="rename_folder_label" msgid="3727762225964550653">"文件夹名称"</string>
     <string name="rename_folder_title" msgid="3771389277707820891">"重命名文件夹"</string>
@@ -87,28 +89,28 @@
     <string name="permdesc_write_settings" msgid="5440712911516509985">"允许应用更改主屏幕中的设置和快捷方式。"</string>
     <string name="gadget_error_text" msgid="6081085226050792095">"加载小部件时出现问题"</string>
     <string name="uninstall_system_app_text" msgid="4172046090762920660">"这是系统应用,无法卸载。"</string>
-    <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
+    <string name="dream_name" msgid="1530253749244328964">"火箭发射器"</string>
     <string name="folder_hint_text" msgid="6617836969016293992">"未命名文件夹"</string>
     <string name="workspace_description_format" msgid="2950174241104043327">"主屏幕%1$d"</string>
     <string name="default_scroll_format" msgid="7475544710230993317">"第%1$d页,共%2$d页"</string>
-    <string name="workspace_scroll_format" msgid="8458889198184077399">"主屏幕:第%1$d页,共%2$d页"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"主屏幕:第%1$d屏,共%2$d屏"</string>
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"应用:第%1$d页,共%2$d页"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"小部件:第%1$d页,共%2$d页"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"欢迎!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"您的主屏幕您做主"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"您的主屏幕您做主。"</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
-    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"创建更多屏幕空间容纳应用和文件夹"</string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"添加更多屏幕来容纳应用和文件夹"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"整理您的空间"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"触摸并按住背景即可管理壁纸、小部件和设置"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"触摸并按住背景,即可管理壁纸、小部件和设置。"</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"选择一些应用"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"要将应用添加到主屏幕,请触摸并按住该应用。"</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"创建新文件夹容纳您的应用"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"触摸并按住某个应用,然后将其移到另一个应用图标上"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"这是一个文件夹"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"要创建一个类似的文件夹,请触摸并按住某个应用,然后将其移至另一个应用上。"</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"确定"</string>
-    <string name="folder_opened" msgid="94695026776264709">"文件夹已打开,尺寸为<xliff:g id="WIDTH">%1$d</xliff:g>×<xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_opened" msgid="94695026776264709">"文件夹已打开,大小为<xliff:g id="WIDTH">%1$d</xliff:g>×<xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"触摸可关闭文件夹"</string>
-    <string name="folder_tap_to_rename" msgid="9191075570492871147">"触摸可保存重命名的名称"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"触摸可保存新名称"</string>
     <string name="folder_closed" msgid="4100806530910930934">"文件夹已关闭"</string>
     <string name="folder_renamed" msgid="1794088362165669656">"已将文件夹重命名为“<xliff:g id="NAME">%1$s</xliff:g>”"</string>
     <string name="folder_name_format" msgid="6629239338071103179">"文件夹:<xliff:g id="NAME">%1$s</xliff:g>"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..eb3def4
--- /dev/null
+++ b/res/values-zh-rHK/strings.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+/*
+* Copyright (C) 2008 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string name="application_name" msgid="5181331383435256801">"Launcher3"</string>
+    <string name="home" msgid="7658288663002113681">"主畫面"</string>
+    <string name="uid_name" msgid="7820867637514617527">"Android 核心應用程式"</string>
+    <string name="folder_name" msgid="7371454440695724752"></string>
+    <string name="wallpaper_instructions" msgid="563973358787555519">"設定桌布"</string>
+  <plurals name="number_of_items_selected">
+    <item quantity="zero" msgid="7464587177007785408">"已選取 %1$d 個"</item>
+    <item quantity="one" msgid="142482526010824029">"已選取 %1$d 個"</item>
+    <item quantity="other" msgid="1418352074806573570">"已選取 %1$d 個"</item>
+  </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"第 %1$d 張桌布,共 %2$d 張"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"已選取「<xliff:g id="LABEL">%1$s</xliff:g>」"</string>
+    <string name="wallpaper_delete" msgid="8095005658756613921">"刪除"</string>
+    <string name="pick_image" msgid="1272073934062909527">"選擇圖片"</string>
+    <string name="pick_wallpaper" msgid="8179698221502010609">"桌布"</string>
+    <string name="crop_wallpaper" msgid="8334345984491368009">"裁剪桌布"</string>
+    <string name="activity_not_found" msgid="8071924732094499514">"尚未安裝應用程式。"</string>
+    <string name="widgets_tab_label" msgid="2921133187116603919">"小工具"</string>
+    <string name="widget_adder" msgid="3201040140710381657">"小工具"</string>
+    <string name="toggle_weight_watcher" msgid="5645299835184636119">"顯示記憶體"</string>
+    <string name="long_press_widget_to_add" msgid="7699152356777458215">"輕觸並按住小工具即可選取。"</string>
+    <string name="market" msgid="2619650989819296998">"商店"</string>
+    <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string>
+    <string name="external_drop_widget_error" msgid="3165821058322217155">"無法將項目拖放至主畫面。"</string>
+    <string name="external_drop_widget_pick_title" msgid="3486317258037690630">"選擇要建立的小工具"</string>
+    <string name="rename_folder_label" msgid="3727762225964550653">"資料夾名稱"</string>
+    <string name="rename_folder_title" msgid="3771389277707820891">"重新命名資料夾"</string>
+    <string name="rename_action" msgid="5559600076028658757">"確定"</string>
+    <string name="cancel_action" msgid="7009134900002915310">"取消"</string>
+    <string name="menu_item_add_item" msgid="1264911265836810421">"新增至主畫面"</string>
+    <string name="group_applications" msgid="3797214114206693605">"應用程式"</string>
+    <string name="group_shortcuts" msgid="6012256992764410535">"捷徑"</string>
+    <string name="group_widgets" msgid="1569030723286851002">"小工具"</string>
+    <string name="completely_out_of_space" msgid="6106288382070760318">"主畫面已無空間。"</string>
+    <string name="out_of_space" msgid="4691004494942118364">"主畫面已無空間。"</string>
+    <string name="hotseat_out_of_space" msgid="9139760413395605841">"停駐區已無可用空間。"</string>
+    <string name="invalid_hotseat_item" msgid="1211534262129849507">"這個小工具過大,停駐區沒有足夠空間。"</string>
+    <string name="shortcut_installed" msgid="1701742129426969556">"已建立「<xliff:g id="NAME">%s</xliff:g>」捷徑。"</string>
+    <string name="shortcut_uninstalled" msgid="8176767991305701821">"已移除「<xliff:g id="NAME">%s</xliff:g>」捷徑。"</string>
+    <string name="shortcut_duplicate" msgid="9167217446062498127">"「<xliff:g id="NAME">%s</xliff:g>」捷徑已存在。"</string>
+    <string name="title_select_shortcut" msgid="6680642571148153868">"選擇捷徑"</string>
+    <string name="title_select_application" msgid="3280812711670683644">"選擇應用程式"</string>
+    <string name="all_apps_button_label" msgid="9110807029020582876">"應用程式"</string>
+    <string name="all_apps_home_button_label" msgid="252062713717058851">"主畫面"</string>
+    <string name="delete_zone_label_workspace" msgid="4009607676751398685">"移除"</string>
+    <string name="delete_zone_label_all_apps" msgid="8083826390278958980">"解除安裝"</string>
+    <string name="delete_target_label" msgid="1822697352535677073">"移除"</string>
+    <string name="delete_target_uninstall_label" msgid="5100785476250872595">"解除安裝"</string>
+    <string name="info_target_label" msgid="8053346143994679532">"應用程式資料"</string>
+    <string name="accessibility_search_button" msgid="1628520399424565142">"搜尋"</string>
+    <string name="accessibility_voice_search_button" msgid="4637324840434406584">"語音搜尋"</string>
+    <string name="accessibility_all_apps_button" msgid="2603132375383800483">"應用程式"</string>
+    <string name="accessibility_delete_button" msgid="6466114477993744621">"移除"</string>
+    <string name="delete_zone_label_all_apps_system_app" msgid="449755632749610895">"解除安裝更新"</string>
+    <string name="cab_menu_delete_app" msgid="7435191475867183689">"解除安裝應用程式"</string>
+    <string name="cab_menu_app_info" msgid="8593722221450362342">"應用程式詳細資料"</string>
+    <string name="cab_app_selection_text" msgid="374688303047985416">"已選取 1 個應用程式"</string>
+    <string name="cab_widget_selection_text" msgid="1833458597831541241">"已選取 1 個小工具"</string>
+    <string name="cab_folder_selection_text" msgid="7999992513806132118">"已選取 1 個資料夾"</string>
+    <string name="cab_shortcut_selection_text" msgid="2103811025667946450">"已選取 1 個捷徑"</string>
+    <string name="permlab_install_shortcut" msgid="5632423390354674437">"安裝捷徑"</string>
+    <string name="permdesc_install_shortcut" msgid="923466509822011139">"允許應用程式無需用戶許可也可新增捷徑。"</string>
+    <string name="permlab_uninstall_shortcut" msgid="864595034498083837">"解除安裝捷徑"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="5134129545001836849">"允許應用程式無需用戶許可也可移除捷徑。"</string>
+    <string name="permlab_read_settings" msgid="1941457408239617576">"讀取主畫面的設定和捷徑"</string>
+    <string name="permdesc_read_settings" msgid="5833423719057558387">"允許應用程式讀取主畫面中的設定和捷徑。"</string>
+    <string name="permlab_write_settings" msgid="3574213698004620587">"寫入主畫面的設定和捷徑"</string>
+    <string name="permdesc_write_settings" msgid="5440712911516509985">"允許應用程式更改主畫面中的設定和捷徑。"</string>
+    <string name="gadget_error_text" msgid="6081085226050792095">"載入小工具時發生問題"</string>
+    <string name="uninstall_system_app_text" msgid="4172046090762920660">"這是系統應用程式,無法將其解除安裝。"</string>
+    <string name="dream_name" msgid="1530253749244328964">"Rocket Launcher"</string>
+    <string name="folder_hint_text" msgid="6617836969016293992">"未命名的資料夾"</string>
+    <string name="workspace_description_format" msgid="2950174241104043327">"主畫面 %1$d"</string>
+    <string name="default_scroll_format" msgid="7475544710230993317">"第 %1$d 頁,共 %2$d 頁"</string>
+    <string name="workspace_scroll_format" msgid="8458889198184077399">"主畫面 %1$d,共 %2$d 個"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"第 %1$d 個應用程式頁面,共 %2$d 頁"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"第 %1$d 個小工具頁面,共 %2$d 頁"</string>
+    <string name="first_run_cling_title" msgid="7257389003637362144">"歡迎!"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"自訂主畫面。"</string>
+    <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
+    <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
+    <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"建立更多應用程式和資料夾的畫面"</string>
+    <string name="workspace_cling_title" msgid="5626202359865825661">"管理您的空間"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"輕觸並按住背景,即可管理桌布、小工具和設定。"</string>
+    <string name="all_apps_cling_title" msgid="34929250753095858">"選擇一些應用程式"</string>
+    <string name="all_apps_cling_add_item" msgid="400866858451850784">"輕觸並按住應用程式,即可加到主畫面。"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"資料夾顯示如下"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"如要建立類似的資料夾,請輕觸並按住某個應用程式,然後疊到另一個應用程式之上。"</string>
+    <string name="cling_dismiss" msgid="8962359497601507581">"確定"</string>
+    <string name="folder_opened" msgid="94695026776264709">"資料夾已開啟 (<xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>)"</string>
+    <string name="folder_tap_to_close" msgid="1884479294466410023">"輕觸即可關閉資料夾"</string>
+    <string name="folder_tap_to_rename" msgid="9191075570492871147">"輕觸即可儲存新改的名稱"</string>
+    <string name="folder_closed" msgid="4100806530910930934">"已關閉資料夾"</string>
+    <string name="folder_renamed" msgid="1794088362165669656">"資料夾已重新命名為「<xliff:g id="NAME">%1$s</xliff:g>」"</string>
+    <string name="folder_name_format" msgid="6629239338071103179">"資料夾:<xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="custom_workspace_cling_title_1" msgid="3750880082935033085"></string>
+    <string name="custom_workspace_cling_description_1" msgid="939966842147696724"></string>
+    <string name="custom_workspace_cling_title_2" msgid="662588444436552198"></string>
+    <string name="custom_workspace_cling_description_2" msgid="8097921091798539310"></string>
+    <string name="widget_button_text" msgid="2880537293434387943">"小工具"</string>
+    <string name="wallpaper_button_text" msgid="8404103075899945851">"桌布"</string>
+    <string name="settings_button_text" msgid="8119458837558863227">"設定"</string>
+</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index e755979..a68f163 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"已選取 %1$d 個項目"</item>
     <item quantity="other" msgid="1418352074806573570">"已選取 %1$d 個項目"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"第 %1$d 張桌布,共 %2$d 張"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"已選取<xliff:g id="LABEL">%1$s</xliff:g>"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"刪除"</string>
     <string name="pick_image" msgid="1272073934062909527">"選擇圖片"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"桌布"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"應用程式:第 %1$d 頁,共 %2$d 頁"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"小工具:第 %1$d 頁,共 %2$d 頁"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"歡迎使用!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"主螢幕由您作主"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"主螢幕由您作主。"</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"建立更多畫面容納應用程式和資料夾"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"管理您的空間"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"輕觸並按住背景,即可管理桌布、小工具和設定"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"輕觸並按住背景,即可管理桌布、小工具和設定。"</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"選擇一些應用程式"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"如要將應用程式新增至主螢幕,請輕觸並按住目標。"</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"建立新資料夾容納應用程式"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"輕觸並按住應用程式,將它移至另一個應用程式圖示上面"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"資料夾顯示如下"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"如要建立類似的資料夾,請輕觸並按住應用程式,然後將應用程式疊放在另一個應用程式上。"</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"確定"</string>
     <string name="folder_opened" msgid="94695026776264709">"資料夾已開啟 (<xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>)"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"輕觸即可關閉資料夾"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 5d18102..da790e6 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -29,6 +29,8 @@
     <item quantity="one" msgid="142482526010824029">"%1$d khethiwe"</item>
     <item quantity="other" msgid="1418352074806573570">"%1$d khethiwe"</item>
   </plurals>
+    <string name="wallpaper_accessibility_name" msgid="1655953108132967972">"Isithombe sangemuva se-%1$d of %2$d"</string>
+    <string name="announce_selection" msgid="8338254712932127413">"I-<xliff:g id="LABEL">%1$s</xliff:g> ekhethiwe"</string>
     <string name="wallpaper_delete" msgid="8095005658756613921">"Susa"</string>
     <string name="pick_image" msgid="1272073934062909527">"Thatha isithombe"</string>
     <string name="pick_wallpaper" msgid="8179698221502010609">"Izithombe zangemuva"</string>
@@ -95,16 +97,16 @@
     <string name="apps_customize_apps_scroll_format" msgid="370005296147130238">"Ikhasi lezinhlelo zokusebenza elingu-%1$d le-%2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="3106209519974971521">"Ikhasi lamawijethi elingu-%1$d le-%2$d"</string>
     <string name="first_run_cling_title" msgid="7257389003637362144">"Siyakwamukela!"</string>
-    <string name="first_run_cling_description" msgid="658815204153067813">"Zizwe Usekhaya"</string>
+    <string name="first_run_cling_description" msgid="6447072552696253358">"Zizwe usekhaya."</string>
     <string name="first_run_cling_custom_content_hint" msgid="6090628589029352439"></string>
     <string name="first_run_cling_search_bar_hint" msgid="5909062802402452582"></string>
     <string name="first_run_cling_create_screens_hint" msgid="6950729526680114157">"Dala izikrini eziningi zezinhlelo zokusebenza namafolda"</string>
     <string name="workspace_cling_title" msgid="5626202359865825661">"Hlela isikhala sakho"</string>
-    <string name="workspace_cling_move_item" msgid="2243369117709858844">"Thinta uphinde ubambe okungemuva ukuze uphathe isithombe sangemuva, amawijethi nezilungiselelo"</string>
+    <string name="workspace_cling_move_item" msgid="528201129978005352">"Thinta uphinde ubambe okungemuva ukuze uphathe isithombe sangemuva, amawijethi nezilungiselelo."</string>
     <string name="all_apps_cling_title" msgid="34929250753095858">"Khetha izinhlelo zokusebenza ezithile"</string>
     <string name="all_apps_cling_add_item" msgid="400866858451850784">"Ukuze ungeze uhlelo lokusebenza kusikrini sakho se-Ikhaya, thinta futhi uyibambe."</string>
-    <string name="folder_cling_title" msgid="294708344826056909">"Dala amafolda amasha wezinhlelo zakho zokusebenza"</string>
-    <string name="folder_cling_create_folder" msgid="3245124301268588807">"Thinta uphinde ubambe uhlelo lokusebenza, bese ulimikisa ngaphezulu kwesithonjana solunye uhlelo lokusebenza"</string>
+    <string name="folder_cling_title" msgid="3894908818693254164">"Nayi ifolda"</string>
+    <string name="folder_cling_create_folder" msgid="6158215559475836131">"Ukuze udale eyodwa efana nale, thinta uphinde ubambe uhlelo lokusebenza, bese ulidlulisa ngaphezulu kwelinye."</string>
     <string name="cling_dismiss" msgid="8962359497601507581">"KULUNGILE"</string>
     <string name="folder_opened" msgid="94695026776264709">"Ifolda ivuliwe, <xliff:g id="WIDTH">%1$d</xliff:g> nge-<xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
     <string name="folder_tap_to_close" msgid="1884479294466410023">"Thinta ukuze uvale ifolda"</string>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 1dcc5dd..a2d3a83 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -148,6 +148,9 @@
         <attr name="key" format="string" />
         <attr name="value" format="string" />
     </declare-styleable>
+    <declare-styleable name="Include">
+        <attr name="workspace" format="reference" />
+    </declare-styleable>
 
     <!-- Only used in the device overlays -->
     <declare-styleable name="CustomClingTitleText">
diff --git a/res/values/colors.xml b/res/values/colors.xml
index e4278d9..dc35a3f 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -36,5 +36,5 @@
     <color name="folder_items_text_color">#FF333333</color>
     <color name="outline_color">#FFFFFFFF</color>
     
-    <color name="first_run_cling_circle_background_color">#FF8BB4E9</color>
+    <color name="first_run_cling_circle_background_color">#64b1ea</color>
 </resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 97408cc..4978281 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -12,8 +12,10 @@
 
 <!-- AllApps/Customize/AppsCustomize -->
     <!-- The alpha of the AppsCustomize bg in spring loaded mode -->
-    <integer name="config_appsCustomizeSpringLoadedBgAlpha">45</integer>
+    <integer name="config_appsCustomizeSpringLoadedBgAlpha">65</integer>
     <integer name="config_workspaceUnshrinkTime">300</integer>
+    <integer name="config_overviewTransitionTime">250</integer>
+
     <!-- Out of 100, the percent to shrink the workspace during spring loaded mode. -->
     <integer name="config_workspaceSpringLoadShrinkPercentage">80</integer>
     <!-- Out of 100, the percent to shrink the workspace during overview mode. -->
@@ -81,4 +83,9 @@
 
     <!-- Memory debugging, including a memory dump icon -->
     <bool name="debug_memory_enabled">false</bool>
+
+    <!-- Name of a subclass of com.android.launcher3.AppFilter used to
+         filter the activities shown in the launcher. Can be empty. -->
+    <string name="app_filter_class" translatable="false"></string>
+
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2910b7c..b4b2367 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -24,6 +24,7 @@
 <!-- Wallpaper picker -->
     <dimen name="wallpaperThumbnailWidth">106.5dp</dimen>
     <dimen name="wallpaperThumbnailHeight">94.5dp</dimen>
+    <dimen name="wallpaperItemIconSize">32dp</dimen>
 
 <!-- Cling -->
     <dimen name="clingPunchThroughGraphicCenterRadius">94dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ac372fd..cafa424 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -38,6 +38,11 @@
         <item quantity="one">%1$d selected</item>
         <item quantity="other">%1$d selected</item>
     </plurals>
+    <!-- Accessibility string used as a label for a particular wallpaper in the Wallpaper Picker list.
+         e.g. "Wallpaper 3 of 10" -->
+    <string name="wallpaper_accessibility_name">Wallpaper %1$d of %2$d</string>
+    <!-- Accessibility string used to announce that a wallpaper has been selected. -->
+    <string name="announce_selection">Selected <xliff:g id="label" example="Wallpaper 3 of 10">%1$s</xliff:g></string>
 
     <!-- Label on button to delete wallpaper(s) -->
     <string name="wallpaper_delete">Delete</string>
@@ -225,29 +230,29 @@
     <string name="apps_customize_widgets_scroll_format">Widgets page %1$d of %2$d</string>
 
     <!-- Clings -->
-    <!-- The title text for the workspace cling [CHAR_LIMIT=none] -->
+    <!-- The title text for the workspace cling [CHAR_LIMIT=60] -->
     <string name="first_run_cling_title">Welcome!</string>
-    <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
-    <string name="first_run_cling_description">Make yourself at Home.</string>
-    <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
+    <!-- The description of how to use the workspace [CHAR_LIMIT=60] -->
+    <string name="first_run_cling_description">Make yourself at home.</string>
+    <!-- The description of how to use the workspace [CHAR_LIMIT=60] -->
     <string name="first_run_cling_custom_content_hint"></string>
-    <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
+    <!-- The description of how to use the workspace [CHAR_LIMIT=60] -->
     <string name="first_run_cling_search_bar_hint"></string>
-    <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
+    <!-- The description of how to use the workspace [CHAR_LIMIT=60] -->
     <string name="first_run_cling_create_screens_hint">Create more screens for apps and folders</string>
-    <!-- The title text for the workspace cling [CHAR_LIMIT=none] -->
+    <!-- The title text for the workspace cling [CHAR_LIMIT=60] -->
     <string name="workspace_cling_title">Organize your space</string>
-    <!-- The description of how to use the workspace [CHAR_LIMIT=none] -->
+    <!-- The description of how to use the workspace [CHAR_LIMIT=160] -->
     <string name="workspace_cling_move_item">Touch &amp; hold background to manage wallpaper, widgets and settings.</string>
-    <!-- The title text for the All Apps cling [CHAR_LIMIT=none] -->
+    <!-- The title text for the All Apps cling [CHAR_LIMIT=60] -->
     <string name="all_apps_cling_title">Choose some apps</string>
-    <!-- The description of how to pick up and add an item to the workspace [CHAR_LIMIT=none] -->
+    <!-- The description of how to pick up and add an item to the workspace [CHAR_LIMIT=160] -->
     <string name="all_apps_cling_add_item">To add an app to your Home screen, touch &amp; hold it.</string>
-    <!-- The title text for the Folder cling [CHAR_LIMIT=none] -->
+    <!-- The title text for the Folder cling [CHAR_LIMIT=60] -->
     <string name="folder_cling_title">Here\'s a folder</string>
-    <!-- The description of how to create a folder [CHAR_LIMIT=none] -->
+    <!-- The description of how to create a folder [CHAR_LIMIT=160] -->
     <string name="folder_cling_create_folder">To create one like this, touch &amp; hold an app, then move it over another.</string>
-    <!-- The text on the button to dismiss a cling [CHAR_LIMIT=none] -->
+    <!-- The text on the button to dismiss a cling [CHAR_LIMIT=30] -->
     <string name="cling_dismiss">OK</string>
     <!-- Error message on dummy custom cling layout [DO NOT TRANSLATE] -->
     <string name="dummy_custom_cling_error_message">Error: custom workspace layout passed in but custom cling was not overwritten</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 9f2a105..a1d2c5c 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -22,6 +22,7 @@
         <item name="android:actionBarStyle">@style/WallpaperCropperActionBar</item>
         <item name="android:windowFullscreen">true</item>
         <item name="android:windowActionBarOverlay">true</item>
+        <item name="android:windowTranslucentNavigation">true</item>
     </style>
 
     <style name="WallpaperCropperActionBar" parent="android:style/Widget.Holo.ActionBar">
@@ -30,6 +31,8 @@
     </style>
 
     <style name="Theme" parent="@android:style/Theme.Holo.Wallpaper.NoTitleBar">
+        <item name="android:windowTranslucentStatus">true</item>
+        <item name="android:windowTranslucentNavigation">true</item>
     </style>
 
     <style name="ClingButton">
@@ -58,7 +61,6 @@
         <item name="android:layout_height">wrap_content</item>
         <item name="android:textSize">24sp</item>
         <item name="android:textColor">#49C0EC</item>
-        <item name="android:fontFamily">sans-serif-condensed</item>
     </style>
     <style name="ClingText">
         <item name="android:layout_width">wrap_content</item>
diff --git a/src/com/android/launcher3/AllAppsList.java b/src/com/android/launcher3/AllAppsList.java
index 5d3aa3a..d955e4e 100644
--- a/src/com/android/launcher3/AllAppsList.java
+++ b/src/com/android/launcher3/AllAppsList.java
@@ -46,11 +46,14 @@
 
     private IconCache mIconCache;
 
+    private AppFilter mAppFilter;
+
     /**
      * Boring constructor.
      */
-    public AllAppsList(IconCache iconCache) {
+    public AllAppsList(IconCache iconCache, AppFilter appFilter) {
         mIconCache = iconCache;
+        mAppFilter = appFilter;
     }
 
     /**
@@ -60,13 +63,16 @@
      * If the app is already in the list, doesn't add it.
      */
     public void add(AppInfo info) {
+        if (mAppFilter != null && !mAppFilter.shouldShowApp(info.componentName)) {
+            return;
+        }
         if (findActivity(data, info.componentName)) {
             return;
         }
         data.add(info);
         added.add(info);
     }
-    
+
     public void clear() {
         data.clear();
         // TODO: do we clear these too?
diff --git a/src/com/android/launcher3/AppFilter.java b/src/com/android/launcher3/AppFilter.java
new file mode 100644
index 0000000..e01436d
--- /dev/null
+++ b/src/com/android/launcher3/AppFilter.java
@@ -0,0 +1,35 @@
+package com.android.launcher3;
+
+import android.content.ComponentName;
+import android.text.TextUtils;
+import android.util.Log;
+
+public abstract class AppFilter {
+
+    private static final boolean DBG = false;
+    private static final String TAG = "AppFilter";
+
+    public abstract boolean shouldShowApp(ComponentName app);
+
+    public static AppFilter loadByName(String className) {
+        if (TextUtils.isEmpty(className)) return null;
+        if (DBG) Log.d(TAG, "Loading AppFilter: " + className);
+        try {
+            Class<?> cls = Class.forName(className);
+            return (AppFilter) cls.newInstance();
+        } catch (ClassNotFoundException e) {
+            Log.e(TAG, "Bad AppFilter class", e);
+            return null;
+        } catch (InstantiationException e) {
+            Log.e(TAG, "Bad AppFilter class", e);
+            return null;
+        } catch (IllegalAccessException e) {
+            Log.e(TAG, "Bad AppFilter class", e);
+            return null;
+        } catch (ClassCastException e) {
+            Log.e(TAG, "Bad AppFilter class", e);
+            return null;
+        }
+    }
+
+}
diff --git a/src/com/android/launcher3/AppsCustomizePagedView.java b/src/com/android/launcher3/AppsCustomizePagedView.java
index 4e9d68b..9b35bb5 100644
--- a/src/com/android/launcher3/AppsCustomizePagedView.java
+++ b/src/com/android/launcher3/AppsCustomizePagedView.java
@@ -438,6 +438,9 @@
         for (Object o : widgetsAndShortcuts) {
             if (o instanceof AppWidgetProviderInfo) {
                 AppWidgetProviderInfo widget = (AppWidgetProviderInfo) o;
+                if (!app.shouldShowAppOrWidgetProvider(widget.provider)) {
+                    continue;
+                }
                 widget.label = widget.label.trim();
                 if (widget.minWidth > 0 && widget.minHeight > 0) {
                     // Ensure that all widgets we show can be added on a workspace of this size
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index 287bb50..8dab943 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -109,9 +109,8 @@
         LauncherAppState app = LauncherAppState.getInstance();
         DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
 
-        setCompoundDrawablesWithIntrinsicBounds(null,
-                new FastBitmapDrawable(b),
-                null, null);
+        setCompoundDrawables(null,
+                Utilities.createIconDrawable(b), null, null);
         setCompoundDrawablePadding((int) ((grid.folderIconSizePx - grid.iconSizePx) / 2f));
         setText(info.title);
         setTag(info);
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index a114ec3..dafb79f 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -95,6 +95,7 @@
     private ArrayList<FolderRingAnimator> mFolderOuterRings = new ArrayList<FolderRingAnimator>();
     private int[] mFolderLeaveBehindCell = {-1, -1};
 
+    private float FOREGROUND_ALPHA_DAMPER = 0.65f;
     private int mForegroundAlpha = 0;
     private float mBackgroundAlpha;
     private float mBackgroundAlphaMultiplier = 1.0f;
@@ -114,7 +115,6 @@
 
     // If we're actively dragging something over this screen, mIsDragOverlapping is true
     private boolean mIsDragOverlapping = false;
-    private final Point mDragCenter = new Point();
     boolean mUseActiveGlowBackground = false;
 
     // These arrays are used to implement the drag visualization on x-large screens.
@@ -169,6 +169,8 @@
     private static final int INVALID_DIRECTION = -100;
     private DropTarget.DragEnforcer mDragEnforcer;
 
+    private Rect mTempRect = new Rect();
+
     private final static PorterDuffXfermode sAddBlendMode =
             new PorterDuffXfermode(PorterDuff.Mode.ADD);
     private final static Paint sPaint = new Paint();
@@ -295,12 +297,8 @@
         addView(mShortcutsAndWidgets);
     }
 
-    public void enableHardwareLayers() {
-        mShortcutsAndWidgets.setLayerType(LAYER_TYPE_HARDWARE, sPaint);
-    }
-
-    public void disableHardwareLayers() {
-        mShortcutsAndWidgets.setLayerType(LAYER_TYPE_NONE, sPaint);
+    public void enableHardwareLayer(boolean hasLayer) {
+        mShortcutsAndWidgets.setLayerType(hasLayer ? LAYER_TYPE_HARDWARE : LAYER_TYPE_NONE, sPaint);
     }
 
     public void buildHardwareLayer() {
@@ -349,6 +347,7 @@
             mOverScrollForegroundDrawable = mOverScrollRight;
         }
 
+        r *= FOREGROUND_ALPHA_DAMPER;
         mForegroundAlpha = (int) Math.round((r * 255));
         mOverScrollForegroundDrawable.setAlpha(mForegroundAlpha);
         invalidate();
@@ -400,25 +399,6 @@
         }
     }
 
-    public void scaleRect(Rect r, float scale) {
-        if (scale != 1.0f) {
-            r.left = (int) (r.left * scale + 0.5f);
-            r.top = (int) (r.top * scale + 0.5f);
-            r.right = (int) (r.right * scale + 0.5f);
-            r.bottom = (int) (r.bottom * scale + 0.5f);
-        }
-    }
-
-    Rect temp = new Rect();
-    void scaleRectAboutCenter(Rect in, Rect out, float scale) {
-        int cx = in.centerX();
-        int cy = in.centerY();
-        out.set(in);
-        out.offset(-cx, -cy);
-        scaleRect(out, scale);
-        out.offset(cx, cy);
-    }
-
     @Override
     protected void onDraw(Canvas canvas) {
         // When we're large, we are either drawn in a "hover" state (ie when dragging an item to
@@ -446,10 +426,11 @@
             final float alpha = mDragOutlineAlphas[i];
             if (alpha > 0) {
                 final Rect r = mDragOutlines[i];
-                scaleRectAboutCenter(r, temp, getChildrenScale());
+                mTempRect.set(r);
+                Utilities.scaleRectAboutCenter(mTempRect, getChildrenScale());
                 final Bitmap b = (Bitmap) mDragOutlineAnims[i].getTag();
                 paint.setAlpha((int)(alpha + .5f));
-                canvas.drawBitmap(b, null, temp, paint);
+                canvas.drawBitmap(b, null, mTempRect, paint);
             }
         }
 
@@ -459,9 +440,13 @@
             final int padding = mPressedOrFocusedIcon.getPressedOrFocusedBackgroundPadding();
             final Bitmap b = mPressedOrFocusedIcon.getPressedOrFocusedBackground();
             if (b != null) {
+                int offset = getMeasuredWidth() - getPaddingLeft() - getPaddingRight() -
+                        (mCountX * mCellWidth);
+                int left = getPaddingLeft() + (int) Math.ceil(offset / 2f);
+                int top = getPaddingTop();
                 canvas.drawBitmap(b,
-                        mPressedOrFocusedIcon.getLeft() + getPaddingLeft() - padding,
-                        mPressedOrFocusedIcon.getTop() + getPaddingTop() - padding,
+                        mPressedOrFocusedIcon.getLeft() + left - padding,
+                        mPressedOrFocusedIcon.getTop() + top - padding,
                         null);
             }
         }
@@ -495,10 +480,12 @@
             int width, height;
             cellToPoint(fra.mCellX, fra.mCellY, mTempLocation);
             View child = getChildAt(fra.mCellX, fra.mCellY);
-            int centerX = mTempLocation[0] + mCellWidth / 2;
-            int centerY = mTempLocation[1] + previewOffset / 2 +
-                    child.getPaddingTop() + grid.folderBackgroundOffset;
+
             if (child != null) {
+                int centerX = mTempLocation[0] + mCellWidth / 2;
+                int centerY = mTempLocation[1] + previewOffset / 2 +
+                        child.getPaddingTop() + grid.folderBackgroundOffset;
+
                 // Draw outer ring, if it exists
                 if (FolderIcon.HAS_OUTER_RING) {
                     d = FolderRingAnimator.sSharedOuterRingDrawable;
@@ -549,10 +536,7 @@
         super.dispatchDraw(canvas);
         if (mForegroundAlpha > 0) {
             mOverScrollForegroundDrawable.setBounds(mForegroundRect);
-            Paint p = ((NinePatchDrawable) mOverScrollForegroundDrawable).getPaint();
-            p.setXfermode(sAddBlendMode);
             mOverScrollForegroundDrawable.draw(canvas);
-            p.setXfermode(null);
         }
     }
 
@@ -1011,11 +995,13 @@
 
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
+        int offset = getMeasuredWidth() - getPaddingLeft() - getPaddingRight() -
+                (mCountX * mCellWidth);
+        int left = getPaddingLeft() + (int) Math.ceil(offset / 2f);
+        int top = getPaddingTop();
         int count = getChildCount();
         for (int i = 0; i < count; i++) {
             View child = getChildAt(i);
-            int left = getPaddingLeft();
-            int top = getPaddingTop();
             child.layout(left, top,
                     left + r - l,
                     top + b - t);
@@ -1025,7 +1011,12 @@
     @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
         super.onSizeChanged(w, h, oldw, oldh);
-        mBackgroundRect.set(0, 0, w, h);
+
+        // Expand the background drawing bounds by the padding baked into the background drawable
+        Rect padding = new Rect();
+        mNormalBackground.getPadding(padding);
+        mBackgroundRect.set(-padding.left, -padding.top, w + padding.right, h + padding.bottom);
+
         mForegroundRect.set(mForegroundPadding, mForegroundPadding,
                 w - mForegroundPadding, h - mForegroundPadding);
     }
@@ -1199,12 +1190,6 @@
         final int oldDragCellX = mDragCell[0];
         final int oldDragCellY = mDragCell[1];
 
-        if (v != null && dragOffset == null) {
-            mDragCenter.set(originX + (v.getWidth() / 2), originY + (v.getHeight() / 2));
-        } else {
-            mDragCenter.set(originX, originY);
-        }
-
         if (dragOutline == null && v == null) {
             return;
         }
@@ -1219,11 +1204,6 @@
             int left = topLeft[0];
             int top = topLeft[1];
 
-            // Offset icons by their padding
-            if (v instanceof BubbleTextView) {
-                top += v.getPaddingTop();
-            }
-
             if (v != null && dragOffset == null) {
                 // When drawing the drag outline, it did not account for margin offsets
                 // added by the view's parent.
@@ -1244,7 +1224,9 @@
                     // outline offset
                     left += dragOffset.x + ((mCellWidth * spanX) + ((spanX - 1) * mWidthGap)
                              - dragRegion.width()) / 2;
-                    top += dragOffset.y;
+                    int cHeight = getShortcutsAndWidgets().getCellContentHeight();
+                    int cellPaddingY = (int) Math.max(0, ((mCellHeight - cHeight) / 2f));
+                    top += dragOffset.y + cellPaddingY;
                 } else {
                     // Center the drag outline in the cell
                     left += ((mCellWidth * spanX) + ((spanX - 1) * mWidthGap)
diff --git a/src/com/android/launcher3/Cling.java b/src/com/android/launcher3/Cling.java
index 2656ad6..338b722 100644
--- a/src/com/android/launcher3/Cling.java
+++ b/src/com/android/launcher3/Cling.java
@@ -18,17 +18,13 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
+import android.app.ActivityOptions;
 import android.content.Context;
+import android.content.ComponentName;
+import android.content.Intent;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
+import android.graphics.*;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
@@ -37,8 +33,10 @@
 import android.view.View;
 import android.view.animation.AccelerateInterpolator;
 import android.widget.FrameLayout;
+import android.widget.TextView;
 
-public class Cling extends FrameLayout implements Insettable, View.OnLongClickListener {
+public class Cling extends FrameLayout implements Insettable, View.OnClickListener,
+        View.OnLongClickListener, View.OnTouchListener {
 
     static final String FIRST_RUN_CLING_DISMISSED_KEY = "cling_gel.first_run.dismissed";
     static final String WORKSPACE_CLING_DISMISSED_KEY = "cling_gel.workspace.dismissed";
@@ -66,6 +64,12 @@
     private String mDrawIdentifier;
     private Drawable mBackground;
 
+    private int[] mTouchDownPt = new int[2];
+
+    private Drawable mFocusedHotseatApp;
+    private ComponentName mFocusedHotseatAppComponent;
+    private Rect mFocusedHotseatAppBounds;
+
     private Paint mErasePaint;
     private Paint mBubblePaint;
     private Paint mDotPaint;
@@ -100,6 +104,8 @@
             mScrimView = scrim;
             mBackgroundColor = 0xdd000000;
             setOnLongClickListener(this);
+            setOnClickListener(this);
+            setOnTouchListener(this);
 
             mErasePaint = new Paint();
             mErasePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
@@ -121,6 +127,46 @@
         }
     }
 
+    void setFocusedHotseatApp(int drawableId, int appRank, ComponentName cn, String title,
+                              String description) {
+        // Get the app to draw
+        Resources r = getResources();
+        int appIconId = drawableId;
+        Hotseat hotseat = mLauncher.getHotseat();
+        if (hotseat != null && appIconId > -1 && appRank > -1 && !title.isEmpty() &&
+                !description.isEmpty()) {
+            // Set the app bounds
+            int x = hotseat.getCellXFromOrder(appRank);
+            int y = hotseat.getCellYFromOrder(appRank);
+            Rect pos = hotseat.getCellCoordinates(x, y);
+            LauncherAppState app = LauncherAppState.getInstance();
+            DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+            mFocusedHotseatApp = getResources().getDrawable(appIconId);
+            mFocusedHotseatAppComponent = cn;
+            mFocusedHotseatAppBounds = new Rect(pos.left, pos.top,
+                    pos.left + Utilities.sIconTextureWidth,
+                    pos.top + Utilities.sIconTextureHeight);
+            Utilities.scaleRectAboutCenter(mFocusedHotseatAppBounds,
+                    (grid.hotseatIconSize / grid.iconSize));
+
+            // Set the title
+            TextView v = (TextView) findViewById(R.id.focused_hotseat_app_title);
+            if (v != null) {
+                v.setText(title);
+            }
+
+            // Set the description
+            v = (TextView) findViewById(R.id.focused_hotseat_app_description);
+            if (v != null) {
+                v.setText(description);
+            }
+
+            // Show the bubble
+            View bubble = findViewById(R.id.focused_hotseat_app_bubble);
+            bubble.setVisibility(View.VISIBLE);
+        }
+    }
+
     void show(boolean animate, int duration) {
         setVisibility(View.VISIBLE);
         setLayerType(View.LAYER_TYPE_HARDWARE, null);
@@ -275,6 +321,32 @@
     };
 
     @Override
+    public boolean onTouch(View v, MotionEvent ev) {
+        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+            mTouchDownPt[0] = (int) ev.getX();
+            mTouchDownPt[1] = (int) ev.getY();
+        }
+        return false;
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) ||
+                mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) ||
+                mDrawIdentifier.equals(WORKSPACE_LARGE)) {
+            if (mFocusedHotseatAppBounds != null &&
+                mFocusedHotseatAppBounds.contains(mTouchDownPt[0], mTouchDownPt[1])) {
+                // Launch the activity that is being highlighted
+                Intent intent = new Intent(Intent.ACTION_MAIN);
+                intent.setComponent(mFocusedHotseatAppComponent);
+                intent.addCategory(Intent.CATEGORY_LAUNCHER);
+                mLauncher.startActivity(intent, null);
+                mLauncher.dismissWorkspaceCling(this);
+            }
+        }
+    }
+
+    @Override
     public boolean onLongClick(View v) {
         if (mDrawIdentifier.equals(WORKSPACE_PORTRAIT) ||
                 mDrawIdentifier.equals(WORKSPACE_LANDSCAPE) ||
@@ -327,7 +399,7 @@
             }
             if (mDrawIdentifier.equals(FIRST_RUN_PORTRAIT) ||
                     mDrawIdentifier.equals(FIRST_RUN_LANDSCAPE)) {
-                // Draw the white circle
+                // Draw the circle
                 View bubbleContent = findViewById(R.id.bubble_content);
                 Rect bubbleRect = new Rect();
                 bubbleContent.getGlobalVisibleRect(bubbleRect);
@@ -354,8 +426,16 @@
                 canvas.drawBitmap(eraseBg, 0, 0, null);
                 eraseCanvas.setBitmap(null);
                 eraseBg = null;
-            }
 
+                // Draw the focused hotseat app icon
+                if (mFocusedHotseatAppBounds != null && mFocusedHotseatApp != null) {
+                    mFocusedHotseatApp.setBounds(mFocusedHotseatAppBounds.left,
+                            mFocusedHotseatAppBounds.top, mFocusedHotseatAppBounds.right,
+                            mFocusedHotseatAppBounds.bottom);
+                    mFocusedHotseatApp.setAlpha((int) (255 * alpha));
+                    mFocusedHotseatApp.draw(canvas);
+                }
+            }
 
             canvas.restore();
         }
diff --git a/src/com/android/launcher3/CropView.java b/src/com/android/launcher3/CropView.java
index c4d1475..9224e3b 100644
--- a/src/com/android/launcher3/CropView.java
+++ b/src/com/android/launcher3/CropView.java
@@ -17,13 +17,15 @@
 package com.android.launcher3;
 
 import android.content.Context;
+import android.graphics.Matrix;
 import android.graphics.Point;
 import android.graphics.RectF;
 import android.util.AttributeSet;
+import android.util.FloatMath;
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
-import android.view.ViewConfiguration;
 import android.view.ScaleGestureDetector.OnScaleGestureListener;
+import android.view.ViewConfiguration;
 import android.view.ViewTreeObserver;
 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 
@@ -36,10 +38,18 @@
     private long mTouchDownTime;
     private float mFirstX, mFirstY;
     private float mLastX, mLastY;
+    private float mCenterX, mCenterY;
     private float mMinScale;
     private boolean mTouchEnabled = true;
     private RectF mTempEdges = new RectF();
+    private float[] mTempPoint = new float[] { 0, 0 };
+    private float[] mTempCoef = new float[] { 0, 0 };
+    private float[] mTempAdjustment = new float[] { 0, 0 };
+    private float[] mTempImageDims = new float[] { 0, 0 };
+    private float[] mTempRendererCenter = new float[] { 0, 0 };
     TouchCallback mTouchCallback;
+    Matrix mRotateMatrix;
+    Matrix mInverseRotateMatrix;
 
     public interface TouchCallback {
         void onTouchDown();
@@ -54,17 +64,43 @@
     public CropView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mScaleGestureDetector = new ScaleGestureDetector(context, this);
+        mRotateMatrix = new Matrix();
+        mInverseRotateMatrix = new Matrix();
+    }
+
+    private float[] getImageDims() {
+        final float imageWidth = mRenderer.source.getImageWidth();
+        final float imageHeight = mRenderer.source.getImageHeight();
+        float[] imageDims = mTempImageDims;
+        imageDims[0] = imageWidth;
+        imageDims[1] = imageHeight;
+        mRotateMatrix.mapPoints(imageDims);
+        imageDims[0] = Math.abs(imageDims[0]);
+        imageDims[1] = Math.abs(imageDims[1]);
+        return imageDims;
     }
 
     private void getEdgesHelper(RectF edgesOut) {
         final float width = getWidth();
         final float height = getHeight();
-        final float imageWidth = mRenderer.source.getImageWidth();
-        final float imageHeight = mRenderer.source.getImageHeight();
+        final float[] imageDims = getImageDims();
+        final float imageWidth = imageDims[0];
+        final float imageHeight = imageDims[1];
+
+        float initialCenterX = mRenderer.source.getImageWidth() / 2f;
+        float initialCenterY = mRenderer.source.getImageHeight() / 2f;
+
+        float[] rendererCenter = mTempRendererCenter;
+        rendererCenter[0] = mCenterX - initialCenterX;
+        rendererCenter[1] = mCenterY - initialCenterY;
+        mRotateMatrix.mapPoints(rendererCenter);
+        rendererCenter[0] += imageWidth / 2;
+        rendererCenter[1] += imageHeight / 2;
+
         final float scale = mRenderer.scale;
-        float centerX = (width / 2f - mRenderer.centerX + (imageWidth - width) / 2f)
+        float centerX = (width / 2f - rendererCenter[0] + (imageWidth - width) / 2f)
                 * scale + width / 2f;
-        float centerY = (height / 2f - mRenderer.centerY + (imageHeight - height) / 2f)
+        float centerY = (height / 2f - rendererCenter[1] + (imageHeight - height) / 2f)
                 * scale + height / 2f;
         float leftEdge = centerX - imageWidth / 2f * scale;
         float rightEdge = centerX + imageWidth / 2f * scale;
@@ -77,6 +113,10 @@
         edgesOut.bottom = bottomEdge;
     }
 
+    public int getImageRotation() {
+        return mRenderer.rotation;
+    }
+
     public RectF getCrop() {
         final RectF edges = mTempEdges;
         getEdgesHelper(edges);
@@ -96,6 +136,12 @@
 
     public void setTileSource(TileSource source, Runnable isReadyCallback) {
         super.setTileSource(source, isReadyCallback);
+        mCenterX = mRenderer.centerX;
+        mCenterY = mRenderer.centerY;
+        mRotateMatrix.reset();
+        mRotateMatrix.setRotate(mRenderer.rotation);
+        mInverseRotateMatrix.reset();
+        mInverseRotateMatrix.setRotate(-mRenderer.rotation);
         updateMinScale(getWidth(), getHeight(), source, true);
     }
 
@@ -115,8 +161,10 @@
                 mRenderer.scale = 1;
             }
             if (source != null) {
-                mMinScale = Math.max(w / (float) source.getImageWidth(),
-                        h / (float) source.getImageHeight());
+                final float[] imageDims = getImageDims();
+                final float imageWidth = imageDims[0];
+                final float imageHeight = imageDims[1];
+                mMinScale = Math.max(w / imageWidth, h / imageHeight);
                 mRenderer.scale = Math.max(mMinScale, mRenderer.scale);
             }
         }
@@ -154,7 +202,13 @@
         final RectF edges = mTempEdges;
         getEdgesHelper(edges);
         final float scale = mRenderer.scale;
-        mRenderer.centerX += Math.ceil(edges.left / scale);
+        mCenterX += Math.ceil(edges.left / scale);
+        updateCenter();
+    }
+
+    private void updateCenter() {
+        mRenderer.centerX = Math.round(mCenterX);
+        mRenderer.centerY = Math.round(mCenterY);
     }
 
     public void setTouchEnabled(boolean enabled) {
@@ -197,13 +251,14 @@
             float squaredDist = (mFirstX - x) * (mFirstX - x) + (mFirstY - y) * (mFirstY - y);
             float slop = config.getScaledTouchSlop() * config.getScaledTouchSlop();
             long now = System.currentTimeMillis();
-            // only do this if it's a small movement
-            if (mTouchCallback != null &&
-                    squaredDist < slop &&
-                    now < mTouchDownTime + ViewConfiguration.getTapTimeout()) {
-                mTouchCallback.onTap();
+            if (mTouchCallback != null) {
+                // only do this if it's a small movement
+                if (squaredDist < slop &&
+                        now < mTouchDownTime + ViewConfiguration.getTapTimeout()) {
+                    mTouchCallback.onTap();
+                }
+                mTouchCallback.onTouchUp();
             }
-            mTouchCallback.onTouchUp();
         }
 
         if (!mTouchEnabled) {
@@ -214,8 +269,13 @@
             mScaleGestureDetector.onTouchEvent(event);
             switch (action) {
                 case MotionEvent.ACTION_MOVE:
-                    mRenderer.centerX += (mLastX - x) / mRenderer.scale;
-                    mRenderer.centerY += (mLastY - y) / mRenderer.scale;
+                    float[] point = mTempPoint;
+                    point[0] = (mLastX - x) / mRenderer.scale;
+                    point[1] = (mLastY - y) / mRenderer.scale;
+                    mInverseRotateMatrix.mapPoints(point);
+                    mCenterX += point[0];
+                    mCenterY += point[1];
+                    updateCenter();
                     invalidate();
                     break;
             }
@@ -225,18 +285,32 @@
                 final RectF edges = mTempEdges;
                 getEdgesHelper(edges);
                 final float scale = mRenderer.scale;
+
+                float[] coef = mTempCoef;
+                coef[0] = 1;
+                coef[1] = 1;
+                mRotateMatrix.mapPoints(coef);
+                float[] adjustment = mTempAdjustment;
+                mTempAdjustment[0] = 0;
+                mTempAdjustment[1] = 0;
                 if (edges.left > 0) {
-                    mRenderer.centerX += Math.ceil(edges.left / scale);
-                }
-                if (edges.right < getWidth()) {
-                    mRenderer.centerX += (edges.right - getWidth()) / scale;
+                    adjustment[0] = edges.left / scale;
+                } else if (edges.right < getWidth()) {
+                    adjustment[0] = (edges.right - getWidth()) / scale;
                 }
                 if (edges.top > 0) {
-                    mRenderer.centerY += Math.ceil(edges.top / scale);
+                    adjustment[1] = FloatMath.ceil(edges.top / scale);
+                } else if (edges.bottom < getHeight()) {
+                    adjustment[1] = (edges.bottom - getHeight()) / scale;
                 }
-                if (edges.bottom < getHeight()) {
-                    mRenderer.centerY += (edges.bottom - getHeight()) / scale;
+                for (int dim = 0; dim <= 1; dim++) {
+                    if (coef[dim] > 0) adjustment[dim] = FloatMath.ceil(adjustment[dim]);
                 }
+
+                mInverseRotateMatrix.mapPoints(adjustment);
+                mCenterX += adjustment[0];
+                mCenterY += adjustment[1];
+                updateCenter();
             }
         }
 
diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java
index da6f2f7..4023daf 100644
--- a/src/com/android/launcher3/DeleteDropTarget.java
+++ b/src/com/android/launcher3/DeleteDropTarget.java
@@ -173,7 +173,8 @@
     @Override
     public void onDragStart(DragSource source, Object info, int dragAction) {
         boolean isVisible = true;
-        boolean isUninstall = false;
+        boolean useUninstallLabel = !AppsCustomizePagedView.DISABLE_ALL_APPS &&
+                isAllAppsApplication(source, info);
 
         // If we are dragging an application from AppsCustomize, only show the control if we can
         // delete the app (it was downloaded), and rename the string to "uninstall" in such a case.
@@ -182,7 +183,7 @@
             isVisible = false;
         }
 
-        if (isUninstall) {
+        if (useUninstallLabel) {
             setCompoundDrawablesRelativeWithIntrinsicBounds(mUninstallDrawable, null, null, null);
         } else {
             setCompoundDrawablesRelativeWithIntrinsicBounds(mRemoveDrawable, null, null, null);
@@ -193,7 +194,7 @@
         resetHoverColor();
         ((ViewGroup) getParent()).setVisibility(isVisible ? View.VISIBLE : View.GONE);
         if (getText().length() > 0) {
-            setText(isUninstall ? R.string.delete_target_uninstall_label
+            setText(useUninstallLabel ? R.string.delete_target_uninstall_label
                 : R.string.delete_target_label);
         }
     }
diff --git a/src/com/android/launcher3/DragLayer.java b/src/com/android/launcher3/DragLayer.java
index 3c955cb..89f8275 100644
--- a/src/com/android/launcher3/DragLayer.java
+++ b/src/com/android/launcher3/DragLayer.java
@@ -69,6 +69,8 @@
     public static final int ANIMATION_END_FADE_OUT = 1;
     public static final int ANIMATION_END_REMAIN_VISIBLE = 2;
 
+    private TouchCompleteListener mTouchCompleteListener;
+
     private final Rect mInsets = new Rect();
 
     /**
@@ -173,10 +175,17 @@
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
-        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
+        int action = ev.getAction();
+
+        if (action == MotionEvent.ACTION_DOWN) {
             if (handleTouchDown(ev, true)) {
                 return true;
             }
+        } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+            if (mTouchCompleteListener != null) {
+                mTouchCompleteListener.onTouchComplete();
+            }
+            mTouchCompleteListener = null;
         }
         clearAllResizeFrames();
         return mDragController.onInterceptTouchEvent(ev);
@@ -278,12 +287,15 @@
         int x = (int) ev.getX();
         int y = (int) ev.getY();
 
-        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
-            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
-                if (handleTouchDown(ev, false)) {
-                    return true;
-                }
+        if (action == MotionEvent.ACTION_DOWN) {
+            if (handleTouchDown(ev, false)) {
+                return true;
             }
+        } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) {
+            if (mTouchCompleteListener != null) {
+                mTouchCompleteListener.onTouchComplete();
+            }
+            mTouchCompleteListener = null;
         }
 
         if (mCurrentResizeFrame != null) {
@@ -818,4 +830,12 @@
             }
         }
     }
+
+    public void setTouchCompleteListener(TouchCompleteListener listener) {
+        mTouchCompleteListener = listener;
+    }
+
+    public interface TouchCompleteListener {
+        public void onTouchComplete();
+    }
 }
diff --git a/src/com/android/launcher3/DynamicGrid.java b/src/com/android/launcher3/DynamicGrid.java
index 33eb595..4776c86 100644
--- a/src/com/android/launcher3/DynamicGrid.java
+++ b/src/com/android/launcher3/DynamicGrid.java
@@ -16,11 +16,14 @@
 
 package com.android.launcher3;
 
+import android.appwidget.AppWidgetHostView;
+import android.content.ComponentName;
+import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Paint;
-import android.graphics.PointF;
 import android.graphics.Paint.FontMetrics;
+import android.graphics.PointF;
 import android.graphics.Rect;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
@@ -64,7 +67,9 @@
     boolean isLargeTablet;
     boolean transposeLayoutWithOrientation;
 
+    int desiredWorkspaceLeftRightMarginPx;
     int edgeMarginPx;
+    Rect defaultWidgetPadding;
 
     int widthPx;
     int heightPx;
@@ -109,7 +114,8 @@
         hotseatIconSize = his;
     }
 
-    DeviceProfile(ArrayList<DeviceProfile> profiles,
+    DeviceProfile(Context context,
+                  ArrayList<DeviceProfile> profiles,
                   float minWidth, float minHeight,
                   int wPx, int hPx,
                   int awPx, int ahPx,
@@ -122,7 +128,11 @@
         minWidthDps = minWidth;
         minHeightDps = minHeight;
 
+        ComponentName cn = new ComponentName(context.getPackageName(),
+                this.getClass().getName());
+        defaultWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, cn, null);
         edgeMarginPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_edge_margin);
+        desiredWorkspaceLeftRightMarginPx = 2 * edgeMarginPx;
         pageIndicatorHeightPx = resources.getDimensionPixelSize(R.dimen.dynamic_grid_page_indicator_height);
 
         // Interpolate the rows
@@ -312,9 +322,9 @@
                         hotseatBarHeightPx + pageIndicatorHeightPx);
             } else {
                 // Pad the top and bottom of the workspace with search/hotseat bar sizes
-                padding.set(edgeMarginPx,
+                padding.set(desiredWorkspaceLeftRightMarginPx - defaultWidgetPadding.left,
                         searchBarSpaceHeightPx,
-                        edgeMarginPx,
+                        desiredWorkspaceLeftRightMarginPx - defaultWidgetPadding.right,
                         hotseatBarHeightPx + pageIndicatorHeightPx);
             }
         }
@@ -460,7 +470,7 @@
                 lp = (FrameLayout.LayoutParams) pageIndicator.getLayoutParams();
                 lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
                 lp.width = LayoutParams.WRAP_CONTENT;
-                lp.height = pageIndicatorHeightPx;
+                lp.height = LayoutParams.WRAP_CONTENT;
                 lp.bottomMargin = hotseatBarHeightPx;
                 pageIndicator.setLayoutParams(lp);
             }
@@ -489,7 +499,8 @@
                 size, metrics));
     }
 
-    public DynamicGrid(Resources resources, int minWidthPx, int minHeightPx,
+    public DynamicGrid(Context context, Resources resources,
+                       int minWidthPx, int minHeightPx,
                        int widthPx, int heightPx,
                        int awPx, int ahPx) {
         DisplayMetrics dm = resources.getDisplayMetrics();
@@ -498,17 +509,17 @@
         boolean hasAA = !AppsCustomizePagedView.DISABLE_ALL_APPS;
         // Our phone profiles include the bar sizes in each orientation
         deviceProfiles.add(new DeviceProfile("Super Short Stubby",
-                255, 300,  2, 3,  48, 12, (hasAA ? 5 : 4), 48));
+                255, 300,  2, 3,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Shorter Stubby",
-                255, 400,  3, 3,  48, 12, (hasAA ? 5 : 4), 48));
+                255, 400,  3, 3,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Short Stubby",
-                275, 420,  3, 4,  48, 12, (hasAA ? 5 : 4), 48));
+                275, 420,  3, 4,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Stubby",
-                255, 450,  3, 4,  48, 12, (hasAA ? 5 : 4), 48));
+                255, 450,  3, 4,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Nexus S",
-                296, 491.33f,  4, 4,  48, 12, (hasAA ? 5 : 4), 48));
+                296, 491.33f,  4, 4,  48, 13, (hasAA ? 5 : 4), 48));
         deviceProfiles.add(new DeviceProfile("Nexus 4",
-                359, 518,  4, 4,  60, 12, (hasAA ? 5 : 4), 56));
+                359, 518,  4, 4,  60, 13, (hasAA ? 5 : 4), 56));
         // The tablet profile is odd in that the landscape orientation
         // also includes the nav bar on the side
         deviceProfiles.add(new DeviceProfile("Nexus 7",
@@ -526,7 +537,7 @@
                 1527, 2527,  7, 7,  100, 20,  7, 72));
         mMinWidth = dpiFromPx(minWidthPx, dm);
         mMinHeight = dpiFromPx(minHeightPx, dm);
-        mProfile = new DeviceProfile(deviceProfiles,
+        mProfile = new DeviceProfile(context, deviceProfiles,
                 mMinWidth, mMinHeight,
                 widthPx, heightPx,
                 awPx, ahPx,
diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java
index a4cb117..69d9a3d 100644
--- a/src/com/android/launcher3/Folder.java
+++ b/src/com/android/launcher3/Folder.java
@@ -532,8 +532,8 @@
     protected boolean createAndAddShortcut(ShortcutInfo item) {
         final BubbleTextView textView =
             (BubbleTextView) mInflater.inflate(R.layout.application, this, false);
-        textView.setCompoundDrawablesWithIntrinsicBounds(null,
-                new FastBitmapDrawable(item.getIcon(mIconCache)), null, null);
+        textView.setCompoundDrawables(null,
+                Utilities.createIconDrawable(item.getIcon(mIconCache)), null, null);
         textView.setText(item.title);
         textView.setTag(item);
         textView.setTextColor(getResources().getColor(R.color.folder_items_text_color));
@@ -888,7 +888,7 @@
         int centerY = (int) (mTempRect.top + mTempRect.height() * scale / 2);
         int centeredLeft = centerX - width / 2;
         int centeredTop = centerY - height / 2;
-        int currentPage = mLauncher.getWorkspace().getCurrentPage();
+        int currentPage = mLauncher.getWorkspace().getNextPage();
         // In case the workspace is scrolling, we need to use the final scroll to compute
         // the folders bounds.
         mLauncher.getWorkspace().setFinalScrollForPageChange(currentPage);
diff --git a/src/com/android/launcher3/FolderIcon.java b/src/com/android/launcher3/FolderIcon.java
index 7c791b9..cd1ff2c 100644
--- a/src/com/android/launcher3/FolderIcon.java
+++ b/src/com/android/launcher3/FolderIcon.java
@@ -98,6 +98,7 @@
     private int mPreviewOffsetY;
     private float mMaxPerspectiveShift;
     boolean mAnimating = false;
+    private Rect mOldBounds = new Rect();
 
     private PreviewItemDrawingParams mParams = new PreviewItemDrawingParams(0, 0, 0, 0);
     private PreviewItemDrawingParams mAnimParams = new PreviewItemDrawingParams(0, 0, 0, 0);
@@ -534,12 +535,15 @@
         Drawable d = params.drawable;
 
         if (d != null) {
+            mOldBounds.set(d.getBounds());
             d.setBounds(0, 0, mIntrinsicIconSize, mIntrinsicIconSize);
             d.setFilterBitmap(true);
-            d.setColorFilter(Color.argb(params.overlayAlpha, 0, 0, 0), PorterDuff.Mode.SRC_ATOP);
+            d.setColorFilter(Color.argb(params.overlayAlpha, 255, 255, 255),
+                    PorterDuff.Mode.SRC_ATOP);
             d.draw(canvas);
             d.clearColorFilter();
             d.setFilterBitmap(false);
+            d.setBounds(mOldBounds);
         }
         canvas.restore();
     }
diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java
index fbbb09f..094e188 100644
--- a/src/com/android/launcher3/Hotseat.java
+++ b/src/com/android/launcher3/Hotseat.java
@@ -20,7 +20,7 @@
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.graphics.Bitmap;
+import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -28,6 +28,7 @@
 import android.view.MotionEvent;
 import android.view.View;
 import android.widget.FrameLayout;
+import android.widget.TextView;
 
 import java.util.ArrayList;
 
@@ -101,6 +102,25 @@
         }
     }
 
+    /** This returns the coordinates of an app in a given cell, relative to the DragLayer */
+    Rect getCellCoordinates(int cellX, int cellY) {
+        Rect coords = new Rect();
+        mContent.cellToRect(cellX, cellY, 1, 1, coords);
+        int[] hotseatInParent = new int[2];
+        Utilities.getDescendantCoordRelativeToParent(this, mLauncher.getDragLayer(),
+                hotseatInParent, false);
+        coords.offset(hotseatInParent[0], hotseatInParent[1]);
+
+        // Center the icon
+        int cWidth = mContent.getShortcutsAndWidgets().getCellContentWidth();
+        int cHeight = mContent.getShortcutsAndWidgets().getCellContentHeight();
+        int cellPaddingX = (int) Math.max(0, ((coords.width() - cWidth) / 2f));
+        int cellPaddingY = (int) Math.max(0, ((coords.height() - cHeight) / 2f));
+        coords.offset(cellPaddingX, cellPaddingY);
+
+        return coords;
+    }
+
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
@@ -126,27 +146,17 @@
             // Add the Apps button
             Context context = getContext();
 
-            Drawable rawIcon =
-                    context.getResources().getDrawable(R.drawable.all_apps_button_icon);
-            Bitmap icon = Utilities.createIconBitmap(rawIcon, context);
-
             LayoutInflater inflater = LayoutInflater.from(context);
-            BubbleTextView allAppsButton = (BubbleTextView)
-                    inflater.inflate(R.layout.application, mContent, false);
-            allAppsButton.setCompoundDrawablesWithIntrinsicBounds(null,
-                    new FastBitmapDrawable(icon), null, null);
-            allAppsButton.setContentDescription(context.getString(R.string.all_apps_button_label));
-            allAppsButton.setOnTouchListener(new View.OnTouchListener() {
-                @Override
-                public boolean onTouch(View v, MotionEvent event) {
-                    if (mLauncher != null &&
-                            (event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) {
-                        mLauncher.onTouchDownAllAppsButton(v);
-                    }
-                    return false;
-                }
-            });
+            TextView allAppsButton = (TextView)
+                    inflater.inflate(R.layout.all_apps_button, mContent, false);
+            Drawable d = context.getResources().getDrawable(R.drawable.all_apps_button_icon);
+            Utilities.resizeIconDrawable(d);
+            allAppsButton.setCompoundDrawables(null, d, null, null);
 
+            allAppsButton.setContentDescription(context.getString(R.string.all_apps_button_label));
+            if (mLauncher != null) {
+                allAppsButton.setOnTouchListener(mLauncher.getHapticFeedbackTouchListener());
+            }
             allAppsButton.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(android.view.View v) {
@@ -166,6 +176,16 @@
         }
     }
 
+    @Override
+    public boolean onInterceptTouchEvent(MotionEvent ev) {
+        // We don't want any clicks to go through to the hotseat unless the workspace is in
+        // the normal state.
+        if (mLauncher.getWorkspace().isSmall()) {
+            return true;
+        }
+        return false;
+    }
+
     void addAllAppsFolder(IconCache iconCache,
             ArrayList<AppInfo> allApps, ArrayList<ComponentName> onWorkspace,
             Launcher launcher, Workspace workspace) {
diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java
index 1797826..543b8ee 100644
--- a/src/com/android/launcher3/IconCache.java
+++ b/src/com/android/launcher3/IconCache.java
@@ -29,6 +29,8 @@
 import android.graphics.drawable.Drawable;
 
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
 
 /**
  * Cache of application icons.  Icons can be made from any thread.
@@ -147,6 +149,21 @@
     }
 
     /**
+     * Empty out the cache that aren't of the correct grid size
+     */
+    public void flushInvalidIcons(DeviceProfile grid) {
+        synchronized (mCache) {
+            Iterator<Entry<ComponentName, CacheEntry>> it = mCache.entrySet().iterator();
+            while (it.hasNext()) {
+                final CacheEntry e = it.next().getValue();
+                if (e.icon.getWidth() != grid.iconSizePx || e.icon.getHeight() != grid.iconSizePx) {
+                    it.remove();
+                }
+            }
+        }
+    }
+
+    /**
      * Fill in "application" with the icon and label for "info."
      */
     public void getTitleAndIcon(AppInfo application, ResolveInfo info,
diff --git a/src/com/android/launcher3/InstallShortcutReceiver.java b/src/com/android/launcher3/InstallShortcutReceiver.java
index 821c15f..7df73b1 100644
--- a/src/com/android/launcher3/InstallShortcutReceiver.java
+++ b/src/com/android/launcher3/InstallShortcutReceiver.java
@@ -36,6 +36,9 @@
 import org.json.*;
 
 public class InstallShortcutReceiver extends BroadcastReceiver {
+    private static final String TAG = "InstallShortcutReceiver";
+    private static final boolean DBG = false;
+
     public static final String ACTION_INSTALL_SHORTCUT =
             "com.android.launcher.action.INSTALL_SHORTCUT";
 
@@ -94,10 +97,11 @@
                 }
                 json = json.endObject();
                 SharedPreferences.Editor editor = sharedPrefs.edit();
+                if (DBG) Log.d(TAG, "Adding to APPS_PENDING_INSTALL: " + json);
                 addToStringSet(sharedPrefs, editor, APPS_PENDING_INSTALL, json.toString());
                 editor.commit();
             } catch (org.json.JSONException e) {
-                Log.d("InstallShortcutReceiver", "Exception when adding shortcut: " + e);
+                Log.d(TAG, "Exception when adding shortcut: " + e);
             }
         }
     }
@@ -106,9 +110,15 @@
                                               ArrayList<String> packageNames) {
         synchronized(sLock) {
             Set<String> strings = sharedPrefs.getStringSet(APPS_PENDING_INSTALL, null);
+            if (DBG) {
+                Log.d(TAG, "APPS_PENDING_INSTALL: " + strings
+                        + ", removing packages: " + packageNames);
+            }
             if (strings != null) {
                 Set<String> newStrings = new HashSet<String>(strings);
-                for (String json : newStrings) {
+                Iterator<String> newStringsIter = newStrings.iterator();
+                while (newStringsIter.hasNext()) {
+                    String json = newStringsIter.next();
                     try {
                         JSONObject object = (JSONObject) new JSONTokener(json).nextValue();
                         Intent launchIntent = Intent.parseUri(object.getString(LAUNCH_INTENT_KEY), 0);
@@ -117,12 +127,12 @@
                             pn = launchIntent.getComponent().getPackageName();
                         }
                         if (packageNames.contains(pn)) {
-                            newStrings.remove(json);
+                            newStringsIter.remove();
                         }
                     } catch (org.json.JSONException e) {
-                        Log.d("InstallShortcutReceiver", "Exception reading shortcut to remove: " + e);
+                        Log.d(TAG, "Exception reading shortcut to remove: " + e);
                     } catch (java.net.URISyntaxException e) {
-                        Log.d("InstallShortcutReceiver", "Exception reading shortcut to remove: " + e);
+                        Log.d(TAG, "Exception reading shortcut to remove: " + e);
                     }
                 }
                 sharedPrefs.edit().putStringSet(APPS_PENDING_INSTALL,
@@ -135,6 +145,7 @@
             SharedPreferences sharedPrefs) {
         synchronized(sLock) {
             Set<String> strings = sharedPrefs.getStringSet(APPS_PENDING_INSTALL, null);
+            if (DBG) Log.d(TAG, "Getting and clearing APPS_PENDING_INSTALL: " + strings);
             if (strings == null) {
                 return new ArrayList<PendingInstallShortcutInfo>();
             }
@@ -167,11 +178,9 @@
                         new PendingInstallShortcutInfo(data, name, launchIntent);
                     infos.add(info);
                 } catch (org.json.JSONException e) {
-                    Log.d("InstallShortcutReceiver",
-                            "Exception reading shortcut to add: " + e);
+                    Log.d(TAG, "Exception reading shortcut to add: " + e);
                 } catch (java.net.URISyntaxException e) {
-                    Log.d("InstallShortcutReceiver",
-                            "Exception reading shortcut to add: " + e);
+                    Log.d(TAG, "Exception reading shortcut to add: " + e);
                 }
             }
             sharedPrefs.edit().putStringSet(APPS_PENDING_INSTALL, new HashSet<String>()).commit();
@@ -203,6 +212,8 @@
             return;
         }
 
+        if (DBG) Log.d(TAG, "Got INSTALL_SHORTCUT: " + data.toUri(0));
+
         Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
         if (intent == null) {
             return;
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index ba34c13..b0e4968 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -87,8 +87,8 @@
 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
 import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.AccelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.Advanceable;
@@ -103,12 +103,9 @@
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.FileDescriptor;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
 import java.io.PrintWriter;
 import java.text.DateFormat;
 import java.util.ArrayList;
@@ -273,6 +270,7 @@
     private IconCache mIconCache;
     private boolean mUserPresent = true;
     private boolean mVisible = false;
+    private boolean mHasFocus = false;
     private boolean mAttached = false;
     private static final boolean DISABLE_CLINGS = false;
     private static final boolean DISABLE_CUSTOM_CLINGS = true;
@@ -281,7 +279,7 @@
 
     private static HashMap<Long, FolderInfo> sFolders = new HashMap<Long, FolderInfo>();
 
-    private Intent mAppMarketIntent = null;
+    private View.OnTouchListener mHapticFeedbackTouchListener;
 
     // Related to the auto-advancing of widgets
     private final int ADVANCE_MSG = 1;
@@ -301,6 +299,9 @@
     private static Drawable.ConstantState[] sVoiceSearchIcon = new Drawable.ConstantState[2];
     private static Drawable.ConstantState[] sAppMarketIcon = new Drawable.ConstantState[2];
 
+    private Intent mAppMarketIntent = null;
+    private static final boolean DISABLE_MARKET_BUTTON = true;
+
     private Drawable mWorkspaceBackgroundDrawable;
 
     private final ArrayList<Integer> mSynchronouslyBoundPages = new ArrayList<Integer>();
@@ -341,7 +342,7 @@
     private static ArrayList<PendingAddArguments> sPendingAddList
             = new ArrayList<PendingAddArguments>();
 
-    private static boolean sForceEnableRotation = isPropertyEnabled(FORCE_ENABLE_ROTATION_PROPERTY);
+    public static boolean sForceEnableRotation = isPropertyEnabled(FORCE_ENABLE_ROTATION_PROPERTY);
 
     private static class PendingAddArguments {
         int requestCode;
@@ -401,12 +402,14 @@
                 Context.MODE_PRIVATE);
         mModel = app.setLauncher(this);
         mIconCache = app.getIconCache();
+        mIconCache.flushInvalidIcons(grid);
         mDragController = new DragController(this);
         mInflater = getLayoutInflater();
 
         mStats = new Stats(this);
 
         mAppWidgetManager = AppWidgetManager.getInstance(this);
+
         mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);
         mAppWidgetHost.startListening();
 
@@ -420,8 +423,10 @@
                     Environment.getExternalStorageDirectory() + "/launcher");
         }
 
+
         checkForLocaleChange();
         setContentView(R.layout.launcher);
+
         setupViews();
         grid.layout(this);
 
@@ -492,7 +497,7 @@
      * ensure the custom content page is added or removed if necessary.
      */
     protected void invalidateHasCustomContentToLeft() {
-        if (mWorkspace.getScreenOrder().isEmpty()) {
+        if (mWorkspace == null || mWorkspace.getScreenOrder().isEmpty()) {
             // Not bound yet, wait for bindScreens to be called.
             return;
         }
@@ -513,7 +518,9 @@
         int coi = getCurrentOrientationIndexForGlobalIcons();
         if (sGlobalSearchIcon[coi] == null || sVoiceSearchIcon[coi] == null ||
                 sAppMarketIcon[coi] == null) {
-            updateAppMarketIcon();
+            if (!DISABLE_MARKET_BUTTON) {
+                updateAppMarketIcon();
+            }
             searchVisible = updateGlobalSearchIcon();
             voiceVisible = updateVoiceSearchIcon(searchVisible);
         }
@@ -525,7 +532,7 @@
             updateVoiceSearchIcon(sVoiceSearchIcon[coi]);
             voiceVisible = true;
         }
-        if (sAppMarketIcon[coi] != null) {
+        if (!DISABLE_MARKET_BUTTON && sAppMarketIcon[coi] != null) {
             updateAppMarketIcon(sAppMarketIcon[coi]);
         }
         if (mSearchDropTargetBar != null) {
@@ -730,6 +737,7 @@
                 Log.e(TAG, "Error: appWidgetId (EXTRA_APPWIDGET_ID) was not returned from the \\" +
                         "widget configuration activity.");
                 completeTwoStageWidgetDrop(RESULT_CANCELED, appWidgetId);
+                mWorkspace.stripEmptyScreens();
             } else {
                 completeTwoStageWidgetDrop(resultCode, appWidgetId);
             }
@@ -754,6 +762,8 @@
             } else {
                 delayExitSpringLoadedMode = completeAdd(args);
             }
+        } else if (resultCode == RESULT_CANCELED) {
+            mWorkspace.stripEmptyScreens();
         }
         mDragLayer.clearAnimatedView();
         // Exit spring loaded mode if necessary after cancelling the configuration of a widget
@@ -827,7 +837,7 @@
         if (mOnResumeState == State.WORKSPACE) {
             showWorkspace(false);
         } else if (mOnResumeState == State.APPS_CUSTOMIZE) {
-            showAllApps(false, AppsCustomizePagedView.ContentType.Applications);
+            showAllApps(false, AppsCustomizePagedView.ContentType.Applications, false);
         }
         mOnResumeState = State.NONE;
 
@@ -882,10 +892,7 @@
             // Resets the previous all apps icon press state
             mAppsCustomizeContent.resetDrawableState();
         }
-        // Reset AllApps to its initial state
-        if (mAppsCustomizeTabHost != null) {
-            mAppsCustomizeTabHost.reset();
-        }
+
         // It is possible that widgets can receive updates while launcher is not in the foreground.
         // Consequently, the widgets will be inflated in the orientation of the foreground activity
         // (framework issue). On resuming, we ensure that any widgets are inflated for the current
@@ -895,12 +902,26 @@
         // Process any items that were added while Launcher was away.
         InstallShortcutReceiver.disableAndFlushInstallQueue(this);
 
+        // Update the voice search button proxy
+        updateVoiceButtonProxyVisible(false);
+
         // Again, as with the above scenario, it's possible that one or more of the global icons
         // were updated in the wrong orientation.
         updateGlobalIcons();
         if (DEBUG_RESUME_TIME) {
             Log.d(TAG, "Time spent in onResume: " + (System.currentTimeMillis() - startTime));
         }
+
+        if (mWorkspace.getCustomContentCallbacks() != null) {
+            // If we are resuming and the custom content is the current page, we call onShow().
+            // It is also poassible that onShow will instead be called slightly after first layout
+            // if PagedView#setRestorePage was set to the custom content page in onCreate().
+            if (mWorkspace.isOnOrMovingToCustomContent()) {
+                mWorkspace.getCustomContentCallbacks().onShow();
+            }
+        }
+        mWorkspace.updateInteractionForState();
+        mWorkspace.onResume();
     }
 
     @Override
@@ -912,6 +933,12 @@
         mPaused = true;
         mDragController.cancelDrag();
         mDragController.resetLastGestureUpTime();
+
+        // We call onHide() aggressively. The custom content callbacks should be able to
+        // debounce excess onHide calls.
+        if (mWorkspace.getCustomContentCallbacks() != null) {
+            mWorkspace.getCustomContentCallbacks().onHide();
+        }
     }
 
     protected void onFinishBindingItems() {
@@ -957,14 +984,9 @@
         public void setScrollY(int scrollY);
     }
 
-    // Add a fullscreen unpadded view to the workspace to the left all other screens.
-    public QSBScroller addToCustomContentPage(View customContent) {
-        return addToCustomContentPage(customContent, null);
-    }
-
     public QSBScroller addToCustomContentPage(View customContent,
-            CustomContentCallbacks callbacks) {
-        mWorkspace.addToCustomContentPage(customContent, callbacks);
+            CustomContentCallbacks callbacks, String description) {
+        mWorkspace.addToCustomContentPage(customContent, callbacks, description);
         return mQsbScroller;
     }
 
@@ -984,25 +1006,11 @@
     }
 
     // We can't hide the IME if it was forced open.  So don't bother
-    /*
     @Override
     public void onWindowFocusChanged(boolean hasFocus) {
         super.onWindowFocusChanged(hasFocus);
-
-        if (hasFocus) {
-            final InputMethodManager inputManager = (InputMethodManager)
-                    getSystemService(Context.INPUT_METHOD_SERVICE);
-            WindowManager.LayoutParams lp = getWindow().getAttributes();
-            inputManager.hideSoftInputFromWindow(lp.token, 0, new android.os.ResultReceiver(new
-                        android.os.Handler()) {
-                        protected void onReceiveResult(int resultCode, Bundle resultData) {
-                            Log.d(TAG, "ResultReceiver got resultCode=" + resultCode);
-                        }
-                    });
-            Log.d(TAG, "called hideSoftInputFromWindow from onWindowFocusChanged");
-        }
+        mHasFocus = hasFocus;
     }
-    */
 
     private boolean acceptFilter() {
         final InputMethodManager inputManager = (InputMethodManager)
@@ -1078,8 +1086,9 @@
             mOnResumeState = State.APPS_CUSTOMIZE;
         }
 
-        int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN, -1);
-        if (currentScreen > -1) {
+        int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN,
+                PagedView.INVALID_RESTORE_PAGE);
+        if (currentScreen != PagedView.INVALID_RESTORE_PAGE) {
             mWorkspace.setRestorePage(currentScreen);
         }
 
@@ -1145,24 +1154,32 @@
         }
 
         mOverviewPanel = findViewById(R.id.overview_panel);
-        findViewById(R.id.widget_button).setOnClickListener(new OnClickListener() {
+        View widgetButton = findViewById(R.id.widget_button);
+        widgetButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View arg0) {
-                showAllApps(true, AppsCustomizePagedView.ContentType.Widgets);
+                showAllApps(true, AppsCustomizePagedView.ContentType.Widgets, true);
             }
         });
-        findViewById(R.id.wallpaper_button).setOnClickListener(new OnClickListener() {
+        widgetButton.setOnTouchListener(getHapticFeedbackTouchListener());
+
+        View wallpaperButton = findViewById(R.id.wallpaper_button);
+        wallpaperButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View arg0) {
                 startWallpaper();
             }
         });
-        findViewById(R.id.settings_button).setOnClickListener(new OnClickListener() {
+        wallpaperButton.setOnTouchListener(getHapticFeedbackTouchListener());
+
+        View settingsButton = findViewById(R.id.settings_button);
+        settingsButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View arg0) {
                 startSettings();
             }
         });
+        settingsButton.setOnTouchListener(getHapticFeedbackTouchListener());
         mOverviewPanel.setAlpha(0f);
 
         // Setup the workspace
@@ -1452,7 +1469,7 @@
                 // Reset AllApps to its initial state only if we are not in the middle of
                 // processing a multi-step drop
                 if (mAppsCustomizeTabHost != null && mPendingAddInfo.container == ItemInfo.NO_ID) {
-                    showWorkspaceAndExitOverviewMode(false);
+                    showWorkspace(false);
                 }
             } else if (Intent.ACTION_USER_PRESENT.equals(action)) {
                 mUserPresent = true;
@@ -1527,7 +1544,9 @@
             }
             // When Launcher comes back to foreground, a different Activity might be responsible for
             // the app market intent, so refresh the icon
-            updateAppMarketIcon();
+            if (!DISABLE_MARKET_BUTTON) {
+                updateAppMarketIcon();
+            }
             clearTypedText();
         }
     }
@@ -1634,74 +1653,51 @@
             // also will cancel mWaitingForResult.
             closeSystemDialogs();
 
-            final boolean alreadyOnHome =
-                    ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
-                        != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
+            final boolean alreadyOnHome = mHasFocus && ((intent.getFlags() &
+                    Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
+                    != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
 
-            Runnable processIntent = new Runnable() {
-                public void run() {
-                    if (mWorkspace == null) {
-                        // Can be cases where mWorkspace is null, this prevents a NPE
-                        return;
-                    }
-                    Folder openFolder = mWorkspace.getOpenFolder();
-                    // In all these cases, only animate if we're already on home
-                    mWorkspace.exitWidgetResizeMode();
-                    if (alreadyOnHome && mState == State.WORKSPACE && !mWorkspace.isTouchActive() &&
-                            openFolder == null) {
-                        mWorkspace.moveToDefaultScreen(true);
-                    }
-
-                    closeFolder();
-                    exitSpringLoadedDragMode();
-
-                    // If we are already on home, then just animate back to the workspace,
-                    // otherwise, just wait until onResume to set the state back to Workspace
-                    if (alreadyOnHome) {
-                        showWorkspaceAndExitOverviewMode(true);
-                    } else {
-                        mOnResumeState = State.WORKSPACE;
-                    }
-
-                    final View v = getWindow().peekDecorView();
-                    if (v != null && v.getWindowToken() != null) {
-                        InputMethodManager imm = (InputMethodManager)getSystemService(
-                                INPUT_METHOD_SERVICE);
-                        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
-                    }
-
-                    // Reset the apps customize page
-                    if (mAppsCustomizeTabHost != null) {
-                        mAppsCustomizeTabHost.reset();
-                    }
-                }
-            };
-
-            if (alreadyOnHome && !mWorkspace.hasWindowFocus()) {
-                // Delay processing of the intent to allow the status bar animation to finish
-                // first in order to avoid janky animations.
-                mWorkspace.postDelayed(processIntent, 350);
-            } else {
-                // Process the intent immediately.
-                processIntent.run();
+            if (mWorkspace == null) {
+                // Can be cases where mWorkspace is null, this prevents a NPE
+                return;
+            }
+            Folder openFolder = mWorkspace.getOpenFolder();
+            // In all these cases, only animate if we're already on home
+            mWorkspace.exitWidgetResizeMode();
+            if (alreadyOnHome && mState == State.WORKSPACE && !mWorkspace.isTouchActive() &&
+                    openFolder == null) {
+                mWorkspace.moveToDefaultScreen(true);
             }
 
+            closeFolder();
+            exitSpringLoadedDragMode();
+
+            // If we are already on home, then just animate back to the workspace,
+            // otherwise, just wait until onResume to set the state back to Workspace
+            if (alreadyOnHome) {
+                showWorkspace(true);
+            } else {
+                mOnResumeState = State.WORKSPACE;
+            }
+
+            final View v = getWindow().peekDecorView();
+            if (v != null && v.getWindowToken() != null) {
+                InputMethodManager imm = (InputMethodManager)getSystemService(
+                        INPUT_METHOD_SERVICE);
+                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+            }
+
+            // Reset the apps customize page
+            if (mAppsCustomizeTabHost != null) {
+                mAppsCustomizeTabHost.reset();
+            }
         }
+
         if (DEBUG_RESUME_TIME) {
             Log.d(TAG, "Time spent in onNewIntent: " + (System.currentTimeMillis() - startTime));
         }
     }
 
-    protected void showWorkspaceAndExitOverviewMode(boolean animate) {
-        showWorkspace(animate);
-        if (mWorkspace.isInOverviewMode()) {
-            mWorkspace.exitOverviewMode(animate);
-        }
-    }
-    protected void showWorkspaceAndExitOverviewMode() {
-        showWorkspaceAndExitOverviewMode(true);
-    }
-
     @Override
     public void onRestoreInstanceState(Bundle state) {
         super.onRestoreInstanceState(state);
@@ -1712,7 +1708,9 @@
 
     @Override
     protected void onSaveInstanceState(Bundle outState) {
-        outState.putInt(RUNTIME_STATE_CURRENT_SCREEN, mWorkspace.getNextPage());
+        if (mWorkspace.getChildCount() > 0) {
+            outState.putInt(RUNTIME_STATE_CURRENT_SCREEN, mWorkspace.getRestorePage());
+        }
         super.onSaveInstanceState(outState);
 
         outState.putInt(RUNTIME_STATE, mState.ordinal());
@@ -2058,7 +2056,6 @@
     }
 
     protected void startWallpaper() {
-        showWorkspace(true);
         final Intent pickWallpaper = new Intent(Intent.ACTION_SET_WALLPAPER);
         pickWallpaper.setComponent(getWallpaperPickerComponent());
         startActivityForResult(pickWallpaper, REQUEST_PICK_WALLPAPER);
@@ -2104,7 +2101,12 @@
     @Override
     public void onBackPressed() {
         if (isAllAppsVisible()) {
-            showWorkspace(true);
+            if (mAppsCustomizeContent.getContentType() ==
+                    AppsCustomizePagedView.ContentType.Applications) {
+                showWorkspace(true);
+            } else {
+                showOverviewMode(true);
+            }
         } else if (mWorkspace.isInOverviewMode()) {
             mWorkspace.exitOverviewMode(true);
         } else if (mWorkspace.getOpenFolder() != null) {
@@ -2171,7 +2173,7 @@
                 final String shortcutClass = intent.getComponent().getClassName();
 
                 if (shortcutClass.equals(WidgetAdder.class.getName())) {
-                    showAllApps(true, AppsCustomizePagedView.ContentType.Widgets);
+                    showAllApps(true, AppsCustomizePagedView.ContentType.Widgets, true);
                     return;
                 } else if (shortcutClass.equals(MemoryDumpActivity.class.getName())) {
                     MemoryDumpActivity.startDump(this);
@@ -2261,7 +2263,7 @@
      * @param v The view that was clicked.
      */
     public void onClickAllAppsButton(View v) {
-        showAllApps(true, AppsCustomizePagedView.ContentType.Applications);
+        showAllApps(true, AppsCustomizePagedView.ContentType.Applications, true);
     }
 
     public void onTouchDownAllAppsButton(View v) {
@@ -2269,11 +2271,33 @@
         v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
     }
 
+    public void performHapticFeedbackOnTouchDown(View v) {
+        // Provide the same haptic feedback that the system offers for virtual keys.
+        v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
+    }
+
+    public View.OnTouchListener getHapticFeedbackTouchListener() {
+        if (mHapticFeedbackTouchListener == null) {
+            mHapticFeedbackTouchListener = new View.OnTouchListener() {
+                @Override
+                public boolean onTouch(View v, MotionEvent event) {
+                    if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) {
+                        v.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
+                    }
+                    return false;
+                }
+            };
+        }
+        return mHapticFeedbackTouchListener;
+    }
+
     public void onClickAppMarketButton(View v) {
-        if (mAppMarketIntent != null) {
-            startActivitySafely(v, mAppMarketIntent, "app market");
-        } else {
-            Log.e(TAG, "Invalid app market intent.");
+        if (!DISABLE_MARKET_BUTTON) {
+            if (mAppMarketIntent != null) {
+                startActivitySafely(v, mAppMarketIntent, "app market");
+            } else {
+                Log.e(TAG, "Invalid app market intent.");
+            }
         }
     }
 
@@ -2811,8 +2835,6 @@
             mStateAnimation.play(alphaAnim).after(startDelay);
 
             mStateAnimation.addListener(new AnimatorListenerAdapter() {
-                boolean animationCancelled = false;
-
                 @Override
                 public void onAnimationStart(Animator animation) {
                     // Prepare the position
@@ -2831,11 +2853,6 @@
                         mSearchDropTargetBar.hideSearchBar(false);
                     }
                 }
-
-                @Override
-                public void onAnimationCancel(Animator animation) {
-                    animationCancelled = true;
-                }
             });
 
             if (workspaceAnim != null) {
@@ -2907,7 +2924,7 @@
      * This is the opposite of showAppsCustomizeHelper.
      * @param animated If true, the transition will be animated.
      */
-    private void hideAppsCustomizeHelper(State toState, final boolean animated,
+    private void hideAppsCustomizeHelper(Workspace.State toState, final boolean animated,
             final boolean springLoaded, final Runnable onCompleteRunnable) {
 
         if (mStateAnimation != null) {
@@ -2925,13 +2942,14 @@
         final View fromView = mAppsCustomizeTabHost;
         final View toView = mWorkspace;
         Animator workspaceAnim = null;
-        if (toState == State.WORKSPACE) {
+        if (toState == Workspace.State.NORMAL) {
             int stagger = res.getInteger(R.integer.config_appsCustomizeWorkspaceAnimationStagger);
             workspaceAnim = mWorkspace.getChangeStateAnimation(
-                    Workspace.State.NORMAL, animated, stagger, -1);
-        } else if (toState == State.APPS_CUSTOMIZE_SPRING_LOADED) {
+                    toState, animated, stagger, -1);
+        } else if (toState == Workspace.State.SPRING_LOADED ||
+                toState == Workspace.State.OVERVIEW) {
             workspaceAnim = mWorkspace.getChangeStateAnimation(
-                    Workspace.State.SPRING_LOADED, animated);
+                    toState, animated);
         }
 
         setPivotsForZoom(fromView, scaleFactor);
@@ -3003,20 +3021,27 @@
         }
     }
 
-    void showWorkspace(boolean animated) {
+    protected void showWorkspace(boolean animated) {
         showWorkspace(animated, null);
     }
 
+    protected void showWorkspace() {
+        showWorkspace(true);
+    }
+
     void showWorkspace(boolean animated, Runnable onCompleteRunnable) {
+        if (mWorkspace.isInOverviewMode()) {
+            mWorkspace.exitOverviewMode(animated);
+        }
         if (mState != State.WORKSPACE) {
             boolean wasInSpringLoadedMode = (mState != State.WORKSPACE);
             mWorkspace.setVisibility(View.VISIBLE);
-            hideAppsCustomizeHelper(State.WORKSPACE, animated, false, onCompleteRunnable);
+            hideAppsCustomizeHelper(Workspace.State.NORMAL, animated, false, onCompleteRunnable);
 
             // Show the search bar (only animate if we were showing the drop target bar in spring
             // loaded mode)
             if (mSearchDropTargetBar != null) {
-                mSearchDropTargetBar.showSearchBar(wasInSpringLoadedMode);
+                mSearchDropTargetBar.showSearchBar(animated && wasInSpringLoadedMode);
             }
 
             // Set focus to the AppsCustomize button
@@ -3037,22 +3062,30 @@
                 .sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
 
         onWorkspaceShown(animated);
-        onInteractionEnd();
+    }
+
+    void showOverviewMode(boolean animated) {
+        mWorkspace.setVisibility(View.VISIBLE);
+        hideAppsCustomizeHelper(Workspace.State.OVERVIEW, animated, false, null);
+        mState = State.WORKSPACE;
+        onWorkspaceShown(animated);
     }
 
     public void onWorkspaceShown(boolean animated) {
     }
 
-    void showAllApps(boolean animated,
-                     AppsCustomizePagedView.ContentType contentType) {
+    void showAllApps(boolean animated, AppsCustomizePagedView.ContentType contentType,
+                     boolean resetPageToZero) {
         if (mState != State.WORKSPACE) return;
 
+        if (resetPageToZero) {
+            mAppsCustomizeTabHost.reset();
+        }
         showAppsCustomizeHelper(animated, false, contentType);
         mAppsCustomizeTabHost.requestFocus();
 
         // Change the state *after* we've called all the transition code
         mState = State.APPS_CUSTOMIZE;
-        onInteractionBegin();
 
         // Pause the auto-advance of widgets until we are out of AllApps
         mUserPresent = false;
@@ -3066,7 +3099,7 @@
 
     void enterSpringLoadedDragMode() {
         if (isAllAppsVisible()) {
-            hideAppsCustomizeHelper(State.APPS_CUSTOMIZE_SPRING_LOADED, true, true, null);
+            hideAppsCustomizeHelper(Workspace.State.SPRING_LOADED, true, true, null);
             mState = State.APPS_CUSTOMIZE_SPRING_LOADED;
         }
     }
@@ -3301,7 +3334,7 @@
             if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.GONE);
             if (searchButton != null) searchButton.setVisibility(View.GONE);
             if (voiceButton != null) voiceButton.setVisibility(View.GONE);
-            setVoiceButtonProxyVisible(false);
+            updateVoiceButtonProxyVisible(false);
             return false;
         }
     }
@@ -3348,13 +3381,13 @@
             }
             if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.VISIBLE);
             voiceButton.setVisibility(View.VISIBLE);
-            setVoiceButtonProxyVisible(true);
+            updateVoiceButtonProxyVisible(false);
             invalidatePressedFocusedStates(voiceButtonContainer, voiceButton);
             return true;
         } else {
             if (voiceButtonContainer != null) voiceButtonContainer.setVisibility(View.GONE);
             if (voiceButton != null) voiceButton.setVisibility(View.GONE);
-            setVoiceButtonProxyVisible(false);
+            updateVoiceButtonProxyVisible(false);
             return false;
         }
     }
@@ -3366,45 +3399,60 @@
         invalidatePressedFocusedStates(voiceButtonContainer, voiceButton);
     }
 
-    public void setVoiceButtonProxyVisible(boolean visible) {
+    public void updateVoiceButtonProxyVisible(boolean forceDisableVoiceButtonProxy) {
         final View voiceButtonProxy = findViewById(R.id.voice_button_proxy);
         if (voiceButtonProxy != null) {
+            boolean visible = !forceDisableVoiceButtonProxy &&
+                    mWorkspace.shouldVoiceButtonProxyBeVisible();
             voiceButtonProxy.setVisibility(visible ? View.VISIBLE : View.GONE);
+            voiceButtonProxy.bringToFront();
         }
     }
+
+    /**
+     * This is an overrid eot disable the voice button proxy.  If disabled is true, then the voice button proxy
+     * will be hidden regardless of what shouldVoiceButtonProxyBeVisible() returns.
+     */
+    public void disableVoiceButtonProxy(boolean disabled) {
+        updateVoiceButtonProxyVisible(disabled);
+    }
     /**
      * Sets the app market icon
      */
     private void updateAppMarketIcon() {
-        final View marketButton = findViewById(R.id.market_button);
-        Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_APP_MARKET);
-        // Find the app market activity by resolving an intent.
-        // (If multiple app markets are installed, it will return the ResolverActivity.)
-        ComponentName activityName = intent.resolveActivity(getPackageManager());
-        if (activityName != null) {
-            int coi = getCurrentOrientationIndexForGlobalIcons();
-            mAppMarketIntent = intent;
-            sAppMarketIcon[coi] = updateTextButtonWithIconFromExternalActivity(
-                    R.id.market_button, activityName, R.drawable.ic_launcher_market_holo,
-                    TOOLBAR_ICON_METADATA_NAME);
-            marketButton.setVisibility(View.VISIBLE);
-        } else {
-            // We should hide and disable the view so that we don't try and restore the visibility
-            // of it when we swap between drag & normal states from IconDropTarget subclasses.
-            marketButton.setVisibility(View.GONE);
-            marketButton.setEnabled(false);
+        if (!DISABLE_MARKET_BUTTON) {
+            final View marketButton = findViewById(R.id.market_button);
+            Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_APP_MARKET);
+            // Find the app market activity by resolving an intent.
+            // (If multiple app markets are installed, it will return the ResolverActivity.)
+            ComponentName activityName = intent.resolveActivity(getPackageManager());
+            if (activityName != null) {
+                int coi = getCurrentOrientationIndexForGlobalIcons();
+                mAppMarketIntent = intent;
+                sAppMarketIcon[coi] = updateTextButtonWithIconFromExternalActivity(
+                        R.id.market_button, activityName, R.drawable.ic_launcher_market_holo,
+                        TOOLBAR_ICON_METADATA_NAME);
+                marketButton.setVisibility(View.VISIBLE);
+            } else {
+                // We should hide and disable the view so that we don't try and restore the visibility
+                // of it when we swap between drag & normal states from IconDropTarget subclasses.
+                marketButton.setVisibility(View.GONE);
+                marketButton.setEnabled(false);
+            }
         }
     }
 
     private void updateAppMarketIcon(Drawable.ConstantState d) {
-        // Ensure that the new drawable we are creating has the approprate toolbar icon bounds
-        Resources r = getResources();
-        Drawable marketIconDrawable = d.newDrawable(r);
-        int w = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_width);
-        int h = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_height);
-        marketIconDrawable.setBounds(0, 0, w, h);
+        if (!DISABLE_MARKET_BUTTON) {
+            // Ensure that the new drawable we are creating has the approprate toolbar icon bounds
+            Resources r = getResources();
+            Drawable marketIconDrawable = d.newDrawable(r);
+            int w = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_width);
+            int h = r.getDimensionPixelSize(R.dimen.toolbar_external_icon_height);
+            marketIconDrawable.setBounds(0, 0, w, h);
 
-        updateTextButtonWithDrawable(R.id.market_button, marketIconDrawable);
+            updateTextButtonWithDrawable(R.id.market_button, marketIconDrawable);
+        }
     }
 
     @Override
@@ -3414,7 +3462,7 @@
         text.clear();
         // Populate event with a fake title based on the current state.
         if (mState == State.APPS_CUSTOMIZE) {
-            text.add(getString(R.string.all_apps_button_label));
+            text.add(mAppsCustomizeTabHost.getCurrentTabView().getContentDescription());
         } else {
             text.add(getString(R.string.all_apps_home_button_label));
         }
@@ -3570,22 +3618,6 @@
         return show;
     }
 
-    private boolean emailSent() {
-        String spKey = LauncherAppState.getSharedPreferencesKey();
-        SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE);
-        boolean show = sp.getBoolean(CORRUPTION_EMAIL_SENT_KEY, false);
-        return show;
-    }
-
-    private void setEmailSent(boolean sent) {
-        String spKey = LauncherAppState.getSharedPreferencesKey();
-        SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE);
-
-        SharedPreferences.Editor editor = sp.edit();
-        editor.putBoolean(CORRUPTION_EMAIL_SENT_KEY, sent);
-        editor.commit();
-    }
-
     private void toggleShowWeightWatcher() {
         String spKey = LauncherAppState.getSharedPreferencesKey();
         SharedPreferences sp = getSharedPreferences(spKey, Context.MODE_PRIVATE);
@@ -3629,6 +3661,9 @@
                     addAnimated.size(), true);
         }
 
+        // Remove the extra empty screen
+        mWorkspace.removeExtraEmptyScreen();
+
         if (!AppsCustomizePagedView.DISABLE_ALL_APPS &&
                 addedApps != null && mAppsCustomizeContent != null) {
             mAppsCustomizeContent.addApps(addedApps);
@@ -3710,20 +3745,24 @@
             if (newShortcutsScreenId > -1) {
                 long currentScreenId = mWorkspace.getScreenIdForPageIndex(mWorkspace.getNextPage());
                 final int newScreenIndex = mWorkspace.getPageIndexForScreenId(newShortcutsScreenId);
+                final Runnable startBounceAnimRunnable = new Runnable() {
+                    public void run() {
+                        anim.playTogether(bounceAnims);
+                        anim.start();
+                    }
+                };
                 if (newShortcutsScreenId != currentScreenId) {
                     // We post the animation slightly delayed to prevent slowdowns
                     // when we are loading right after we return to launcher.
                     mWorkspace.postDelayed(new Runnable() {
                         public void run() {
                             mWorkspace.snapToPage(newScreenIndex);
-                            mWorkspace.postDelayed(new Runnable() {
-                                public void run() {
-                                    anim.playTogether(bounceAnims);
-                                    anim.start();
-                                }
-                            }, NEW_APPS_ANIMATION_DELAY);
+                            mWorkspace.postDelayed(startBounceAnimRunnable,
+                                    NEW_APPS_ANIMATION_DELAY);
                         }
                     }, NEW_APPS_PAGE_MOVE_DELAY);
+                } else {
+                    mWorkspace.postDelayed(startBounceAnimRunnable, NEW_APPS_ANIMATION_DELAY);
                 }
             }
         }
@@ -3826,7 +3865,9 @@
 
         // Update the market app icon as necessary (the other icons will be managed in response to
         // package changes in bindSearchablesChanged()
-        updateAppMarketIcon();
+        if (!DISABLE_MARKET_BUTTON) {
+            updateAppMarketIcon();
+        }
 
         mWorkspaceLoading = false;
         if (upgradePath) {
@@ -3889,18 +3930,12 @@
                 mIntentsOnWorkspaceFromUpgradePath = null;
             }
         } else {
-            if (!AppsCustomizePagedView.DISABLE_ALL_APPS &&
-                    mAppsCustomizeContent != null) {
+            if (mAppsCustomizeContent != null) {
                 mAppsCustomizeContent.setApps(apps);
             }
         }
     }
 
-    @Override
-    public boolean shouldShowApp(ResolveInfo app) {
-        return true;
-    }
-
     /**
      * A package was updated.
      *
@@ -4049,9 +4084,23 @@
             return false;
         }
 
+        // For now, limit only to phones
+        LauncherAppState app = LauncherAppState.getInstance();
+        DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+        if (grid.isTablet()) {
+            return false;
+        }
+
         // disable clings when running in a test harness
         if(ActivityManager.isRunningInTestHarness()) return false;
 
+        // Disable clings for accessibility when explore by touch is enabled
+        final AccessibilityManager a11yManager = (AccessibilityManager) getSystemService(
+                ACCESSIBILITY_SERVICE);
+        if (a11yManager.isTouchExplorationEnabled()) {
+            return false;
+        }
+
         // Restricted secondary users (child mode) will potentially have very few apps
         // seeded when they start up for the first time. Clings won't work well with that
 //        boolean supportsLimitedUsers =
@@ -4147,6 +4196,57 @@
         return false;
     }
 
+    public void updateCustomContentHintVisibility() {
+        Cling cling = (Cling) findViewById(R.id.first_run_cling);
+        String ccHintStr = getFirstRunCustomContentHint();
+
+        if (mWorkspace.hasCustomContent()) {
+            // Show the custom content hint if ccHintStr is not empty
+            if (cling != null) {
+                setCustomContentHintVisibility(cling, ccHintStr, true, true);
+            }
+        } else {
+            // Hide the custom content hint
+            if (cling != null) {
+                setCustomContentHintVisibility(cling, ccHintStr, false, true);
+            }
+        }
+    }
+
+    private void setCustomContentHintVisibility(Cling cling, String ccHintStr, boolean visible,
+                                                boolean animate) {
+        final TextView ccHint = (TextView) cling.findViewById(R.id.custom_content_hint);
+        if (ccHint != null) {
+            if (visible && !ccHintStr.isEmpty()) {
+                ccHint.setText(ccHintStr);
+                ccHint.setVisibility(View.VISIBLE);
+                if (animate) {
+                    ccHint.setAlpha(0f);
+                    ccHint.animate().alpha(1f)
+                                    .setDuration(SHOW_CLING_DURATION)
+                                    .start();
+                } else {
+                    ccHint.setAlpha(1f);
+                }
+            } else {
+                if (animate) {
+                    ccHint.animate().alpha(0f)
+                                    .setDuration(SHOW_CLING_DURATION)
+                                    .setListener(new AnimatorListenerAdapter() {
+                                        @Override
+                                        public void onAnimationEnd(Animator animation) {
+                                            ccHint.setVisibility(View.GONE);
+                                        }
+                                    })
+                                    .start();
+                } else {
+                    ccHint.setAlpha(0f);
+                    ccHint.setVisibility(View.GONE);
+                }
+            }
+        }
+    }
+
     public void showFirstRunCling() {
         if (isClingsEnabled() &&
                 !mSharedPrefs.getBoolean(Cling.FIRST_RUN_CLING_DISMISSED_KEY, false) &&
@@ -4176,11 +4276,7 @@
                     sbHint.setText(sbHintStr);
                     sbHint.setVisibility(View.VISIBLE);
                 }
-                if (!ccHintStr.isEmpty()) {
-                    TextView ccHint = (TextView) cling.findViewById(R.id.custom_content_hint);
-                    ccHint.setText(ccHintStr);
-                    ccHint.setVisibility(View.VISIBLE);
-                }
+                setCustomContentHintVisibility(cling, ccHintStr, true, false);
             }
             initCling(R.id.first_run_cling, 0, false, true);
         } else {
@@ -4194,12 +4290,34 @@
     protected String getFirstRunCustomContentHint() {
         return "";
     }
+    protected int getFirstRunFocusedHotseatAppDrawableId() {
+        return -1;
+    }
+    protected ComponentName getFirstRunFocusedHotseatAppComponentName() {
+        return null;
+    }
+    protected int getFirstRunFocusedHotseatAppRank() {
+        return -1;
+    }
+    protected String getFirstRunFocusedHotseatAppBubbleTitle() {
+        return "";
+    }
+    protected String getFirstRunFocusedHotseatAppBubbleDescription() {
+        return "";
+    }
 
     public void showFirstRunWorkspaceCling() {
         // Enable the clings only if they have not been dismissed before
         if (isClingsEnabled() &&
                 !mSharedPrefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false)) {
-            initCling(R.id.workspace_cling, 0, false, true);
+            Cling c = initCling(R.id.workspace_cling, 0, false, true);
+
+            // Set the focused hotseat app if there is one
+            c.setFocusedHotseatApp(getFirstRunFocusedHotseatAppDrawableId(),
+                    getFirstRunFocusedHotseatAppRank(),
+                    getFirstRunFocusedHotseatAppComponentName(),
+                    getFirstRunFocusedHotseatAppBubbleTitle(),
+                    getFirstRunFocusedHotseatAppBubbleDescription());
         } else {
             removeCling(R.id.workspace_cling);
         }
@@ -4236,6 +4354,9 @@
         };
         dismissCling(cling, cb, Cling.FIRST_RUN_CLING_DISMISSED_KEY,
                 DISMISS_CLING_DURATION, false);
+
+        // Fade out the search bar for the workspace cling coming up
+        mSearchDropTargetBar.hideSearchBar(true);
     }
     public void dismissWorkspaceCling(View v) {
         Cling cling = (Cling) findViewById(R.id.workspace_cling);
@@ -4249,6 +4370,9 @@
         }
         dismissCling(cling, cb, Cling.WORKSPACE_CLING_DISMISSED_KEY,
                 DISMISS_CLING_DURATION, true);
+
+        // Fade in the search bar
+        mSearchDropTargetBar.showSearchBar(true);
     }
     public void dismissFolderCling(View v) {
         Cling cling = (Cling) findViewById(R.id.folder_cling);
diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java
index 01f72a7..5d4f9c6 100644
--- a/src/com/android/launcher3/LauncherAnimUtils.java
+++ b/src/com/android/launcher3/LauncherAnimUtils.java
@@ -30,6 +30,7 @@
     static HashSet<Animator> sAnimators = new HashSet<Animator>();
     static Animator.AnimatorListener sEndAnimListener = new Animator.AnimatorListener() {
         public void onAnimationStart(Animator animation) {
+            sAnimators.add(animation);
         }
 
         public void onAnimationRepeat(Animator animation) {
@@ -45,7 +46,6 @@
     };
 
     public static void cancelOnDestroyActivity(Animator a) {
-        sAnimators.add(a);
         a.addListener(sEndAnimListener);
     }
 
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index ed96310..a255b89 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -34,6 +34,7 @@
 
     private LauncherModel mModel;
     private IconCache mIconCache;
+    private AppFilter mAppFilter;
     private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb;
     private boolean mIsScreenLarge;
     private float mScreenDensity;
@@ -53,6 +54,10 @@
         return INSTANCE;
     }
 
+    public static LauncherAppState getInstanceNoCreate() {
+        return INSTANCE;
+    }
+
     public Context getContext() {
         return sContext;
     }
@@ -81,7 +86,9 @@
 
         mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext);
         mIconCache = new IconCache(sContext);
-        mModel = new LauncherModel(this, mIconCache);
+
+        mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class));
+        mModel = new LauncherModel(this, mIconCache, mAppFilter);
 
         // Register intent receivers
         IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
@@ -147,6 +154,10 @@
         return mModel;
     }
 
+    boolean shouldShowAppOrWidgetProvider(ComponentName componentName) {
+        return mAppFilter == null || mAppFilter.shouldShowApp(componentName);
+    }
+
     WidgetPreviewLoader.CacheDb getWidgetPreviewCacheDb() {
         return mWidgetPreviewCacheDb;
     }
@@ -167,7 +178,8 @@
                                   int width, int height,
                                   int availableWidth, int availableHeight) {
         if (mDynamicGrid == null) {
-            mDynamicGrid = new DynamicGrid(context.getResources(),
+            mDynamicGrid = new DynamicGrid(context,
+                    context.getResources(),
                     minWidth, minHeight, width, height,
                     availableWidth, availableHeight);
         }
diff --git a/src/com/android/launcher3/LauncherAppWidgetHostView.java b/src/com/android/launcher3/LauncherAppWidgetHostView.java
index 59bd307..83aef1a 100644
--- a/src/com/android/launcher3/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher3/LauncherAppWidgetHostView.java
@@ -24,20 +24,24 @@
 import android.view.ViewGroup;
 import android.widget.RemoteViews;
 
+import com.android.launcher3.DragLayer.TouchCompleteListener;
+
 /**
  * {@inheritDoc}
  */
-public class LauncherAppWidgetHostView extends AppWidgetHostView {
+public class LauncherAppWidgetHostView extends AppWidgetHostView implements TouchCompleteListener {
     private CheckLongPressHelper mLongPressHelper;
     private LayoutInflater mInflater;
     private Context mContext;
     private int mPreviousOrientation;
+    private DragLayer mDragLayer;
 
     public LauncherAppWidgetHostView(Context context) {
         super(context);
         mContext = context;
         mLongPressHelper = new CheckLongPressHelper(this);
         mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        mDragLayer = ((Launcher) context).getDragLayer();
     }
 
     @Override
@@ -72,6 +76,7 @@
         switch (ev.getAction()) {
             case MotionEvent.ACTION_DOWN: {
                 mLongPressHelper.postCheckForLongPress();
+                mDragLayer.setTouchCompleteListener(this);
                 break;
             }
 
@@ -100,7 +105,11 @@
     @Override
     public void cancelLongPress() {
         super.cancelLongPress();
+        mLongPressHelper.cancelLongPress();
+    }
 
+    @Override
+    public void onTouchComplete() {
         mLongPressHelper.cancelLongPress();
     }
 
@@ -108,4 +117,6 @@
     public int getDescendantFocusability() {
         return ViewGroup.FOCUS_BLOCK_DESCENDANTS;
     }
+
+
 }
diff --git a/src/com/android/launcher3/LauncherBackupAgent.java b/src/com/android/launcher3/LauncherBackupAgent.java
deleted file mode 100644
index bb15ca1..0000000
--- a/src/com/android/launcher3/LauncherBackupAgent.java
+++ /dev/null
@@ -1,655 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3;
-
-import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
-import com.google.protobuf.nano.MessageNano;
-
-import com.android.launcher3.LauncherSettings.ChangeLogColumns;
-import com.android.launcher3.LauncherSettings.Favorites;
-import com.android.launcher3.LauncherSettings.WorkspaceScreens;
-import com.android.launcher3.backup.BackupProtos;
-import com.android.launcher3.backup.BackupProtos.CheckedMessage;
-import com.android.launcher3.backup.BackupProtos.Favorite;
-import com.android.launcher3.backup.BackupProtos.Journal;
-import com.android.launcher3.backup.BackupProtos.Key;
-import com.android.launcher3.backup.BackupProtos.Screen;
-
-import android.app.backup.BackupAgent;
-import android.app.backup.BackupDataInput;
-import android.app.backup.BackupDataOutput;
-import android.app.backup.BackupManager;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.database.Cursor;
-import android.os.ParcelFileDescriptor;
-import android.provider.BaseColumns;
-import android.text.TextUtils;
-import android.util.Base64;
-import android.util.Log;
-
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.zip.CRC32;
-
-/**
- * Persist the launcher home state across calamities.
- */
-public class LauncherBackupAgent extends BackupAgent {
-
-    private static final String TAG = "LauncherBackupAgent";
-    private static final boolean DEBUG = false;
-
-    private static final int MAX_JOURNAL_SIZE = 1000000;
-
-    private static BackupManager sBackupManager;
-
-    private static final String[] FAVORITE_PROJECTION = {
-            Favorites._ID,                     // 0
-            Favorites.APPWIDGET_ID,            // 1
-            Favorites.APPWIDGET_PROVIDER,      // 2
-            Favorites.CELLX,                   // 3
-            Favorites.CELLY,                   // 4
-            Favorites.CONTAINER,               // 5
-            Favorites.ICON,                    // 6
-            Favorites.ICON_PACKAGE,            // 7
-            Favorites.ICON_RESOURCE,           // 8
-            Favorites.ICON_TYPE,               // 9
-            Favorites.ITEM_TYPE,               // 10
-            Favorites.INTENT,                  // 11
-            Favorites.SCREEN,                  // 12
-            Favorites.SPANX,                   // 13
-            Favorites.SPANY,                   // 14
-            Favorites.TITLE,                   // 15
-    };
-
-    private static final int ID_INDEX = 0;
-    private static final int APPWIDGET_ID_INDEX = 1;
-    private static final int APPWIDGET_PROVIDER_INDEX = 2;
-    private static final int CELLX_INDEX = 3;
-    private static final int CELLY_INDEX = 4;
-    private static final int CONTAINER_INDEX = 5;
-    private static final int ICON_INDEX = 6;
-    private static final int ICON_PACKAGE_INDEX = 7;
-    private static final int ICON_RESOURCE_INDEX = 8;
-    private static final int ICON_TYPE_INDEX = 9;
-    private static final int ITEM_TYPE_INDEX = 10;
-    private static final int INTENT_INDEX = 11;
-    private static final int SCREEN_INDEX = 12;
-    private static final int SPANX_INDEX = 13 ;
-    private static final int SPANY_INDEX = 14;
-    private static final int TITLE_INDEX = 15;
-
-    private static final String[] SCREEN_PROJECTION = {
-            WorkspaceScreens._ID,              // 0
-            WorkspaceScreens.SCREEN_RANK       // 1
-    };
-
-    private static final int SCREEN_RANK_INDEX = 1;
-
-    private static final String[] ID_ONLY_PROJECTION = {
-            BaseColumns._ID
-    };
-
-
-    /**
-     * Notify the backup manager that out database is dirty.
-     *
-     * <P>This does not force an immediate backup.
-     *
-     * @param context application context
-     */
-    public static void dataChanged(Context context) {
-        if (sBackupManager == null) {
-            sBackupManager = new BackupManager(context);
-        }
-        sBackupManager.dataChanged();
-    }
-
-    /**
-     * Back up launcher data so we can restore the user's state on a new device.
-     *
-     * <P>The journal is a timestamp and a list of keys that were saved as of that time.
-     *
-     * <P>Keys may come back in any order, so each key/value is one complete row of the database.
-     *
-     * @param oldState notes from the last backup
-     * @param data incremental key/value pairs to persist off-device
-     * @param newState notes for the next backup
-     * @throws IOException
-     */
-    @Override
-    public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
-            ParcelFileDescriptor newState)
-            throws IOException {
-        Log.v(TAG, "onBackup");
-
-        Journal in = readJournal(oldState);
-        Journal out = new Journal();
-
-        long lastBackupTime = in.t;
-        out.t = System.currentTimeMillis();
-        out.rows = 0;
-        out.bytes = 0;
-
-        Log.v(TAG, "lastBackupTime=" + lastBackupTime);
-
-        ArrayList<Key> keys = new ArrayList<Key>();
-        backupFavorites(in, data, out, keys);
-        backupScreens(in, data, out, keys);
-
-        out.key = keys.toArray(BackupProtos.Key.EMPTY_ARRAY);
-        writeJournal(newState, out);
-        Log.v(TAG, "onBackup: wrote " + out.bytes + "b in " + out.rows + " rows.");
-
-        Log.v(TAG, "onBackup: finished");
-    }
-
-    /**
-     * Restore home screen from the restored data stream.
-     *
-     * <P>Keys may arrive in any order.
-     *
-     * @param data the key/value pairs from the server
-     * @param versionCode the version of the app that generated the data
-     * @param newState notes for the next backup
-     * @throws IOException
-     */
-    @Override
-    public void onRestore(BackupDataInput data, int versionCode, ParcelFileDescriptor newState)
-            throws IOException {
-        Log.v(TAG, "onRestore");
-        int numRows = 0;
-        Journal out = new Journal();
-
-        ArrayList<Key> keys = new ArrayList<Key>();
-        byte[] buffer = new byte[512];
-        while (data.readNextHeader()) {
-            numRows++;
-            String backupKey = data.getKey();
-            int dataSize = data.getDataSize();
-            if (buffer.length < dataSize) {
-                buffer = new byte[dataSize];
-            }
-            Key key = null;
-            int bytesRead = data.readEntityData(buffer, 0, dataSize);
-            if (DEBUG) {
-                Log.d(TAG, "read " + bytesRead + " of " + dataSize + " available");
-            }
-            try {
-                key = backupKeyToKey(backupKey);
-                switch (key.type) {
-                    case Key.FAVORITE:
-                        restoreFavorite(key, buffer, dataSize, keys);
-                        break;
-
-                    case Key.SCREEN:
-                        restoreScreen(key, buffer, dataSize, keys);
-                        break;
-
-                    default:
-                        Log.w(TAG, "unknown restore entity type: " + key.type);
-                        break;
-                }
-            } catch (KeyParsingException e) {
-                Log.w(TAG, "ignoring unparsable backup key: " + backupKey);
-            }
-        }
-
-        // clear the output journal time, to force a full backup to
-        // will catch any changes the restore process might have made
-        out.t = 0;
-        out.key = keys.toArray(BackupProtos.Key.EMPTY_ARRAY);
-        writeJournal(newState, out);
-        Log.v(TAG, "onRestore: read " + numRows + " rows");
-    }
-
-    /**
-     * Write all modified favorites to the data stream.
-     *
-     *
-     * @param in notes from last backup
-     * @param data output stream for key/value pairs
-     * @param out notes about this backup
-     * @param keys keys to mark as clean in the notes for next backup
-     * @throws IOException
-     */
-    private void backupFavorites(Journal in, BackupDataOutput data, Journal out,
-            ArrayList<Key> keys)
-            throws IOException {
-        // read the old ID set
-        Set<String> savedIds = new HashSet<String>();
-        for(int i = 0; i < in.key.length; i++) {
-            Key key = in.key[i];
-            if (key.type == Key.FAVORITE) {
-                savedIds.add(keyToBackupKey(key));
-            }
-        }
-        if (DEBUG) Log.d(TAG, "favorite savedIds.size()=" + savedIds.size());
-
-        // persist things that have changed since the last backup
-        ContentResolver cr = getContentResolver();
-        String where = ChangeLogColumns.MODIFIED + " > ?";
-        String[] args = {Long.toString(in.t)};
-        String updateOrder = ChangeLogColumns.MODIFIED;
-        Cursor updated = cr.query(Favorites.CONTENT_URI, FAVORITE_PROJECTION,
-                where, args, updateOrder);
-        if (DEBUG) Log.d(TAG, "favorite updated.getCount()=" + updated.getCount());
-        try {
-            updated.moveToPosition(-1);
-            while(updated.moveToNext()) {
-                final long id = updated.getLong(ID_INDEX);
-                Key key = getKey(Key.FAVORITE, id);
-                byte[] blob = packFavorite(updated);
-                String backupKey = keyToBackupKey(key);
-                data.writeEntityHeader(backupKey, blob.length);
-                data.writeEntityData(blob, blob.length);
-                out.rows++;
-                out.bytes += blob.length;
-                Log.v(TAG, "saving favorite " + backupKey + ": " + id + "/" + blob.length);
-                if(DEBUG) Log.d(TAG, "wrote " +
-                        Base64.encodeToString(blob, 0, blob.length, Base64.NO_WRAP));
-                // remember that is was a new column, so we don't delete it.
-                savedIds.add(backupKey);
-            }
-        } finally {
-            updated.close();
-        }
-        if (DEBUG) Log.d(TAG, "favorite savedIds.size()=" + savedIds.size());
-
-        // build the current ID set
-        String idOrder = BaseColumns._ID;
-        Cursor idCursor = cr.query(Favorites.CONTENT_URI, ID_ONLY_PROJECTION,
-                null, null, idOrder);
-        Set<String> currentIds = new HashSet<String>(idCursor.getCount());
-        try {
-            idCursor.moveToPosition(-1);
-            while(idCursor.moveToNext()) {
-                Key key = getKey(Key.FAVORITE, idCursor.getLong(ID_INDEX));
-                currentIds.add(keyToBackupKey(key));
-                // save the IDs for next time
-                keys.add(key);
-            }
-        } finally {
-            idCursor.close();
-        }
-        if (DEBUG) Log.d(TAG, "favorite currentIds.size()=" + currentIds.size());
-
-        // these IDs must have been deleted
-        savedIds.removeAll(currentIds);
-        for (String deleted : savedIds) {
-            Log.v(TAG, "dropping favorite " + deleted);
-            data.writeEntityHeader(deleted, -1);
-            out.rows++;
-        }
-    }
-
-    /**
-     * Read a favorite from the stream.
-     *
-     * <P>Keys arrive in any order, so screens and containers may not exist yet.
-     *
-     * @param key identifier for the row
-     * @param buffer the serialized proto from the stream, may be larger than dataSize
-     * @param dataSize the size of the proto from the stream
-     * @param keys keys to mark as clean in the notes for next backup
-     */
-    private void restoreFavorite(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
-        Log.v(TAG, "unpacking favorite " + key.id + " (" + dataSize + " bytes)");
-        if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
-                Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
-
-        try {
-            Favorite favorite =  unpackFavorite(buffer, 0, dataSize);
-            if (DEBUG) Log.d(TAG, "unpacked " + favorite.itemType);
-        } catch (InvalidProtocolBufferNanoException e) {
-            Log.w(TAG, "failed to decode proto", e);
-        }
-    }
-
-    /**
-     * Write all modified screens to the data stream.
-     *
-     *
-     * @param in notes from last backup
-     * @param data output stream for key/value pairs
-     * @param out notes about this backup
-     * @param keys keys to mark as clean in the notes for next backup  @throws IOException
-     */
-    private void backupScreens(Journal in, BackupDataOutput data, Journal out,
-            ArrayList<Key> keys)
-            throws IOException {
-        // read the old ID set
-        Set<String> savedIds = new HashSet<String>();
-        for(int i = 0; i < in.key.length; i++) {
-            Key key = in.key[i];
-            if (key.type == Key.SCREEN) {
-                savedIds.add(keyToBackupKey(key));
-            }
-        }
-        if (DEBUG) Log.d(TAG, "screens savedIds.size()=" + savedIds.size());
-
-        // persist things that have changed since the last backup
-        ContentResolver cr = getContentResolver();
-        String where = ChangeLogColumns.MODIFIED + " > ?";
-        String[] args = {Long.toString(in.t)};
-        String updateOrder = ChangeLogColumns.MODIFIED;
-        Cursor updated = cr.query(WorkspaceScreens.CONTENT_URI, SCREEN_PROJECTION,
-                where, args, updateOrder);
-        updated.moveToPosition(-1);
-        if (DEBUG) Log.d(TAG, "screens updated.getCount()=" + updated.getCount());
-        try {
-            while(updated.moveToNext()) {
-                final long id = updated.getLong(ID_INDEX);
-                Key key = getKey(Key.SCREEN, id);
-                byte[] blob = packScreen(updated);
-                String backupKey = keyToBackupKey(key);
-                data.writeEntityHeader(backupKey, blob.length);
-                data.writeEntityData(blob, blob.length);
-                out.rows++;
-                out.bytes += blob.length;
-                Log.v(TAG, "saving screen " + backupKey + ": " + id + "/" + blob.length);
-                if(DEBUG) Log.d(TAG, "wrote " +
-                        Base64.encodeToString(blob, 0, blob.length, Base64.NO_WRAP));
-                // remember that is was a new column, so we don't delete it.
-                savedIds.add(backupKey);
-            }
-        } finally {
-            updated.close();
-        }
-        if (DEBUG) Log.d(TAG, "screen savedIds.size()=" + savedIds.size());
-
-        // build the current ID set
-        String idOrder = BaseColumns._ID;
-        Cursor idCursor = cr.query(WorkspaceScreens.CONTENT_URI, ID_ONLY_PROJECTION,
-                null, null, idOrder);
-        idCursor.moveToPosition(-1);
-        Set<String> currentIds = new HashSet<String>(idCursor.getCount());
-        try {
-            while(idCursor.moveToNext()) {
-                Key key = getKey(Key.SCREEN, idCursor.getLong(ID_INDEX));
-                currentIds.add(keyToBackupKey(key));
-                // save the IDs for next time
-                keys.add(key);
-            }
-        } finally {
-            idCursor.close();
-        }
-        if (DEBUG) Log.d(TAG, "screen currentIds.size()=" + currentIds.size());
-
-        // these IDs must have been deleted
-        savedIds.removeAll(currentIds);
-        for(String deleted: savedIds) {
-            Log.v(TAG, "dropping screen " + deleted);
-            data.writeEntityHeader(deleted, -1);
-            out.rows++;
-        }
-    }
-
-    /**
-     * Read a screen from the stream.
-     *
-     * <P>Keys arrive in any order, so children of this screen may already exist.
-     *
-     * @param key identifier for the row
-     * @param buffer the serialized proto from the stream, may be larger than dataSize
-     * @param dataSize the size of the proto from the stream
-     * @param keys keys to mark as clean in the notes for next backup
-     */
-    private void restoreScreen(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
-        Log.v(TAG, "unpacking screen " + key.id);
-        if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
-                Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
-        try {
-            Screen screen = unpackScreen(buffer, 0, dataSize);
-            if (DEBUG) Log.d(TAG, "unpacked " + screen.rank);
-        } catch (InvalidProtocolBufferNanoException e) {
-            Log.w(TAG, "failed to decode proto", e);
-        }
-    }
-
-    /** create a new key object.
-     *
-     * <P> Keys contain their own checksum instead of using
-     * the heavy-weight CheckedMessage wrapper.
-     */
-    private Key getKey(int type, long id) {
-        Key key = new Key();
-        key.type = type;
-        key.id = id;
-        key.checksum = checkKey(key);
-        return key;
-    }
-
-    /** keys need to be strings, serialize and encode. */
-    private String keyToBackupKey(Key key) {
-        return Base64.encodeToString(Key.toByteArray(key), Base64.NO_WRAP | Base64.NO_PADDING);
-    }
-
-    /** keys need to be strings, decode and parse. */
-    private Key backupKeyToKey(String backupKey) throws KeyParsingException {
-        try {
-            Key key = Key.parseFrom(Base64.decode(backupKey, Base64.DEFAULT));
-            if (key.checksum != checkKey(key)) {
-                key = null;
-                throw new KeyParsingException("invalid key read from stream" + backupKey);
-            }
-            return key;
-        } catch (InvalidProtocolBufferNanoException e) {
-            throw new KeyParsingException(e);
-        } catch (IllegalArgumentException e) {
-            throw new KeyParsingException(e);
-        }
-    }
-
-    /** Compute the checksum over the important bits of a key. */
-    private long checkKey(Key key) {
-        CRC32 checksum = new CRC32();
-        checksum.update(key.type);
-        checksum.update((int) (key.id & 0xffff));
-        checksum.update((int) ((key.id >> 32) & 0xffff));
-        if (!TextUtils.isEmpty(key.name)) {
-            checksum.update(key.name.getBytes());
-        }
-        return checksum.getValue();
-    }
-
-    /** Serialize a Favorite for persistence, including a checksum wrapper. */
-    private byte[] packFavorite(Cursor c) {
-        Favorite favorite = new Favorite();
-        favorite.id = c.getLong(ID_INDEX);
-        favorite.screen = c.getInt(SCREEN_INDEX);
-        favorite.container = c.getInt(CONTAINER_INDEX);
-        favorite.cellX = c.getInt(CELLX_INDEX);
-        favorite.cellY = c.getInt(CELLY_INDEX);
-        favorite.spanX = c.getInt(SPANX_INDEX);
-        favorite.spanY = c.getInt(SPANY_INDEX);
-        favorite.iconType = c.getInt(ICON_TYPE_INDEX);
-        if (favorite.iconType == Favorites.ICON_TYPE_RESOURCE) {
-            String iconPackage = c.getString(ICON_PACKAGE_INDEX);
-            if (!TextUtils.isEmpty(iconPackage)) {
-                favorite.iconPackage = iconPackage;
-            }
-            String iconResource = c.getString(ICON_RESOURCE_INDEX);
-            if (!TextUtils.isEmpty(iconResource)) {
-                favorite.iconResource = iconResource;
-            }
-        }
-        if (favorite.iconType == Favorites.ICON_TYPE_BITMAP) {
-            byte[] blob = c.getBlob(ICON_INDEX);
-            if (blob != null && blob.length > 0) {
-                favorite.icon = blob;
-            }
-        }
-        String title = c.getString(TITLE_INDEX);
-        if (!TextUtils.isEmpty(title)) {
-            favorite.title = title;
-        }
-        String intent = c.getString(INTENT_INDEX);
-        if (!TextUtils.isEmpty(intent)) {
-            favorite.intent = intent;
-        }
-        favorite.itemType = c.getInt(ITEM_TYPE_INDEX);
-        if (favorite.itemType == Favorites.ITEM_TYPE_APPWIDGET) {
-            favorite.appWidgetId = c.getInt(APPWIDGET_ID_INDEX);
-            String appWidgetProvider = c.getString(APPWIDGET_PROVIDER_INDEX);
-            if (!TextUtils.isEmpty(appWidgetProvider)) {
-                favorite.appWidgetProvider = appWidgetProvider;
-            }
-        }
-
-        return writeCheckedBytes(favorite);
-    }
-
-    /** Deserialize a Favorite from persistence, after verifying checksum wrapper. */
-    private Favorite unpackFavorite(byte[] buffer, int offset, int dataSize)
-            throws InvalidProtocolBufferNanoException {
-        Favorite favorite = new Favorite();
-        MessageNano.mergeFrom(favorite, readCheckedBytes(buffer, offset, dataSize));
-        return favorite;
-    }
-
-    /** Serialize a Screen for persistence, including a checksum wrapper. */
-    private byte[] packScreen(Cursor c) {
-        Screen screen = new Screen();
-        screen.id = c.getLong(ID_INDEX);
-        screen.rank = c.getInt(SCREEN_RANK_INDEX);
-
-        return writeCheckedBytes(screen);
-    }
-
-    /** Deserialize a Screen from persistence, after verifying checksum wrapper. */
-    private Screen unpackScreen(byte[] buffer, int offset, int dataSize)
-            throws InvalidProtocolBufferNanoException {
-        Screen screen = new Screen();
-        MessageNano.mergeFrom(screen, readCheckedBytes(buffer, offset, dataSize));
-        return screen;
-    }
-
-    /**
-     * Read the old journal from the input file.
-     *
-     * In the event of any error, just pretend we didn't have a journal,
-     * in that case, do a full backup.
-     *
-     * @param oldState the read-0only file descriptor pointing to the old journal
-     * @return a Journal protocol bugffer
-     */
-    private Journal readJournal(ParcelFileDescriptor oldState) {
-        int fileSize = (int) oldState.getStatSize();
-        int remaining = fileSize;
-        byte[] buffer = null;
-        Journal journal = new Journal();
-        if (remaining < MAX_JOURNAL_SIZE) {
-            FileInputStream inStream = new FileInputStream(oldState.getFileDescriptor());
-            int offset = 0;
-
-            buffer = new byte[remaining];
-            while (remaining > 0) {
-                int bytesRead = 0;
-                try {
-                    bytesRead = inStream.read(buffer, offset, remaining);
-                } catch (IOException e) {
-                    Log.w(TAG, "failed to read the journal", e);
-                    buffer = null;
-                    remaining = 0;
-                }
-                if (bytesRead > 0) {
-                    remaining -= bytesRead;
-                } else {
-                    // act like there is not journal
-                    Log.w(TAG, "failed to read the journal");
-                    buffer = null;
-                    remaining = 0;
-                }
-            }
-
-            if (buffer != null) {
-                try {
-                    MessageNano.mergeFrom(journal, readCheckedBytes(buffer, 0, fileSize));
-                } catch (InvalidProtocolBufferNanoException e) {
-                    Log.d(TAG, "failed to read the journal", e);
-                    journal.clear();
-                }
-            }
-
-            try {
-                inStream.close();
-            } catch (IOException e) {
-                Log.d(TAG, "failed to close the journal", e);
-            }
-        }
-        return journal;
-    }
-
-    /**
-     * Write the new journal to the output file.
-     *
-     * In the event of any error, just pretend we didn't have a journal,
-     * in that case, do a full backup.
-
-     * @param newState the write-only file descriptor pointing to the new journal
-     * @param journal a Journal protocol buffer
-     */
-    private void writeJournal(ParcelFileDescriptor newState, Journal journal) {
-        FileOutputStream outStream = null;
-        try {
-            outStream = new FileOutputStream(newState.getFileDescriptor());
-            outStream.write(writeCheckedBytes(journal));
-            outStream.close();
-        } catch (IOException e) {
-            Log.d(TAG, "failed to write backup journal", e);
-        }
-    }
-
-    /** Wrap a proto in a CheckedMessage and compute the checksum. */
-    private byte[] writeCheckedBytes(MessageNano proto) {
-        CheckedMessage wrapper = new CheckedMessage();
-        wrapper.payload = MessageNano.toByteArray(proto);
-        CRC32 checksum = new CRC32();
-        checksum.update(wrapper.payload);
-        wrapper.checksum = checksum.getValue();
-        return MessageNano.toByteArray(wrapper);
-    }
-
-    /** Unwrap a proto message from a CheckedMessage, verifying the checksum. */
-    private byte[] readCheckedBytes(byte[] buffer, int offset, int dataSize)
-            throws InvalidProtocolBufferNanoException {
-        CheckedMessage wrapper = new CheckedMessage();
-        MessageNano.mergeFrom(wrapper, buffer, offset, dataSize);
-        CRC32 checksum = new CRC32();
-        checksum.update(wrapper.payload);
-        if (wrapper.checksum != checksum.getValue()) {
-            throw new InvalidProtocolBufferNanoException("checksum does not match");
-        }
-        return wrapper.payload;
-    }
-
-    private class KeyParsingException extends Throwable {
-        private KeyParsingException(Throwable cause) {
-            super(cause);
-        }
-
-        public KeyParsingException(String reason) {
-            super(reason);
-        }
-    }
-}
diff --git a/src/com/android/launcher3/LauncherBackupAgentHelper.java b/src/com/android/launcher3/LauncherBackupAgentHelper.java
new file mode 100644
index 0000000..2b5059b
--- /dev/null
+++ b/src/com/android/launcher3/LauncherBackupAgentHelper.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3;
+
+import android.app.backup.BackupAgentHelper;
+import android.app.backup.BackupManager;
+import android.content.Context;
+
+public class LauncherBackupAgentHelper extends BackupAgentHelper {
+
+    private static BackupManager sBackupManager;
+
+    /**
+     * Notify the backup manager that out database is dirty.
+     *
+     * <P>This does not force an immediate backup.
+     *
+     * @param context application context
+     */
+    public static void dataChanged(Context context) {
+        if (sBackupManager == null) {
+            sBackupManager = new BackupManager(context);
+        }
+        sBackupManager.dataChanged();
+    }
+
+
+    @Override
+    public void onCreate() {
+        addHelper(LauncherBackupHelper.LAUNCHER_PREFIX, new LauncherBackupHelper(this));
+    }
+}
diff --git a/src/com/android/launcher3/LauncherBackupHelper.java b/src/com/android/launcher3/LauncherBackupHelper.java
new file mode 100644
index 0000000..9b901ee
--- /dev/null
+++ b/src/com/android/launcher3/LauncherBackupHelper.java
@@ -0,0 +1,1016 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3;
+
+import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
+import com.google.protobuf.nano.MessageNano;
+
+import com.android.launcher3.LauncherSettings.Favorites;
+import com.android.launcher3.LauncherSettings.WorkspaceScreens;
+import com.android.launcher3.backup.BackupProtos;
+import com.android.launcher3.backup.BackupProtos.CheckedMessage;
+import com.android.launcher3.backup.BackupProtos.Favorite;
+import com.android.launcher3.backup.BackupProtos.Journal;
+import com.android.launcher3.backup.BackupProtos.Key;
+import com.android.launcher3.backup.BackupProtos.Resource;
+import com.android.launcher3.backup.BackupProtos.Screen;
+import com.android.launcher3.backup.BackupProtos.Widget;
+
+import android.app.backup.BackupDataInputStream;
+import android.app.backup.BackupHelper;
+import android.app.backup.BackupDataInput;
+import android.app.backup.BackupDataOutput;
+import android.app.backup.BackupManager;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProviderInfo;
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.Drawable;
+import android.os.ParcelFileDescriptor;
+import android.text.TextUtils;
+import android.util.Base64;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.zip.CRC32;
+
+/**
+ * Persist the launcher home state across calamities.
+ */
+public class LauncherBackupHelper implements BackupHelper {
+
+    private static final String TAG = "LauncherBackupHelper";
+    private static final boolean DEBUG = false;
+    private static final boolean DEBUG_PAYLOAD = false;
+
+    private static final int MAX_JOURNAL_SIZE = 1000000;
+
+    /** icons are large, dribble them out */
+    private static final int MAX_ICONS_PER_PASS = 10;
+
+    /** widgets contain previews, which are very large, dribble them out */
+    private static final int MAX_WIDGETS_PER_PASS = 5;
+
+    public static final int IMAGE_COMPRESSION_QUALITY = 75;
+
+    public static final String LAUNCHER_PREFIX = "L";
+
+    private static final Bitmap.CompressFormat IMAGE_FORMAT =
+            android.graphics.Bitmap.CompressFormat.PNG;
+
+    private static BackupManager sBackupManager;
+
+    private static final String[] FAVORITE_PROJECTION = {
+            Favorites._ID,                     // 0
+            Favorites.MODIFIED,                // 1
+            Favorites.INTENT,                  // 2
+            Favorites.APPWIDGET_PROVIDER,      // 3
+            Favorites.APPWIDGET_ID,            // 4
+            Favorites.CELLX,                   // 5
+            Favorites.CELLY,                   // 6
+            Favorites.CONTAINER,               // 7
+            Favorites.ICON,                    // 8
+            Favorites.ICON_PACKAGE,            // 9
+            Favorites.ICON_RESOURCE,           // 10
+            Favorites.ICON_TYPE,               // 11
+            Favorites.ITEM_TYPE,               // 12
+            Favorites.SCREEN,                  // 13
+            Favorites.SPANX,                   // 14
+            Favorites.SPANY,                   // 15
+            Favorites.TITLE,                   // 16
+    };
+
+    private static final int ID_INDEX = 0;
+    private static final int ID_MODIFIED = 1;
+    private static final int INTENT_INDEX = 2;
+    private static final int APPWIDGET_PROVIDER_INDEX = 3;
+    private static final int APPWIDGET_ID_INDEX = 4;
+    private static final int CELLX_INDEX = 5;
+    private static final int CELLY_INDEX = 6;
+    private static final int CONTAINER_INDEX = 7;
+    private static final int ICON_INDEX = 8;
+    private static final int ICON_PACKAGE_INDEX = 9;
+    private static final int ICON_RESOURCE_INDEX = 10;
+    private static final int ICON_TYPE_INDEX = 11;
+    private static final int ITEM_TYPE_INDEX = 12;
+    private static final int SCREEN_INDEX = 13;
+    private static final int SPANX_INDEX = 14;
+    private static final int SPANY_INDEX = 15;
+    private static final int TITLE_INDEX = 16;
+
+    private static final String[] SCREEN_PROJECTION = {
+            WorkspaceScreens._ID,              // 0
+            WorkspaceScreens.MODIFIED,         // 1
+            WorkspaceScreens.SCREEN_RANK       // 2
+    };
+
+    private static final int SCREEN_RANK_INDEX = 2;
+
+    private final Context mContext;
+
+    private HashMap<ComponentName, AppWidgetProviderInfo> mWidgetMap;
+
+    private ArrayList<Key> mKeys;
+
+    public LauncherBackupHelper(Context context) {
+        mContext = context;
+    }
+
+    private void dataChanged() {
+        if (sBackupManager == null) {
+            sBackupManager = new BackupManager(mContext);
+        }
+        sBackupManager.dataChanged();
+    }
+
+    /**
+     * Back up launcher data so we can restore the user's state on a new device.
+     *
+     * <P>The journal is a timestamp and a list of keys that were saved as of that time.
+     *
+     * <P>Keys may come back in any order, so each key/value is one complete row of the database.
+     *
+     * @param oldState notes from the last backup
+     * @param data incremental key/value pairs to persist off-device
+     * @param newState notes for the next backup
+     * @throws IOException
+     */
+    @Override
+    public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
+            ParcelFileDescriptor newState) {
+        Log.v(TAG, "onBackup");
+
+        Journal in = readJournal(oldState);
+        Journal out = new Journal();
+
+        long lastBackupTime = in.t;
+        out.t = System.currentTimeMillis();
+        out.rows = 0;
+        out.bytes = 0;
+
+        Log.v(TAG, "lastBackupTime=" + lastBackupTime);
+
+        ArrayList<Key> keys = new ArrayList<Key>();
+        try {
+            backupFavorites(in, data, out, keys);
+            backupScreens(in, data, out, keys);
+            backupIcons(in, data, out, keys);
+            backupWidgets(in, data, out, keys);
+        } catch (IOException e) {
+            Log.e(TAG, "launcher backup has failed", e);
+        }
+
+        out.key = keys.toArray(BackupProtos.Key.EMPTY_ARRAY);
+        writeJournal(newState, out);
+        Log.v(TAG, "onBackup: wrote " + out.bytes + "b in " + out.rows + " rows.");
+    }
+
+    /**
+     * Restore launcher configuration from the restored data stream.
+     *
+     * <P>Keys may arrive in any order.
+     *
+     * @param data the key/value pair from the server
+     */
+    @Override
+    public void restoreEntity(BackupDataInputStream data) {
+        Log.v(TAG, "restoreEntity");
+        if (mKeys == null) {
+            mKeys = new ArrayList<Key>();
+        }
+        byte[] buffer = new byte[512];
+            String backupKey = data.getKey();
+            int dataSize = data.size();
+            if (buffer.length < dataSize) {
+                buffer = new byte[dataSize];
+            }
+            Key key = null;
+        int bytesRead = 0;
+        try {
+            bytesRead = data.read(buffer, 0, dataSize);
+            if (DEBUG) Log.d(TAG, "read " + bytesRead + " of " + dataSize + " available");
+        } catch (IOException e) {
+            Log.d(TAG, "failed to read entity from restore data", e);
+        }
+        try {
+            key = backupKeyToKey(backupKey);
+            switch (key.type) {
+                case Key.FAVORITE:
+                    restoreFavorite(key, buffer, dataSize, mKeys);
+                    break;
+
+                case Key.SCREEN:
+                    restoreScreen(key, buffer, dataSize, mKeys);
+                    break;
+
+                case Key.ICON:
+                    restoreIcon(key, buffer, dataSize, mKeys);
+                    break;
+
+                case Key.WIDGET:
+                    restoreWidget(key, buffer, dataSize, mKeys);
+                    break;
+
+                default:
+                    Log.w(TAG, "unknown restore entity type: " + key.type);
+                    break;
+            }
+        } catch (KeyParsingException e) {
+            Log.w(TAG, "ignoring unparsable backup key: " + backupKey);
+        }
+
+    }
+
+    /**
+     * Record the restore state for the next backup.
+     *
+     * @param newState notes about the backup state after restore.
+     */
+    @Override
+    public void writeNewStateDescription(ParcelFileDescriptor newState) {
+        // clear the output journal time, to force a full backup to
+        // will catch any changes the restore process might have made
+        Journal out = new Journal();
+        out.t = 0;
+        out.key = mKeys.toArray(BackupProtos.Key.EMPTY_ARRAY);
+        writeJournal(newState, out);
+        Log.v(TAG, "onRestore: read " + mKeys.size() + " rows");
+        mKeys.clear();
+    }
+
+    /**
+     * Write all modified favorites to the data stream.
+     *
+     *
+     * @param in notes from last backup
+     * @param data output stream for key/value pairs
+     * @param out notes about this backup
+     * @param keys keys to mark as clean in the notes for next backup
+     * @throws IOException
+     */
+    private void backupFavorites(Journal in, BackupDataOutput data, Journal out,
+            ArrayList<Key> keys)
+            throws IOException {
+        // read the old ID set
+        Set<String> savedIds = getSavedIdsByType(Key.FAVORITE, in);
+        if (DEBUG) Log.d(TAG, "favorite savedIds.size()=" + savedIds.size());
+
+        // persist things that have changed since the last backup
+        ContentResolver cr = mContext.getContentResolver();
+        Cursor cursor = cr.query(Favorites.CONTENT_URI, FAVORITE_PROJECTION,
+                null, null, null);
+        Set<String> currentIds = new HashSet<String>(cursor.getCount());
+        try {
+            cursor.moveToPosition(-1);
+            while(cursor.moveToNext()) {
+                final long id = cursor.getLong(ID_INDEX);
+                final long updateTime = cursor.getLong(ID_MODIFIED);
+                Key key = getKey(Key.FAVORITE, id);
+                keys.add(key);
+                currentIds.add(keyToBackupKey(key));
+                if (updateTime > in.t) {
+                    byte[] blob = packFavorite(cursor);
+                    writeRowToBackup(key, blob, out, data);
+                }
+            }
+        } finally {
+            cursor.close();
+        }
+        if (DEBUG) Log.d(TAG, "favorite currentIds.size()=" + currentIds.size());
+
+        // these IDs must have been deleted
+        savedIds.removeAll(currentIds);
+        out.rows += removeDeletedKeysFromBackup(savedIds, data);
+    }
+
+    /**
+     * Read a favorite from the stream.
+     *
+     * <P>Keys arrive in any order, so screens and containers may not exist yet.
+     *
+     * @param key identifier for the row
+     * @param buffer the serialized proto from the stream, may be larger than dataSize
+     * @param dataSize the size of the proto from the stream
+     * @param keys keys to mark as clean in the notes for next backup
+     */
+    private void restoreFavorite(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
+        Log.v(TAG, "unpacking favorite " + key.id + " (" + dataSize + " bytes)");
+        if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
+                Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+
+        try {
+            Favorite favorite =  unpackFavorite(buffer, 0, dataSize);
+            if (DEBUG) Log.d(TAG, "unpacked " + favorite.itemType);
+        } catch (InvalidProtocolBufferNanoException e) {
+            Log.w(TAG, "failed to decode proto", e);
+        }
+    }
+
+    /**
+     * Write all modified screens to the data stream.
+     *
+     *
+     * @param in notes from last backup
+     * @param data output stream for key/value pairs
+     * @param out notes about this backup
+     * @param keys keys to mark as clean in the notes for next backup
+     * @throws IOException
+     */
+    private void backupScreens(Journal in, BackupDataOutput data, Journal out,
+            ArrayList<Key> keys)
+            throws IOException {
+        // read the old ID set
+        Set<String> savedIds = getSavedIdsByType(Key.SCREEN, in);
+        if (DEBUG) Log.d(TAG, "screen savedIds.size()=" + savedIds.size());
+
+        // persist things that have changed since the last backup
+        ContentResolver cr = mContext.getContentResolver();
+        Cursor cursor = cr.query(WorkspaceScreens.CONTENT_URI, SCREEN_PROJECTION,
+                null, null, null);
+        Set<String> currentIds = new HashSet<String>(cursor.getCount());
+        try {
+            cursor.moveToPosition(-1);
+            while(cursor.moveToNext()) {
+                final long id = cursor.getLong(ID_INDEX);
+                final long updateTime = cursor.getLong(ID_MODIFIED);
+                Key key = getKey(Key.SCREEN, id);
+                keys.add(key);
+                currentIds.add(keyToBackupKey(key));
+                if (updateTime > in.t) {
+                    byte[] blob = packScreen(cursor);
+                    writeRowToBackup(key, blob, out, data);
+                }
+            }
+        } finally {
+            cursor.close();
+        }
+        if (DEBUG) Log.d(TAG, "screen currentIds.size()=" + currentIds.size());
+
+        // these IDs must have been deleted
+        savedIds.removeAll(currentIds);
+        out.rows += removeDeletedKeysFromBackup(savedIds, data);
+    }
+
+    /**
+     * Read a screen from the stream.
+     *
+     * <P>Keys arrive in any order, so children of this screen may already exist.
+     *
+     * @param key identifier for the row
+     * @param buffer the serialized proto from the stream, may be larger than dataSize
+     * @param dataSize the size of the proto from the stream
+     * @param keys keys to mark as clean in the notes for next backup
+     */
+    private void restoreScreen(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
+        Log.v(TAG, "unpacking screen " + key.id);
+        if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
+                Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+        try {
+            Screen screen = unpackScreen(buffer, 0, dataSize);
+            if (DEBUG) Log.d(TAG, "unpacked " + screen.rank);
+        } catch (InvalidProtocolBufferNanoException e) {
+            Log.w(TAG, "failed to decode proto", e);
+        }
+    }
+
+    /**
+     * Write all the static icon resources we need to render placeholders
+     * for a package that is not installed.
+     *
+     * @param in notes from last backup
+     * @param data output stream for key/value pairs
+     * @param out notes about this backup
+     * @param keys keys to mark as clean in the notes for next backup
+     * @throws IOException
+     */
+    private void backupIcons(Journal in, BackupDataOutput data, Journal out,
+            ArrayList<Key> keys) throws IOException {
+        // persist icons that haven't been persisted yet
+        final LauncherAppState appState = LauncherAppState.getInstanceNoCreate();
+        if (appState == null) {
+            dataChanged(); // try again later
+            if (DEBUG) Log.d(TAG, "Launcher is not initialized, delaying icon backup");
+            return;
+        }
+        final ContentResolver cr = mContext.getContentResolver();
+        final IconCache iconCache = appState.getIconCache();
+        final int dpi = mContext.getResources().getDisplayMetrics().densityDpi;
+
+        // read the old ID set
+        Set<String> savedIds = getSavedIdsByType(Key.ICON, in);
+        if (DEBUG) Log.d(TAG, "icon savedIds.size()=" + savedIds.size());
+
+        int startRows = out.rows;
+        if (DEBUG) Log.d(TAG, "starting here: " + startRows);
+        String where = Favorites.ITEM_TYPE + "=" + Favorites.ITEM_TYPE_APPLICATION;
+        Cursor cursor = cr.query(Favorites.CONTENT_URI, FAVORITE_PROJECTION,
+                where, null, null);
+        Set<String> currentIds = new HashSet<String>(cursor.getCount());
+        try {
+            cursor.moveToPosition(-1);
+            while(cursor.moveToNext()) {
+                final long id = cursor.getLong(ID_INDEX);
+                final String intentDescription = cursor.getString(INTENT_INDEX);
+                try {
+                    Intent intent = Intent.parseUri(intentDescription, 0);
+                    ComponentName cn = intent.getComponent();
+                    Key key = null;
+                    String backupKey = null;
+                    if (cn != null) {
+                        key = getKey(Key.ICON, cn.flattenToShortString());
+                        backupKey = keyToBackupKey(key);
+                        currentIds.add(backupKey);
+                    } else {
+                        Log.w(TAG, "empty intent on application favorite: " + id);
+                    }
+                    if (savedIds.contains(backupKey)) {
+                        if (DEBUG) Log.d(TAG, "already saved icon " + backupKey);
+
+                        // remember that we already backed this up previously
+                        keys.add(key);
+                    } else if (backupKey != null) {
+                        if (DEBUG) Log.d(TAG, "I can count this high: " + out.rows);
+                        if ((out.rows - startRows) < MAX_ICONS_PER_PASS) {
+                            if (DEBUG) Log.d(TAG, "saving icon " + backupKey);
+                            Bitmap icon = iconCache.getIcon(intent);
+                            keys.add(key);
+                            if (icon != null && !iconCache.isDefaultIcon(icon)) {
+                                byte[] blob = packIcon(dpi, icon);
+                                writeRowToBackup(key, blob, out, data);
+                            }
+                        } else {
+                            if (DEBUG) Log.d(TAG, "scheduling another run for icon " + backupKey);
+                            // too many icons for this pass, request another.
+                            dataChanged();
+                        }
+                    }
+                } catch (URISyntaxException e) {
+                    Log.w(TAG, "invalid URI on application favorite: " + id);
+                } catch (IOException e) {
+                    Log.w(TAG, "unable to save application icon for favorite: " + id);
+                }
+
+            }
+        } finally {
+            cursor.close();
+        }
+        if (DEBUG) Log.d(TAG, "icon currentIds.size()=" + currentIds.size());
+
+        // these IDs must have been deleted
+        savedIds.removeAll(currentIds);
+        out.rows += removeDeletedKeysFromBackup(savedIds, data);
+    }
+
+    /**
+     * Read an icon from the stream.
+     *
+     * <P>Keys arrive in any order, so shortcuts that use this icon may already exist.
+     *
+     * @param key identifier for the row
+     * @param buffer the serialized proto from the stream, may be larger than dataSize
+     * @param dataSize the size of the proto from the stream
+     * @param keys keys to mark as clean in the notes for next backup
+     */
+    private void restoreIcon(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
+        Log.v(TAG, "unpacking icon " + key.id);
+        if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
+                Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+        try {
+            Resource res = unpackIcon(buffer, 0, dataSize);
+            if (DEBUG) Log.d(TAG, "unpacked " + res.dpi);
+            if (DEBUG) Log.d(TAG, "read " +
+                    Base64.encodeToString(res.data, 0, res.data.length,
+                            Base64.NO_WRAP));
+            Bitmap icon = BitmapFactory.decodeByteArray(res.data, 0, res.data.length);
+            if (icon == null) {
+                Log.w(TAG, "failed to unpack icon for " + key.name);
+            }
+        } catch (InvalidProtocolBufferNanoException e) {
+            Log.w(TAG, "failed to decode proto", e);
+        }
+    }
+
+    /**
+     * Write all the static widget resources we need to render placeholders
+     * for a package that is not installed.
+     *
+     * @param in notes from last backup
+     * @param data output stream for key/value pairs
+     * @param out notes about this backup
+     * @param keys keys to mark as clean in the notes for next backup
+     * @throws IOException
+     */
+    private void backupWidgets(Journal in, BackupDataOutput data, Journal out,
+            ArrayList<Key> keys) throws IOException {
+        // persist static widget info that hasn't been persisted yet
+        final LauncherAppState appState = LauncherAppState.getInstanceNoCreate();
+        if (appState == null) {
+            dataChanged(); // try again later
+            if (DEBUG) Log.d(TAG, "Launcher is not initialized, delaying widget backup");
+            return;
+        }
+        final ContentResolver cr = mContext.getContentResolver();
+        final WidgetPreviewLoader previewLoader = new WidgetPreviewLoader(mContext);
+        final PagedViewCellLayout widgetSpacingLayout = new PagedViewCellLayout(mContext);
+        final IconCache iconCache = appState.getIconCache();
+        final int dpi = mContext.getResources().getDisplayMetrics().densityDpi;
+        final DeviceProfile profile = appState.getDynamicGrid().getDeviceProfile();
+        if (DEBUG) Log.d(TAG, "cellWidthPx: " + profile.cellWidthPx);
+
+        // read the old ID set
+        Set<String> savedIds = getSavedIdsByType(Key.WIDGET, in);
+        if (DEBUG) Log.d(TAG, "widgets savedIds.size()=" + savedIds.size());
+
+        int startRows = out.rows;
+        if (DEBUG) Log.d(TAG, "starting here: " + startRows);
+        String where = Favorites.ITEM_TYPE + "=" + Favorites.ITEM_TYPE_APPWIDGET;
+        Cursor cursor = cr.query(Favorites.CONTENT_URI, FAVORITE_PROJECTION,
+                where, null, null);
+        Set<String> currentIds = new HashSet<String>(cursor.getCount());
+        try {
+            cursor.moveToPosition(-1);
+            while(cursor.moveToNext()) {
+                final long id = cursor.getLong(ID_INDEX);
+                final String providerName = cursor.getString(APPWIDGET_PROVIDER_INDEX);
+                final int spanX = cursor.getInt(SPANX_INDEX);
+                final int spanY = cursor.getInt(SPANY_INDEX);
+                final ComponentName provider = ComponentName.unflattenFromString(providerName);
+                Key key = null;
+                String backupKey = null;
+                if (provider != null) {
+                    key = getKey(Key.WIDGET, providerName);
+                    backupKey = keyToBackupKey(key);
+                    currentIds.add(backupKey);
+                } else {
+                    Log.w(TAG, "empty intent on appwidget: " + id);
+                }
+                if (savedIds.contains(backupKey)) {
+                    if (DEBUG) Log.d(TAG, "already saved widget " + backupKey);
+
+                    // remember that we already backed this up previously
+                    keys.add(key);
+                } else if (backupKey != null) {
+                    if (DEBUG) Log.d(TAG, "I can count this high: " + out.rows);
+                    if ((out.rows - startRows) < MAX_WIDGETS_PER_PASS) {
+                        if (DEBUG) Log.d(TAG, "saving widget " + backupKey);
+                        previewLoader.setPreviewSize(spanX * profile.cellWidthPx,
+                                spanY * profile.cellHeightPx, widgetSpacingLayout);
+                        byte[] blob = packWidget(dpi, previewLoader, iconCache, provider);
+                        keys.add(key);
+                        writeRowToBackup(key, blob, out, data);
+
+                    } else {
+                        if (DEBUG) Log.d(TAG, "scheduling another run for widget " + backupKey);
+                        // too many widgets for this pass, request another.
+                        dataChanged();
+                    }
+                }
+            }
+        } finally {
+            cursor.close();
+        }
+        if (DEBUG) Log.d(TAG, "widget currentIds.size()=" + currentIds.size());
+
+        // these IDs must have been deleted
+        savedIds.removeAll(currentIds);
+        out.rows += removeDeletedKeysFromBackup(savedIds, data);
+    }
+
+    /**
+     * Read a widget from the stream.
+     *
+     * <P>Keys arrive in any order, so widgets that use this data may already exist.
+     *
+     * @param key identifier for the row
+     * @param buffer the serialized proto from the stream, may be larger than dataSize
+     * @param dataSize the size of the proto from the stream
+     * @param keys keys to mark as clean in the notes for next backup
+     */
+    private void restoreWidget(Key key, byte[] buffer, int dataSize, ArrayList<Key> keys) {
+        Log.v(TAG, "unpacking widget " + key.id);
+        if (DEBUG) Log.d(TAG, "read (" + buffer.length + "): " +
+                Base64.encodeToString(buffer, 0, dataSize, Base64.NO_WRAP));
+        try {
+            Widget widget = unpackWidget(buffer, 0, dataSize);
+            if (DEBUG) Log.d(TAG, "unpacked " + widget.provider);
+            if (widget.icon.data != null)  {
+                Bitmap icon = BitmapFactory
+                        .decodeByteArray(widget.icon.data, 0, widget.icon.data.length);
+                if (icon == null) {
+                    Log.w(TAG, "failed to unpack widget icon for " + key.name);
+                }
+            }
+        } catch (InvalidProtocolBufferNanoException e) {
+            Log.w(TAG, "failed to decode proto", e);
+        }
+    }
+
+    /** create a new key, with an integer ID.
+     *
+     * <P> Keys contain their own checksum instead of using
+     * the heavy-weight CheckedMessage wrapper.
+     */
+    private Key getKey(int type, long id) {
+        Key key = new Key();
+        key.type = type;
+        key.id = id;
+        key.checksum = checkKey(key);
+        return key;
+    }
+
+    /** create a new key for a named object.
+     *
+     * <P> Keys contain their own checksum instead of using
+     * the heavy-weight CheckedMessage wrapper.
+     */
+    private Key getKey(int type, String name) {
+        Key key = new Key();
+        key.type = type;
+        key.name = name;
+        key.checksum = checkKey(key);
+        return key;
+    }
+
+    /** keys need to be strings, serialize and encode. */
+    private String keyToBackupKey(Key key) {
+        return Base64.encodeToString(Key.toByteArray(key), Base64.NO_WRAP);
+    }
+
+    /** keys need to be strings, decode and parse. */
+    private Key backupKeyToKey(String backupKey) throws KeyParsingException {
+        try {
+            Key key = Key.parseFrom(Base64.decode(backupKey, Base64.DEFAULT));
+            if (key.checksum != checkKey(key)) {
+                key = null;
+                throw new KeyParsingException("invalid key read from stream" + backupKey);
+            }
+            return key;
+        } catch (InvalidProtocolBufferNanoException e) {
+            throw new KeyParsingException(e);
+        } catch (IllegalArgumentException e) {
+            throw new KeyParsingException(e);
+        }
+    }
+
+    private String getKeyName(Key key) {
+        if (TextUtils.isEmpty(key.name)) {
+            return Long.toString(key.id);
+        } else {
+            return key.name;
+        }
+
+    }
+
+    private String geKeyType(Key key) {
+        switch (key.type) {
+            case Key.FAVORITE:
+                return "favorite";
+            case Key.SCREEN:
+                return "screen";
+            case Key.ICON:
+                return "icon";
+            case Key.WIDGET:
+                return "widget";
+            default:
+                return "anonymous";
+        }
+    }
+
+    /** Compute the checksum over the important bits of a key. */
+    private long checkKey(Key key) {
+        CRC32 checksum = new CRC32();
+        checksum.update(key.type);
+        checksum.update((int) (key.id & 0xffff));
+        checksum.update((int) ((key.id >> 32) & 0xffff));
+        if (!TextUtils.isEmpty(key.name)) {
+            checksum.update(key.name.getBytes());
+        }
+        return checksum.getValue();
+    }
+
+    /** Serialize a Favorite for persistence, including a checksum wrapper. */
+    private byte[] packFavorite(Cursor c) {
+        Favorite favorite = new Favorite();
+        favorite.id = c.getLong(ID_INDEX);
+        favorite.screen = c.getInt(SCREEN_INDEX);
+        favorite.container = c.getInt(CONTAINER_INDEX);
+        favorite.cellX = c.getInt(CELLX_INDEX);
+        favorite.cellY = c.getInt(CELLY_INDEX);
+        favorite.spanX = c.getInt(SPANX_INDEX);
+        favorite.spanY = c.getInt(SPANY_INDEX);
+        favorite.iconType = c.getInt(ICON_TYPE_INDEX);
+        if (favorite.iconType == Favorites.ICON_TYPE_RESOURCE) {
+            String iconPackage = c.getString(ICON_PACKAGE_INDEX);
+            if (!TextUtils.isEmpty(iconPackage)) {
+                favorite.iconPackage = iconPackage;
+            }
+            String iconResource = c.getString(ICON_RESOURCE_INDEX);
+            if (!TextUtils.isEmpty(iconResource)) {
+                favorite.iconResource = iconResource;
+            }
+        }
+        if (favorite.iconType == Favorites.ICON_TYPE_BITMAP) {
+            byte[] blob = c.getBlob(ICON_INDEX);
+            if (blob != null && blob.length > 0) {
+                favorite.icon = blob;
+            }
+        }
+        String title = c.getString(TITLE_INDEX);
+        if (!TextUtils.isEmpty(title)) {
+            favorite.title = title;
+        }
+        String intent = c.getString(INTENT_INDEX);
+        if (!TextUtils.isEmpty(intent)) {
+            favorite.intent = intent;
+        }
+        favorite.itemType = c.getInt(ITEM_TYPE_INDEX);
+        if (favorite.itemType == Favorites.ITEM_TYPE_APPWIDGET) {
+            favorite.appWidgetId = c.getInt(APPWIDGET_ID_INDEX);
+            String appWidgetProvider = c.getString(APPWIDGET_PROVIDER_INDEX);
+            if (!TextUtils.isEmpty(appWidgetProvider)) {
+                favorite.appWidgetProvider = appWidgetProvider;
+            }
+        }
+
+        return writeCheckedBytes(favorite);
+    }
+
+    /** Deserialize a Favorite from persistence, after verifying checksum wrapper. */
+    private Favorite unpackFavorite(byte[] buffer, int offset, int dataSize)
+            throws InvalidProtocolBufferNanoException {
+        Favorite favorite = new Favorite();
+        MessageNano.mergeFrom(favorite, readCheckedBytes(buffer, offset, dataSize));
+        return favorite;
+    }
+
+    /** Serialize a Screen for persistence, including a checksum wrapper. */
+    private byte[] packScreen(Cursor c) {
+        Screen screen = new Screen();
+        screen.id = c.getLong(ID_INDEX);
+        screen.rank = c.getInt(SCREEN_RANK_INDEX);
+
+        return writeCheckedBytes(screen);
+    }
+
+    /** Deserialize a Screen from persistence, after verifying checksum wrapper. */
+    private Screen unpackScreen(byte[] buffer, int offset, int dataSize)
+            throws InvalidProtocolBufferNanoException {
+        Screen screen = new Screen();
+        MessageNano.mergeFrom(screen, readCheckedBytes(buffer, offset, dataSize));
+        return screen;
+    }
+
+    /** Serialize an icon Resource for persistence, including a checksum wrapper. */
+    private byte[] packIcon(int dpi, Bitmap icon) {
+        Resource res = new Resource();
+        res.dpi = dpi;
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        if (icon.compress(IMAGE_FORMAT, IMAGE_COMPRESSION_QUALITY, os)) {
+            res.data = os.toByteArray();
+        }
+        return writeCheckedBytes(res);
+    }
+
+    /** Deserialize an icon resource from persistence, after verifying checksum wrapper. */
+    private Resource unpackIcon(byte[] buffer, int offset, int dataSize)
+            throws InvalidProtocolBufferNanoException {
+        Resource res = new Resource();
+        MessageNano.mergeFrom(res, readCheckedBytes(buffer, offset, dataSize));
+        return res;
+    }
+
+    /** Serialize a widget for persistence, including a checksum wrapper. */
+    private byte[] packWidget(int dpi, WidgetPreviewLoader previewLoader, IconCache iconCache,
+            ComponentName provider) {
+        final AppWidgetProviderInfo info = findAppWidgetProviderInfo(provider);
+        Widget widget = new Widget();
+        widget.provider = provider.flattenToShortString();
+        widget.label = info.label;
+        widget.configure = info.configure != null;
+        if (info.icon != 0) {
+            widget.icon = new Resource();
+            Drawable fullResIcon = iconCache.getFullResIcon(provider.getPackageName(), info.icon);
+            Bitmap icon = Utilities.createIconBitmap(fullResIcon, mContext);
+            ByteArrayOutputStream os = new ByteArrayOutputStream();
+            if (icon.compress(IMAGE_FORMAT, IMAGE_COMPRESSION_QUALITY, os)) {
+                widget.icon.data = os.toByteArray();
+                widget.icon.dpi = dpi;
+            }
+        }
+        if (info.previewImage != 0) {
+            widget.preview = new Resource();
+            Bitmap preview = previewLoader.generateWidgetPreview(info, null);
+            ByteArrayOutputStream os = new ByteArrayOutputStream();
+            if (preview.compress(IMAGE_FORMAT, IMAGE_COMPRESSION_QUALITY, os)) {
+                widget.preview.data = os.toByteArray();
+                widget.preview.dpi = dpi;
+            }
+        }
+        return writeCheckedBytes(widget);
+    }
+
+    /** Deserialize a widget from persistence, after verifying checksum wrapper. */
+    private Widget unpackWidget(byte[] buffer, int offset, int dataSize)
+            throws InvalidProtocolBufferNanoException {
+        Widget widget = new Widget();
+        MessageNano.mergeFrom(widget, readCheckedBytes(buffer, offset, dataSize));
+        return widget;
+    }
+
+    /**
+     * Read the old journal from the input file.
+     *
+     * In the event of any error, just pretend we didn't have a journal,
+     * in that case, do a full backup.
+     *
+     * @param oldState the read-0only file descriptor pointing to the old journal
+     * @return a Journal protocol bugffer
+     */
+    private Journal readJournal(ParcelFileDescriptor oldState) {
+        Journal journal = new Journal();
+        if (oldState == null) {
+            return journal;
+        }
+        FileInputStream inStream = new FileInputStream(oldState.getFileDescriptor());
+        try {
+            int remaining = inStream.available();
+            if (DEBUG) Log.d(TAG, "available " + remaining);
+            if (remaining < MAX_JOURNAL_SIZE) {
+                byte[] buffer = new byte[remaining];
+                int bytesRead = 0;
+                while (remaining > 0) {
+                    try {
+                        int result = inStream.read(buffer, bytesRead, remaining);
+                        if (result > 0) {
+                            if (DEBUG) Log.d(TAG, "read some bytes: " + result);
+                            remaining -= result;
+                            bytesRead += result;
+                        } else {
+                            // stop reading ands see what there is to parse
+                            Log.w(TAG, "read error: " + result);
+                            remaining = 0;
+                        }
+                    } catch (IOException e) {
+                        Log.w(TAG, "failed to read the journal", e);
+                        buffer = null;
+                        remaining = 0;
+                    }
+                }
+                if (DEBUG) Log.d(TAG, "journal bytes read: " + bytesRead);
+
+                if (buffer != null) {
+                    try {
+                        MessageNano.mergeFrom(journal, readCheckedBytes(buffer, 0, bytesRead));
+                    } catch (InvalidProtocolBufferNanoException e) {
+                        Log.d(TAG, "failed to read the journal", e);
+                        journal.clear();
+                    }
+                }
+            }
+        } catch (IOException e) {
+            Log.d(TAG, "failed to close the journal", e);
+        } finally {
+            try {
+                inStream.close();
+            } catch (IOException e) {
+                Log.d(TAG, "failed to close the journal", e);
+            }
+        }
+        return journal;
+    }
+
+    private void writeRowToBackup(Key key, byte[] blob, Journal out,
+            BackupDataOutput data) throws IOException {
+        String backupKey = keyToBackupKey(key);
+        data.writeEntityHeader(backupKey, blob.length);
+        data.writeEntityData(blob, blob.length);
+        out.rows++;
+        out.bytes += blob.length;
+        Log.v(TAG, "saving " + geKeyType(key) + " " + backupKey + ": " +
+                getKeyName(key) + "/" + blob.length);
+        if(DEBUG_PAYLOAD) {
+            String encoded = Base64.encodeToString(blob, 0, blob.length, Base64.NO_WRAP);
+            final int chunkSize = 1024;
+            for (int offset = 0; offset < encoded.length(); offset += chunkSize) {
+                int end = offset + chunkSize;
+                end = Math.min(end, encoded.length());
+                Log.d(TAG, "wrote " + encoded.substring(offset, end));
+            }
+        }
+    }
+
+    private Set<String> getSavedIdsByType(int type, Journal in) {
+        Set<String> savedIds = new HashSet<String>();
+        for(int i = 0; i < in.key.length; i++) {
+            Key key = in.key[i];
+            if (key.type == type) {
+                savedIds.add(keyToBackupKey(key));
+            }
+        }
+        return savedIds;
+    }
+
+    private int removeDeletedKeysFromBackup(Set<String> deletedIds, BackupDataOutput data)
+            throws IOException {
+        int rows = 0;
+        for(String deleted: deletedIds) {
+            Log.v(TAG, "dropping icon " + deleted);
+            data.writeEntityHeader(deleted, -1);
+            rows++;
+        }
+        return rows;
+    }
+
+    /**
+     * Write the new journal to the output file.
+     *
+     * In the event of any error, just pretend we didn't have a journal,
+     * in that case, do a full backup.
+
+     * @param newState the write-only file descriptor pointing to the new journal
+     * @param journal a Journal protocol buffer
+     */
+    private void writeJournal(ParcelFileDescriptor newState, Journal journal) {
+        FileOutputStream outStream = null;
+        try {
+            outStream = new FileOutputStream(newState.getFileDescriptor());
+            outStream.write(writeCheckedBytes(journal));
+            outStream.close();
+        } catch (IOException e) {
+            Log.d(TAG, "failed to write backup journal", e);
+        }
+    }
+
+    /** Wrap a proto in a CheckedMessage and compute the checksum. */
+    private byte[] writeCheckedBytes(MessageNano proto) {
+        CheckedMessage wrapper = new CheckedMessage();
+        wrapper.payload = MessageNano.toByteArray(proto);
+        CRC32 checksum = new CRC32();
+        checksum.update(wrapper.payload);
+        wrapper.checksum = checksum.getValue();
+        return MessageNano.toByteArray(wrapper);
+    }
+
+    /** Unwrap a proto message from a CheckedMessage, verifying the checksum. */
+    private byte[] readCheckedBytes(byte[] buffer, int offset, int dataSize)
+            throws InvalidProtocolBufferNanoException {
+        CheckedMessage wrapper = new CheckedMessage();
+        MessageNano.mergeFrom(wrapper, buffer, offset, dataSize);
+        CRC32 checksum = new CRC32();
+        checksum.update(wrapper.payload);
+        if (wrapper.checksum != checksum.getValue()) {
+            throw new InvalidProtocolBufferNanoException("checksum does not match");
+        }
+        return wrapper.payload;
+    }
+
+    private AppWidgetProviderInfo findAppWidgetProviderInfo(ComponentName component) {
+        if (mWidgetMap == null) {
+            List<AppWidgetProviderInfo> widgets =
+                    AppWidgetManager.getInstance(mContext).getInstalledProviders();
+            mWidgetMap = new HashMap<ComponentName, AppWidgetProviderInfo>(widgets.size());
+            for (AppWidgetProviderInfo info : widgets) {
+                mWidgetMap.put(info.provider, info);
+            }
+        }
+        return mWidgetMap.get(component);
+    }
+
+    private class KeyParsingException extends Throwable {
+        private KeyParsingException(Throwable cause) {
+            super(cause);
+        }
+
+        public KeyParsingException(String reason) {
+            super(reason);
+        }
+    }
+}
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index f8644b1..7e1442d 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -158,7 +158,6 @@
         public void bindFolders(HashMap<Long,FolderInfo> folders);
         public void finishBindingItems(boolean upgradePath);
         public void bindAppWidget(LauncherAppWidgetInfo info);
-        public boolean shouldShowApp(ResolveInfo app);
         public void bindAllApplications(ArrayList<AppInfo> apps);
         public void bindAppsAdded(ArrayList<Long> newScreens,
                                   ArrayList<ItemInfo> addNotAnimated,
@@ -179,12 +178,12 @@
         public boolean filterItem(ItemInfo parent, ItemInfo info, ComponentName cn);
     }
 
-    LauncherModel(LauncherAppState app, IconCache iconCache) {
+    LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter) {
         final Context context = app.getContext();
 
         mAppsCanBeOnRemoveableStorage = Environment.isExternalStorageRemovable();
         mApp = app;
-        mBgAllAppsList = new AllAppsList(iconCache);
+        mBgAllAppsList = new AllAppsList(iconCache, appFilter);
         mIconCache = iconCache;
 
         mDefaultIcon = Utilities.createIconBitmap(
@@ -319,8 +318,10 @@
                             continue;
                         }
 
-                        // Add this icon to the db, creating a new page if necessary
-                        int startSearchPageIndex = 1;
+                        // Add this icon to the db, creating a new page if necessary.  If there
+                        // is only the empty page then we just add items to the first page.
+                        // Otherwise, we add them to the next pages.
+                        int startSearchPageIndex = workspaceScreens.isEmpty() ? 0 : 1;
                         Pair<Long, int[]> coords = LauncherModel.findNextAvailableIconSpace(context,
                                 name, launchIntent, startSearchPageIndex, workspaceScreens);
                         if (coords == null) {
@@ -694,6 +695,7 @@
      */
     static void modifyItemInDatabase(Context context, final ItemInfo item, final long container,
             final long screenId, final int cellX, final int cellY, final int spanX, final int spanY) {
+        item.container = container;
         item.cellX = cellX;
         item.cellY = cellY;
         item.spanX = spanX;
@@ -1621,6 +1623,7 @@
 
                 final ArrayList<Long> itemsToRemove = new ArrayList<Long>();
                 final Uri contentUri = LauncherSettings.Favorites.CONTENT_URI;
+                if (DEBUG_LOADERS) Log.d(TAG, "loading model from " + contentUri);
                 final Cursor c = contentResolver.query(contentUri, null, null, null, null);
 
                 // +1 for the hotseat (it can be larger than the workspace)
@@ -2396,11 +2399,9 @@
             // Create the ApplicationInfos
             for (int i = 0; i < apps.size(); i++) {
                 ResolveInfo app = apps.get(i);
-                if (oldCallbacks.shouldShowApp(app)) {
-                    // This builds the icon bitmaps.
-                    mBgAllAppsList.add(new AppInfo(packageManager, app,
-                            mIconCache, mLabelCache));
-                }
+                // This builds the icon bitmaps.
+                mBgAllAppsList.add(new AppInfo(packageManager, app,
+                        mIconCache, mLabelCache));
             }
 
             // Huh? Shouldn't this be inside the Runnable below?
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index 471d2d2..d0f6770 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -49,8 +49,8 @@
 import android.util.Log;
 import android.util.Xml;
 
-import com.android.launcher3.LauncherSettings.BaseLauncherColumns;
 import com.android.launcher3.LauncherSettings.Favorites;
+import com.android.launcher3.config.ProviderConfig;
 
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
@@ -69,7 +69,7 @@
     private static final int DATABASE_VERSION = 15;
 
     static final String OLD_AUTHORITY = "com.android.launcher2.settings";
-    static final String AUTHORITY = "com.android.launcher3.settings";
+    static final String AUTHORITY = ProviderConfig.AUTHORITY;
 
     static final String TABLE_FAVORITES = "favorites";
     static final String TABLE_WORKSPACE_SCREENS = "workspaceScreens";
@@ -210,7 +210,7 @@
         }
 
         // always notify the backup agent
-        LauncherBackupAgent.dataChanged(getContext());
+        LauncherBackupAgentHelper.dataChanged(getContext());
     }
 
     private void addModifiedTime(ContentValues values) {
@@ -296,6 +296,7 @@
         private static final String TAG_SHORTCUT = "shortcut";
         private static final String TAG_FOLDER = "folder";
         private static final String TAG_EXTRA = "extra";
+        private static final String TAG_INCLUDE = "include";
 
         private final Context mContext;
         private final AppWidgetHost mAppWidgetHost;
@@ -1011,6 +1012,8 @@
             intent.addCategory(Intent.CATEGORY_LAUNCHER);
             ContentValues values = new ContentValues();
 
+            if (LOGD) Log.v(TAG, String.format("Loading favorites from resid=0x%08x", workspaceResourceId));
+
             PackageManager packageManager = mContext.getPackageManager();
             int i = 0;
             try {
@@ -1031,6 +1034,30 @@
                     boolean added = false;
                     final String name = parser.getName();
 
+                    if (TAG_INCLUDE.equals(name)) {
+                        final TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Include);
+
+                        final int resId = a.getResourceId(R.styleable.Include_workspace, 0);
+
+                        if (LOGD) Log.v(TAG, String.format(("%" + (2*(depth+1)) + "s<include workspace=%08x>"),
+                                "", resId));
+
+                        if (resId != 0 && resId != workspaceResourceId) {
+                            // recursively load some more favorites, why not?
+                            i += loadFavorites(db, resId);
+                            added = false;
+                            mMaxItemId = -1;
+                        } else {
+                            Log.w(TAG, String.format("Skipping <include workspace=0x%08x>", resId));
+                        }
+
+                        a.recycle();
+
+                        if (LOGD) Log.v(TAG, String.format(("%" + (2*(depth+1)) + "s</include>"), ""));
+                        continue;
+                    }
+
+                    // Assuming it's a <favorite> at this point
                     TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Favorite);
 
                     long container = LauncherSettings.Favorites.CONTAINER_DESKTOP;
@@ -1048,6 +1075,17 @@
                     values.put(LauncherSettings.Favorites.CELLX, x);
                     values.put(LauncherSettings.Favorites.CELLY, y);
 
+                    if (LOGD) {
+                        final String title = a.getString(R.styleable.Favorite_title);
+                        final String pkg = a.getString(R.styleable.Favorite_packageName);
+                        final String something = title != null ? title : pkg;
+                        Log.v(TAG, String.format(
+                                ("%" + (2*(depth+1)) + "s<%s%s c=%d s=%s x=%s y=%s>"),
+                                "", name,
+                                (something == null ? "" : (" \"" + something + "\"")),
+                                container, screen, x, y));
+                    }
+
                     if (TAG_FAVORITE.equals(name)) {
                         long id = addAppShortcut(db, values, a, packageManager, intent);
                         added = id >= 0;
@@ -1087,6 +1125,13 @@
                             values.clear();
                             values.put(LauncherSettings.Favorites.CONTAINER, folderId);
 
+                            if (LOGD) {
+                                final String pkg = ar.getString(R.styleable.Favorite_packageName);
+                                final String uri = ar.getString(R.styleable.Favorite_uri);
+                                Log.v(TAG, String.format(("%" + (2*(folderDepth+1)) + "s<%s \"%s\">"), "",
+                                        folder_item_name, uri != null ? uri : pkg));
+                            }
+
                             if (TAG_FAVORITE.equals(folder_item_name) && folderId >= 0) {
                                 long id =
                                     addAppShortcut(db, values, ar, packageManager, intent);
diff --git a/src/com/android/launcher3/LauncherViewPropertyAnimator.java b/src/com/android/launcher3/LauncherViewPropertyAnimator.java
index 8a9c35d..4cafbbf 100644
--- a/src/com/android/launcher3/LauncherViewPropertyAnimator.java
+++ b/src/com/android/launcher3/LauncherViewPropertyAnimator.java
@@ -35,7 +35,8 @@
             ALPHA,
             START_DELAY,
             DURATION,
-            INTERPOLATOR
+            INTERPOLATOR,
+            WITH_LAYER
     }
     EnumSet<Properties> mPropertiesToSet = EnumSet.noneOf(Properties.class);
     ViewPropertyAnimator mViewPropertyAnimator;
@@ -223,6 +224,9 @@
         if (mPropertiesToSet.contains(Properties.INTERPOLATOR)) {
             mViewPropertyAnimator.setInterpolator(mInterpolator);
         }
+        if (mPropertiesToSet.contains(Properties.WITH_LAYER)) {
+            mViewPropertyAnimator.withLayer();
+        }
         mViewPropertyAnimator.setListener(this);
         mViewPropertyAnimator.start();
         LauncherAnimUtils.cancelOnDestroyActivity(this);
@@ -263,4 +267,9 @@
         mAlpha = value;
         return this;
     }
+
+    public LauncherViewPropertyAnimator withLayer() {
+        mPropertiesToSet.add(Properties.WITH_LAYER);
+        return this;
+    }
 }
diff --git a/src/com/android/launcher3/LiveWallpaperListAdapter.java b/src/com/android/launcher3/LiveWallpaperListAdapter.java
index e9e5e79..54e0af7 100644
--- a/src/com/android/launcher3/LiveWallpaperListAdapter.java
+++ b/src/com/android/launcher3/LiveWallpaperListAdapter.java
@@ -85,7 +85,7 @@
         View view;
 
         if (convertView == null) {
-            view = mInflater.inflate(R.layout.live_wallpaper_picker_item, parent, false);
+            view = mInflater.inflate(R.layout.wallpaper_picker_live_wallpaper_item, parent, false);
         } else {
             view = convertView;
         }
@@ -93,6 +93,7 @@
         WallpaperPickerActivity.setWallpaperItemPaddingToZero((FrameLayout) view);
 
         LiveWallpaperTile wallpaperInfo = mWallpapers.get(position);
+        wallpaperInfo.setView(view);
         ImageView image = (ImageView) view.findViewById(R.id.wallpaper_image);
         ImageView icon = (ImageView) view.findViewById(R.id.wallpaper_icon);
         if (wallpaperInfo.mThumbnail != null) {
@@ -174,46 +175,10 @@
                 Intent launchIntent = new Intent(WallpaperService.SERVICE_INTERFACE);
                 launchIntent.setClassName(info.getPackageName(), info.getServiceName());
                 LiveWallpaperTile wallpaper = new LiveWallpaperTile(thumb, info, launchIntent);
-
-                // TODO: generate a default thumb
-                /*
-                final Resources res = mContext.getResources();
-                Canvas canvas = new Canvas();
-                Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
-                paint.setTextAlign(Paint.Align.CENTER);
-                BitmapDrawable galleryIcon = (BitmapDrawable) res.getDrawable(
-                        R.drawable.livewallpaper_placeholder);
-                if (thumb == null) {
-                    int thumbWidth = res.getDimensionPixelSize(
-                            R.dimen.live_wallpaper_thumbnail_width);
-                    int thumbHeight = res.getDimensionPixelSize(
-                            R.dimen.live_wallpaper_thumbnail_height);
-
-                    Bitmap thumbnail = Bitmap.createBitmap(thumbWidth, thumbHeight,
-                            Bitmap.Config.ARGB_8888);
-
-                    paint.setColor(res.getColor(R.color.live_wallpaper_thumbnail_background));
-                    canvas.setBitmap(thumbnail);
-                    canvas.drawPaint(paint);
-
-                    galleryIcon.setBounds(0, 0, thumbWidth, thumbHeight);
-                    galleryIcon.setGravity(Gravity.CENTER);
-                    galleryIcon.draw(canvas);
-
-                    String title = info.loadLabel(packageManager).toString();
-
-                    paint.setColor(res.getColor(R.color.live_wallpaper_thumbnail_text_color));
-                    paint.setTextSize(
-                            res.getDimensionPixelSize(R.dimen.live_wallpaper_thumbnail_text_size));
-
-                    canvas.drawText(title, (int) (thumbWidth * 0.5),
-                            thumbHeight - res.getDimensionPixelSize(
-                                    R.dimen.live_wallpaper_thumbnail_text_offset), paint);
-
-                    thumb = new BitmapDrawable(res, thumbnail);
-                }*/
                 publishProgress(wallpaper);
             }
+            // Send a null object to show loading is finished
+            publishProgress((LiveWallpaperTile) null);
 
             return null;
         }
@@ -221,6 +186,10 @@
         @Override
         protected void onProgressUpdate(LiveWallpaperTile...infos) {
             for (LiveWallpaperTile info : infos) {
+                if (info == null) {
+                    LiveWallpaperListAdapter.this.notifyDataSetChanged();
+                    break;
+                }
                 info.mThumbnail.setDither(true);
                 if (mWallpaperPosition < mWallpapers.size()) {
                     mWallpapers.set(mWallpaperPosition, info);
@@ -228,9 +197,6 @@
                     mWallpapers.add(info);
                 }
                 mWallpaperPosition++;
-                if (mWallpaperPosition == getCount()) {
-                    LiveWallpaperListAdapter.this.notifyDataSetChanged();
-                }
             }
         }
     }
diff --git a/src/com/android/launcher3/MarketUpdateReceiver.java b/src/com/android/launcher3/MarketUpdateReceiver.java
deleted file mode 100644
index c41bf3e..0000000
--- a/src/com/android/launcher3/MarketUpdateReceiver.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3;
-
-import android.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.util.Log;
-
-public class MarketUpdateReceiver extends BroadcastReceiver {
-    private static final String TAG = "MarketUpdateReceiver";
-
-    private static final String ACTION_PACKAGE_ENQUEUED =
-            "com.android.launcher.action.ACTION_PACKAGE_ENQUEUED";
-    private static final String ACTION_PACKAGE_DOWNLOADING =
-            "com.android.launcher.action.ACTION_PACKAGE_DOWNLOADING";
-    private static final String ACTION_PACKAGE_INSTALLING =
-            "com.android.launcher.action.ACTION_PACKAGE_INSTALLING";
-    private static final String ACTION_PACKAGE_DEQUEUED =
-            "com.android.launcher.action.ACTION_PACKAGE_DEQUEUED";
-
-    /** extra for {@link #ACTION_PACKAGE_ENQUEUED}, send on of the following values **/
-    private static final String EXTRA_KEY_REASON = "reason";
-    private static final String EXTRA_VALUE_REASON_INSTALL = "install";
-    private static final String EXTRA_VALUE_REASON_UPDATE = "update";
-    private static final String EXTRA_VALUE_REASON_RESTORE = "restore";
-
-    /** extra for {@link #ACTION_PACKAGE_DOWNLOADING}, send an int in the range [0-100]. **/
-    private static final String EXTRA_KEY_PROGRESS = "progress";
-
-    /**
-     * extra for {@link #ACTION_PACKAGE_DEQUEUED}
-     * send {@link android.app.Activity#RESULT_OK} on success.
-     * or {@link android.app.Activity#RESULT_CANCELED} if the package was abandoned.
-     * **/
-    private static final String EXTRA_KEY_STATUS =
-            "com.android.launcher.action.EXTRA_STATUS";
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        final String action = intent.getAction();
-        String pkgName = "none";
-        Uri uri = intent.getData();
-        if (uri != null) {
-            pkgName = uri.getSchemeSpecificPart();;
-        }
-        if (ACTION_PACKAGE_ENQUEUED.equals(action)) {
-            String reason = "unknown";
-            if (intent.hasExtra(EXTRA_KEY_REASON)) {
-                reason = intent.getStringExtra(EXTRA_KEY_REASON);
-            }
-            Log.d(TAG, "market has promised to " + reason + ": " + pkgName);
-        } else if (ACTION_PACKAGE_DOWNLOADING.equals(action)) {
-            int progress = intent.getIntExtra(EXTRA_KEY_PROGRESS, 0);
-            Log.d(TAG, "market is downloading (" + progress + "%): " + pkgName);
-        } else if (ACTION_PACKAGE_INSTALLING.equals(action)) {
-            Log.d(TAG, "market is installing: " + pkgName);
-        } else if ( ACTION_PACKAGE_DEQUEUED.equals(action)) {
-            boolean success = Activity.RESULT_OK == intent.getIntExtra(EXTRA_KEY_STATUS,
-                    Activity.RESULT_CANCELED);
-            if (success) {
-                Log.d(TAG, "market has installed: " + pkgName);
-            } else {
-                Log.d(TAG, "market has decided not to install: " + pkgName);
-            }
-        } else {
-            Log.d(TAG, "unknown message " + action);
-        }
-    }
-}
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index 41687d3..e982985 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -32,6 +32,7 @@
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.support.v4.view.accessibility.AccessibilityEventCompat;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.Log;
@@ -96,6 +97,8 @@
     private static final boolean DISABLE_TOUCH_SIDE_PAGES = true;
     private static final boolean DISABLE_FLING_TO_DELETE = true;
 
+    public static final int INVALID_RESTORE_PAGE = -1001;
+
     private boolean mFreeScroll = false;
     private int mFreeScrollMinScrollX = -1;
     private int mFreeScrollMaxScrollX = -1;
@@ -114,7 +117,7 @@
     private int mNormalChildHeight;
 
     protected int mCurrentPage;
-    protected int mRestorePage = -1;
+    protected int mRestorePage = INVALID_RESTORE_PAGE;
     protected int mChildCountOnLastLayout;
 
     protected int mNextPage = INVALID_PAGE;
@@ -265,6 +268,8 @@
 
     protected final Rect mInsets = new Rect();
 
+    protected int mFirstChildLeft;
+
     public interface PageSwitchListener {
         void onPageSwitch(View newPage, int newPageIndex);
     }
@@ -332,6 +337,8 @@
     }
 
     protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+
         // Hook up the page indicator
         ViewGroup parent = (ViewGroup) getParent();
         if (mPageIndicator == null && mPageIndicatorViewId > -1) {
@@ -345,9 +352,23 @@
             }
 
             mPageIndicator.addMarkers(markers, mAllowPagedViewAnimations);
+
+            OnClickListener listener = getPageIndicatorClickListener();
+            if (listener != null) {
+                mPageIndicator.setOnClickListener(listener);
+            }
+            mPageIndicator.setContentDescription(getPageIndicatorDescription());
         }
     }
 
+    protected String getPageIndicatorDescription() {
+        return getCurrentPageDescription();
+    }
+
+    protected OnClickListener getPageIndicatorClickListener() {
+        return null;
+    }
+
     protected void onDetachedFromWindow() {
         // Unhook the page indicator
         mPageIndicator = null;
@@ -518,13 +539,15 @@
     void setCurrentPage(int currentPage) {
         if (!mScroller.isFinished()) {
             mScroller.abortAnimation();
+            // We need to clean up the next page here to avoid computeScrollHelper from
+            // updating current page on the pass.
+            mNextPage = INVALID_PAGE;
         }
         // don't introduce any checks like mCurrentPage == currentPage here-- if we change the
         // the default
         if (getChildCount() == 0) {
             return;
         }
-
         mForceScreenScrolled = true;
         mCurrentPage = Math.max(0, Math.min(currentPage, getPageCount() - 1));
         updateCurrentPageScroll();
@@ -644,6 +667,27 @@
         }
     }
 
+    private void sendScrollAccessibilityEvent() {
+        AccessibilityManager am =
+                (AccessibilityManager) getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+        if (am.isEnabled()) {
+            AccessibilityEvent ev =
+                    AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_SCROLLED);
+            ev.setItemCount(getChildCount());
+            ev.setFromIndex(mCurrentPage);
+
+            final int action;
+            if (getNextPage() >= mCurrentPage) {
+                action = AccessibilityNodeInfo.ACTION_SCROLL_FORWARD;
+            } else {
+                action = AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD;
+            }
+
+            ev.setAction(action);
+            sendAccessibilityEventUnchecked(ev);
+        }
+    }
+
     // we moved this functionality to a helper function so SmoothPagedView can reuse it
     protected boolean computeScrollHelper() {
         if (mScroller.computeScrollOffset()) {
@@ -658,6 +702,8 @@
             invalidate();
             return true;
         } else if (mNextPage != INVALID_PAGE) {
+            sendScrollAccessibilityEvent();
+
             mCurrentPage = Math.max(0, Math.min(mNextPage, getPageCount() - 1));
             mNextPage = INVALID_PAGE;
             notifyPageSwitchListener();
@@ -675,14 +721,11 @@
             }
 
             onPostReorderingAnimationCompleted();
-            // Notify the user when the page changes
-            AccessibilityManager accessibilityManager = (AccessibilityManager)
+            AccessibilityManager am = (AccessibilityManager)
                     getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
-            if (accessibilityManager.isEnabled()) {
-                AccessibilityEvent ev =
-                    AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_SCROLLED);
-                ev.getText().add(getCurrentPageDescription());
-                sendAccessibilityEventUnchecked(ev);
+            if (am.isEnabled()) {
+                // Notify the user when the page changes
+                announceForAccessibility(getCurrentPageDescription());
             }
             return true;
         }
@@ -788,48 +831,50 @@
         for (int i = 0; i < childCount; i++) {
             // disallowing padding in paged view (just pass 0)
             final View child = getPageAt(i);
-            final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            if (child.getVisibility() != GONE) {
+                final LayoutParams lp = (LayoutParams) child.getLayoutParams();
 
-            int childWidthMode;
-            int childHeightMode;
-            int childWidth;
-            int childHeight;
+                int childWidthMode;
+                int childHeightMode;
+                int childWidth;
+                int childHeight;
 
-            if (!lp.isFullScreenPage) {
-                if (lp.width == LayoutParams.WRAP_CONTENT) {
-                    childWidthMode = MeasureSpec.AT_MOST;
+                if (!lp.isFullScreenPage) {
+                    if (lp.width == LayoutParams.WRAP_CONTENT) {
+                        childWidthMode = MeasureSpec.AT_MOST;
+                    } else {
+                        childWidthMode = MeasureSpec.EXACTLY;
+                    }
+
+                    if (lp.height == LayoutParams.WRAP_CONTENT) {
+                        childHeightMode = MeasureSpec.AT_MOST;
+                    } else {
+                        childHeightMode = MeasureSpec.EXACTLY;
+                    }
+
+                    childWidth = widthSize - horizontalPadding;
+                    childHeight = heightSize - verticalPadding - mInsets.top - mInsets.bottom;
+                    mNormalChildHeight = childHeight;
+
                 } else {
                     childWidthMode = MeasureSpec.EXACTLY;
-                }
-
-                if (lp.height == LayoutParams.WRAP_CONTENT) {
-                    childHeightMode = MeasureSpec.AT_MOST;
-                } else {
                     childHeightMode = MeasureSpec.EXACTLY;
+
+                    if (mUseMinScale) {
+                        childWidth = getViewportWidth();
+                        childHeight = getViewportHeight();
+                    } else {
+                        childWidth = widthSize - getPaddingLeft() - getPaddingRight();
+                        childHeight = heightSize - getPaddingTop() - getPaddingBottom();
+                    }
                 }
 
-                childWidth = widthSize - horizontalPadding;
-                childHeight = heightSize - verticalPadding - mInsets.top - mInsets.bottom;
-                mNormalChildHeight = childHeight;
-
-            } else {
-                childWidthMode = MeasureSpec.EXACTLY;
-                childHeightMode = MeasureSpec.EXACTLY;
-
-                if (mUseMinScale) {
-                    childWidth = getViewportWidth();
-                    childHeight = getViewportHeight();
-                } else {
-                    childWidth = widthSize - getPaddingLeft() - getPaddingRight();
-                    childHeight = heightSize - getPaddingTop() - getPaddingBottom();
-                }
+                final int childWidthMeasureSpec =
+                        MeasureSpec.makeMeasureSpec(childWidth, childWidthMode);
+                    final int childHeightMeasureSpec =
+                        MeasureSpec.makeMeasureSpec(childHeight, childHeightMode);
+                child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
             }
-
-            final int childWidthMeasureSpec =
-                    MeasureSpec.makeMeasureSpec(childWidth, childWidthMode);
-                final int childHeightMeasureSpec =
-                    MeasureSpec.makeMeasureSpec(childHeight, childHeightMode);
-            child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
         }
         setMeasuredDimension(scaledWidthSize, scaledHeightSize);
 
@@ -854,6 +899,10 @@
         requestLayout();
     }
 
+    protected int getFirstChildLeft() {
+        return mFirstChildLeft;
+    }
+
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
         if (!mIsDataReady || getChildCount() == 0) {
@@ -878,26 +927,26 @@
         final int delta = isRtl ? -1 : 1;
 
         int verticalPadding = getPaddingTop() + getPaddingBottom();
-        int childLeft = offsetX + (screenWidth - getChildWidth(startIndex)) / 2;
 
+        int childLeft = mFirstChildLeft = offsetX + (screenWidth - getChildWidth(startIndex)) / 2;
         if (mPageScrolls == null || getChildCount() != mChildCountOnLastLayout) {
             mPageScrolls = new int[getChildCount()];
         }
 
         for (int i = startIndex; i != endIndex; i += delta) {
             final View child = getPageAt(i);
-            LayoutParams lp = (LayoutParams) child.getLayoutParams();
-            int childTop;
-            if (lp.isFullScreenPage) {
-                childTop = offsetY;
-            } else {
-                childTop = offsetY + getPaddingTop() + mInsets.top;
-                if (mCenterPagesVertically) {
-                    childTop += (getViewportHeight() - mInsets.top - mInsets.bottom - verticalPadding - child.getMeasuredHeight()) / 2;
-                }
-            }
-
             if (child.getVisibility() != View.GONE) {
+                LayoutParams lp = (LayoutParams) child.getLayoutParams();
+                int childTop;
+                if (lp.isFullScreenPage) {
+                    childTop = offsetY;
+                } else {
+                    childTop = offsetY + getPaddingTop() + mInsets.top;
+                    if (mCenterPagesVertically) {
+                        childTop += (getViewportHeight() - mInsets.top - mInsets.bottom - verticalPadding - child.getMeasuredHeight()) / 2;
+                    }
+                }
+
                 final int childWidth = child.getMeasuredWidth();
                 final int childHeight = child.getMeasuredHeight();
 
@@ -934,9 +983,9 @@
 
         if (mScroller.isFinished() && mChildCountOnLastLayout != getChildCount() &&
                 !mDeferringForDelete) {
-            if (mRestorePage > -1) {
+            if (mRestorePage != INVALID_RESTORE_PAGE) {
                 setCurrentPage(mRestorePage);
-                mRestorePage = -1;
+                mRestorePage = INVALID_RESTORE_PAGE;
             } else {
                 setCurrentPage(getNextPage());
             }
@@ -987,13 +1036,14 @@
         // in accordance with any scroll effects.
         mForceScreenScrolled = true;
         mRecomputePageSpacing = true;
-
+        updateFreescrollBounds();
         invalidate();
     }
 
     @Override
     public void onChildViewRemoved(View parent, View child) {
         mForceScreenScrolled = true;
+        updateFreescrollBounds();
         invalidate();
     }
 
@@ -1047,7 +1097,7 @@
 
     protected void getOverviewModePages(int[] range) {
         range[0] = 0;
-        range[1] = getChildCount() - 1;
+        range[1] = Math.max(0, getChildCount() - 1);
     }
 
     protected void getVisiblePages(int[] range) {
@@ -1472,13 +1522,26 @@
     }
 
     public int getScrollForPage(int index) {
-        if (mPageScrolls == null || index >= mPageScrolls.length) {
+        if (mPageScrolls == null || index >= mPageScrolls.length || index < 0) {
             return 0;
         } else {
             return mPageScrolls[index];
         }
     }
 
+    // While layout transitions are occurring, a child's position may stray from its baseline
+    // position. This method returns the magnitude of this stray at any given time.
+    public int getLayoutTransitionOffsetForPage(int index) {
+        if (mPageScrolls == null || index >= mPageScrolls.length || index < 0) {
+            return 0;
+        } else {
+            View child = getChildAt(index);
+            int scrollOffset = (getViewportWidth() - child.getMeasuredWidth()) / 2;
+            int baselineX = mPageScrolls[index] + scrollOffset + getViewportOffsetX();
+            return (int) (child.getX() - baselineX);
+        }
+    }
+
     // This curve determines how the effect of scrolling over the limits of the page dimishes
     // as the user pulls further and further from the bounds
     private float overScrollInfluenceCurve(float f) {
@@ -1555,6 +1618,17 @@
         setEnableFreeScroll(false, snapPage);
     }
 
+    void updateFreescrollBounds() {
+        getOverviewModePages(mTempVisiblePagesRange);
+        if (isLayoutRtl()) {
+            mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
+            mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
+        } else {
+            mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
+            mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
+        }
+    }
+
     private void setEnableFreeScroll(boolean freeScroll, int snapPage) {
         mFreeScroll = freeScroll;
 
@@ -1562,18 +1636,11 @@
             snapPage = getPageNearestToCenterOfScreen();
         }
 
-        getOverviewModePages(mTempVisiblePagesRange);
         if (!mFreeScroll) {
             snapToPage(snapPage);
         } else {
-            if (isLayoutRtl()) {
-                mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
-                mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
-            } else {
-                mFreeScrollMinScrollX = getScrollForPage(mTempVisiblePagesRange[0]);
-                mFreeScrollMaxScrollX = getScrollForPage(mTempVisiblePagesRange[1]);
-            }
-
+            updateFreescrollBounds();
+            getOverviewModePages(mTempVisiblePagesRange);
             if (getCurrentPage() < mTempVisiblePagesRange[0]) {
                 setCurrentPage(mTempVisiblePagesRange[0]);
             } else if (getCurrentPage() > mTempVisiblePagesRange[1]) {
@@ -2119,6 +2186,8 @@
             focusedChild.clearFocus();
         }
 
+        sendScrollAccessibilityEvent();
+
         pageBeginMoving();
         awakenScrollBars(duration);
         if (immediate) {
@@ -2702,14 +2771,17 @@
     }
 
     @Override
+    public void sendAccessibilityEvent(int eventType) {
+        // Don't let the view send real scroll events.
+        if (eventType != AccessibilityEvent.TYPE_VIEW_SCROLLED) {
+            super.sendAccessibilityEvent(eventType);
+        }
+    }
+
+    @Override
     public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
         super.onInitializeAccessibilityEvent(event);
         event.setScrollable(true);
-        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) {
-            event.setFromIndex(mCurrentPage);
-            event.setToIndex(mCurrentPage);
-            event.setItemCount(getChildCount());
-        }
     }
 
     @Override
diff --git a/src/com/android/launcher3/PagedViewIcon.java b/src/com/android/launcher3/PagedViewIcon.java
index c6d5e49..8bfe42d 100644
--- a/src/com/android/launcher3/PagedViewIcon.java
+++ b/src/com/android/launcher3/PagedViewIcon.java
@@ -69,7 +69,8 @@
             PagedViewIcon.PressedCallback cb) {
         mIcon = info.iconBitmap;
         mPressedCallback = cb;
-        setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null);
+        setCompoundDrawables(null, Utilities.createIconDrawable(mIcon),
+                null, null);
         setText(info.title);
         setTag(info);
     }
diff --git a/src/com/android/launcher3/SavedWallpaperImages.java b/src/com/android/launcher3/SavedWallpaperImages.java
index 531672a..8d5b005 100644
--- a/src/com/android/launcher3/SavedWallpaperImages.java
+++ b/src/com/android/launcher3/SavedWallpaperImages.java
@@ -61,7 +61,9 @@
             String imageFilename = a.getSavedImages().getImageFilename(mDbId);
             File file = new File(a.getFilesDir(), imageFilename);
             CropView v = a.getCropView();
-            v.setTileSource(new BitmapRegionTileSource(a, file.getAbsolutePath(), 1024, 0), null);
+            int rotation = WallpaperCropActivity.getRotationFromExif(file.getAbsolutePath());
+            v.setTileSource(
+                    new BitmapRegionTileSource(a, file.getAbsolutePath(), 1024, rotation), null);
             v.moveToLeft();
             v.setTouchEnabled(false);
         }
@@ -79,6 +81,10 @@
         public boolean isSelectable() {
             return true;
         }
+        @Override
+        public boolean isNamelessWallpaper() {
+            return true;
+        }
     }
 
     public SavedWallpaperImages(Activity context) {
diff --git a/src/com/android/launcher3/SearchDropTargetBar.java b/src/com/android/launcher3/SearchDropTargetBar.java
index e681aa1..435dbda 100644
--- a/src/com/android/launcher3/SearchDropTargetBar.java
+++ b/src/com/android/launcher3/SearchDropTargetBar.java
@@ -138,7 +138,8 @@
      * Shows and hides the search bar.
      */
     public void showSearchBar(boolean animated) {
-        if (!mIsSearchBarHidden) return;
+        boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated;
+        if (!mIsSearchBarHidden && !needToCancelOngoingAnimation) return;
         if (animated) {
             prepareStartAnimation(mQSBSearchBar);
             mQSBSearchBarAnim.reverse();
@@ -153,7 +154,8 @@
         mIsSearchBarHidden = false;
     }
     public void hideSearchBar(boolean animated) {
-        if (mIsSearchBarHidden) return;
+        boolean needToCancelOngoingAnimation = mQSBSearchBarAnim.isRunning() && !animated;
+        if (mIsSearchBarHidden && !needToCancelOngoingAnimation) return;
         if (animated) {
             prepareStartAnimation(mQSBSearchBar);
             mQSBSearchBarAnim.start();
diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java
index b951100..bb5601e 100644
--- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java
+++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java
@@ -103,7 +103,9 @@
 
         for (int i = 0; i < count; i++) {
             View child = getChildAt(i);
-            measureChild(child);
+            if (child.getVisibility() != GONE) {
+                measureChild(child);
+            }
         }
     }
 
@@ -121,6 +123,20 @@
         mIsHotseatLayout = isHotseat;
     }
 
+    int getCellContentWidth() {
+        final LauncherAppState app = LauncherAppState.getInstance();
+        final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+        return Math.min(getMeasuredHeight(), mIsHotseatLayout ?
+                grid.hotseatCellWidthPx: grid.cellWidthPx);
+    }
+
+    int getCellContentHeight() {
+        final LauncherAppState app = LauncherAppState.getInstance();
+        final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
+        return Math.min(getMeasuredHeight(), mIsHotseatLayout ?
+                grid.hotseatCellHeightPx : grid.cellHeightPx);
+    }
+
     public void measureChild(View child) {
         final LauncherAppState app = LauncherAppState.getInstance();
         final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
@@ -135,7 +151,7 @@
                 // Widgets have their own padding, so skip
             } else {
                 // Otherwise, center the icon
-                int cHeight = mIsHotseatLayout ? grid.hotseatCellHeightPx : Math.min(getMeasuredHeight(), grid.cellHeightPx);
+                int cHeight = getCellContentHeight();
                 int cellPaddingY = (int) Math.max(0, ((lp.height - cHeight) / 2f));
                 int cellPaddingX = (int) (grid.edgeMarginPx / 2f);
                 child.setPadding(cellPaddingX, cellPaddingY, cellPaddingX, 0);
diff --git a/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java b/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java
index 7ed1c1b..494694c 100644
--- a/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java
+++ b/src/com/android/launcher3/ThirdPartyWallpaperPickerListAdapter.java
@@ -22,6 +22,8 @@
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -38,8 +40,10 @@
 
     private final LayoutInflater mInflater;
     private final PackageManager mPackageManager;
+    private final int mIconSize;
 
-    private List<ResolveInfo> mThirdPartyWallpaperPickers = new ArrayList<ResolveInfo>();
+    private List<ThirdPartyWallpaperTile> mThirdPartyWallpaperPickers =
+            new ArrayList<ThirdPartyWallpaperTile>();
 
     public static class ThirdPartyWallpaperTile extends WallpaperPickerActivity.WallpaperTileInfo {
         private ResolveInfo mResolveInfo;
@@ -60,6 +64,7 @@
     public ThirdPartyWallpaperPickerListAdapter(Context context) {
         mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         mPackageManager = context.getPackageManager();
+        mIconSize = context.getResources().getDimensionPixelSize(R.dimen.wallpaperItemIconSize);
         final PackageManager pm = mPackageManager;
 
         final Intent pickWallpaperIntent = new Intent(Intent.ACTION_SET_WALLPAPER);
@@ -96,7 +101,7 @@
                     continue outerLoop;
                 }
             }
-            mThirdPartyWallpaperPickers.add(info);
+            mThirdPartyWallpaperPickers.add(new ThirdPartyWallpaperTile(info));
         }
     }
 
@@ -104,7 +109,7 @@
         return mThirdPartyWallpaperPickers.size();
     }
 
-    public ResolveInfo getItem(int position) {
+    public ThirdPartyWallpaperTile getItem(int position) {
         return mThirdPartyWallpaperPickers.get(position);
     }
 
@@ -116,18 +121,19 @@
         View view;
 
         if (convertView == null) {
-            view = mInflater.inflate(R.layout.third_party_wallpaper_picker_item, parent, false);
+            view = mInflater.inflate(R.layout.wallpaper_picker_third_party_item, parent, false);
         } else {
             view = convertView;
         }
 
         WallpaperPickerActivity.setWallpaperItemPaddingToZero((FrameLayout) view);
 
-        ResolveInfo info = mThirdPartyWallpaperPickers.get(position);
+        ResolveInfo info = mThirdPartyWallpaperPickers.get(position).mResolveInfo;
         TextView label = (TextView) view.findViewById(R.id.wallpaper_item_label);
         label.setText(info.loadLabel(mPackageManager));
-        label.setCompoundDrawablesWithIntrinsicBounds(
-                null, info.loadIcon(mPackageManager), null, null);
+        Drawable icon = info.loadIcon(mPackageManager);
+        icon.setBounds(new Rect(0, 0, mIconSize, mIconSize));
+        label.setCompoundDrawables(null, icon, null, null);
         return view;
     }
 }
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 4a8a237..21c546d 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -48,8 +48,8 @@
 
     private static int sIconWidth = -1;
     private static int sIconHeight = -1;
-    private static int sIconTextureWidth = -1;
-    private static int sIconTextureHeight = -1;
+    public static int sIconTextureWidth = -1;
+    public static int sIconTextureHeight = -1;
 
     private static final Paint sBlurPaint = new Paint();
     private static final Paint sGlowColorPressedPaint = new Paint();
@@ -66,6 +66,23 @@
     static int sColorIndex = 0;
 
     /**
+     * Returns a FastBitmapDrawable with the icon, accurately sized.
+     */
+    static Drawable createIconDrawable(Bitmap icon) {
+        FastBitmapDrawable d = new FastBitmapDrawable(icon);
+        d.setFilterBitmap(true);
+        resizeIconDrawable(d);
+        return d;
+    }
+
+    /**
+     * Resizes an icon drawable to the correct icon size.
+     */
+    static void resizeIconDrawable(Drawable icon) {
+        icon.setBounds(0, 0, sIconTextureWidth, sIconTextureHeight);
+    }
+
+    /**
      * Returns a bitmap suitable for the all apps view. Used to convert pre-ICS
      * icon bitmaps that are stored in the database (which were 74x74 pixels at hdpi size)
      * to the proper size (48dp)
@@ -295,6 +312,23 @@
         sIconTextureWidth = sIconTextureHeight = widthPx;
     }
 
+    public static void scaleRect(Rect r, float scale) {
+        if (scale != 1.0f) {
+            r.left = (int) (r.left * scale + 0.5f);
+            r.top = (int) (r.top * scale + 0.5f);
+            r.right = (int) (r.right * scale + 0.5f);
+            r.bottom = (int) (r.bottom * scale + 0.5f);
+        }
+    }
+
+    public static void scaleRectAboutCenter(Rect r, float scale) {
+        int cx = r.centerX();
+        int cy = r.centerY();
+        r.offset(-cx, -cy);
+        Utilities.scaleRect(r, scale);
+        r.offset(cx, cy);
+    }
+
     public static void startActivityForResultSafely(
             Activity activity, Intent intent, int requestCode) {
         try {
diff --git a/src/com/android/launcher3/WallpaperCropActivity.java b/src/com/android/launcher3/WallpaperCropActivity.java
index bc8df6c..30ec340 100644
--- a/src/com/android/launcher3/WallpaperCropActivity.java
+++ b/src/com/android/launcher3/WallpaperCropActivity.java
@@ -37,12 +37,14 @@
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.util.FloatMath;
 import android.util.Log;
 import android.view.Display;
 import android.view.View;
 import android.view.WindowManager;
 
 import com.android.gallery3d.common.Utils;
+import com.android.gallery3d.exif.ExifInterface;
 import com.android.photos.BitmapRegionTileSource;
 
 import java.io.BufferedInputStream;
@@ -75,6 +77,9 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         init();
+        if (!enableRotation()) {
+            setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
+        }
     }
 
     protected void init() {
@@ -82,10 +87,17 @@
 
         mCropView = (CropView) findViewById(R.id.cropView);
 
-        Intent cropIntent = this.getIntent();
+        Intent cropIntent = getIntent();
         final Uri imageUri = cropIntent.getData();
 
-        mCropView.setTileSource(new BitmapRegionTileSource(this, imageUri, 1024, 0), null);
+        if (imageUri == null) {
+            Log.e(LOGTAG, "No URI passed in intent, exiting WallpaperCropActivity");
+            finish();
+            return;
+        }
+
+        int rotation = getRotationFromExif(this, imageUri);
+        mCropView.setTileSource(new BitmapRegionTileSource(this, imageUri, 1024, rotation), null);
         mCropView.setTouchEnabled(true);
         // Action bar
         // Show the custom action bar view
@@ -101,6 +113,10 @@
                 });
     }
 
+    public boolean enableRotation() {
+        return getResources().getBoolean(R.bool.allow_rotation);
+    }
+
     public static String getSharedPreferencesKey() {
         return WallpaperCropActivity.class.getName();
     }
@@ -161,9 +177,47 @@
         return new Point(defaultWidth, defaultHeight);
     }
 
+    public static int getRotationFromExif(String path) {
+        return getRotationFromExifHelper(path, null, 0, null, null);
+    }
+
+    public static int getRotationFromExif(Context context, Uri uri) {
+        return getRotationFromExifHelper(null, null, 0, context, uri);
+    }
+
+    public static int getRotationFromExif(Resources res, int resId) {
+        return getRotationFromExifHelper(null, res, resId, null, null);
+    }
+
+    private static int getRotationFromExifHelper(
+            String path, Resources res, int resId, Context context, Uri uri) {
+        ExifInterface ei = new ExifInterface();
+        try {
+            if (path != null) {
+                ei.readExif(path);
+            } else if (uri != null) {
+                InputStream is = context.getContentResolver().openInputStream(uri);
+                BufferedInputStream bis = new BufferedInputStream(is);
+                ei.readExif(bis);
+            } else {
+                InputStream is = res.openRawResource(resId);
+                BufferedInputStream bis = new BufferedInputStream(is);
+                ei.readExif(bis);
+            }
+            Integer ori = ei.getTagIntValue(ExifInterface.TAG_ORIENTATION);
+            if (ori != null) {
+                return ExifInterface.getRotationForOrientationValue(ori.shortValue());
+            }
+        } catch (IOException e) {
+            Log.w(LOGTAG, "Getting exif data failed", e);
+        }
+        return 0;
+    }
+
     protected void setWallpaper(String filePath, final boolean finishActivityWhenDone) {
-        BitmapCropTask cropTask = new BitmapCropTask(this,
-                filePath, null, 0, 0, true, false, null);
+        int rotation = getRotationFromExif(filePath);
+        BitmapCropTask cropTask = new BitmapCropTask(
+                this, filePath, null, rotation, 0, 0, true, false, null);
         final Point bounds = cropTask.getImageBounds();
         Runnable onEndCrop = new Runnable() {
             public void run() {
@@ -183,6 +237,7 @@
             Resources res, int resId, final boolean finishActivityWhenDone) {
         // crop this image and scale it down to the default wallpaper size for
         // this device
+        int rotation = getRotationFromExif(res, resId);
         Point inSize = mCropView.getSourceDimensions();
         Point outSize = getDefaultWallpaperSize(getResources(),
                 getWindowManager());
@@ -200,8 +255,7 @@
             }
         };
         BitmapCropTask cropTask = new BitmapCropTask(this, res, resId,
-                crop, outSize.x, outSize.y,
-                true, false, onEndCrop);
+                crop, rotation, outSize.x, outSize.y, true, false, onEndCrop);
         cropTask.execute();
     }
 
@@ -212,8 +266,8 @@
 
     protected void cropImageAndSetWallpaper(Uri uri,
             OnBitmapCroppedHandler onBitmapCroppedHandler, final boolean finishActivityWhenDone) {
-     // Get the crop
-        Point inSize = mCropView.getSourceDimensions();
+        // Get the crop
+        boolean ltr = mCropView.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;
 
         Point minDims = new Point();
         Point maxDims = new Point();
@@ -225,12 +279,12 @@
 
         int maxDim = Math.max(maxDims.x, maxDims.y);
         final int minDim = Math.min(minDims.x, minDims.y);
-        int defaultWidth;
+        int defaultWallpaperWidth;
         if (isScreenLarge(getResources())) {
-            defaultWidth = (int) (maxDim *
+            defaultWallpaperWidth = (int) (maxDim *
                     wallpaperTravelToScreenWidthRatio(maxDim, minDim));
         } else {
-            defaultWidth = Math.max((int)
+            defaultWallpaperWidth = Math.max((int)
                     (minDim * WALLPAPER_SCREENS_SPAN), maxDim);
         }
 
@@ -251,16 +305,30 @@
         }
         // Get the crop
         RectF cropRect = mCropView.getCrop();
+        int cropRotation = mCropView.getImageRotation();
         float cropScale = mCropView.getWidth() / (float) cropRect.width();
 
+        Point inSize = mCropView.getSourceDimensions();
+        Matrix rotateMatrix = new Matrix();
+        rotateMatrix.setRotate(cropRotation);
+        float[] rotatedInSize = new float[] { inSize.x, inSize.y };
+        rotateMatrix.mapPoints(rotatedInSize);
+        rotatedInSize[0] = Math.abs(rotatedInSize[0]);
+        rotatedInSize[1] = Math.abs(rotatedInSize[1]);
+
         // ADJUST CROP WIDTH
         // Extend the crop all the way to the right, for parallax
-        float extraSpaceToRight = inSize.x - cropRect.right;
+        // (or all the way to the left, in RTL)
+        float extraSpace = ltr ? rotatedInSize[0] - cropRect.right : cropRect.left;
         // Cap the amount of extra width
-        float maxExtraSpace = defaultWidth / cropScale - cropRect.width();
-        extraSpaceToRight = Math.min(extraSpaceToRight, maxExtraSpace);
+        float maxExtraSpace = defaultWallpaperWidth / cropScale - cropRect.width();
+        extraSpace = Math.min(extraSpace, maxExtraSpace);
 
-        cropRect.right += extraSpaceToRight;
+        if (ltr) {
+            cropRect.right += extraSpace;
+        } else {
+            cropRect.left -= extraSpace;
+        }
 
         // ADJUST CROP HEIGHT
         if (isPortrait) {
@@ -269,7 +337,7 @@
             float extraPortraitHeight =
                     portraitHeight / cropScale - cropRect.height();
             float expandHeight =
-                    Math.min(Math.min(inSize.y - cropRect.bottom, cropRect.top),
+                    Math.min(Math.min(rotatedInSize[1] - cropRect.bottom, cropRect.top),
                             extraPortraitHeight / 2);
             cropRect.top -= expandHeight;
             cropRect.bottom += expandHeight;
@@ -287,7 +355,7 @@
             }
         };
         BitmapCropTask cropTask = new BitmapCropTask(this, uri,
-                cropRect, outWidth, outHeight, true, false, onEndCrop);
+                cropRect, cropRotation, outWidth, outHeight, true, false, onEndCrop);
         if (onBitmapCroppedHandler != null) {
             cropTask.setOnBitmapCropped(onBitmapCroppedHandler);
         }
@@ -307,7 +375,7 @@
         InputStream mInStream;
         RectF mCropBounds = null;
         int mOutWidth, mOutHeight;
-        int mRotation = 0; // for now
+        int mRotation;
         String mOutputFormat = "jpg"; // for now
         boolean mSetWallpaper;
         boolean mSaveCroppedBitmap;
@@ -318,40 +386,45 @@
         boolean mNoCrop;
 
         public BitmapCropTask(Context c, String filePath,
-                RectF cropBounds, int outWidth, int outHeight,
+                RectF cropBounds, int rotation, int outWidth, int outHeight,
                 boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
             mContext = c;
             mInFilePath = filePath;
-            init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
+            init(cropBounds, rotation,
+                    outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
         }
 
         public BitmapCropTask(byte[] imageBytes,
-                RectF cropBounds, int outWidth, int outHeight,
+                RectF cropBounds, int rotation, int outWidth, int outHeight,
                 boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
             mInImageBytes = imageBytes;
-            init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
+            init(cropBounds, rotation,
+                    outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
         }
 
         public BitmapCropTask(Context c, Uri inUri,
-                RectF cropBounds, int outWidth, int outHeight,
+                RectF cropBounds, int rotation, int outWidth, int outHeight,
                 boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
             mContext = c;
             mInUri = inUri;
-            init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
+            init(cropBounds, rotation,
+                    outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
         }
 
         public BitmapCropTask(Context c, Resources res, int inResId,
-                RectF cropBounds, int outWidth, int outHeight,
+                RectF cropBounds, int rotation, int outWidth, int outHeight,
                 boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
             mContext = c;
             mInResId = inResId;
             mResources = res;
-            init(cropBounds, outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
+            init(cropBounds, rotation,
+                    outWidth, outHeight, setWallpaper, saveCroppedBitmap, onEndRunnable);
         }
 
-        private void init(RectF cropBounds, int outWidth, int outHeight,
+        private void init(RectF cropBounds, int rotation, int outWidth, int outHeight,
                 boolean setWallpaper, boolean saveCroppedBitmap, Runnable onEndRunnable) {
             mCropBounds = cropBounds;
+            mRotation = rotation;
             mOutWidth = outWidth;
             mOutHeight = outHeight;
             mSetWallpaper = setWallpaper;
@@ -438,6 +511,29 @@
             if (mInStream != null) {
                 // Find crop bounds (scaled to original image size)
                 Rect roundedTrueCrop = new Rect();
+                Matrix rotateMatrix = new Matrix();
+                Matrix inverseRotateMatrix = new Matrix();
+                if (mRotation > 0) {
+                    rotateMatrix.setRotate(mRotation);
+                    inverseRotateMatrix.setRotate(-mRotation);
+
+                    mCropBounds.roundOut(roundedTrueCrop);
+                    mCropBounds = new RectF(roundedTrueCrop);
+
+                    Point bounds = getImageBounds();
+
+                    float[] rotatedBounds = new float[] { bounds.x, bounds.y };
+                    rotateMatrix.mapPoints(rotatedBounds);
+                    rotatedBounds[0] = Math.abs(rotatedBounds[0]);
+                    rotatedBounds[1] = Math.abs(rotatedBounds[1]);
+
+                    mCropBounds.offset(-rotatedBounds[0]/2, -rotatedBounds[1]/2);
+                    inverseRotateMatrix.mapRect(mCropBounds);
+                    mCropBounds.offset(bounds.x/2, bounds.y/2);
+
+                    regenerateInputStream();
+                }
+
                 mCropBounds.roundOut(roundedTrueCrop);
 
                 if (roundedTrueCrop.width() <= 0 || roundedTrueCrop.height() <= 0) {
@@ -481,6 +577,12 @@
                         fullSize = BitmapFactory.decodeStream(mInStream, null, options);
                     }
                     if (fullSize != null) {
+                        mCropBounds.left /= scaleDownSampleSize;
+                        mCropBounds.top /= scaleDownSampleSize;
+                        mCropBounds.bottom /= scaleDownSampleSize;
+                        mCropBounds.right /= scaleDownSampleSize;
+                        mCropBounds.roundOut(roundedTrueCrop);
+
                         crop = Bitmap.createBitmap(fullSize, roundedTrueCrop.left,
                                 roundedTrueCrop.top, roundedTrueCrop.width(),
                                 roundedTrueCrop.height());
@@ -492,29 +594,47 @@
                     failure = true;
                     return false;
                 }
-                if (mOutWidth > 0 && mOutHeight > 0) {
-                    Matrix m = new Matrix();
-                    RectF cropRect = new RectF(0, 0, crop.getWidth(), crop.getHeight());
-                    if (mRotation > 0) {
-                        m.setRotate(mRotation);
-                        m.mapRect(cropRect);
+                if (mOutWidth > 0 && mOutHeight > 0 || mRotation > 0) {
+                    float[] dimsAfter = new float[] { crop.getWidth(), crop.getHeight() };
+                    rotateMatrix.mapPoints(dimsAfter);
+                    dimsAfter[0] = Math.abs(dimsAfter[0]);
+                    dimsAfter[1] = Math.abs(dimsAfter[1]);
+
+                    if (!(mOutWidth > 0 && mOutHeight > 0)) {
+                        mOutWidth = Math.round(dimsAfter[0]);
+                        mOutHeight = Math.round(dimsAfter[1]);
                     }
+
+                    RectF cropRect = new RectF(0, 0, dimsAfter[0], dimsAfter[1]);
                     RectF returnRect = new RectF(0, 0, mOutWidth, mOutHeight);
-                    m.setRectToRect(cropRect, returnRect, Matrix.ScaleToFit.FILL);
-                    m.preRotate(mRotation);
+
+                    Matrix m = new Matrix();
+                    if (mRotation == 0) {
+                        m.setRectToRect(cropRect, returnRect, Matrix.ScaleToFit.FILL);
+                    } else {
+                        Matrix m1 = new Matrix();
+                        m1.setTranslate(-crop.getWidth() / 2f, -crop.getHeight() / 2f);
+                        Matrix m2 = new Matrix();
+                        m2.setRotate(mRotation);
+                        Matrix m3 = new Matrix();
+                        m3.setTranslate(dimsAfter[0] / 2f, dimsAfter[1] / 2f);
+                        Matrix m4 = new Matrix();
+                        m4.setRectToRect(cropRect, returnRect, Matrix.ScaleToFit.FILL);
+
+                        Matrix c1 = new Matrix();
+                        c1.setConcat(m2, m1);
+                        Matrix c2 = new Matrix();
+                        c2.setConcat(m4, m3);
+                        m.setConcat(c2, c1);
+                    }
+
                     Bitmap tmp = Bitmap.createBitmap((int) returnRect.width(),
                             (int) returnRect.height(), Bitmap.Config.ARGB_8888);
                     if (tmp != null) {
                         Canvas c = new Canvas(tmp);
-                        c.drawBitmap(crop, m, new Paint());
-                        crop = tmp;
-                    }
-                } else if (mRotation > 0) {
-                    Matrix m = new Matrix();
-                    m.setRotate(mRotation);
-                    Bitmap tmp = Bitmap.createBitmap(crop, 0, 0, crop.getWidth(),
-                            crop.getHeight(), m, true);
-                    if (tmp != null) {
+                        Paint p = new Paint();
+                        p.setFilterBitmap(true);
+                        c.drawBitmap(crop, m, p);
                         crop = tmp;
                     }
                 }
@@ -585,8 +705,7 @@
             final SharedPreferences sharedPrefs,
             WindowManager windowManager,
             final WallpaperManager wallpaperManager) {
-        final Point defaultWallpaperSize =
-                WallpaperCropActivity.getDefaultWallpaperSize(res, windowManager);
+        final Point defaultWallpaperSize = getDefaultWallpaperSize(res, windowManager);
 
         new Thread("suggestWallpaperDimension") {
             public void run() {
@@ -598,7 +717,6 @@
         }.start();
     }
 
-
     protected static RectF getMaxCropRect(
             int inWidth, int inHeight, int outWidth, int outHeight, boolean leftAligned) {
         RectF cropRect = new RectF();
diff --git a/src/com/android/launcher3/WallpaperPickerActivity.java b/src/com/android/launcher3/WallpaperPickerActivity.java
index ef94fe8..e71a26b 100644
--- a/src/com/android/launcher3/WallpaperPickerActivity.java
+++ b/src/com/android/launcher3/WallpaperPickerActivity.java
@@ -16,6 +16,7 @@
 
 package com.android.launcher3;
 
+import android.animation.Animator;
 import android.animation.LayoutTransition;
 import android.app.ActionBar;
 import android.app.Activity;
@@ -30,6 +31,7 @@
 import android.database.DataSetObserver;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
 import android.graphics.Point;
 import android.graphics.PorterDuff;
 import android.graphics.Rect;
@@ -50,18 +52,26 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.AccelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
 import android.widget.BaseAdapter;
 import android.widget.FrameLayout;
+import android.widget.HorizontalScrollView;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ListAdapter;
 
+import com.android.gallery3d.exif.ExifInterface;
 import com.android.photos.BitmapRegionTileSource;
 
+import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 
 public class WallpaperPickerActivity extends WallpaperCropActivity {
@@ -77,6 +87,7 @@
     private OnClickListener mThumbnailOnClickListener;
 
     private LinearLayout mWallpapersView;
+    private View mWallpaperStrip;
 
     private ActionMode.Callback mActionModeCallback;
     private ActionMode mActionMode;
@@ -88,10 +99,20 @@
     private WallpaperInfo mLiveWallpaperInfoOnPickerLaunch;
 
     public static abstract class WallpaperTileInfo {
+        protected View mView;
+        public void setView(View v) {
+            mView = v;
+        }
         public void onClick(WallpaperPickerActivity a) {}
         public void onSave(WallpaperPickerActivity a) {}
         public void onDelete(WallpaperPickerActivity a) {}
         public boolean isSelectable() { return false; }
+        public boolean isNamelessWallpaper() { return false; }
+        public void onIndexUpdated(CharSequence label) {
+            if (isNamelessWallpaper()) {
+                mView.setContentDescription(label);
+            }
+        }
     }
 
     public static class PickImageInfo extends WallpaperTileInfo {
@@ -111,8 +132,8 @@
         @Override
         public void onClick(WallpaperPickerActivity a) {
             CropView v = a.getCropView();
-            v.setTileSource(new BitmapRegionTileSource(
-                    a, mUri, 1024, 0), null);
+            int rotation = WallpaperCropActivity.getRotationFromExif(a, mUri);
+            v.setTileSource(new BitmapRegionTileSource(a, mUri, 1024, rotation), null);
             v.setTouchEnabled(true);
         }
         @Override
@@ -121,8 +142,9 @@
             OnBitmapCroppedHandler h = new OnBitmapCroppedHandler() {
                 public void onBitmapCropped(byte[] imageBytes) {
                     Point thumbSize = getDefaultThumbnailSize(a.getResources());
-                    Bitmap thumb =
-                            createThumbnail(thumbSize, null, null, imageBytes, null, 0, true);
+                    // rotation is set to 0 since imageBytes has already been correctly rotated
+                    Bitmap thumb = createThumbnail(
+                            thumbSize, null, null, imageBytes, null, 0, 0, true);
                     a.getSavedImages().writeImage(thumb, imageBytes);
                 }
             };
@@ -132,6 +154,10 @@
         public boolean isSelectable() {
             return true;
         }
+        @Override
+        public boolean isNamelessWallpaper() {
+            return true;
+        }
     }
 
     public static class ResourceWallpaperInfo extends WallpaperTileInfo {
@@ -146,8 +172,9 @@
         }
         @Override
         public void onClick(WallpaperPickerActivity a) {
+            int rotation = WallpaperCropActivity.getRotationFromExif(mResources, mResId);
             BitmapRegionTileSource source = new BitmapRegionTileSource(
-                    mResources, a, mResId, 1024, 0);
+                    mResources, a, mResId, 1024, rotation);
             CropView v = a.getCropView();
             v.setTileSource(source, null);
             Point wallpaperSize = WallpaperCropActivity.getDefaultWallpaperSize(
@@ -167,6 +194,14 @@
         public boolean isSelectable() {
             return true;
         }
+        @Override
+        public boolean isNamelessWallpaper() {
+            return true;
+        }
+    }
+
+    public void setWallpaperStripYOffset(float offset) {
+        mWallpaperStrip.setPadding(0, 0, 0, (int) offset);
     }
 
     // called by onCreate; this is subclassed to overwrite WallpaperCropActivity
@@ -174,7 +209,7 @@
         setContentView(R.layout.wallpaper_picker);
 
         mCropView = (CropView) findViewById(R.id.cropView);
-        final View wallpaperStrip = findViewById(R.id.wallpaper_strip);
+        mWallpaperStrip = findViewById(R.id.wallpaper_strip);
         mCropView.setTouchCallback(new CropView.TouchCallback() {
             LauncherViewPropertyAnimator mAnim;
             @Override
@@ -182,12 +217,21 @@
                 if (mAnim != null) {
                     mAnim.cancel();
                 }
-                if (wallpaperStrip.getTranslationY() == 0) {
+                if (mWallpaperStrip.getAlpha() == 1f) {
                     mIgnoreNextTap = true;
                 }
-                mAnim = new LauncherViewPropertyAnimator(wallpaperStrip);
-                mAnim.translationY(wallpaperStrip.getHeight()).alpha(0f)
-                        .setInterpolator(new DecelerateInterpolator(0.75f));
+                mAnim = new LauncherViewPropertyAnimator(mWallpaperStrip);
+                mAnim.alpha(0f)
+                     .setDuration(150)
+                     .addListener(new Animator.AnimatorListener() {
+                         public void onAnimationStart(Animator animator) { }
+                         public void onAnimationEnd(Animator animator) {
+                             mWallpaperStrip.setVisibility(View.INVISIBLE);
+                         }
+                         public void onAnimationCancel(Animator animator) { }
+                         public void onAnimationRepeat(Animator animator) { }
+                     });
+                mAnim.setInterpolator(new AccelerateInterpolator(0.75f));
                 mAnim.start();
             }
             @Override
@@ -202,9 +246,11 @@
                     if (mAnim != null) {
                         mAnim.cancel();
                     }
-                    mAnim = new LauncherViewPropertyAnimator(wallpaperStrip);
-                    mAnim.translationY(0).alpha(1f)
-                            .setInterpolator(new DecelerateInterpolator(0.75f));
+                    mWallpaperStrip.setVisibility(View.VISIBLE);
+                    mAnim = new LauncherViewPropertyAnimator(mWallpaperStrip);
+                    mAnim.alpha(1f)
+                         .setDuration(150)
+                         .setInterpolator(new DecelerateInterpolator(0.75f));
                     mAnim.start();
                 }
             }
@@ -227,6 +273,10 @@
                     }
                     mSelectedThumb = v;
                     v.setSelected(true);
+                    // TODO: Remove this once the accessibility framework and
+                    // services have better support for selection state.
+                    v.announceForAccessibility(
+                            getString(R.string.announce_selection, v.getContentDescription()));
                 }
                 info.onClick(WallpaperPickerActivity.this);
             }
@@ -270,6 +320,8 @@
             public void onChanged() {
                 liveWallpapersView.removeAllViews();
                 populateWallpapersFromAdapter(liveWallpapersView, a, false, false);
+                initializeScrollForRtl();
+                updateTileIndices();
             }
         });
 
@@ -282,24 +334,32 @@
 
         // Add a tile for the Gallery
         LinearLayout masterWallpaperList = (LinearLayout) findViewById(R.id.master_wallpaper_list);
-        FrameLayout galleryThumbnail = (FrameLayout) getLayoutInflater().
-                inflate(R.layout.wallpaper_picker_gallery_item, masterWallpaperList, false);
-        setWallpaperItemPaddingToZero(galleryThumbnail);
-        masterWallpaperList.addView(galleryThumbnail, 0);
+        FrameLayout pickImageTile = (FrameLayout) getLayoutInflater().
+                inflate(R.layout.wallpaper_picker_image_picker_item, masterWallpaperList, false);
+        setWallpaperItemPaddingToZero(pickImageTile);
+        masterWallpaperList.addView(pickImageTile, 0);
 
         // Make its background the last photo taken on external storage
         Bitmap lastPhoto = getThumbnailOfLastPhoto();
         if (lastPhoto != null) {
             ImageView galleryThumbnailBg =
-                    (ImageView) galleryThumbnail.findViewById(R.id.wallpaper_image);
+                    (ImageView) pickImageTile.findViewById(R.id.wallpaper_image);
             galleryThumbnailBg.setImageBitmap(getThumbnailOfLastPhoto());
             int colorOverlay = getResources().getColor(R.color.wallpaper_picker_translucent_gray);
             galleryThumbnailBg.setColorFilter(colorOverlay, PorterDuff.Mode.SRC_ATOP);
+
         }
 
         PickImageInfo pickImageInfo = new PickImageInfo();
-        galleryThumbnail.setTag(pickImageInfo);
-        galleryThumbnail.setOnClickListener(mThumbnailOnClickListener);
+        pickImageTile.setTag(pickImageInfo);
+        pickImageInfo.setView(pickImageTile);
+        pickImageTile.setOnClickListener(mThumbnailOnClickListener);
+        pickImageInfo.setView(pickImageTile);
+
+        updateTileIndices();
+
+        // Update the scroll for RTL
+        initializeScrollForRtl();
 
         // Create smooth layout transitions for when items are deleted
         final LayoutTransition transitioner = new LayoutTransition();
@@ -380,6 +440,7 @@
                     for (View v : viewsToRemove) {
                         mWallpapersView.removeView(v);
                     }
+                    updateTileIndices();
                     mode.finish(); // Action picked, so close the CAB
                     return true;
                 } else {
@@ -401,6 +462,27 @@
         };
     }
 
+    private void initializeScrollForRtl() {
+        final HorizontalScrollView scroll =
+                (HorizontalScrollView) findViewById(R.id.wallpaper_scroll_container);
+
+        if (scroll.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
+            final ViewTreeObserver observer = scroll.getViewTreeObserver();
+            observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
+                public void onGlobalLayout() {
+                    LinearLayout masterWallpaperList =
+                            (LinearLayout) findViewById(R.id.master_wallpaper_list);
+                    scroll.scrollTo(masterWallpaperList.getWidth(), 0);
+                    scroll.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                }
+            });
+        }
+    }
+
+    public boolean enableRotation() {
+        return super.enableRotation() || Launcher.sForceEnableRotation;
+    }
+
     protected Bitmap getThumbnailOfLastPhoto() {
         Cursor cursor = MediaStore.Images.Media.query(getContentResolver(),
                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
@@ -419,10 +501,10 @@
 
     protected void onStop() {
         super.onStop();
-        final View wallpaperStrip = findViewById(R.id.wallpaper_strip);
-        if (wallpaperStrip.getTranslationY() > 0) {
-            wallpaperStrip.setTranslationY(0);
-            wallpaperStrip.setAlpha(1f);
+        mWallpaperStrip = findViewById(R.id.wallpaper_strip);
+        if (mWallpaperStrip.getAlpha() < 1f) {
+            mWallpaperStrip.setAlpha(1f);
+            mWallpaperStrip.setVisibility(View.VISIBLE);
         }
     }
 
@@ -442,7 +524,9 @@
         for (int i = 0; i < adapter.getCount(); i++) {
             FrameLayout thumbnail = (FrameLayout) adapter.getView(i, null, parent);
             parent.addView(thumbnail, i);
-            thumbnail.setTag(adapter.getItem(i));
+            WallpaperTileInfo info = (WallpaperTileInfo) adapter.getItem(i);
+            thumbnail.setTag(info);
+            info.setView(thumbnail);
             if (addLongPressHandler) {
                 addLongPressHandler(thumbnail);
             }
@@ -453,6 +537,47 @@
         }
     }
 
+    private void updateTileIndices() {
+        LinearLayout masterWallpaperList = (LinearLayout) findViewById(R.id.master_wallpaper_list);
+        final int childCount = masterWallpaperList.getChildCount();
+        final Resources res = getResources();
+
+        // Do two passes; the first pass gets the total number of tiles
+        int numTiles = 0;
+        for (int passNum = 0; passNum < 2; passNum++) {
+            int tileIndex = 0;
+            for (int i = 0; i < childCount; i++) {
+                View child = masterWallpaperList.getChildAt(i);
+                LinearLayout subList;
+
+                int subListStart;
+                int subListEnd;
+                if (child.getTag() instanceof WallpaperTileInfo) {
+                    subList = masterWallpaperList;
+                    subListStart = i;
+                    subListEnd = i + 1;
+                } else { // if (child instanceof LinearLayout) {
+                    subList = (LinearLayout) child;
+                    subListStart = 0;
+                    subListEnd = subList.getChildCount();
+                }
+
+                for (int j = subListStart; j < subListEnd; j++) {
+                    WallpaperTileInfo info = (WallpaperTileInfo) subList.getChildAt(j).getTag();
+                    if (info.isNamelessWallpaper()) {
+                        if (passNum == 0) {
+                            numTiles++;
+                        } else {
+                            CharSequence label = res.getString(
+                                    R.string.wallpaper_accessibility_name, ++tileIndex, numTiles);
+                            info.onIndexUpdated(label);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     private static Point getDefaultThumbnailSize(Resources res) {
         return new Point(res.getDimensionPixelSize(R.dimen.wallpaperThumbnailWidth),
                 res.getDimensionPixelSize(R.dimen.wallpaperThumbnailHeight));
@@ -460,26 +585,35 @@
     }
 
     private static Bitmap createThumbnail(Point size, Context context, Uri uri, byte[] imageBytes,
-            Resources res, int resId, boolean leftAligned) {
+            Resources res, int resId, int rotation, boolean leftAligned) {
         int width = size.x;
         int height = size.y;
 
         BitmapCropTask cropTask;
         if (uri != null) {
-            cropTask = new BitmapCropTask(context, uri, null, width, height, false, true, null);
+            cropTask = new BitmapCropTask(
+                    context, uri, null, rotation, width, height, false, true, null);
         } else if (imageBytes != null) {
-            cropTask = new BitmapCropTask(imageBytes, null, width, height, false, true, null);
+            cropTask = new BitmapCropTask(
+                    imageBytes, null, rotation, width, height, false, true, null);
         }  else {
-            cropTask =
-                    new BitmapCropTask(context, res, resId, null, width, height, false, true, null);
+            cropTask = new BitmapCropTask(
+                    context, res, resId, null, rotation, width, height, false, true, null);
         }
         Point bounds = cropTask.getImageBounds();
         if (bounds == null || bounds.x == 0 || bounds.y == 0) {
             return null;
         }
 
+        Matrix rotateMatrix = new Matrix();
+        rotateMatrix.setRotate(rotation);
+        float[] rotatedBounds = new float[] { bounds.x, bounds.y };
+        rotateMatrix.mapPoints(rotatedBounds);
+        rotatedBounds[0] = Math.abs(rotatedBounds[0]);
+        rotatedBounds[1] = Math.abs(rotatedBounds[1]);
+
         RectF cropRect = WallpaperCropActivity.getMaxCropRect(
-                bounds.x, bounds.y, width, height, leftAligned);
+                (int) rotatedBounds[0], (int) rotatedBounds[1], width, height, leftAligned);
         cropTask.setCropBounds(cropRect);
 
         if (cropTask.cropBitmap()) {
@@ -499,7 +633,8 @@
         // Load the thumbnail
         ImageView image = (ImageView) pickedImageThumbnail.findViewById(R.id.wallpaper_image);
         Point defaultSize = getDefaultThumbnailSize(this.getResources());
-        Bitmap thumb = createThumbnail(defaultSize, this, uri, null, null, 0, false);
+        int rotation = WallpaperCropActivity.getRotationFromExif(this, uri);
+        Bitmap thumb = createThumbnail(defaultSize, this, uri, null, null, 0, rotation, false);
         if (thumb != null) {
             image.setImageBitmap(thumb);
             Drawable thumbDrawable = image.getDrawable();
@@ -511,14 +646,19 @@
 
         UriWallpaperInfo info = new UriWallpaperInfo(uri);
         pickedImageThumbnail.setTag(info);
+        info.setView(pickedImageThumbnail);
+        addLongPressHandler(pickedImageThumbnail);
+        updateTileIndices();
         pickedImageThumbnail.setOnClickListener(mThumbnailOnClickListener);
         mThumbnailOnClickListener.onClick(pickedImageThumbnail);
     }
 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == IMAGE_PICK && resultCode == RESULT_OK) {
-            Uri uri = data.getData();
-            addTemporaryWallpaperTile(uri);
+            if (data != null && data.getData() != null) {
+                Uri uri = data.getData();
+                addTemporaryWallpaperTile(uri);
+            }
         } else if (requestCode == PICK_WALLPAPER_THIRD_PARTY_ACTIVITY) {
             setResult(RESULT_OK);
             finish();
@@ -578,8 +718,11 @@
             thumb = BitmapFactory.decodeFile(defaultThumbFile.getAbsolutePath());
             defaultWallpaperExists = true;
         } else {
-            Point defaultThumbSize = getDefaultThumbnailSize(getResources());
-            thumb = createThumbnail(defaultThumbSize, this, null, null, sysRes, resId, false);
+            Resources res = getResources();
+            Point defaultThumbSize = getDefaultThumbnailSize(res);
+            int rotation = WallpaperCropActivity.getRotationFromExif(res, resId);
+            thumb = createThumbnail(
+                    defaultThumbSize, this, null, null, sysRes, resId, rotation, false);
             if (thumb != null) {
                 try {
                     defaultThumbFile.createNewFile();
diff --git a/src/com/android/launcher3/WallpaperRootView.java b/src/com/android/launcher3/WallpaperRootView.java
new file mode 100644
index 0000000..ceaa043
--- /dev/null
+++ b/src/com/android/launcher3/WallpaperRootView.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.widget.RelativeLayout;
+
+public class WallpaperRootView extends RelativeLayout {
+    private final WallpaperPickerActivity a;
+    public WallpaperRootView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        a = (WallpaperPickerActivity) context;
+    }
+    public WallpaperRootView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        a = (WallpaperPickerActivity) context;
+    }
+
+    protected boolean fitSystemWindows(Rect insets) {
+        a.setWallpaperStripYOffset(insets.bottom);
+        return true;
+    }
+}
diff --git a/src/com/android/launcher3/WidgetPreviewLoader.java b/src/com/android/launcher3/WidgetPreviewLoader.java
index 1910ab7..07b4f6f 100644
--- a/src/com/android/launcher3/WidgetPreviewLoader.java
+++ b/src/com/android/launcher3/WidgetPreviewLoader.java
@@ -105,7 +105,6 @@
     private int mPreviewBitmapHeight;
     private String mSize;
     private Context mContext;
-    private Launcher mLauncher;
     private PackageManager mPackageManager;
     private PagedViewCellLayout mWidgetSpacingLayout;
 
@@ -137,11 +136,11 @@
         sInvalidPackages = new HashSet<String>();
     }
 
-    public WidgetPreviewLoader(Launcher launcher) {
+    public WidgetPreviewLoader(Context context) {
         LauncherAppState app = LauncherAppState.getInstance();
         DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
 
-        mContext = mLauncher = launcher;
+        mContext = context;
         mPackageManager = mContext.getPackageManager();
         mAppIconSize = grid.iconSizePx;
         mIconCache = app.getIconCache();
@@ -417,7 +416,7 @@
     }
 
     public Bitmap generateWidgetPreview(AppWidgetProviderInfo info, Bitmap preview) {
-        int[] cellSpans = Launcher.getSpanForWidget(mLauncher, info);
+        int[] cellSpans = Launcher.getSpanForWidget(mContext, info);
         int maxWidth = maxWidthForWidgetPreview(cellSpans[0]);
         int maxHeight = maxHeightForWidgetPreview(cellSpans[1]);
         return generateWidgetPreview(info.provider, info.previewImage, info.icon,
@@ -464,12 +463,12 @@
             if (cellVSpan < 1) cellVSpan = 1;
 
             BitmapDrawable previewDrawable = (BitmapDrawable) mContext.getResources()
-                    .getDrawable(R.drawable.widget_preview_tile);
+                    .getDrawable(R.drawable.widget_tile);
             final int previewDrawableWidth = previewDrawable
                     .getIntrinsicWidth();
             final int previewDrawableHeight = previewDrawable
                     .getIntrinsicHeight();
-            previewWidth = previewDrawableWidth * cellHSpan; // subtract 2 dips
+            previewWidth = previewDrawableWidth * cellHSpan;
             previewHeight = previewDrawableHeight * cellVSpan;
 
             defaultPreview = Bitmap.createBitmap(previewWidth, previewHeight,
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index baddc2d..f6416c8 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -17,6 +17,7 @@
 package com.android.launcher3;
 
 import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.AnimatorSet;
 import android.animation.LayoutTransition;
@@ -44,6 +45,7 @@
 import android.net.Uri;
 import android.os.IBinder;
 import android.os.Parcelable;
+import android.support.v4.view.ViewCompat;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.SparseArray;
@@ -52,6 +54,10 @@
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.View.OnClickListener;
+import android.view.accessibility.AccessibilityEvent;
+import android.view.accessibility.AccessibilityManager;
+import android.view.accessibility.AccessibilityNodeInfo;
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.Interpolator;
 import android.widget.TextView;
@@ -113,6 +119,7 @@
     private int mDefaultPage;
 
     private ShortcutAndWidgetContainer mDragSourceInternal;
+    private static boolean sAccessibilityEnabled;
 
     // The screen id used for the empty screen always present to the right.
     private final static long EXTRA_EMPTY_SCREEN_ID = -201;
@@ -139,6 +146,7 @@
     CustomContentCallbacks mCustomContentCallbacks;
     boolean mCustomContentShowing;
     private float mLastCustomContentScrollProgress = -1f;
+    private String mCustomContentDescription = "";
 
     /**
      * The CellLayout that is currently being dragged over
@@ -318,11 +326,7 @@
 
         // Disable multitouch across the workspace/all apps/customize tray
         setMotionEventSplittingEnabled(true);
-
-        // Unless otherwise specified this view is important for accessibility.
-        if (getImportantForAccessibility() == View.IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
-            setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
-        }
+        setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
     }
 
     @Override
@@ -336,7 +340,8 @@
             ItemInfo itemInfo, boolean springLoaded) {
         int[] size = new int[2];
         if (getChildCount() > 0) {
-            CellLayout cl = (CellLayout) mLauncher.getWorkspace().getChildAt(0);
+            // Use the first non-custom page to estimate the child position
+            CellLayout cl = (CellLayout) getChildAt(numCustomPages());
             Rect r = estimateItemPosition(cl, itemInfo, 0, 0, hSpan, vSpan);
             size[0] = r.width();
             size[1] = r.height();
@@ -437,6 +442,13 @@
         setLayoutTransition(mLayoutTransition);
     }
 
+    void enableLayoutTransitions() {
+        setLayoutTransition(mLayoutTransition);
+    }
+    void disableLayoutTransitions() {
+        setLayoutTransition(null);
+    }
+
     @Override
     protected int getScrollMode() {
         return SmoothPagedView.X_LARGE_MODE;
@@ -450,16 +462,15 @@
         CellLayout cl = ((CellLayout) child);
         cl.setOnInterceptTouchListener(this);
         cl.setClickable(true);
-        cl.setContentDescription(getContext().getString(
-                R.string.workspace_description_format, getChildCount()));
-
+        cl.setImportantForAccessibility(ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO);
         super.onChildViewAdded(parent, child);
     }
 
     protected boolean shouldDrawChild(View child) {
         final CellLayout cl = (CellLayout) child;
         return super.shouldDrawChild(child) &&
-            (cl.getShortcutsAndWidgets().getAlpha() > 0 ||
+            (mIsSwitchingState ||
+             cl.getShortcutsAndWidgets().getAlpha() > 0 ||
              cl.getBackgroundAlpha() > 0);
     }
 
@@ -485,10 +496,24 @@
     }
 
     public void removeAllWorkspaceScreens() {
+        // Disable all layout transitions before removing all pages to ensure that we don't get the
+        // transition animations competing with us changing the scroll when we add pages or the
+        // custom content screen
+        disableLayoutTransitions();
+
+        // Since we increment the current page when we call addCustomContentPage via bindScreens
+        // (and other places), we need to adjust the current page back when we clear the pages
+        if (hasCustomContent()) {
+            removeCustomContentPage();
+        }
+
         // Remove the pages and clear the screen models
         removeAllViews();
         mScreenOrder.clear();
         mWorkspaceScreens.clear();
+
+        // Re-enable the layout transitions
+        enableLayoutTransitions();
     }
 
     public long insertNewWorkspaceScreenBeforeEmptyScreen(long screenId) {
@@ -536,7 +561,14 @@
 
         // Ensure that the current page and default page are maintained.
         mDefaultPage = mOriginalDefaultPage + 1;
-        setCurrentPage(getCurrentPage() + 1);
+
+        // Update the custom content hint
+        mLauncher.updateCustomContentHintVisibility();
+        if (mRestorePage != INVALID_RESTORE_PAGE) {
+            mRestorePage = mRestorePage + 1;
+        } else {
+            setCurrentPage(getCurrentPage() + 1);
+        }
     }
 
     public void removeCustomContentPage() {
@@ -548,14 +580,28 @@
         mWorkspaceScreens.remove(CUSTOM_CONTENT_SCREEN_ID);
         mScreenOrder.remove(CUSTOM_CONTENT_SCREEN_ID);
         removeView(customScreen);
+
+        if (mCustomContentCallbacks != null) {
+            mCustomContentCallbacks.onScrollProgressChanged(0);
+            mCustomContentCallbacks.onHide();
+        }
+
         mCustomContentCallbacks = null;
 
         // Ensure that the current page and default page are maintained.
         mDefaultPage = mOriginalDefaultPage - 1;
-        setCurrentPage(getCurrentPage() - 1);
+
+        // Update the custom content hint
+        mLauncher.updateCustomContentHintVisibility();
+        if (mRestorePage != INVALID_RESTORE_PAGE) {
+            mRestorePage = mRestorePage - 1;
+        } else {
+            setCurrentPage(getCurrentPage() - 1);
+        }
     }
 
-    public void addToCustomContentPage(View customContent, CustomContentCallbacks callbacks) {
+    public void addToCustomContentPage(View customContent, CustomContentCallbacks callbacks,
+            String description) {
         if (getPageIndexForScreenId(CUSTOM_CONTENT_SCREEN_ID) < 0) {
             throw new RuntimeException("Expected custom content screen to exist");
         }
@@ -570,7 +616,9 @@
         if (customContent instanceof Insettable) {
             ((Insettable)customContent).setInsets(mInsets);
         }
+        customScreen.removeAllViews();
         customScreen.addViewToCellLayout(customContent, 0, 0, lp, true);
+        mCustomContentDescription = description;
 
         mCustomContentCallbacks = callbacks;
     }
@@ -617,7 +665,7 @@
 
     public boolean hasExtraEmptyScreen() {
         int nScreens = getChildCount();
-        nScreens = hasCustomContent() ? nScreens - 1 : nScreens;
+        nScreens = nScreens - numCustomPages();
         return mWorkspaceScreens.containsKey(EXTRA_EMPTY_SCREEN_ID) && nScreens > 1;
     }
 
@@ -642,7 +690,6 @@
         return newId;
     }
 
-
     public CellLayout getScreenWithId(long screenId) {
         CellLayout layout = mWorkspaceScreens.get(screenId);
         return layout;
@@ -691,7 +738,7 @@
 
         // We enforce at least one page to add new items to. In the case that we remove the last
         // such screen, we convert the last screen to the empty screen
-        int minScreens = hasCustomContent() ? 2 : 1;
+        int minScreens = 1 + numCustomPages();
 
         int pageShift = 0;
         for (Long id: removeScreens) {
@@ -853,13 +900,6 @@
 
     protected void onWindowVisibilityChanged (int visibility) {
         mLauncher.onWindowVisibilityChanged(visibility);
-        if (mCustomContentShowing && mCustomContentCallbacks != null) {
-            if (visibility == View.VISIBLE) {
-                mCustomContentCallbacks.onShow();
-            } else if (visibility == View.GONE) {
-                mCustomContentCallbacks.onHide();
-            }
-        }
     }
 
     @Override
@@ -1024,29 +1064,36 @@
             stripEmptyScreens();
             mStripScreensOnPageStopMoving = false;
         }
-
-        if (hasCustomContent() && getNextPage() == 0 && !mCustomContentShowing) {
-            mCustomContentShowing = true;
-            if (mCustomContentCallbacks != null) {
-                mCustomContentCallbacks.onShow();
-                mCustomContentShowTime = System.currentTimeMillis();
-                mLauncher.setVoiceButtonProxyVisible(false);
-            }
-        } else if (hasCustomContent() && getNextPage() != 0 && mCustomContentShowing) {
-            mCustomContentShowing = false;
-            if (mCustomContentCallbacks != null) {
-                mCustomContentCallbacks.onHide();
-                mLauncher.resetQSBScroll();
-                mLauncher.setVoiceButtonProxyVisible(true);
-            }
-        }
     }
 
     @Override
     protected void notifyPageSwitchListener() {
         super.notifyPageSwitchListener();
         Launcher.setScreen(mCurrentPage);
-    };
+
+        if (hasCustomContent() && getNextPage() == 0 && !mCustomContentShowing) {
+            mCustomContentShowing = true;
+            if (mCustomContentCallbacks != null) {
+                mCustomContentCallbacks.onShow();
+                mCustomContentShowTime = System.currentTimeMillis();
+                mLauncher.updateVoiceButtonProxyVisible(false);
+            }
+        } else if (hasCustomContent() && getNextPage() != 0 && mCustomContentShowing) {
+            mCustomContentShowing = false;
+            if (mCustomContentCallbacks != null) {
+                mCustomContentCallbacks.onHide();
+                mLauncher.resetQSBScroll();
+                mLauncher.updateVoiceButtonProxyVisible(false);
+            }
+        }
+        if (getPageIndicator() != null) {
+            getPageIndicator().setContentDescription(getPageIndicatorDescription());
+        }
+    }
+
+    protected CustomContentCallbacks getCustomContentCallbacks() {
+        return mCustomContentCallbacks;
+    }
 
     protected void setWallpaperDimension() {
         String spKey = WallpaperCropActivity.getSharedPreferencesKey();
@@ -1070,7 +1117,6 @@
     class WallpaperOffsetInterpolator implements Choreographer.FrameCallback {
         float mFinalOffset = 0.0f;
         float mCurrentOffset = 0.5f; // to force an initial update
-        //long mLastWallpaperOffsetUpdateTime;
         boolean mWaitingForUpdate;
         Choreographer mChoreographer;
         Interpolator mInterpolator;
@@ -1079,7 +1125,7 @@
         float mAnimationStartOffset;
         private final int ANIMATION_DURATION = 250;
         // Don't use all the wallpaper for parallax until you have at least this many pages
-        private final int MIN_PARALLAX_PAGE_SPAN = 4;
+        private final int MIN_PARALLAX_PAGE_SPAN = 3;
         int mNumScreens;
 
         public WallpaperOffsetInterpolator() {
@@ -1135,10 +1181,15 @@
             }
 
             // Exclude the leftmost page
-            final int firstIndex = isLayoutRtl() ? getChildCount() - 2 : 1;
+            int emptyExtraPages = numEmptyScreensToIgnore();
+            int firstIndex = numCustomPages();
             // Exclude the last extra empty screen (if we have > MIN_PARALLAX_PAGE_SPAN pages)
-            int extra = numExtraScreensToIgnore();
-            final int lastIndex = isLayoutRtl() ? 0 + extra : getChildCount() - 1 - extra;
+            int lastIndex = getChildCount() - 1 - emptyExtraPages;
+            if (isLayoutRtl()) {
+                int temp = firstIndex;
+                firstIndex = lastIndex;
+                lastIndex = temp;
+            }
 
             int firstPageScrollX = getScrollForPage(firstIndex);
             int scrollRange = getScrollForPage(lastIndex) - firstPageScrollX;
@@ -1146,27 +1197,36 @@
                 return 0;
             } else {
                 // TODO: do different behavior if it's  a live wallpaper?
-                float offset = Math.min(1, (getScrollX() - firstPageScrollX) / (float) scrollRange);
+                // Sometimes the left parameter of the pages is animated during a layout transition;
+                // this parameter offsets it to keep the wallpaper from animating as well
+                int offsetForLayoutTransitionAnimation = isLayoutRtl() ?
+                        getPageAt(getChildCount() - 1).getLeft() - getFirstChildLeft() : 0;
+                int adjustedScroll =
+                        getScrollX() - firstPageScrollX - offsetForLayoutTransitionAnimation;
+                float offset = Math.min(1, adjustedScroll / (float) scrollRange);
                 offset = Math.max(0, offset);
                 // Don't use up all the wallpaper parallax until you have at least
                 // MIN_PARALLAX_PAGE_SPAN pages
-                int numScrollingPages = getNumScreensExcludingExtraEmptyScreenAndLeftmost();
-                int parallaxPageSpan = Math.max(MIN_PARALLAX_PAGE_SPAN, numScrollingPages) - 1;
-                return offset * (numScrollingPages - 1) / parallaxPageSpan;
+                int numScrollingPages = getNumScreensExcludingEmptyAndCustom();
+                int parallaxPageSpan = Math.max(MIN_PARALLAX_PAGE_SPAN, numScrollingPages - 1);
+                // On RTL devices, push the wallpaper offset to the right if we don't have enough
+                // pages (ie if numScrollingPages < MIN_PARALLAX_PAGE_SPAN)
+                int padding = isLayoutRtl() ? parallaxPageSpan - numScrollingPages + 1 : 0;
+                return offset * (padding + numScrollingPages - 1) / parallaxPageSpan;
             }
         }
 
-        private int numExtraScreensToIgnore() {
-            int numScrollingPages = getChildCount() - 1;
-            if (numScrollingPages > MIN_PARALLAX_PAGE_SPAN && hasExtraEmptyScreen()) {
+        private int numEmptyScreensToIgnore() {
+            int numScrollingPages = getChildCount() - numCustomPages();
+            if (numScrollingPages >= MIN_PARALLAX_PAGE_SPAN && hasExtraEmptyScreen()) {
                 return 1;
             } else {
                 return 0;
             }
         }
 
-        private int getNumScreensExcludingExtraEmptyScreenAndLeftmost() {
-            int numScrollingPages = getChildCount() - 1 - numExtraScreensToIgnore();
+        private int getNumScreensExcludingEmptyAndCustom() {
+            int numScrollingPages = getChildCount() - numEmptyScreensToIgnore() - numCustomPages();
             return numScrollingPages;
         }
 
@@ -1198,12 +1258,12 @@
         public void setFinalX(float x) {
             scheduleUpdate();
             mFinalOffset = Math.max(0f, Math.min(x, 1.0f));
-            if (getNumScreensExcludingExtraEmptyScreenAndLeftmost() != mNumScreens) {
+            if (getNumScreensExcludingEmptyAndCustom() != mNumScreens) {
                 if (mNumScreens > 0) {
                     // Don't animate if we're going from 0 screens
                     animateToFinal();
                 }
-                mNumScreens = getNumScreensExcludingExtraEmptyScreenAndLeftmost();
+                mNumScreens = getNumScreensExcludingEmptyAndCustom();
             }
         }
 
@@ -1357,6 +1417,10 @@
         return (mScreenOrder.size() > 0 && mScreenOrder.get(0) == CUSTOM_CONTENT_SCREEN_ID);
     }
 
+    public int numCustomPages() {
+        return hasCustomContent() ? 1 : 0;
+    }
+
     public boolean isOnOrMovingToCustomContent() {
         return hasCustomContent() && getNextPage() == 0;
     }
@@ -1366,10 +1430,12 @@
         float progress = 0;
         if (hasCustomContent()) {
             int index = mScreenOrder.indexOf(CUSTOM_CONTENT_SCREEN_ID);
-            int scrollDelta = getScrollForPage(index + 1) - getScrollX();
-            translationX = scrollDelta;
-            progress = (1.0f * scrollDelta) /
-                    (getScrollForPage(index + 1) - getScrollForPage(index));
+
+            int scrollDelta = getScrollX() - getScrollForPage(index) -
+                    getLayoutTransitionOffsetForPage(index);
+            float scrollRange = getScrollForPage(index + 1) - getScrollForPage(index);
+            translationX = scrollRange - scrollDelta;
+            progress = (scrollRange - scrollDelta) / scrollRange;
 
             if (isLayoutRtl()) {
                 translationX = Math.min(0, translationX);
@@ -1380,6 +1446,12 @@
         }
 
         if (Float.compare(progress, mLastCustomContentScrollProgress) == 0) return;
+
+        CellLayout cc = mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID);
+        if (progress > 0 && cc.getVisibility() != VISIBLE && !isSmall()) {
+            cc.setVisibility(VISIBLE);
+        }
+
         mLastCustomContentScrollProgress = progress;
 
         setBackgroundAlpha(progress * 0.8f);
@@ -1398,6 +1470,22 @@
     }
 
     @Override
+    protected OnClickListener getPageIndicatorClickListener() {
+        AccessibilityManager am = (AccessibilityManager)
+                getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+        if (!am.isTouchExplorationEnabled()) {
+            return null;
+        }
+        OnClickListener listener = new OnClickListener() {
+            @Override
+            public void onClick(View arg0) {
+                enterOverviewMode();
+            }
+        };
+        return listener;
+    }
+
+    @Override
     protected void screenScrolled(int screenCenter) {
         final boolean isRtl = isLayoutRtl();
         super.screenScrolled(screenCenter);
@@ -1461,6 +1549,20 @@
         mWindowToken = null;
     }
 
+    protected void onResume() {
+        if (getPageIndicator() != null) {
+            // In case accessibility state has changed, we need to perform this on every
+            // attach to window
+            OnClickListener listener = getPageIndicatorClickListener();
+            if (listener != null) {
+                getPageIndicator().setOnClickListener(listener);
+            }
+        }
+        AccessibilityManager am = (AccessibilityManager)
+                getContext().getSystemService(Context.ACCESSIBILITY_SERVICE);
+        sAccessibilityEnabled = am.isEnabled();
+    }
+
     @Override
     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
         if (mFirstLayout && mCurrentPage >= 0 && mCurrentPage < getChildCount()) {
@@ -1570,7 +1672,7 @@
             } else {
                 for (int i = 0; i < getPageCount(); i++) {
                     final CellLayout cl = (CellLayout) getChildAt(i);
-                    cl.disableHardwareLayers();
+                    cl.enableHardwareLayer(false);
                 }
             }
         }
@@ -1590,17 +1692,16 @@
                     leftScreen--;
                 }
             }
+
+            final CellLayout customScreen = mWorkspaceScreens.get(CUSTOM_CONTENT_SCREEN_ID);
             for (int i = 0; i < screenCount; i++) {
                 final CellLayout layout = (CellLayout) getPageAt(i);
-                if (!(leftScreen <= i && i <= rightScreen && shouldDrawChild(layout))) {
-                    layout.disableHardwareLayers();
-                }
-            }
-            for (int i = 0; i < screenCount; i++) {
-                final CellLayout layout = (CellLayout) getPageAt(i);
-                if (leftScreen <= i && i <= rightScreen && shouldDrawChild(layout)) {
-                    layout.enableHardwareLayers();
-                }
+
+                // enable layers between left and right screen inclusive, except for the
+                // customScreen, which may animate its content during transitions.
+                boolean enableLayer = layout != customScreen &&
+                        leftScreen <= i && i <= rightScreen && shouldDrawChild(layout);
+                layout.enableHardwareLayer(enableLayer);
             }
         }
     }
@@ -1737,9 +1838,7 @@
 
     @Override
     protected void getOverviewModePages(int[] range) {
-        int count = mScreenOrder.size();
-
-        int start = hasCustomContent() ? 1 : 0;
+        int start = numCustomPages();
         int end = getChildCount() - 1;
 
         range[0] = Math.max(0, Math.min(start, getChildCount() - 1));
@@ -1750,7 +1849,7 @@
         super.onStartReordering();
         showOutlines();
         // Reordering handles its own animations, disable the automatic ones.
-        setLayoutTransition(null);
+        disableLayoutTransitions();
     }
 
     protected void onEndReordering() {
@@ -1767,7 +1866,7 @@
         mLauncher.getModel().updateWorkspaceScreenOrder(mLauncher, mScreenOrder);
 
         // Re-enable auto layout transitions for page deletion.
-        setLayoutTransition(mLayoutTransition);
+        enableLayoutTransitions();
     }
 
     public boolean isInOverviewMode() {
@@ -1778,19 +1877,16 @@
         if (mTouchState != TOUCH_STATE_REST) {
             return false;
         }
-        mLauncher.onInteractionBegin();
         enableOverviewMode(true, -1, true);
         return true;
     }
 
     public void exitOverviewMode(boolean animated) {
         exitOverviewMode(-1, animated);
-        mLauncher.onInteractionEnd();
     }
 
     public void exitOverviewMode(int snapPage, boolean animated) {
         enableOverviewMode(false, snapPage, animated);
-        mLauncher.onInteractionEnd();
     }
 
     private void enableOverviewMode(boolean enable, int snapPage, boolean animated) {
@@ -1823,6 +1919,37 @@
         return offsetDelta;
     }
 
+    boolean shouldVoiceButtonProxyBeVisible() {
+        if (isOnOrMovingToCustomContent()) {
+            return false;
+        }
+        if (mState != State.NORMAL) {
+            return false;
+        }
+        return true;
+    }
+
+    public void updateInteractionForState() {
+        if (mState != State.NORMAL) {
+            mLauncher.onInteractionBegin();
+        } else {
+            mLauncher.onInteractionEnd();
+        }
+    }
+
+    private void setState(State state) {
+        mState = state;
+        updateInteractionForState();
+        updateAccessibilityFlags();
+    }
+
+    private void updateAccessibilityFlags() {
+        int accessible = mState == State.NORMAL ?
+                ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_YES :
+                ViewCompat.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS;
+        setImportantForAccessibility(accessible);
+    }
+
     Animator getChangeStateAnimation(final State state, boolean animated, int delay, int snapPage) {
         if (mState == state) {
             return null;
@@ -1838,7 +1965,7 @@
         final boolean oldStateIsSpringLoaded = (oldState == State.SPRING_LOADED);
         final boolean oldStateIsSmall = (oldState == State.SMALL);
         final boolean oldStateIsOverview = (oldState == State.OVERVIEW);
-        mState = state;
+        setState(state);
         final boolean stateIsNormal = (state == State.NORMAL);
         final boolean stateIsSpringLoaded = (state == State.SPRING_LOADED);
         final boolean stateIsSmall = (state == State.SMALL);
@@ -1849,7 +1976,11 @@
         float finalSearchBarAlpha = !stateIsNormal ? 0f : 1f;
         float finalWorkspaceTranslationY = stateIsOverview ? getOverviewModeTranslationY() : 0;
 
-        boolean zoomIn = true;
+        boolean workspaceToAllApps = (oldStateIsNormal && stateIsSmall);
+        boolean allAppsToWorkspace = (oldStateIsSmall && stateIsNormal);
+        boolean workspaceToOverview = (oldStateIsNormal && stateIsOverview);
+        boolean overviewToWorkspace = (oldStateIsOverview && stateIsNormal);
+
         mNewScale = 1.0f;
 
         if (oldStateIsOverview) {
@@ -1866,19 +1997,38 @@
             } else if (stateIsSmall){
                 mNewScale = mOverviewModeShrinkFactor - 0.3f;
             }
-            if (oldStateIsNormal && stateIsSmall) {
-                zoomIn = false;
+            if (workspaceToAllApps) {
                 updateChildrenLayersEnabled(false);
             }
         }
-        final int duration = zoomIn ?
-                getResources().getInteger(R.integer.config_workspaceUnshrinkTime) :
-                getResources().getInteger(R.integer.config_appsCustomizeWorkspaceShrinkTime);
+
+        final int duration;
+        if (workspaceToAllApps) {
+            duration = getResources().getInteger(R.integer.config_workspaceUnshrinkTime);
+        } else if (workspaceToOverview || overviewToWorkspace) {
+            duration = getResources().getInteger(R.integer.config_overviewTransitionTime);
+        } else {
+            duration = getResources().getInteger(R.integer.config_appsCustomizeWorkspaceShrinkTime);
+        }
+
         for (int i = 0; i < getChildCount(); i++) {
             final CellLayout cl = (CellLayout) getChildAt(i);
-            float finalAlpha = (!mWorkspaceFadeInAdjacentScreens ||
-                    (i == mCurrentPage)) && !stateIsSmall ? 1f : 0f;
+            boolean isCurrentPage = (i == getNextPage());
             float initialAlpha = cl.getShortcutsAndWidgets().getAlpha();
+            float finalAlpha = stateIsSmall ? 0f : 1f;
+
+            // If we are animating to/from the small state, then hide the side pages and fade the
+            // current page in
+            if (!mIsSwitchingState) {
+                if (workspaceToAllApps || allAppsToWorkspace) {
+                    if (allAppsToWorkspace && isCurrentPage) {
+                        initialAlpha = 0f;
+                    } else if (!isCurrentPage) {
+                        initialAlpha = finalAlpha = 0f;
+                    }
+                    cl.setShortcutAndWidgetAlpha(initialAlpha);
+                }
+            }
 
             mOldAlphas[i] = initialAlpha;
             mNewAlphas[i] = finalAlpha;
@@ -1895,6 +2045,7 @@
         final View overviewPanel = mLauncher.getOverviewPanel();
         final View hotseat = mLauncher.getHotseat();
         if (animated) {
+            anim.setDuration(duration);
             LauncherViewPropertyAnimator scale = new LauncherViewPropertyAnimator(this);
             scale.scaleX(mNewScale)
                 .scaleY(mNewScale)
@@ -1913,14 +2064,13 @@
                         LauncherViewPropertyAnimator alphaAnim =
                             new LauncherViewPropertyAnimator(cl.getShortcutsAndWidgets());
                         alphaAnim.alpha(mNewAlphas[i])
-                            .setDuration(duration)
                             .setInterpolator(mZoomInInterpolator);
                         anim.play(alphaAnim);
                     }
                     if (mOldBackgroundAlphas[i] != 0 ||
                         mNewBackgroundAlphas[i] != 0) {
                         ValueAnimator bgAnim =
-                                LauncherAnimUtils.ofFloat(cl, 0f, 1f).setDuration(duration);
+                                LauncherAnimUtils.ofFloat(cl, 0f, 1f);
                         bgAnim.setInterpolator(mZoomInInterpolator);
                         bgAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
                                 public void onAnimationUpdate(float a, float b) {
@@ -1945,14 +2095,19 @@
             ObjectAnimator overviewPanelAlpha = ObjectAnimator.ofFloat(overviewPanel,
                     "alpha", finalOverviewPanelAlpha);
 
-            overviewPanelAlpha.addUpdateListener(new AlphaUpdateListener(overviewPanel));
-            hotseatAlpha.addUpdateListener(new AlphaUpdateListener(hotseat));
-            searchBarAlpha.addUpdateListener(new AlphaUpdateListener(searchBar));
+            overviewPanelAlpha.addListener(new AlphaUpdateListener(overviewPanel));
+            hotseatAlpha.addListener(new AlphaUpdateListener(hotseat));
+            searchBarAlpha.addListener(new AlphaUpdateListener(searchBar));
 
-            if (getPageIndicator() != null) {
-                pageIndicatorAlpha.addUpdateListener(new AlphaUpdateListener(getPageIndicator()));
+            if (workspaceToOverview) {
+                hotseatAlpha.setInterpolator(new DecelerateInterpolator(2));
+            } else if (overviewToWorkspace) {
+                overviewPanelAlpha.setInterpolator(new DecelerateInterpolator(2));
             }
 
+            if (getPageIndicator() != null) {
+                pageIndicatorAlpha.addListener(new AlphaUpdateListener(getPageIndicator()));
+            }
 
             anim.play(overviewPanelAlpha);
             anim.play(hotseatAlpha);
@@ -1975,11 +2130,7 @@
             setScaleY(mNewScale);
             setTranslationY(finalWorkspaceTranslationY);
         }
-        if (finalSearchBarAlpha == 0) {
-            mLauncher.setVoiceButtonProxyVisible(false);
-        } else {
-            mLauncher.setVoiceButtonProxyVisible(true);
-        }
+        mLauncher.updateVoiceButtonProxyVisible(false);
 
         if (stateIsSpringLoaded) {
             // Right now we're covered by Apps Customize
@@ -1992,12 +2143,12 @@
                     R.integer.config_appsCustomizeSpringLoadedBgAlpha) / 100f, true);
         } else {
             // Fade the background gradient away
-            animateBackgroundGradient(0f, true);
+            animateBackgroundGradient(0f, animated);
         }
         return anim;
     }
 
-    static class AlphaUpdateListener implements AnimatorUpdateListener {
+    static class AlphaUpdateListener implements AnimatorUpdateListener, AnimatorListener {
         View view;
         public AlphaUpdateListener(View v) {
             view = v;
@@ -2009,13 +2160,35 @@
         }
 
         public static void updateVisibility(View view) {
-            if (view.getAlpha() < ALPHA_CUTOFF_THRESHOLD && view.getVisibility() != INVISIBLE) {
-                view.setVisibility(INVISIBLE);
+            // We want to avoid the extra layout pass by setting the views to GONE unless
+            // accessibility is on, in which case not setting them to GONE causes a glitch.
+            int invisibleState = sAccessibilityEnabled ? GONE : INVISIBLE;
+            if (view.getAlpha() < ALPHA_CUTOFF_THRESHOLD && view.getVisibility() != invisibleState) {
+                view.setVisibility(invisibleState);
             } else if (view.getAlpha() > ALPHA_CUTOFF_THRESHOLD
                     && view.getVisibility() != VISIBLE) {
                 view.setVisibility(VISIBLE);
             }
         }
+
+        @Override
+        public void onAnimationCancel(Animator arg0) {
+        }
+
+        @Override
+        public void onAnimationEnd(Animator arg0) {
+            updateVisibility(view);
+        }
+
+        @Override
+        public void onAnimationRepeat(Animator arg0) {
+        }
+
+        @Override
+        public void onAnimationStart(Animator arg0) {
+            // We want the views to be visible for animation, so fade-in/out is visible
+            view.setVisibility(VISIBLE);
+        }
     }
 
     @Override
@@ -2039,6 +2212,10 @@
 
     private void onTransitionPrepare() {
         mIsSwitchingState = true;
+
+        // Invalidate here to ensure that the pages are rendered during the state change transition.
+        invalidate();
+
         updateChildrenLayersEnabled(false);
         hideCustomContentIfNecessary();
     }
@@ -2875,7 +3052,9 @@
     private void cleanupFolderCreation() {
         if (mDragFolderRingAnimator != null) {
             mDragFolderRingAnimator.animateToNaturalState();
+            mDragFolderRingAnimator = null;
         }
+        mFolderCreationAlarm.setOnAlarmListener(null);
         mFolderCreationAlarm.cancelAlarm();
     }
 
@@ -3219,9 +3398,11 @@
         }
 
         public void onAlarm(Alarm alarm) {
-            if (mDragFolderRingAnimator == null) {
-                mDragFolderRingAnimator = new FolderRingAnimator(mLauncher, null);
+            if (mDragFolderRingAnimator != null) {
+                // This shouldn't happen ever, but just in case, make sure we clean up the mess.
+                mDragFolderRingAnimator.animateToNaturalState();
             }
+            mDragFolderRingAnimator = new FolderRingAnimator(mLauncher, null);
             mDragFolderRingAnimator.setCell(cellX, cellY);
             mDragFolderRingAnimator.setCellLayout(layout);
             mDragFolderRingAnimator.animateToAcceptState();
@@ -3624,6 +3805,10 @@
         return mDragInfo;
     }
 
+    public int getRestorePage() {
+        return getNextPage() - numCustomPages();
+    }
+
     /**
      * Calculate the nearest cell where the given object would be dropped.
      *
@@ -3902,6 +4087,7 @@
             }
         }
         mRestoredPages.clear();
+        mSavedStates = null;
     }
 
     @Override
@@ -4263,9 +4449,9 @@
     protected PageIndicator.PageMarkerResources getPageIndicatorMarker(int pageIndex) {
         long screenId = getScreenIdForPageIndex(pageIndex);
         if (screenId == EXTRA_EMPTY_SCREEN_ID) {
-            int count = mScreenOrder.size() - (hasCustomContent() ? 1 : 0);
+            int count = mScreenOrder.size() - numCustomPages();
             if (count > 1) {
-                return new PageIndicator.PageMarkerResources(R.drawable.ic_pageindicator_add,
+                return new PageIndicator.PageMarkerResources(R.drawable.ic_pageindicator_current,
                         R.drawable.ic_pageindicator_add);
             }
         }
@@ -4281,10 +4467,19 @@
     public void syncPageItems(int page, boolean immediate) {
     }
 
+    protected String getPageIndicatorDescription() {
+        String settings = getResources().getString(R.string.settings_button_text);
+        return getCurrentPageDescription() + ", " + settings;
+    }
+
     protected String getCurrentPageDescription() {
         int page = (mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage;
+        int delta = numCustomPages();
+        if (hasCustomContent() && getNextPage() == 0) {
+            return mCustomContentDescription;
+        }
         return String.format(getContext().getString(R.string.workspace_scroll_format),
-                page + 1, getChildCount());
+                page + 1 - delta, getChildCount() - delta);
     }
 
     public void getLocationInDragLayer(int[] loc) {
diff --git a/src/com/android/launcher3/config/ProviderConfig.java b/src/com/android/launcher3/config/ProviderConfig.java
new file mode 100644
index 0000000..db25076
--- /dev/null
+++ b/src/com/android/launcher3/config/ProviderConfig.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.config;
+
+public class ProviderConfig {
+
+    public static final String AUTHORITY = "com.android.launcher3.settings";
+}
diff --git a/src/com/android/photos/views/TiledImageView.java b/src/com/android/photos/views/TiledImageView.java
index 36cb438..af4199c 100644
--- a/src/com/android/photos/views/TiledImageView.java
+++ b/src/com/android/photos/views/TiledImageView.java
@@ -63,7 +63,7 @@
         // Guarded by locks
         public float scale;
         public int centerX, centerY;
-        int rotation;
+        public int rotation;
         public TileSource source;
         Runnable isReadyCallback;
 
diff --git a/util/com/android/launcher3/DecoderRing.java b/util/com/android/launcher3/DecoderRing.java
new file mode 100644
index 0000000..1d9e0de
--- /dev/null
+++ b/util/com/android/launcher3/DecoderRing.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3;
+
+import com.android.launcher3.backup.BackupProtos.CheckedMessage;
+import com.android.launcher3.backup.BackupProtos.Favorite;
+import com.android.launcher3.backup.BackupProtos.Key;
+import com.android.launcher3.backup.BackupProtos.Journal;
+import com.android.launcher3.backup.BackupProtos.Resource;
+import com.android.launcher3.backup.BackupProtos.Screen;
+import com.android.launcher3.backup.BackupProtos.Widget;
+
+import com.google.protobuf.nano.InvalidProtocolBufferNanoException;
+import com.google.protobuf.nano.MessageNano;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.System;
+import java.util.zip.CRC32;
+
+/**
+ * Commandline utility for decoding protos written to the android logs during debugging.
+ *
+ * base64 -D icon.log > icon.bin
+ * java -classpath $ANDROID_HOST_OUT/framework/protoutil.jar:$ANDROID_HOST_OUT/../common/obj/JAVA_LIBRARIES/host-libprotobuf-java-2.3.0-nano_intermediates/javalib.jar \
+ *   com.android.launcher3.DecoderRing -i icon.bin
+ *
+ * TODO: write a wrapper to setup the classpath
+ */
+class DecoderRing {
+    public static void main(String[ ] args)
+            throws Exception {
+        File source = null;
+        Class type = Key.class;
+        int skip = 0;
+
+        for (int i = 0; i < args.length; i++) {
+            if ("-k".equals(args[i])) {
+                type = Key.class;
+            } else if ("-f".equals(args[i])) {
+                type = Favorite.class;
+            } else if ("-j".equals(args[i])) {
+                type = Journal.class;
+            } else if ("-i".equals(args[i])) {
+                type = Resource.class;
+            } else if ("-s".equals(args[i])) {
+                type = Screen.class;
+            } else if ("-w".equals(args[i])) {
+                type = Widget.class;
+            } else if ("-S".equals(args[i])) {
+                if ((i + 1) < args.length) {
+                    skip = Integer.valueOf(args[++i]);
+                } else {
+                    usage(args);
+                }
+            } else if (args[i] != null && !args[i].startsWith("-")) {
+                source = new File(args[i]);
+            } else {
+                System.err.println("Unsupported flag: " + args[i]);
+                usage(args);
+            }
+        }
+
+
+        // read in the bytes
+        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+        BufferedInputStream input = null;
+        if (source == null) {
+            input = new BufferedInputStream(System.in);
+        } else {
+            try {
+                input = new BufferedInputStream(new FileInputStream(source));
+            } catch (FileNotFoundException e) {
+                System.err.println("failed to open file: " + source + ", " + e);
+                System.exit(1);
+            }
+        }
+        byte[] buffer = new byte[1024];
+        try {
+            while (input.available() > 0) {
+                int n = input.read(buffer);
+                int offset = 0;
+                if (skip > 0) {
+                    offset = Math.min(skip, n);
+                    n -= offset;
+                    skip -= offset;
+                }
+                if (n > 0) {
+                    byteStream.write(buffer, offset, n);
+                }
+            }
+        } catch (IOException e) {
+            System.err.println("failed to read input: " + e);
+            System.exit(1);
+        }
+        System.err.println("read this many bytes: " + byteStream.size());
+
+        MessageNano proto = null;
+        if (type == Key.class) {
+            Key key = new Key();
+            try {
+                key = Key.parseFrom(byteStream.toByteArray());
+            } catch (InvalidProtocolBufferNanoException e) {
+                System.err.println("failed to parse proto: " + e);
+                System.exit(1);
+            }
+            // keys are self-checked
+            if (key.checksum != checkKey(key)) {
+                System.err.println("key ckecksum failed");
+                System.exit(1);
+            }
+            proto = key;
+        } else {
+            // other types are wrapped in a checksum message
+            CheckedMessage wrapper = new CheckedMessage();
+            try {
+                MessageNano.mergeFrom(wrapper, byteStream.toByteArray());
+            } catch (InvalidProtocolBufferNanoException e) {
+                System.err.println("failed to parse wrapper: " + e);
+                System.exit(1);
+            }
+            CRC32 checksum = new CRC32();
+            checksum.update(wrapper.payload);
+            if (wrapper.checksum != checksum.getValue()) {
+                System.err.println("wrapper ckecksum failed");
+                System.exit(1);
+            }
+            // decode the actual message
+            proto = (MessageNano) type.newInstance();
+            try {
+                MessageNano.mergeFrom(proto, wrapper.payload);
+            } catch (InvalidProtocolBufferNanoException e) {
+                System.err.println("failed to parse proto: " + e);
+                System.exit(1);
+            }
+        }
+
+        // Generic string output
+        System.out.println(proto.toString());
+
+        // save off the icon bits in a file for inspection
+        if (proto instanceof Resource) {
+            Resource icon = (Resource) proto;
+            final String path = "icon.webp";
+            FileOutputStream iconFile = new FileOutputStream(path);
+            iconFile.write(icon.data);
+            iconFile.close();
+            System.err.println("wrote " + path);
+        }
+
+        // save off the widget icon and preview bits in files for inspection
+        if (proto instanceof Widget) {
+            Widget widget = (Widget) proto;
+            if (widget.icon != null) {
+                final String path = "widget_icon.webp";
+                FileOutputStream iconFile = new FileOutputStream(path);
+                iconFile.write(widget.icon.data);
+                iconFile.close();
+                System.err.println("wrote " + path);
+            }
+            if (widget.preview != null) {
+                final String path = "widget_preview.webp";
+                FileOutputStream iconFile = new FileOutputStream(path);
+                iconFile.write(widget.preview.data);
+                iconFile.close();
+                System.err.println("wrote " + path);
+            }
+        }
+
+        // success
+        System.exit(0);
+    }
+
+    private static long checkKey(Key key) {
+        CRC32 checksum = new CRC32();
+        checksum.update(key.type);
+        checksum.update((int) (key.id & 0xffff));
+        checksum.update((int) ((key.id >> 32) & 0xffff));
+        if (key.name != null && key.name.length() > 0) {
+            checksum.update(key.name.getBytes());
+        }
+        return checksum.getValue();
+    }
+
+    private static void usage(String[] args) {
+        System.err.println("DecoderRing type [input]");
+        System.err.println("\t-k\tdecode a key");
+        System.err.println("\t-f\tdecode a favorite");
+        System.err.println("\t-i\tdecode a icon");
+        System.err.println("\t-s\tdecode a screen");
+        System.err.println("\t-w\tdecode a widget");
+        System.err.println("\t-s b\tskip b bytes");
+        System.err.println("\tfilename\tread from filename, not stdin");
+        System.exit(1);
+    }
+}
\ No newline at end of file