am c2bd4bee: (-s ours) am c554fb92: Import revised translations.  DO NOT MERGE

* commit 'c2bd4bee5a5ebb450b508732af8a28a71e58765d':
  Import revised translations.  DO NOT MERGE
diff --git a/res/layout-xlarge-port/launcher.xml b/res/layout-xlarge-port/launcher.xml
deleted file mode 100644
index a8087f4..0000000
--- a/res/layout-xlarge-port/launcher.xml
+++ /dev/null
@@ -1,215 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
-<com.android.launcher2.DragLayer
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
-
-    android:id="@+id/drag_layer"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <!-- The workspace contains 5 screens of cells -->
-    <com.android.launcher2.Workspace
-        android:id="@+id/workspace"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:paddingTop="?android:attr/actionBarSize"
-        android:paddingBottom="10dp"
-        launcher:defaultScreen="2"
-        launcher:cellCountX="8"
-        launcher:cellCountY="7"
-        launcher:pageSpacing="64dp">
-
-        <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
-        <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
-        <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
-        <include android:id="@+id/cell4" layout="@layout/workspace_screen" />
-        <include android:id="@+id/cell5" layout="@layout/workspace_screen" />
-    </com.android.launcher2.Workspace>
-
-    <include
-        layout="@layout/all_apps_tabbed"
-        android:id="@+id/all_apps_view"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_gravity="top" />
-
-    <RelativeLayout
-        android:id="@+id/all_apps_button_cluster"
-        android:layout_width="fill_parent"
-        android:layout_height="?android:attr/actionBarSize"
-        android:layout_gravity="top">
-
-       <!-- Global search icon -->
-       <ImageView
-           android:id="@+id/search_button"
-           android:layout_width="wrap_content"
-           android:layout_height="wrap_content"
-           android:layout_alignParentTop="true"
-           android:layout_alignParentLeft="true"
-           android:paddingLeft="@dimen/toolbar_button_horizontal_padding"
-           android:paddingRight="@dimen/toolbar_button_horizontal_padding"
-           android:paddingTop="@dimen/toolbar_button_vertical_padding"
-           android:paddingBottom="@dimen/toolbar_button_vertical_padding"
-           android:src="@drawable/ic_generic_search"
-           android:background="@drawable/button_bg"
-           android:onClick="onClickSearchButton"
-           android:focusable="true"
-           android:clickable="true" />
-           
-        <ImageView
-            android:id="@+id/search_divider"
-            android:src="@drawable/divider_launcher_holo"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_toRightOf="@id/search_button"
-            android:paddingTop="@dimen/toolbar_button_vertical_padding"
-            android:paddingBottom="@dimen/toolbar_button_vertical_padding"
-
-            android:onClick="onClickSearchButton"
-            android:focusable="false"
-            android:clickable="true" />
-
-        <!-- Voice search icon -->
-        <ImageView
-            android:id="@+id/voice_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_toRightOf="@id/search_divider"
-            android:paddingLeft="@dimen/toolbar_button_horizontal_padding"
-            android:paddingRight="@dimen/toolbar_button_horizontal_padding"
-            android:paddingTop="@dimen/toolbar_button_vertical_padding"
-            android:paddingBottom="@dimen/toolbar_button_vertical_padding"
-            android:src="@drawable/ic_voice_search"
-            android:background="@drawable/button_bg"
-            android:onClick="onClickVoiceButton"
-            android:focusable="true"
-            android:clickable="true"/>
-
-        <ImageView
-            android:id="@+id/configure_button"
-            android:src="@drawable/ic_home_add_holo_dark"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignParentTop="true"
-            android:layout_alignParentRight="true"
-            android:paddingLeft="@dimen/toolbar_button_horizontal_padding"
-            android:paddingRight="@dimen/toolbar_button_horizontal_padding"
-            android:paddingTop="@dimen/toolbar_button_vertical_padding"
-            android:paddingBottom="@dimen/toolbar_button_vertical_padding"
-            android:background="@drawable/button_bg"
-
-            android:onClick="onClickConfigureButton"
-            android:focusable="true"
-            android:clickable="true" />
-        <ImageView
-            android:id="@+id/divider"
-            android:src="@drawable/divider_launcher_holo"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_toLeftOf="@id/configure_button"
-            android:paddingTop="@dimen/toolbar_button_vertical_padding"
-            android:paddingBottom="@dimen/toolbar_button_vertical_padding"
-
-            android:onClick="onClickAllAppsButton"
-            android:focusable="false"
-            android:clickable="true" />
-        <TextView
-            android:id="@+id/all_apps_button"
-            android:text="@string/all_apps_button_label"
-            android:drawablePadding="@dimen/all_apps_button_drawable_padding"
-            android:drawableLeft="@drawable/ic_home_all_apps_holo_dark"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_toLeftOf="@id/divider"
-            android:paddingLeft="@dimen/toolbar_button_horizontal_padding"
-            android:paddingRight="@dimen/toolbar_button_horizontal_padding"
-            android:paddingTop="@dimen/all_apps_button_vertical_padding"
-            android:paddingBottom="@dimen/all_apps_button_vertical_padding"
-            android:background="@drawable/button_bg"
-            
-            android:gravity="center_horizontal|center_vertical"
-            android:textColor="#CCFFFFFF"
-            android:textSize="18sp"
-
-            android:shadowColor="#DA000000"
-            android:shadowDx="0.0"
-            android:shadowDy="0.0"
-            android:shadowRadius="2.5"
-
-            android:onClick="onClickAllAppsButton"
-            android:focusable="true"
-            android:clickable="true" />
-        <ImageView
-            android:id="@+id/divider_during_drag"
-            android:src="@drawable/divider_launcher_holo"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_toLeftOf="@id/configure_button"
-            android:paddingTop="@dimen/toolbar_button_vertical_padding"
-            android:paddingBottom="@dimen/toolbar_button_vertical_padding"
-            android:visibility="gone"/>
-        <com.android.launcher2.DeleteZone
-            android:id="@+id/delete_zone"
-            android:text="@string/delete_zone_label_workspace"
-            android:drawablePadding="@dimen/delete_zone_drawable_padding"
-            android:drawableLeft="@drawable/delete_zone_selector"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_alignRight="@id/configure_button"
-            android:paddingLeft="@dimen/toolbar_button_horizontal_padding"
-            android:paddingRight="@dimen/toolbar_button_horizontal_padding"
-            android:paddingTop="@dimen/toolbar_button_vertical_padding"
-            android:paddingBottom="@dimen/toolbar_button_vertical_padding"
-            android:background="@drawable/button_bg"
-
-            android:gravity="center_horizontal|center_vertical"
-            android:textColor="@color/workspace_all_apps_and_delete_zone_text_color"
-            android:textSize="18sp"
-            android:shadowColor="@color/workspace_all_apps_and_delete_zone_text_shadow_color"
-            android:shadowDx="0.0"
-            android:shadowDy="0.0"
-            android:shadowRadius="2.0"
-
-            android:visibility="gone"
-            launcher:direction="horizontal" />
-    </RelativeLayout>
-
-    <TabHost
-        android:id="@+id/customization_drawer"
-        android:layout_width="match_parent"
-        android:layout_height="800dp"
-        android:layout_gravity="bottom">
-        <LinearLayout
-            android:orientation="vertical"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent">
-            <TabWidget
-                android:id="@android:id/tabs"
-                android:layout_width="700dp"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_horizontal"
-                android:background="@drawable/tab_unselected_holo"
-                android:tabStripEnabled="false" />
-            <FrameLayout
-                android:id="@android:id/tabcontent"
-                android:layout_width="match_parent"
-                android:layout_height="650dp">
-             </FrameLayout>
-          </LinearLayout>
-    </TabHost>
-</com.android.launcher2.DragLayer>
diff --git a/res/layout-xlarge-land/launcher.xml b/res/layout-xlarge/launcher.xml
similarity index 96%
rename from res/layout-xlarge-land/launcher.xml
rename to res/layout-xlarge/launcher.xml
index 957327e..7f2b8e1 100644
--- a/res/layout-xlarge-land/launcher.xml
+++ b/res/layout-xlarge/launcher.xml
@@ -32,7 +32,7 @@
         launcher:defaultScreen="2"
         launcher:cellCountX="8"
         launcher:cellCountY="7"
-        launcher:pageSpacing="50dp">
+        launcher:pageSpacing="@dimen/workspace_page_spacing">
 
         <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
         <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
@@ -70,7 +70,7 @@
            android:onClick="onClickSearchButton"
            android:focusable="true"
            android:clickable="true" />
-           
+
         <ImageView
             android:id="@+id/search_divider"
             android:src="@drawable/divider_launcher_holo"
@@ -113,7 +113,6 @@
             android:paddingBottom="@dimen/toolbar_button_vertical_padding"
             android:background="@drawable/button_bg"
 
-            android:onClick="onClickConfigureButton"
             android:focusable="true"
             android:clickable="true" />
         <ImageView
@@ -125,7 +124,6 @@
             android:paddingTop="@dimen/toolbar_button_vertical_padding"
             android:paddingBottom="@dimen/toolbar_button_vertical_padding"
 
-            android:onClick="onClickAllAppsButton"
             android:focusable="false"
             android:clickable="true" />
         <TextView
@@ -141,7 +139,7 @@
             android:paddingTop="@dimen/all_apps_button_vertical_padding"
             android:paddingBottom="@dimen/all_apps_button_vertical_padding"
             android:background="@drawable/button_bg"
-            
+
             android:gravity="center_horizontal|center_vertical"
             android:textColor="#CCFFFFFF"
             android:textSize="18sp"
@@ -151,7 +149,6 @@
             android:shadowDy="0.0"
             android:shadowRadius="2.5"
 
-            android:onClick="onClickAllAppsButton"
             android:focusable="true"
             android:clickable="true" />
         <ImageView
@@ -162,7 +159,7 @@
             android:layout_toLeftOf="@id/configure_button"
             android:paddingTop="@dimen/toolbar_button_vertical_padding"
             android:paddingBottom="@dimen/toolbar_button_vertical_padding"
-            android:visibility="gone"/>
+            android:visibility="gone" />
         <com.android.launcher2.DeleteZone
             android:id="@+id/delete_zone"
             android:text="@string/delete_zone_label_workspace"
@@ -192,7 +189,7 @@
     <TabHost
         android:id="@+id/customization_drawer"
         android:layout_width="match_parent"
-        android:layout_height="480dp"
+        android:layout_height="@dimen/customization_drawer_height"
         android:layout_gravity="bottom">
         <LinearLayout
             android:orientation="vertical"
@@ -200,7 +197,7 @@
             android:layout_height="match_parent">
             <TabWidget
                 android:id="@android:id/tabs"
-                android:layout_width="952dp"
+                android:layout_width="@dimen/customization_drawer_tab_widget_width"
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_horizontal"
                 android:background="@drawable/tab_unselected_holo"
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 7d38035..aadeeb3 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Carpetas"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Más"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Papeles tapiz"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Accesos directos a aplicaciones"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Accesos directos a aplicaciones"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Ésta será la pestaña para los papeles tapiz"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Todos"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Aplicaciones"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Juegos"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mis aplicaciones"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mis aplicaciones"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"No se encontraron juegos."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"No has descargado ninguna aplicación."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"No se pudo colocar el elemento en esta pantalla principal"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 11b9f2d..8777d8a 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"پوشه ها"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"بیشتر"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"تصاویر زمینه"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"میانبرهای برنامه"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"میانبرهای برنامه کاربردی"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"این برگه تصاویر زمینه خواهد بود"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"همه"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"برنامه های کاربردی"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"بازی ها"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"برنامه های من"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"برنامه های کاربردی من"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"هیچ بازی پیدا نشد."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"شما هیچ برنامه کاربردی دانلود شده ای ندارید."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"نمی توان موردی در این صفحه اصلی انداخت"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 7aee9f1..4d2a049 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Kansiot"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Lisää"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Taustakuvat"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Sovelluspikakuvakkeet"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Sovelluspikakuvakkeet"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Tämä on taustakuvavälilehti"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Kaikki"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Sovellukset"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Pelit"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Omat sovellukset"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Omat sovellukset"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Ei pelejä."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Ei ladattuja sovelluksia."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Kohdetta ei voi lisätä etusivulle"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 7a1f8f1..f43bb5e 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Dossiers"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Plus"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Fonds d\'écran"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Raccourcis des applications"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Raccourcis des applications"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Onglet des fonds d\'écran"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Toutes"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Applications"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Jeux"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mes applications"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mes applications"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Aucun jeu n\'a été trouvé."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Vous n\'avez téléchargé aucune application."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Impossible de déposer l\'élément sur l\'écran d\'accueil."</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 848f539..6fa7f3a 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Mape"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Više"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Pozadinske slike"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Prečaci aplikacija"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Prečaci aplikacija"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Ovo će biti kartica pozadinske slike"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Sve"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Aplikacije"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Igre"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Moje aplikacije"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Moje aplikacije"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Igre nisu pronađene."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Nemate preuzetih aplikacija"</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Nije bilo moguće spustiti stavku na početni zaslon"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 81be5a7..e310903 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Mappák"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Egyebek"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Háttérképek"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Alkalmazás-parancsikonok"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Alkalmazás-parancsikonok"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Ez lesz a háttérképek lapja"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Összes"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Alkalmazások"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Játékok"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Saját alkalmazások"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Saját alkalmazások"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Nincsenek játékok."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Nincsenek letöltött alkalmazásai."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Nem lehet elhelyezni az elemet ezen a főoldalon"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 4abe037..af3eff2 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Map"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Lainnya"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Wallpaper"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Pintasan apl"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Pintasan App"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Ini akan menjadi tab wallpaper"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Semua"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Apps"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Permainan"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Apl saya"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Apl Saya"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Tidak ditemukan permainan."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Anda tidak memiliki aplikasi yang diunduh."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Tidak dapat menaruh item pada layar utama ini"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index fc95c18..e050219 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Cartelle"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Altro"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Sfondi"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Scorciatoie applicazioni"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Scorciatoie applicazioni"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Questa sarà la scheda degli sfondi"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Tutte"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Applicazioni"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Giochi"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Le mie applicazioni"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Le mie applicazioni"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Nessun gioco trovato."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Non hai applicazioni scaricate."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Impossibile rilasciare elemento in schermata Home"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 8eaa433..cf38fc0 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"תיקיות"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"עוד"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"טפטים"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"קיצורי דרך של יישומים"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"קיצורי דרך של יישומים"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"זו תהיה כרטיסיית הטפטים"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"הכל"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"יישומים"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"משחקים"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"היישומים שלי"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"היישומים שלי"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"לא נמצאו משחקים."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"לא הורדת יישומים."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"אין אפשרות להניח פריט במסך בית זה"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 0264232..bfc7d03 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"フォルダ"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"その他"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"壁紙"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"アプリのショートカット"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"アプリのショートカット"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"ここが壁紙タブになります"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"すべて"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"アプリ"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"ゲーム"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"マイアプリ"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"マイアプリ"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"ゲームなし"</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"ダウンロードしたアプリケーションはありません。"</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"このホーム画面にアイテムをドロップできませんでした"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index d8c8caf..c386636 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"폴더"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"더보기"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"배경화면"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"앱 바로가기"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"앱 바로가기"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"배경화면 탭이 됩니다."</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"모두"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"애플리케이션"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"게임"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"내 애플리케이션"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"내 애플리케이션"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"게임이 없습니다."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"다운로드한 애플리케이션이 없습니다."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"홈 화면에 항목을 드롭할 수 없습니다."</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 98817fd..413b29b 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Aplankai"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Daugiau"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Darbalaukio fonai"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Spartieji programos klavišai"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Spartieji programos klavišai"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Tai bus darbalaukio fonų skirtukas"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Visos"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Apps"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Žaidimai"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mano programos"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mano programos"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Nerasta žaidimų."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Neturite atsisiųstų programų."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Nepavyko pašalinti elemento šiame pagr. ekrane"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index fec6492..b6bdf25 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Mapes"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Vairāk"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Fona tapetes"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Lietotņu saīsnes"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Lietotnes saīsnes"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Šī būs fona tapetes cilne"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Visas"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Lietotnes"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Spēles"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Manas lietotnes"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Manas lietotnes"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Nav nevienas spēles."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Nav ielādēta neviena lietojumprogramma."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Nevarēja nomest vienumu šajā sākumekrānā."</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 2cbde30..186f01f 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Mapper"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Mer"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Bakgrunner"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Programsnarveier"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Programsnarveier"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Dette er nå bakgrunnsfanen"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Alle"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Programmer"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Spill"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mine programmer"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Programmer"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Finner ingen spill."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Du har ingen nedlastede programmer."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Kunne ikke slippe elementet på denne startskjermen"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 224e4f0..a3ad199 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -25,18 +25,18 @@
     <string name="chooser_wallpaper" msgid="5988031014201479733">"Achtergrond selecteren in"</string>
     <string name="wallpaper_instructions" msgid="4215640646180727542">"Achtergrond instellen"</string>
     <string name="pick_wallpaper" msgid="5630222540525626723">"Achtergronden"</string>
-    <string name="activity_not_found" msgid="5591731020063337696">"De app is niet geïnstalleerd."</string>
+    <string name="activity_not_found" msgid="5591731020063337696">"De toepassing is niet geïnstalleerd."</string>
     <string name="configure_wallpaper" msgid="2820186271419674623">"Configureren..."</string>
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="folders_tab_label" msgid="1145293785541489736">"Mappen"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Meer"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Achtergronden"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Toepassingssnelkoppelingen"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Toepassingssnelkoppelingen"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Dit wordt het tabblad \'Achtergronden\'"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Alle"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Toepassingen"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Games"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mijn toepassingen"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mijn toepassingen"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Geen games gevonden."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"U heeft geen gedownloade toepassingen."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Kan item niet neerzetten op dit startscherm"</string>
@@ -60,7 +60,7 @@
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Snelkoppeling \'<xliff:g id="NAME">%s</xliff:g>\' is verwijderd."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Snelkoppeling \'<xliff:g id="NAME">%s</xliff:g>\' bestaat al."</string>
     <string name="title_select_shortcut" msgid="2858897527672831763">"Snelkoppeling selecteren"</string>
-    <string name="title_select_application" msgid="8031072293115454221">"App selecteren"</string>
+    <string name="title_select_application" msgid="8031072293115454221">"Toepassing selecteren"</string>
     <string name="title_select_live_folder" msgid="3753447798805166749">"Map selecteren"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Toepassingen"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Startpagina"</string>
@@ -73,20 +73,20 @@
     <string name="menu_notifications" msgid="6424587053194766192">"Meldingen"</string>
     <string name="menu_gestures" msgid="514678675575912237">"Gebaren"</string>
     <string name="menu_settings" msgid="6233960148378443661">"Instellingen"</string>
-    <string name="cab_menu_delete_app" msgid="1242619904941293871">"App verwijderen"</string>
+    <string name="cab_menu_delete_app" msgid="1242619904941293871">"Toepassing verwijderen"</string>
     <string name="cab_menu_app_info" msgid="5180426909324882018">"Toepassingsdetails"</string>
-    <string name="cab_app_selection_text" msgid="606113924828167756">"1 app geselecteerd"</string>
+    <string name="cab_app_selection_text" msgid="606113924828167756">"1 toepassing geselecteerd"</string>
     <string name="cab_widget_selection_text" msgid="962527270506951955">"1 widget geselecteerd"</string>
     <string name="cab_folder_selection_text" msgid="8916111874189565067">"1 map geselecteerd"</string>
     <string name="cab_shortcut_selection_text" msgid="8115847384500412878">"1 snelkoppeling geselecteerd"</string>
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"snelkoppelingen installeren"</string>
-    <string name="permdesc_install_shortcut" msgid="7429365847558984148">"Een app toestaan snelkoppelingen toe te voegen zonder tussenkomst van de gebruiker."</string>
+    <string name="permdesc_install_shortcut" msgid="7429365847558984148">"Een toepassing toestaan om snelkoppelingen toe te voegen zonder tussenkomst van de gebruiker."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"snelkoppelingen verwijderen"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="959972195916090900">"Een app toestaan snelkoppelingen te verwijderen zonder tussenkomst van de gebruiker."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="959972195916090900">"Een toepassing toestaan om snelkoppelingen te verwijderen zonder tussenkomst van de gebruiker."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"instellingen en snelkoppelingen voor de startpagina lezen"</string>
-    <string name="permdesc_read_settings" msgid="8377434937176025492">"Hiermee kan een app de instellingen en snelkoppelingen op de startpagina lezen."</string>
+    <string name="permdesc_read_settings" msgid="8377434937176025492">"Hiermee kan een toepassing de instellingen en snelkoppelingen op de startpagina lezen."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"instellingen en snelkoppelingen voor de startpagina schrijven"</string>
-    <string name="permdesc_write_settings" msgid="1098648778383349818">"Hiermee kan een app de instellingen en snelkoppelingen op de startpagina wijzigen."</string>
+    <string name="permdesc_write_settings" msgid="1098648778383349818">"Hiermee kan een toepassing de instellingen en snelkoppelingen op de startpagina wijzigen."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Probleem bij het laden van widget"</string>
     <string name="uninstall_system_app_text" msgid="7488523163288397451">"Dit is een systeemtoepassing die niet kan worden verwijderd."</string>
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index b457e56..8a21cba 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Foldery"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Więcej"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Tapety"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Skróty do aplikacji"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Skróty do aplikacji"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"To będzie karta tapet"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Wszystkie"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Aplikacje"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Gry"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Moje aplikacje"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Moje aplikacje"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Nie znaleziono gier."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Nie masz żadnych pobranych aplikacji."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Nie można upuścić elementu na ekranie głównym"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 931a8ea..5a59b39 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Pastas"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Mais"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Imagens de fundo"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Atalhos de aplicações"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Atalhos de aplicações"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Isto será o separador de imagens de fundo"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Todas"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Aplicações"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Jogos"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"As minhas aplicações"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"As minhas aplicações"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Sem jogos."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Não existem aplicações transferidas."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Não foi possível largar o item neste ecrã inicial"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index c4fb78a..2e6611e 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Pastas"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Mais"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Papéis de parede"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Atalhos de aplicativo"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Atalhos de aplicativo"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Esta será a guia de papéis de parede"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Todos"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Aplicativos"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Jogos"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Meus aplicativos"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Meus Aplicativos"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Nenhum jogo encontrado."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Você não tem nenhum aplicativo transferido."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Não foi possível soltar o item nesta tela inicial"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 7addc18..1abba7a 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -31,14 +31,14 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Dosare"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Mai multe"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Imagini de fundal"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Comenzi rapide aplicaţii"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Comenzi rapide aplicaţii"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Aceasta va fi fila pentru imagini de fundal"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Toate"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Aplicaţii"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Jocuri"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Aplicaţiile mele"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Aplicaţiile mele"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Nu s-au găsit jocuri."</string>
-    <string name="all_apps_no_downloads" msgid="2284720393234453761">"Nu aveţi aplicaţii descărcate."</string>
+    <string name="all_apps_no_downloads" msgid="2284720393234453761">"Nu aveţi aplicaţii descărcate"</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Impos. de plasat elem. pe acest ecran de pornire"</string>
     <string name="external_drop_widget_pick_title" msgid="4481311720134376218">"Selectaţi obiectul widget"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nume dosar"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 76ef1ff..a62dfa2 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Папки"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Ещё"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Обои"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Ярлыки приложений"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Ярлыки приложений"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Это будет вкладка обоев"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Все"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Приложения"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Игры"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Мои приложения"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Мои приложения"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Игр не найдено."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"У вас нет загруженных приложений."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Не удается скопировать элемент на главный экран"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 90cc9eb..ebdf139 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Priečinky"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Viac"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Tapety"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Odkazy aplikácií"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Odkazy aplikácií"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Toto bude karta Tapety"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Všetky"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Aplikácie"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Hry"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Moje aplikácie"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Moje aplikácie"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Nenašli sa žiadne hry."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Nemáte žiadne prevzaté aplikácie."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Položku sa nepodarilo pretiahnuť na túto plochu"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 8ceeb87..97a96a1 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Mape"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Več"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Ozadja"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Bližnjice do programov"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Bližnjice do programov"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"To bo zavihek ozadij"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Vse"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Programi"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Igre"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Moji programi"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Moji programi"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Ni najdenih iger."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Ni prenesenih programov."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Elementa ni bilo mogoče postaviti na ta začetni zaslon"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 5c89227..fbeea6b 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Директоријуми"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Још"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Позадине"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Пречице за апликације"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Пречице за апликације"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Ово ће бити картица позадине"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Све"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Apps"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Игре"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Моје апликације"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Моје апликације"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Нису пронађене игре."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Немате ниједну преузету апликацију."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Ставка није пребачена на овај почетни екран"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index ad74885..9eb8df9 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -31,14 +31,14 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Mappar"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Mer"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Bakgrundsbilder"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Genvägar för appar"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Genvägar för appar"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Det här kommer att vara fliken för bakgrundsbilder"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Alla"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Appar"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Spel"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Mina appar"</string>
+    <!-- outdated translation 2300935549064726963 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Hämtade"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Inga spel hittades."</string>
-    <string name="all_apps_no_downloads" msgid="2284720393234453761">"Du har inte hämtat några appar."</string>
+    <!-- outdated translation 6145042636084482299 -->     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Inga hämtade appar."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Objektet kunde inte släppas på den här startsidan"</string>
     <string name="external_drop_widget_pick_title" msgid="4481311720134376218">"Välj en widget att skapa"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Mappnamn"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 0a19cbb..ee3b563 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"โฟลเดอร์"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"เพิ่มเติม"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"วอลเปเปอร์"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"ทางลัดของแอปพลิเคชัน"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"ทางลัดของแอปพลิเคชัน"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"นี่จะเป็นแท็บวอลเปเปอร์"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"ทั้งหมด"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"แอปพลิเคชัน"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"เกม"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"แอปพลิเคชันของฉัน"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"แอปพลิเคชันของฉัน"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"ไม่พบเกม"</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"คุณไม่ได้ดาวน์โหลดแอปพลิเคชันไว้"</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"ไม่สามารถวางรายการลงในหน้าจอหลักนี้ได้"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index f131b02..67212cb 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Mga Folder"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Higit pa"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Mga Wallpaper"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Mga shortcut ng app"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Mga Shortcut ng App"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Ito ang magiging tab ng mga wallpaper"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Lahat"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Apps"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Mga Laro"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Aking mga app"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Aking Mga App"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Walang nakitang mga laro."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Wala kang mga na-download na application."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Hindi ma-drop ang item sa homescreen na ito"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 13ff3e0..79e67c0 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Klasörler"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Diğer"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Duvar Kağıtları"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Uygulama kısayolları"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Uygulama Kısayolları"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Bu duvar kağıdı sekmesi olacaktır"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Tümü"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Uygulamalar"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Oyunlar"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Uygulamalarım"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Uygulamalarım"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Oyun bulunamadı."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"İndirilmiş uygulamanız yok."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Öğe bu ana ekrana bırakılamadı"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 2095bc9..55b39e1 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Папки"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Більше"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Фонові мал."</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Ярлики програм"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Ярлики програм"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"This will be the wallpapers tab"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Усі"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Програми"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Ігри"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Мої програми"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Мої програми"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Ігор не знайдено."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"У вас немає завантажених програм."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Неможливо помістити елемент на цей головний екран"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 8e5b4c3..06a7a3f 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"Thư mục"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"Khác"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"Hình nền"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"Lối tắt ứng dụng"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"Lối tắt ứng dụng"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"Đây sẽ là tab hình nền"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"Tất cả"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"Ứng dụng"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"Trò chơi"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"Ứng dụng của tôi"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"ƯD của tôi"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"Không tìm thấy trò chơi."</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"Bạn không có ứng dụng nào được tải xuống."</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"Không thể thả mục vào màn hình chính này"</string>
diff --git a/res/values-xlarge-land/dimens.xml b/res/values-xlarge-land/dimens.xml
index 51037f5..ccea6eb 100644
--- a/res/values-xlarge-land/dimens.xml
+++ b/res/values-xlarge-land/dimens.xml
@@ -22,4 +22,9 @@
     <!-- Width/height gap overrides for the workspace -->
     <dimen name="workspace_width_gap">32dp</dimen>
     <dimen name="workspace_height_gap">2dp</dimen>
+
+    <dimen name="workspace_page_spacing">50dp</dimen>
+
+    <dimen name="customization_drawer_height">480dp</dimen>
+    <dimen name="customization_drawer_tab_widget_width">952dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/res/values-xlarge-port/dimens.xml b/res/values-xlarge-port/dimens.xml
index baa31aa..eca8f44 100644
--- a/res/values-xlarge-port/dimens.xml
+++ b/res/values-xlarge-port/dimens.xml
@@ -22,4 +22,9 @@
     <!-- Width/height gap overrides for the workspace -->
     <dimen name="workspace_width_gap">0dp</dimen>
     <dimen name="workspace_height_gap">32dp</dimen>
+
+    <dimen name="workspace_page_spacing">64dp</dimen>
+
+    <dimen name="customization_drawer_height">800dp</dimen>
+    <dimen name="customization_drawer_tab_widget_width">700dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/res/values-xlarge/config.xml b/res/values-xlarge/config.xml
index dc9d096..900fbba 100644
--- a/res/values-xlarge/config.xml
+++ b/res/values-xlarge/config.xml
@@ -35,7 +35,6 @@
 
     <!-- Duration in milliseconds of the animations between all apps, customize, & home.
          NOTE: If these are changed, the toolbar animation times below should also be. -->
-    <integer name="config_allAppsCameraPanTime">700</integer>
     <integer name="config_allAppsFadeOutTime">500</integer>
     <integer name="config_customizeWorkspaceShrinkTime">800</integer>
     <integer name="config_allAppsWorkspaceShrinkTime">1450</integer>
@@ -66,12 +65,6 @@
     <integer name="config_screenOnDropAlphaFadeDelay">350</integer>
     <integer name="config_screenOnDropAlphaFadeDuration">50</integer>
 
-    <!-- Workspace screens are cached to bitmaps only when they're smaller than a certain size
-         (maxScaleForUsingWorkspaceScreenBitmapCache), since the bitmap cache itself is smaller
-         than the view itself (workspaceScreenBitmapCacheScale)  -->
-    <integer name="config_workspaceScreenBitmapCacheScale">20</integer>
-    <integer name="config_maxScaleForUsingWorkspaceScreenBitmapCache">50</integer>
-
     <!-- The slope, in percent, of the drag movement needed to drag an item out of the customization
          drawer (y / x * 100%)  -->
     <integer name="config_customizationDrawerDragSlopeThreshold">150</integer>
diff --git a/res/values-xlarge/dimens.xml b/res/values-xlarge/dimens.xml
index c4988e4..421c9e3 100644
--- a/res/values-xlarge/dimens.xml
+++ b/res/values-xlarge/dimens.xml
@@ -37,11 +37,6 @@
     <dimen name="allAppsSmallScreenVerticalMarginLandscape">30dip</dimen>
     <dimen name="allAppsSmallScreenVerticalMarginPortrait">60dip</dimen>
 
-    <!-- Vertical spacing between edge of screen and mini cell layouts when they
-         are minimized to the top when the customization drawer is showing -->
-    <dimen name="customizeSmallScreenVerticalMarginLandscape">90dip</dimen>
-    <dimen name="customizeSmallScreenVerticalMarginPortrait">180dip</dimen>
-
     <dimen name="delete_zone_drawable_padding">8dip</dimen>
     <dimen name="all_apps_button_drawable_padding">0dip</dimen>
     <dimen name="all_apps_button_vertical_padding">4dip</dimen>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index cd840c3..98ed69d 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"文件夹"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"更多"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"壁纸"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"应用程序快捷方式"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"应用程序快捷方式"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"这将会成为壁纸标签"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"全部"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"应用程序"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"游戏"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"我的应用程序"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"我的应用程序"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"未找到游戏。"</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"您没有下载任何应用程序。"</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"无法将该项放到主屏幕上"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 0622dde..3ddfbe8 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -31,12 +31,12 @@
     <string name="folders_tab_label" msgid="1145293785541489736">"資料夾"</string>
     <string name="shortcuts_tab_label" msgid="8640731503933155644">"更多選項"</string>
     <string name="wallpapers_tab_label" msgid="1617804870364119879">"桌布"</string>
-    <string name="applications_tab_label" msgid="2991364240020736760">"應用程式捷徑"</string>
+    <!-- outdated translation 9046797126882613707 -->     <string name="applications_tab_label" msgid="2991364240020736760">"應用程式捷徑"</string>
     <string name="wallpapers_temp_tab_text" msgid="1660218201190495279">"桌布標籤保留位"</string>
     <string name="all_apps_tab_all" msgid="2942727589595027258">"全部"</string>
     <string name="all_apps_tab_apps" msgid="5468972551904071712">"應用程式"</string>
     <string name="all_apps_tab_games" msgid="1855736784923494918">"遊戲"</string>
-    <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"我的應用程式"</string>
+    <!-- outdated translation 3335316755603669951 -->     <string name="all_apps_tab_downloaded" msgid="1488049110598641387">"我的應用程式"</string>
     <string name="all_apps_no_games" msgid="5293893733372793696">"找不到遊戲。"</string>
     <string name="all_apps_no_downloads" msgid="2284720393234453761">"您沒有下載任何應用程式。"</string>
     <string name="external_drop_widget_error" msgid="4976816434597126575">"無法將項目拖放至主螢幕上"</string>
diff --git a/res/values/config.xml b/res/values/config.xml
index 850c609..c56a8ce 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -25,12 +25,6 @@
     <!-- The alpha value at which to show the most recent drop visualization outline. -->
     <integer name="config_dragOutlineMaxAlpha">128</integer>
 
-    <!-- Workspace screens are cached to bitmaps only when they're smaller than a certain size
-         (maxScaleForUsingWorkspaceScreenBitmapCache), since the bitmap cache it self is smaller
-         than the view itself (workspaceScreenBitmapCacheScale)  -->
-    <integer name="config_workspaceScreenBitmapCacheScale">20</integer>
-    <integer name="config_maxScaleForUsingWorkspaceScreenBitmapCache">50</integer>
-
     <!-- Parameters controlling the animation for when an item is dropped on the home screen,
          and it animates from its old position to the new one. -->
 
@@ -39,6 +33,12 @@
     <!-- The distance at which the animation should take the max duration -->
     <integer name="config_dropAnimMaxDist">800</integer>
 
+    <!-- Workspace screens are cached to bitmaps only when they're smaller than a certain size
+         (maxScaleForUsingWorkspaceScreenBitmapCache), since the bitmap cache itself is smaller
+         than the view itself (workspaceScreenBitmapCacheScale)  -->
+    <integer name="config_workspaceScreenBitmapCacheScale">20</integer>
+    <integer name="config_maxScaleForUsingWorkspaceScreenBitmapCache">50</integer>
+
     <style name="config_orientation">
         <item name="@android:screenOrientation">nosensor</item>
     </style>
diff --git a/src/com/android/launcher2/AllApps2D.java b/src/com/android/launcher2/AllApps2D.java
index 66d9395..a9423be 100644
--- a/src/com/android/launcher2/AllApps2D.java
+++ b/src/com/android/launcher2/AllApps2D.java
@@ -211,7 +211,7 @@
     }
 
     @Override
-    public void onDropCompleted(View target, boolean success) {
+    public void onDropCompleted(View target, Object dragInfo, boolean success) {
     }
 
     /**
diff --git a/src/com/android/launcher2/AllApps3D.java b/src/com/android/launcher2/AllApps3D.java
index 2ecf761..29f49af 100644
--- a/src/com/android/launcher2/AllApps3D.java
+++ b/src/com/android/launcher2/AllApps3D.java
@@ -685,16 +685,14 @@
                 && mCurrentIconIndex >= 0 && mCurrentIconIndex < mAllAppsList.size()) {
             ApplicationInfo app = mAllAppsList.get(mCurrentIconIndex);
 
-            Bitmap bmp = app.iconBitmap;
-            final int w = bmp.getWidth();
-            final int h = bmp.getHeight();
+            final Bitmap bmp = app.iconBitmap;
 
             // We don't really have an accurate location to use.  This will do.
-            int screenX = mMotionDownRawX - (w / 2);
-            int screenY = mMotionDownRawY - h;
+            int screenX = mMotionDownRawX - (bmp.getWidth() / 2);
+            int screenY = mMotionDownRawY - bmp.getHeight();
 
-            mDragController.startDrag(bmp, screenX, screenY,
-                    0, 0, w, h, this, app, DragController.DRAG_ACTION_COPY);
+            mDragController.startDrag(
+                    bmp, screenX, screenY, this, app, DragController.DRAG_ACTION_COPY);
 
             mLauncher.closeAllApps(true);
         }
@@ -748,7 +746,7 @@
     }
 
     @Override
-    public void onDropCompleted(View target, boolean success) {
+    public void onDropCompleted(View target, Object dragInfo, boolean success) {
     }
 
     /**
diff --git a/src/com/android/launcher2/AllAppsPagedView.java b/src/com/android/launcher2/AllAppsPagedView.java
index daa5d64..bfe6ec1 100644
--- a/src/com/android/launcher2/AllAppsPagedView.java
+++ b/src/com/android/launcher2/AllAppsPagedView.java
@@ -79,6 +79,8 @@
         mCellCountX = a.getInt(R.styleable.PagedView_cellCountX, 6);
         mCellCountY = a.getInt(R.styleable.PagedView_cellCountY, 4);
         mInflater = LayoutInflater.from(context);
+        mApps = new ArrayList<ApplicationInfo>();
+        mFilteredApps = new ArrayList<ApplicationInfo>();
         a.recycle();
         setSoundEffectsEnabled(false);
 
@@ -282,7 +284,7 @@
     }
 
     @Override
-    public void onDropCompleted(View target, boolean success) {
+    public void onDropCompleted(View target, Object dragInfo, boolean success) {
         // close the choice action mode if we have a proper drop
         if (target != this) {
             endChoiceMode();
@@ -390,12 +392,14 @@
     }
 
     private int findAppByComponent(ArrayList<ApplicationInfo> list, ApplicationInfo item) {
-        ComponentName removeComponent = item.intent.getComponent();
-        final int length = list.size();
-        for (int i = 0; i < length; ++i) {
-            ApplicationInfo info = list.get(i);
-            if (info.intent.getComponent().equals(removeComponent)) {
-                return i;
+        if (item != null && item.intent != null) {
+            ComponentName removeComponent = item.intent.getComponent();
+            final int length = list.size();
+            for (int i = 0; i < length; ++i) {
+                ApplicationInfo info = list.get(i);
+                if (info.intent.getComponent().equals(removeComponent)) {
+                    return i;
+                }
             }
         }
         return -1;
@@ -515,6 +519,7 @@
             layout.addViewToCellLayout(icon, -1, 0,
                     new PagedViewCellLayout.LayoutParams(0, 0, 4, 1));
         }
+        layout.createHardwareLayers();
     }
 
     /*
diff --git a/src/com/android/launcher2/BubbleTextView.java b/src/com/android/launcher2/BubbleTextView.java
index ad01fac..203883e 100644
--- a/src/com/android/launcher2/BubbleTextView.java
+++ b/src/com/android/launcher2/BubbleTextView.java
@@ -66,6 +66,8 @@
     private boolean mBackgroundSizeChanged;
     private Drawable mBackground;
 
+    private boolean mStayPressed;
+
     private VisibilityChangedListener mOnVisibilityChangedListener;
 
     public BubbleTextView(Context context) {
@@ -124,27 +126,40 @@
         return who == mBackground || super.verifyDrawable(who);
     }
 
+    private void invalidatePressedOrFocusedBackground() {
+        int padding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS / 2;
+        View parent = (View) getParent();
+        if (parent != null) {
+            parent.invalidate(getLeft() - padding, getTop() - padding,
+                    getRight() + padding, getBottom() + padding);
+        }
+        invalidate();
+    }
+
     @Override
     protected void drawableStateChanged() {
         if (isPressed()) {
             // In this case, we have already created the pressed outline on ACTION_DOWN,
             // so we just need to do an invalidate to trigger draw
             if (!mDidInvalidateForPressedState) {
-                invalidate();
+                invalidatePressedOrFocusedBackground();
             }
         } else {
             // Otherwise, either clear the pressed/focused background, or create a background
             // for the focused state
             final boolean backgroundEmptyBefore = mPressedOrFocusedBackground == null;
-            mPressedOrFocusedBackground = null;
+            if (!mStayPressed) {
+                mPressedOrFocusedBackground = null;
+            }
             if (isFocused()) {
                 mPressedOrFocusedBackground = createGlowingOutline(
                         mTempCanvas, mFocusedGlowColor, mFocusedOutlineColor);
-                invalidate();
+                mStayPressed = false;
+                invalidatePressedOrFocusedBackground();
             }
             final boolean backgroundEmptyNow = mPressedOrFocusedBackground == null;
             if (!backgroundEmptyBefore && backgroundEmptyNow) {
-                invalidate();
+                invalidatePressedOrFocusedBackground();
             }
         }
 
@@ -244,9 +259,16 @@
         super.onVisibilityChanged(changedView, visibility);
     }
 
+    void setStayPressed(boolean stayPressed) {
+        mStayPressed = stayPressed;
+        if (!stayPressed) {
+            mPressedOrFocusedBackground = null;
+        }
+        invalidatePressedOrFocusedBackground();
+    }
     @Override
     public void draw(Canvas canvas) {
-        if (mPressedOrFocusedBackground != null && (isPressed() || isFocused())) {
+        if (mPressedOrFocusedBackground != null && (isPressed() || isFocused() || mStayPressed)) {
             // The blue glow can extend outside of our clip region, so we first temporarily expand
             // the canvas's clip region
             canvas.save(Canvas.CLIP_SAVE_FLAG);
diff --git a/src/com/android/launcher2/CellLayoutChildren.java b/src/com/android/launcher2/CellLayoutChildren.java
index 0d0a339..76a6900 100644
--- a/src/com/android/launcher2/CellLayoutChildren.java
+++ b/src/com/android/launcher2/CellLayoutChildren.java
@@ -45,9 +45,6 @@
         super(context);
         mWallpaperManager = WallpaperManager.getInstance(context);
         setLayerType(LAYER_TYPE_HARDWARE, null);
-
-        // Disable multitouch for the workspace
-        setMotionEventSplittingEnabled(false);
     }
 
     public void setCellDimensions(int cellWidth, int cellHeight,
diff --git a/src/com/android/launcher2/CustomizePagedView.java b/src/com/android/launcher2/CustomizePagedView.java
index d08bf54..2f2cb24 100644
--- a/src/com/android/launcher2/CustomizePagedView.java
+++ b/src/com/android/launcher2/CustomizePagedView.java
@@ -38,8 +38,9 @@
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
 import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
 import android.graphics.Canvas;
+import android.graphics.Rect;
+import android.graphics.Bitmap.Config;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -53,7 +54,7 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
+import android.view.animation.LinearInterpolator;
 import android.widget.Checkable;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
@@ -120,9 +121,19 @@
 
     private final float mTmpFloatPos[] = new float[2];
     private final float ANIMATION_SCALE = 0.5f;
-    private final int ANIMATION_DURATION = 400;
+
+    // The duration of the translation animation that occurs during you drag and drop
+    private final int TRANSLATE_ANIM_DURATION = 400;
+
+    // The duration of the scale & alpha animation that occurs during drag and drop
+    private final int DROP_ANIM_DURATION = 200;
+
     private TimeInterpolator mQuintEaseOutInterpolator = new DecelerateInterpolator(2.5f);
-    private ScaleAlphaInterpolator mScaleAlphaInterpolator = new ScaleAlphaInterpolator();
+
+    // The Bitmap used to generate the drag view
+    private Bitmap mDragBitmap;
+
+    private int[] mDragViewOrigin = new int[2];
 
     public CustomizePagedView(Context context) {
         this(context, null, 0);
@@ -324,38 +335,60 @@
         return mCustomizationType;
     }
 
-    @Override
-    public void onDropCompleted(View target, boolean success) {
-        resetCheckedGrandchildren();
+    /**
+     * Similar to resetCheckedGrandchildren, but allows us to specify that it's not animated.
+     * NOTE: This assumes that only a single item can be checked.
+     */
+    private void resetCheckedItem(boolean animated) {
+        Checkable checkable = getCheckedGrandchildren().get(0);
+        if (checkable instanceof PagedViewWidget) {
+            ((PagedViewWidget) checkable).setChecked(false, animated);
+        } else {
+            ((PagedViewIcon) checkable).setChecked(false, animated);
+        }
+    }
+
+    public void onDropCompleted(View target, Object dragInfo, boolean success) {
+        final DragLayer dragLayer = (DragLayer) mLauncher.findViewById(R.id.drag_layer);
+
+        // Create a view, identical to the drag view, that is only used for animating the
+        // item onto the home screen (or back to its original position, if the drop failed).
+        final int[] pos = new int[2];
+        mDragController.getDragView().getLocationOnScreen(pos);
+        final View animView = dragLayer.createDragView(mDragBitmap, pos[0], pos[1]);
+        animView.setVisibility(View.VISIBLE);
+
+        if (success) {
+            resetCheckedItem(true);
+            animateDropOntoScreen(animView, (ItemInfo) dragInfo, DROP_ANIM_DURATION, 0);
+        } else {
+            // Animate the icon/widget back to its original position
+            animateIntoPosition(animView, mDragViewOrigin[0], mDragViewOrigin[1], new Runnable() {
+                public void run() {
+                   resetCheckedItem(false);
+                   dragLayer.removeView(animView);
+                }
+            });
+        }
         mLauncher.getWorkspace().onDragStopped(success);
         mLauncher.unlockScreenOrientation();
+        mDragBitmap = null;
     }
 
     @Override
     public void onDragViewVisible() {
     }
 
-    class ScaleAlphaInterpolator implements Interpolator {
-        public float getInterpolation(float input) {
-            float pivot = 0.5f;
-            if (input < pivot) {
-                return 0;
-            } else {
-                return (input - pivot)/(1 - pivot);
-            }
-        }
-    }
-
+    /**
+     * Animates the given item onto the center of a home screen, and then scales the item to
+     * look as though it's disappearing onto that screen.
+     */
     private void animateItemOntoScreen(View dragView,
             final CellLayout layout, final ItemInfo info) {
         mTmpFloatPos[0] = layout.getWidth() / 2;
         mTmpFloatPos[1] = layout.getHeight() / 2;
         mLauncher.getWorkspace().mapPointFromChildToSelf(layout, mTmpFloatPos);
 
-        final DragLayer dragLayer = (DragLayer) mLauncher.findViewById(R.id.drag_layer);
-        final View dragCopy = dragLayer.createDragView(dragView);
-        dragCopy.setAlpha(1.0f);
-
         int dragViewWidth = dragView.getMeasuredWidth();
         int dragViewHeight = dragView.getMeasuredHeight();
         float heightOffset = 0;
@@ -374,37 +407,69 @@
                 widthOffset = ANIMATION_SCALE * (dragViewWidth - f * width) / 2;
             }
         }
+        final float toX = mTmpFloatPos[0] - dragView.getMeasuredWidth() / 2 + widthOffset;
+        final float toY = mTmpFloatPos[1] - dragView.getMeasuredHeight() / 2 + heightOffset;
 
-        float toX = mTmpFloatPos[0] - dragView.getMeasuredWidth() / 2 + widthOffset;
-        float toY = mTmpFloatPos[1] - dragView.getMeasuredHeight() / 2 + heightOffset;
+        final DragLayer dragLayer = (DragLayer) mLauncher.findViewById(R.id.drag_layer);
+        final View dragCopy = dragLayer.createDragView(dragView);
+        dragCopy.setAlpha(1.0f);
 
-        ObjectAnimator posAnim = ObjectAnimator.ofPropertyValuesHolder(dragCopy,
-                PropertyValuesHolder.ofFloat("x", toX),
-                PropertyValuesHolder.ofFloat("y", toY));
-        posAnim.setInterpolator(mQuintEaseOutInterpolator);
-        posAnim.setDuration(ANIMATION_DURATION);
+        // Translate the item to the center of the appropriate home screen
+        animateIntoPosition(dragCopy, toX, toY, null);
 
-        posAnim.addListener(new AnimatorListenerAdapter() {
-            public void onAnimationEnd(Animator animation) {
-                dragLayer.removeView(dragCopy);
-                mLauncher.addExternalItemToScreen(info, layout);
-                post(new Runnable() {
-                    public void run() {
-                        layout.animateDrop();
-                    }
-                });
-            }
-        });
+        // The drop-onto-screen animation begins a bit later, but ends at the same time.
+        final int startDelay = TRANSLATE_ANIM_DURATION - DROP_ANIM_DURATION;
+        
+        // Scale down the icon and fade out the alpha
+        animateDropOntoScreen(dragCopy, info, DROP_ANIM_DURATION, startDelay);
+    }
 
-        ObjectAnimator scaleAlphaAnim = ObjectAnimator.ofPropertyValuesHolder(dragCopy,
+    /**
+     * Animation which scales the view down and animates its alpha, making it appear to disappear
+     * onto a home screen.
+     */
+    private void animateDropOntoScreen(
+            final View view, final ItemInfo info, int duration, int delay) {
+        final DragLayer dragLayer = (DragLayer) mLauncher.findViewById(R.id.drag_layer);
+        final CellLayout layout = mLauncher.getWorkspace().getCurrentDropLayout();
+
+        ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(view,
                 PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.0f),
                 PropertyValuesHolder.ofFloat("scaleX", ANIMATION_SCALE),
                 PropertyValuesHolder.ofFloat("scaleY", ANIMATION_SCALE));
-        scaleAlphaAnim.setInterpolator(mScaleAlphaInterpolator);
-        scaleAlphaAnim.setDuration(ANIMATION_DURATION);
+        anim.setInterpolator(new LinearInterpolator());
+        if (delay > 0) {
+            anim.setStartDelay(delay);
+        }
+        anim.setDuration(duration);
+        anim.addListener(new AnimatorListenerAdapter() {
+            public void onAnimationEnd(Animator animation) {
+                dragLayer.removeView(view);
+                mLauncher.addExternalItemToScreen(info, layout);
+            }
+        });
+        anim.start();
+    }
 
-        posAnim.start();
-        scaleAlphaAnim.start();
+    /**
+     * Animates the x,y position of the view, and optionally execute a Runnable on animation end.
+     */
+    private void animateIntoPosition(
+            View view, float toX, float toY, final Runnable endRunnable) {
+        ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(view,
+                PropertyValuesHolder.ofFloat("x", toX),
+                PropertyValuesHolder.ofFloat("y", toY));
+        anim.setInterpolator(mQuintEaseOutInterpolator);
+        anim.setDuration(TRANSLATE_ANIM_DURATION);
+        if (endRunnable != null) {
+            anim.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    endRunnable.run();
+                }
+            });
+        }
+        anim.start();
     }
 
     @Override
@@ -479,12 +544,12 @@
         }
     }
 
-    Bitmap drawableToBitmap(Drawable d, View v, boolean clipHeight) {
-        int height = clipHeight ? v.getPaddingTop() + d.getIntrinsicHeight() : v.getHeight();
-        Bitmap b = Bitmap.createBitmap(v.getWidth(), height, Bitmap.Config.ARGB_8888);
-        Canvas c = new Canvas(b);
-        c.translate((v.getWidth() - d.getIntrinsicWidth()) / 2, v.getPaddingTop());
-        d.draw(c);
+    private Bitmap drawableToBitmap(Drawable d) {
+        final Rect bounds = d.getBounds();
+        final int w = bounds.width();
+        final int h = bounds.height();
+        Bitmap b = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+        renderDrawableToBitmap(d, b, 0, 0, w, h);
         return b;
     }
 
@@ -501,6 +566,7 @@
         if (isChoiceMode(CHOICE_MODE_SINGLE)) {
             endChoiceMode();
         }
+        final Workspace workspace = mLauncher.getWorkspace();
         boolean result = false;
         mLauncher.lockScreenOrientation();
         switch (mCustomizationType) {
@@ -509,50 +575,44 @@
                 // Get the widget preview as the drag representation
                 final LinearLayout l = (LinearLayout) v;
                 final ImageView i = (ImageView) l.findViewById(R.id.widget_preview);
-                Bitmap b = drawableToBitmap(i.getDrawable(), i, true);
+                mDragBitmap = drawableToBitmap(i.getDrawable());
+                i.getLocationOnScreen(mDragViewOrigin);
                 PendingAddWidgetInfo createWidgetInfo = (PendingAddWidgetInfo) v.getTag();
 
-                int[] spanXY = CellLayout.rectToCell(
-                        getResources(), createWidgetInfo.minWidth, createWidgetInfo.minHeight, null);
+                int[] spanXY = CellLayout.rectToCell(getResources(),
+                        createWidgetInfo.minWidth, createWidgetInfo.minHeight, null);
                 createWidgetInfo.spanX = spanXY[0];
                 createWidgetInfo.spanY = spanXY[1];
-                mLauncher.getWorkspace().onDragStartedWithItemSpans(spanXY[0], spanXY[1], b);
-                mDragController.startDrag(
-                        i, b, this, createWidgetInfo, DragController.DRAG_ACTION_COPY, null);
-                b.recycle();
+                workspace.onDragStartedWithItemSpans(spanXY[0], spanXY[1], mDragBitmap);
+                mDragController.startDrag(i, mDragBitmap, this, createWidgetInfo,
+                        DragController.DRAG_ACTION_COPY, null);
                 result = true;
             }
             break;
         }
-        case ShortcutCustomization: {
-            if (v instanceof PagedViewIcon) {
-                // get icon (top compound drawable, index is 1)
-                final TextView tv = (TextView) v;
-                final Drawable icon = tv.getCompoundDrawables()[1];
-                Bitmap b = drawableToBitmap(icon, tv, false);
-                PendingAddItemInfo createItemInfo = (PendingAddItemInfo) v.getTag();
-
-                mLauncher.getWorkspace().onDragStartedWithItemSpans(1, 1, b);
-                mDragController.startDrag(v, b, this, createItemInfo, DragController.DRAG_ACTION_COPY,
-                        null);
-                b.recycle();
-                result = true;
-            }
-            break;
-        }
+        case ShortcutCustomization:
         case ApplicationCustomization: {
             if (v instanceof PagedViewIcon) {
-                // Pick up the application for dropping
                 // get icon (top compound drawable, index is 1)
                 final TextView tv = (TextView) v;
                 final Drawable icon = tv.getCompoundDrawables()[1];
-                Bitmap b = drawableToBitmap(icon, tv, false);
-                ApplicationInfo app = (ApplicationInfo) v.getTag();
-                app = new ApplicationInfo(app);
+                mDragBitmap = drawableToBitmap(icon);
 
-                mLauncher.getWorkspace().onDragStartedWithItemSpans(1, 1, b);
-                mDragController.startDrag(v, b, this, app, DragController.DRAG_ACTION_COPY, null);
-                b.recycle();
+                Object dragInfo = v.getTag();
+                if (mCustomizationType == CustomizationType.ApplicationCustomization) {
+                    // TODO: Not sure why we have to copy this
+                    dragInfo = new ApplicationInfo((ApplicationInfo) dragInfo);
+                }
+                workspace.onDragStartedWithItemSpans(1, 1, mDragBitmap);
+
+                // Calculate where to place the drag view in order to align the icon pixels with
+                // the original view.
+                v.getLocationOnScreen(mDragViewOrigin);
+                mDragViewOrigin[0] += (v.getWidth() - icon.getIntrinsicWidth()) / 2;
+                mDragViewOrigin[1] += v.getPaddingTop();
+
+                mDragController.startDrag(mDragBitmap, mDragViewOrigin[0], mDragViewOrigin[1],
+                        this, dragInfo, DragController.DRAG_ACTION_COPY);
                 result = true;
             }
             break;
@@ -622,8 +682,10 @@
     private void renderDrawableToBitmap(Drawable d, Bitmap bitmap, int x, int y, int w, int h) {
         if (bitmap != null) mCanvas.setBitmap(bitmap);
         mCanvas.save();
-        d.setBounds(x, y, x+w, y+h);
+        final Rect oldBounds = d.copyBounds();
+        d.setBounds(x, y, x + w, y + h);
         d.draw(mCanvas);
+        d.setBounds(oldBounds); // Restore the bounds
         mCanvas.restore();
     }
 
@@ -1047,7 +1109,14 @@
         }
 
         // bound the current page
-        setCurrentPage(Math.max(0, Math.min(childCount - 1, getCurrentPage())));
+        requestLayout();
+        post(new Runnable() {
+            @Override
+            public void run() {
+                setCurrentPage(Math.max(0, Math.min(childCount - 1, getCurrentPage())));
+                forceUpdateAdjacentPagesAlpha();
+            }
+        });
     }
 
     @Override
diff --git a/src/com/android/launcher2/DragController.java b/src/com/android/launcher2/DragController.java
index 45b359d..e546697 100644
--- a/src/com/android/launcher2/DragController.java
+++ b/src/com/android/launcher2/DragController.java
@@ -205,9 +205,7 @@
         int screenX = loc[0];
         int screenY = loc[1];
 
-        startDrag(b, screenX, screenY, 0, 0, b.getWidth(), b.getHeight(),
-                source, dragInfo, dragAction, dragRegion);
-
+        startDrag(b, screenX, screenY, source, dragInfo, dragAction, dragRegion);
         b.recycle();
 
         if (dragAction == DRAG_ACTION_MOVE) {
@@ -236,8 +234,7 @@
         int screenX = loc[0];
         int screenY = loc[1];
 
-        startDrag(bmp, screenX, screenY, 0, 0, bmp.getWidth(), bmp.getHeight(),
-                source, dragInfo, dragAction, dragRegion);
+        startDrag(bmp, screenX, screenY, source, dragInfo, dragAction, dragRegion);
 
         if (dragAction == DRAG_ACTION_MOVE) {
             v.setVisibility(View.GONE);
@@ -251,20 +248,14 @@
      *          enlarged size.
      * @param screenX The x position on screen of the left-top of the bitmap.
      * @param screenY The y position on screen of the left-top of the bitmap.
-     * @param textureLeft The left edge of the region inside b to use.
-     * @param textureTop The top edge of the region inside b to use.
-     * @param textureWidth The width of the region inside b to use.
-     * @param textureHeight The height of the region inside b to use.
      * @param source An object representing where the drag originated
      * @param dragInfo The data associated with the object that is being dragged
      * @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
      *        {@link #DRAG_ACTION_COPY}
      */
     public void startDrag(Bitmap b, int screenX, int screenY,
-            int textureLeft, int textureTop, int textureWidth, int textureHeight,
             DragSource source, Object dragInfo, int dragAction) {
-        startDrag(b, screenX, screenY, textureLeft, textureTop, textureWidth, textureHeight,
-                source, dragInfo, dragAction, null);
+        startDrag(b, screenX, screenY, source, dragInfo, dragAction, null);
     }
 
     /**
@@ -274,10 +265,6 @@
      *          enlarged size.
      * @param screenX The x position on screen of the left-top of the bitmap.
      * @param screenY The y position on screen of the left-top of the bitmap.
-     * @param textureLeft The left edge of the region inside b to use.
-     * @param textureTop The top edge of the region inside b to use.
-     * @param textureWidth The width of the region inside b to use.
-     * @param textureHeight The height of the region inside b to use.
      * @param source An object representing where the drag originated
      * @param dragInfo The data associated with the object that is being dragged
      * @param dragAction The drag action: either {@link #DRAG_ACTION_MOVE} or
@@ -286,7 +273,6 @@
      *          Makes dragging feel more precise, e.g. you can clip out a transparent border
      */
     public void startDrag(Bitmap b, int screenX, int screenY,
-            int textureLeft, int textureTop, int textureWidth, int textureHeight,
             DragSource source, Object dragInfo, int dragAction, Rect dragRegion) {
         if (PROFILE_DRAWING_DURING_DRAG) {
             android.os.Debug.startMethodTracing("Launcher");
@@ -318,7 +304,7 @@
         mVibrator.vibrate(VIBRATE_DURATION);
 
         DragView dragView = mDragView = new DragView(mContext, b, registrationX, registrationY,
-                textureLeft, textureTop, textureWidth, textureHeight);
+                0, 0, b.getWidth(), b.getHeight());
 
         final DragSource dragSource = source;
         dragView.setOnDrawRunnable(new Runnable() {
@@ -400,7 +386,7 @@
     public void cancelDrag() {
         if (mDragging) {
             // Should we also be calling onDragExit() here?
-            mDragSource.onDropCompleted(null, false);
+            mDragSource.onDropCompleted(null, mDragInfo, false);
         }
         endDrag();
     }
@@ -596,14 +582,14 @@
                     (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo)) {
                 dropTarget.onDrop(mDragSource, coordinates[0], coordinates[1],
                         (int) mTouchOffsetX, (int) mTouchOffsetY, mDragView, mDragInfo);
-                mDragSource.onDropCompleted((View) dropTarget, true);
+                mDragSource.onDropCompleted((View) dropTarget, mDragInfo, true);
                 return true;
             } else {
-                mDragSource.onDropCompleted((View) dropTarget, false);
+                mDragSource.onDropCompleted((View) dropTarget, mDragInfo, false);
                 return true;
             }
         } else {
-            mDragSource.onDropCompleted(null, false);
+            mDragSource.onDropCompleted(null, mDragInfo, false);
         }
         return false;
     }
@@ -716,6 +702,10 @@
         mDeleteRegion = region;
     }
 
+    DragView getDragView() {
+        return mDragView;
+    }
+
     private class ScrollRunnable implements Runnable {
         private int mDirection;
 
diff --git a/src/com/android/launcher2/DragSource.java b/src/com/android/launcher2/DragSource.java
index 11cdcc9..4dbdaf7 100644
--- a/src/com/android/launcher2/DragSource.java
+++ b/src/com/android/launcher2/DragSource.java
@@ -31,5 +31,5 @@
      */
     void onDragViewVisible();
 
-    void onDropCompleted(View target, boolean success);
+    void onDropCompleted(View target, Object dragInfo, boolean success);
 }
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java
index cb450b9..059e73d 100644
--- a/src/com/android/launcher2/Folder.java
+++ b/src/com/android/launcher2/Folder.java
@@ -114,7 +114,7 @@
     }
 
     @Override
-    public void onDropCompleted(View target, boolean success) {
+    public void onDropCompleted(View target, Object dragInfo, boolean success) {
     }
 
     @Override
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index df6ff36..7920472 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -88,6 +88,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.WindowManager;
+import android.view.View.OnClickListener;
 import android.view.View.OnLongClickListener;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.DecelerateInterpolator;
@@ -181,7 +182,7 @@
     private static final String TOOLBAR_ICON_METADATA_NAME = "com.android.launcher.toolbar_icon";
 
     /** The different states that Launcher can be in. */
-    private enum State { WORKSPACE, ALL_APPS, CUSTOMIZE, OVERVIEW,
+    private enum State { WORKSPACE, ALL_APPS, CUSTOMIZE,
         CUSTOMIZE_SPRING_LOADED, ALL_APPS_SPRING_LOADED };
     private State mState = State.WORKSPACE;
     private AnimatorSet mStateAnimation;
@@ -217,6 +218,11 @@
     private TabHost mHomeCustomizationDrawer;
     private boolean mAutoAdvanceRunning = false;
 
+    private View mButtonCluster;
+    private View mAllAppsButton;
+    private View mDivider;
+    private View mConfigureButton;
+
     private AllAppsPagedView mAllAppsPagedView = null;
     private CustomizePagedView mCustomizePagedView = null;
 
@@ -274,6 +280,8 @@
     private static Drawable.ConstantState sVoiceSearchIcon;
     private static Drawable.ConstantState sAppMarketIcon;
 
+    private BubbleTextView mWaitingForResume;
+
     private CustomizationType getCustomizeFilterForTabTag(String tag) {
         if (tag.equals(WIDGETS_TAG)) {
             return CustomizationType.WidgetCustomization;
@@ -755,6 +763,9 @@
             mRestoring = false;
             mOnResumeNeedsLoad = false;
         }
+        if (mWaitingForResume != null) {
+            mWaitingForResume.setStayPressed(false);
+        }
         // When we resume Launcher, a different Activity might be responsible for the app
         // market intent, so refresh the icon
         updateAppMarketIcon();
@@ -1043,6 +1054,36 @@
         if (allAppsDeleteZone != null) {
             dragController.addDropTarget(allAppsDeleteZone);
         }
+        mButtonCluster = findViewById(R.id.all_apps_button_cluster);
+
+        mAllAppsButton = findViewById(R.id.all_apps_button);
+        mDivider = findViewById(R.id.divider);
+        mConfigureButton = findViewById(R.id.configure_button);
+
+        // We had previously set these click handlers in XML, but the first time we launched
+        // Configure or All Apps we had an extra 50ms of delay while the java reflection methods
+        // found the right handler. Setting the handlers directly here eliminates that cost.
+        if (mConfigureButton != null) {
+            mConfigureButton.setOnClickListener(new OnClickListener() {
+                public void onClick(View v) {
+                    onClickConfigureButton(v);
+                }
+            });
+        }
+        if (mDivider != null) {
+            mDivider.setOnClickListener(new OnClickListener() {
+                public void onClick(View v) {
+                    onClickAllAppsButton(v);
+                }
+            });
+        }
+        if (mAllAppsButton != null) {
+            mAllAppsButton.setOnClickListener(new OnClickListener() {
+                public void onClick(View v) {
+                    onClickAllAppsButton(v);
+                }
+            });
+        }
     }
 
     @SuppressWarnings({"UnusedDeclaration"})
@@ -1402,16 +1443,14 @@
             boolean alreadyOnHome = ((intent.getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
                         != Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
 
-            // in all these cases, only animate if we're already on home
+            // In all these cases, only animate if we're already on home
+
             if (LauncherApplication.isScreenXLarge()) {
                 mWorkspace.unshrink(alreadyOnHome);
             }
-            if (!mWorkspace.isDefaultPageShowing()) {
-                // on the phone, we don't animate the change to the workspace if all apps is visible
-                boolean animate = alreadyOnHome &&
-                    (LauncherApplication.isScreenXLarge() || mState != State.ALL_APPS);
-                mWorkspace.moveToDefaultScreen(animate);
-                if (!animate) mWorkspace.updateWallpaperOffsetImmediately();
+
+            if (alreadyOnHome && mState == State.WORKSPACE && !mWorkspace.isDefaultPageShowing()) {
+                mWorkspace.moveToDefaultScreen(true);
             }
             showWorkspace(alreadyOnHome);
 
@@ -1971,7 +2010,9 @@
      * Re-listen when widgets are reset.
      */
     private void onAppWidgetReset() {
-        mAppWidgetHost.startListening();
+        if (mAppWidgetHost != null) {
+            mAppWidgetHost.startListening();
+        }
     }
 
     /**
@@ -1999,7 +2040,12 @@
             v.getLocationOnScreen(pos);
             intent.setSourceBounds(new Rect(pos[0], pos[1],
                     pos[0] + v.getWidth(), pos[1] + v.getHeight()));
-            startActivitySafely(intent, tag);
+            boolean success = startActivitySafely(intent, tag);
+
+            if (success && v instanceof BubbleTextView) {
+                mWaitingForResume = (BubbleTextView) v;
+                mWaitingForResume.setStayPressed(true);
+            }
         } else if (tag instanceof FolderInfo) {
             handleFolderClick((FolderInfo) tag);
         } else if (v == mHandleView) {
@@ -2092,10 +2138,11 @@
         }
     }
 
-    void startActivitySafely(Intent intent, Object tag) {
+    boolean startActivitySafely(Intent intent, Object tag) {
         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         try {
             startActivity(intent);
+            return true;
         } catch (ActivityNotFoundException e) {
             Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show();
             Log.e(TAG, "Unable to launch. tag=" + tag + " intent=" + intent, e);
@@ -2106,6 +2153,7 @@
                     "or use the exported attribute for this activity. "
                     + "tag="+ tag + " intent=" + intent, e);
         }
+        return false;
     }
 
     void startActivityForResultSafely(Intent intent, int requestCode) {
@@ -2379,6 +2427,10 @@
         return mWorkspace;
     }
 
+    TabHost getCustomizationDrawer() {
+        return mHomeCustomizationDrawer;
+    }
+
     @Override
     protected Dialog onCreateDialog(int id) {
         switch (id) {
@@ -2536,7 +2588,7 @@
         }
     }
     
-    private void showToolbarButton(View button) {
+    private void showAndEnableToolbarButton(View button) {
         button.setVisibility(View.VISIBLE);
         button.setFocusable(true);
         button.setClickable(true);
@@ -2546,6 +2598,9 @@
         button.setAlpha(0.0f);
         // We can't set it to GONE, otherwise the RelativeLayout gets screwed up
         button.setVisibility(View.INVISIBLE);
+    }
+
+    private void disableToolbarButton(View button) {
         button.setFocusable(false);
         button.setClickable(false);
     }
@@ -2567,12 +2622,18 @@
                 getResources().getInteger(R.integer.config_toolbarButtonFadeOutTime);
 
         if (seq != null) {
-            Animator anim = ObjectAnimator.ofFloat(view, "alpha", show ? 1.0f : 0.0f);
+            ValueAnimator anim = ValueAnimator.ofFloat(view.getAlpha(), show ? 1.0f : 0.0f);
             anim.setDuration(duration);
+            anim.addUpdateListener(new AnimatorUpdateListener() {
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    view.setAlpha((Float) animation.getAnimatedValue());
+                }
+            });
             anim.addListener(new AnimatorListenerAdapter() {
                 @Override
                 public void onAnimationStart(Animator animation) {
-                    if (showing) showToolbarButton(view);
+                    if (showing) showAndEnableToolbarButton(view);
+                    if (hiding) disableToolbarButton(view);
                 }
                 @Override
                 public void onAnimationEnd(Animator animation) {
@@ -2582,9 +2643,10 @@
             seq.play(anim);
         } else {
             if (showing) {
-                showToolbarButton(view);
+                showAndEnableToolbarButton(view);
                 view.setAlpha(1f);
             } else {
+                disableToolbarButton(view);
                 hideToolbarButton(view);
             }
         }
@@ -2599,26 +2661,21 @@
      * @param hideSeq AnimatorSet in which to put "hide" animations, or null.
      */
     private void hideAndShowToolbarButtons(State newState, AnimatorSet showSeq, AnimatorSet hideSeq) {
-        final View buttonCluster = findViewById(R.id.all_apps_button_cluster);
-
-        final View allAppsButton = findViewById(R.id.all_apps_button);
-        final View divider = findViewById(R.id.divider);
-        final View configureButton = findViewById(R.id.configure_button);
-
         switch (newState) {
         case WORKSPACE:
-            hideOrShowToolbarButton(true, buttonCluster, showSeq);
-            mDeleteZone.setOverlappingViews(new View[] { allAppsButton, divider, configureButton });
+            hideOrShowToolbarButton(true, mButtonCluster, showSeq);
+            mDeleteZone.setOverlappingViews(
+                    new View[] { mAllAppsButton, mDivider, mConfigureButton });
             mDeleteZone.setDragAndDropEnabled(true);
             mDeleteZone.setText(getResources().getString(R.string.delete_zone_label_workspace));
             break;
         case ALL_APPS:
-            hideOrShowToolbarButton(false, buttonCluster, hideSeq);
+            hideOrShowToolbarButton(false, mButtonCluster, hideSeq);
             mDeleteZone.setDragAndDropEnabled(false);
             mDeleteZone.setText(getResources().getString(R.string.delete_zone_label_all_apps));
             break;
         case CUSTOMIZE:
-            hideOrShowToolbarButton(false, buttonCluster, hideSeq);
+            hideOrShowToolbarButton(false, mButtonCluster, hideSeq);
             mDeleteZone.setDragAndDropEnabled(false);
             break;
         }
@@ -2847,94 +2904,13 @@
         }
     }
 
-    /**
-     * Pan the camera in the vertical plane between 'fromView' and 'toView'.
-     * This is the transition used on xlarge screens to go between all apps and
-     * the home customization drawer.
-     * @param fromState The view to pan away from. Must be ALL_APPS or CUSTOMIZE.
-     * @param toState The view to pan into the frame. Must be ALL_APPS or CUSTOMIZE.
-     * @param animated If true, the transition will be animated.
-     */
-    private void cameraPan(State fromState, State toState, boolean animated) {
-        final Resources res = getResources();
-        final int duration = res.getInteger(R.integer.config_allAppsCameraPanTime);
-        final int workspaceHeight = mWorkspace.getHeight();
-
-        final boolean fromAllApps = (fromState == State.ALL_APPS);
-        final View fromView = fromAllApps ? (View) mAllAppsGrid : mHomeCustomizationDrawer;
-        final View toView = fromAllApps ? mHomeCustomizationDrawer : (View) mAllAppsGrid;
-
-        final float fromViewStartY = fromAllApps ? 0.0f : fromView.getY();
-        final float fromViewEndY = fromAllApps ? -fromView.getHeight() * 2 : workspaceHeight * 2;
-        final float toViewStartY = fromAllApps ? workspaceHeight * 2 : -toView.getHeight() * 2;
-        final float toViewEndY = fromAllApps ? workspaceHeight - toView.getHeight() : 0.0f;
-
-        mCustomizePagedView.endChoiceMode();
-        mAllAppsPagedView.endChoiceMode();
-
-        if (toState == State.ALL_APPS) {
-            mWorkspace.shrink(Workspace.ShrinkState.BOTTOM_HIDDEN, animated);
-        } else {
-            mWorkspace.shrink(Workspace.ShrinkState.TOP, animated);
-        }
-
-        if (animated) {
-            if (mStateAnimation != null) mStateAnimation.cancel();
-            mStateAnimation = new AnimatorSet();
-            mStateAnimation.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationStart(Animator animation) {
-                    toView.setVisibility(View.VISIBLE);
-                    toView.setY(toViewStartY);
-                    toView.setAlpha(1.0f);
-                }
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    fromView.setVisibility(View.GONE);
-                }
-            });
-
-            AnimatorSet toolbarHideAnim = new AnimatorSet();
-            AnimatorSet toolbarShowAnim = new AnimatorSet();
-            hideAndShowToolbarButtons(toState, toolbarShowAnim, toolbarHideAnim);
-
-            ObjectAnimator fromAnim = ObjectAnimator.ofFloat(fromView, "y",
-                    fromViewStartY, fromViewEndY);
-            fromAnim.setDuration(duration);
-            ObjectAnimator toAnim = ObjectAnimator.ofPropertyValuesHolder(toView,
-                    PropertyValuesHolder.ofFloat("y", toViewStartY, toViewEndY),
-                    PropertyValuesHolder.ofFloat("scaleX", toView.getScaleX(), 1.0f),
-                    PropertyValuesHolder.ofFloat("scaleY", toView.getScaleY(), 1.0f)
-                    );
-            fromAnim.setDuration(duration);
-            mStateAnimation.playTogether(toolbarHideAnim, fromAnim, toAnim);
-
-            // Show the new toolbar buttons just as the main animation is ending
-            final int fadeInTime = res.getInteger(R.integer.config_toolbarButtonFadeInTime);
-            mStateAnimation.play(toolbarShowAnim).after(duration - fadeInTime);
-            mStateAnimation.start();
-        } else {
-            fromView.setY(fromViewEndY);
-            fromView.setVisibility(View.GONE);
-            toView.setY(toViewEndY);
-            toView.setScaleX(1.0f);
-            toView.setScaleY(1.0f);
-            toView.setVisibility(View.VISIBLE);
-            hideAndShowToolbarButtons(toState, null, null);
-        }
-    }
-
     void showAllApps(boolean animated) {
-        if (mState == State.ALL_APPS) {
+        if (mState != State.WORKSPACE) {
             return;
         }
 
         if (LauncherApplication.isScreenXLarge()) {
-            if (mState == State.CUSTOMIZE) {
-                cameraPan(State.CUSTOMIZE, State.ALL_APPS, animated);
-            } else {
-                cameraZoomOut(State.ALL_APPS, animated);
-            }
+            cameraZoomOut(State.ALL_APPS, animated);
         } else {
             mAllAppsGrid.zoom(1.0f, animated);
         }
@@ -3074,11 +3050,12 @@
 
     // Show the customization drawer (only exists in x-large configuration)
     private void showCustomizationDrawer(boolean animated) {
-        if (mState == State.ALL_APPS) {
-            cameraPan(State.ALL_APPS, State.CUSTOMIZE, animated);
-        } else {
-            cameraZoomOut(State.CUSTOMIZE, animated);
+        if (mState != State.WORKSPACE) {
+            return;
         }
+
+        cameraZoomOut(State.CUSTOMIZE, animated);
+
         // Change the state *after* we've called all the transition code
         mState = State.CUSTOMIZE;
 
@@ -3094,9 +3071,15 @@
         }
     }
 
-    void addExternalItemToScreen(ItemInfo itemInfo, CellLayout layout) {
+    /**
+     * Add an item from all apps or customize onto the given workspace screen.
+     * If layout is null, add to the current screen.
+     */
+    void addExternalItemToScreen(ItemInfo itemInfo, final CellLayout layout) {
         if (!mWorkspace.addExternalItemToScreen(itemInfo, layout)) {
             showOutOfSpaceMessage();
+        } else {
+            layout.animateDrop();
         }
     }
 
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 0052737..2364174 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -44,6 +44,7 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
+import android.os.Environment;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Parcelable;
@@ -65,6 +66,7 @@
     static final String TAG = "Launcher.Model";
 
     private static final int ITEMS_CHUNK = 6; // batch size for the workspace icons
+    private final boolean mAppsCanBeOnExternalStorage;
     private int mBatchSize; // 0 is all apps at once
     private int mAllAppsLoadDelay; // milliseconds between batches
 
@@ -115,6 +117,7 @@
     }
 
     LauncherModel(LauncherApplication app, IconCache iconCache) {
+        mAppsCanBeOnExternalStorage = !Environment.isExternalStorageEmulated();
         mApp = app;
         mAllAppsList = new AllAppsList(iconCache);
         mIconCache = iconCache;
@@ -794,8 +797,6 @@
                             }
 
                             if (info != null) {
-                                updateSavedIcon(context, info, c, iconIndex);
-
                                 info.intent = intent;
                                 info.id = c.getLong(idIndex);
                                 container = c.getInt(containerIndex);
@@ -820,6 +821,10 @@
                                     folderInfo.add(info);
                                     break;
                                 }
+
+                                // now that we've loaded everthing re-save it with the
+                                // icon in case it disappears somehow.
+                                updateSavedIcon(context, info, c, iconIndex);
                             } else {
                                 // Failed to load the shortcut, probably because the
                                 // activity manager couldn't resolve it (maybe the app
@@ -1669,6 +1674,10 @@
     }
 
     void updateSavedIcon(Context context, ShortcutInfo info, Cursor c, int iconIndex) {
+        // If apps can't be on SD, don't even bother.
+        if (!mAppsCanBeOnExternalStorage) {
+            return;
+        }
         // If this icon doesn't have a custom icon, check to see
         // what's stored in the DB, and if it doesn't match what
         // we're going to show, store what we are going to show back
@@ -1691,9 +1700,8 @@
             }
             if (needSave) {
                 Log.d(TAG, "going to save icon bitmap for info=" + info);
-                // This is slower than is ideal, but this only happens either
-                // after the froyo OTA or when the app is updated with a new
-                // icon.
+                // This is slower than is ideal, but this only happens once
+                // or when the app is updated with a new icon.
                 updateItemInDatabase(context, info);
             }
         }
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index e4cdd59..4152104 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -61,6 +61,7 @@
     private static final float OVERSCROLL_DAMP_FACTOR = 0.08f;
     private static final int MINIMUM_SNAP_VELOCITY = 2200;
     private static final int MIN_FLING_VELOCITY = 250;
+    private static final float RETURN_TO_ORIGINAL_PAGE_THRESHOLD = 0.33f;
 
     // the velocity at which a fling gesture will cause us to snap to the next page
     protected int mSnapVelocity = 500;
@@ -81,6 +82,7 @@
     protected float mLastMotionX;
     protected float mLastMotionXRemainder;
     protected float mLastMotionY;
+    protected float mTotalMotionX;
     private int mLastScreenCenter = -1;
 
     protected final static int TOUCH_STATE_REST = 0;
@@ -498,6 +500,11 @@
         }
     }
 
+    protected void forceUpdateAdjacentPagesAlpha() {
+        mDirtyPageAlpha = true;
+        updateAdjacentPagesAlpha();
+    }
+
     protected void updateAdjacentPagesAlpha() {
         if (mFadeInAdjacentScreens) {
             if (mDirtyPageAlpha || (mTouchState == TOUCH_STATE_SCROLLING) || !mScroller.isFinished()) {
@@ -544,6 +551,11 @@
                         alpha = 1.0f;
                     }
 
+                    // Due to the way we're setting alpha on our children in PagedViewCellLayout,
+                    // this optimization causes alpha to not be properly updated sometimes (repro
+                    // case: in xlarge mode, swipe to second page in All Apps, then click on "My
+                    // Apps" tab. the page will have alpha 0 until you swipe it). Removing
+                    // optimization fixes the issue, but we should fix this in a better manner
                     //if (Float.compare(alpha, layout.getAlpha()) != 0) {
                         layout.setAlpha(alpha);
                     //}
@@ -596,21 +608,7 @@
             canvas.clipRect(mScrollX, mScrollY, mScrollX + mRight - mLeft,
                     mScrollY + mBottom - mTop);
 
-            for (int i = 0; i < pageCount; i++) {
-                View child = getChildAt(i);
-                if (child != null && child instanceof PagedViewCellLayout) {
-                    boolean willBeDrawn = i >= leftScreen && i <= rightScreen;
-                    if (!willBeDrawn) {
-                        ((PagedViewCellLayout)child).destroyHardwareLayers();
-                    }
-                }
-            }
-
             for (int i = leftScreen; i <= rightScreen; i++) {
-                View child = getChildAt(i);
-                if (child != null && child instanceof PagedViewCellLayout) {
-                    ((PagedViewCellLayout)child).createHardwareLayers();
-                }
                 drawChild(canvas, getChildAt(i), drawingTime);
             }
             canvas.restore();
@@ -777,6 +775,7 @@
                 mLastMotionX = x;
                 mLastMotionY = y;
                 mLastMotionXRemainder = 0;
+                mTotalMotionX = 0;
                 mActivePointerId = ev.getPointerId(0);
                 mAllowLongPress = true;
 
@@ -952,6 +951,7 @@
             // Remember where the motion event started
             mDownMotionX = mLastMotionX = ev.getX();
             mLastMotionXRemainder = 0;
+            mTotalMotionX = 0;
             mActivePointerId = ev.getPointerId(0);
             if (mTouchState == TOUCH_STATE_SCROLLING) {
                 pageBeginMoving();
@@ -965,6 +965,8 @@
                 final float x = ev.getX(pointerIndex);
                 final float deltaX = mLastMotionX + mLastMotionXRemainder - x;
 
+                mTotalMotionX += Math.abs(deltaX);
+
                 // Only scroll and update mLastMotionX if we have moved some discrete amount.  We
                 // keep the remainder because we are actually testing if we've moved from the last
                 // scrolled position (which is discrete).
@@ -995,17 +997,37 @@
                 velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
                 int velocityX = (int) velocityTracker.getXVelocity(activePointerId);
                 final int deltaX = (int) (x - mDownMotionX);
-                boolean isfling = Math.abs(deltaX) > MIN_LENGTH_FOR_FLING;
                 boolean isSignificantMove = Math.abs(deltaX) > MIN_LENGTH_FOR_MOVE;
-
                 final int snapVelocity = mSnapVelocity;
-                if ((isSignificantMove && deltaX > 0 ||
-                        (isfling && velocityX > snapVelocity)) && mCurrentPage > 0) {
-                    snapToPageWithVelocity(mCurrentPage - 1, velocityX);
-                } else if ((isSignificantMove && deltaX < 0 ||
-                        (isfling && velocityX < -snapVelocity)) &&
+
+                mTotalMotionX += Math.abs(mLastMotionX + mLastMotionXRemainder - x);
+
+                // In the case that the page is moved far to one direction and then is flung
+                // in the opposite direction, we use a threshold to determine whether we should
+                // just return to the starting page, or if we should skip one further.
+                boolean returnToOriginalPage = false;
+                final int pageWidth = getScaledMeasuredWidth(getChildAt(mCurrentPage));
+                if (Math.abs(deltaX) > pageWidth * RETURN_TO_ORIGINAL_PAGE_THRESHOLD &&
+                        Math.signum(velocityX) != Math.signum(deltaX)) {
+                    returnToOriginalPage = true;
+                }
+
+                boolean isFling = mTotalMotionX > MIN_LENGTH_FOR_FLING &&
+                        Math.abs(velocityX) > snapVelocity;
+
+                int finalPage;
+                // We give flings precedence over large moves, which is why we short-circuit our
+                // test for a large move if a fling has been registered. That is, a large
+                // move to the left and fling to the right will register as a fling to the right.
+                if (((isSignificantMove && deltaX > 0 && !isFling) ||
+                        (isFling && velocityX > 0)) && mCurrentPage > 0) {
+                    finalPage = returnToOriginalPage ? mCurrentPage : mCurrentPage - 1;
+                    snapToPageWithVelocity(finalPage, velocityX);
+                } else if (((isSignificantMove && deltaX < 0 && !isFling) ||
+                        (isFling && velocityX < 0)) &&
                         mCurrentPage < getChildCount() - 1) {
-                    snapToPageWithVelocity(mCurrentPage + 1, velocityX);
+                    finalPage = returnToOriginalPage ? mCurrentPage : mCurrentPage + 1;
+                    snapToPageWithVelocity(finalPage, velocityX);
                 } else {
                     snapToDestination();
                 }
diff --git a/src/com/android/launcher2/PagedViewCellLayout.java b/src/com/android/launcher2/PagedViewCellLayout.java
index d64f3c9..57d41fa 100644
--- a/src/com/android/launcher2/PagedViewCellLayout.java
+++ b/src/com/android/launcher2/PagedViewCellLayout.java
@@ -141,6 +141,7 @@
     public void removeAllViewsOnPage() {
         mChildren.removeAllViews();
         mHolographicChildren.removeAllViews();
+        destroyHardwareLayers();
     }
 
     @Override
diff --git a/src/com/android/launcher2/PagedViewIcon.java b/src/com/android/launcher2/PagedViewIcon.java
index 1366619..9c5d126 100644
--- a/src/com/android/launcher2/PagedViewIcon.java
+++ b/src/com/android/launcher2/PagedViewIcon.java
@@ -243,8 +243,7 @@
         return mIsChecked;
     }
 
-    @Override
-    public void setChecked(boolean checked) {
+    void setChecked(boolean checked, boolean animate) {
         if (mIsChecked != checked) {
             mIsChecked = checked;
 
@@ -262,15 +261,24 @@
             if (mCheckedAlphaAnimator != null) {
                 mCheckedAlphaAnimator.cancel();
             }
-            mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha);
-            mCheckedAlphaAnimator.setDuration(duration);
-            mCheckedAlphaAnimator.start();
+            if (animate) {
+                mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha);
+                mCheckedAlphaAnimator.setDuration(duration);
+                mCheckedAlphaAnimator.start();
+            } else {
+                setAlpha(alpha);
+            }
 
             invalidate();
         }
     }
 
     @Override
+    public void setChecked(boolean checked) {
+        setChecked(checked, true);
+    }
+
+    @Override
     public void toggle() {
         setChecked(!mIsChecked);
     }
diff --git a/src/com/android/launcher2/PagedViewWidget.java b/src/com/android/launcher2/PagedViewWidget.java
index 9b83f48..07b215d 100644
--- a/src/com/android/launcher2/PagedViewWidget.java
+++ b/src/com/android/launcher2/PagedViewWidget.java
@@ -257,8 +257,7 @@
         sWorker.removeMessages(MESSAGE_CREATE_HOLOGRAPHIC_OUTLINE, this);
     }
 
-    @Override
-    public void setChecked(boolean checked) {
+    void setChecked(boolean checked, boolean animate) {
         if (mIsChecked != checked) {
             mIsChecked = checked;
 
@@ -276,15 +275,24 @@
             if (mCheckedAlphaAnimator != null) {
                 mCheckedAlphaAnimator.cancel();
             }
-            mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha);
-            mCheckedAlphaAnimator.setDuration(duration);
-            mCheckedAlphaAnimator.start();
+            if (animate) {
+                mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha);
+                mCheckedAlphaAnimator.setDuration(duration);
+                mCheckedAlphaAnimator.start();
+            } else {
+                setAlpha(alpha);
+            }
 
             invalidate();
         }
     }
 
     @Override
+    public void setChecked(boolean checked) {
+        setChecked(checked, true);
+    }
+
+    @Override
     public boolean isChecked() {
         return mIsChecked;
     }
diff --git a/src/com/android/launcher2/UserFolder.java b/src/com/android/launcher2/UserFolder.java
index b362fbd..251b3f9 100644
--- a/src/com/android/launcher2/UserFolder.java
+++ b/src/com/android/launcher2/UserFolder.java
@@ -64,7 +64,7 @@
     }
 
     @Override
-    public void onDropCompleted(View target, boolean success) {
+    public void onDropCompleted(View target, Object dragInfo, boolean success) {
         if (success) {
             ShortcutsAdapter adapter = (ShortcutsAdapter)mContent.getAdapter();
             adapter.remove(mDragItem);
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 0daed37..fe54ae7 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -23,7 +23,6 @@
 import android.animation.AnimatorListenerAdapter;
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
-import android.animation.PropertyValuesHolder;
 import android.animation.TimeInterpolator;
 import android.animation.ValueAnimator;
 import android.animation.Animator.AnimatorListener;
@@ -62,6 +61,8 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.DecelerateInterpolator;
+import android.widget.TabHost;
+import android.widget.TabWidget;
 import android.widget.TextView;
 import android.widget.Toast;
 
@@ -108,8 +109,8 @@
     private float mChildrenOutlineAlpha = 0;
 
     // These properties refer to the background protection gradient used for AllApps and Customize
-    private ObjectAnimator mBackgroundFadeInAnimation;
-    private ObjectAnimator mBackgroundFadeOutAnimation;
+    private ValueAnimator mBackgroundFadeInAnimation;
+    private ValueAnimator mBackgroundFadeOutAnimation;
     private Drawable mBackground;
     private Drawable mCustomizeTrayBackground;
     private boolean mDrawCustomizeTrayBackground;
@@ -224,9 +225,6 @@
     final static float MAX_SWIPE_ANGLE = (float) Math.PI / 3;
     final static float TOUCH_SLOP_DAMPING_FACTOR = 4;
 
-    int mSpringLoadedDropX;
-    int mSpringLoadedDropY;
-
     /**
      * Used to inflate the Workspace from XML.
      *
@@ -265,6 +263,9 @@
         setHapticFeedbackEnabled(false);
 
         initWorkspace();
+
+        // Disable multitouch across the workspace/all apps/customize tray
+        setMotionEventSplittingEnabled(true);
     }
 
     /**
@@ -938,7 +939,12 @@
         if (mBackground == null) return;
         if (mBackgroundFadeOutAnimation != null) mBackgroundFadeOutAnimation.cancel();
         if (mBackgroundFadeInAnimation != null) mBackgroundFadeInAnimation.cancel();
-        mBackgroundFadeInAnimation = ObjectAnimator.ofFloat(this, "backgroundAlpha", 1.0f);
+        mBackgroundFadeInAnimation = ValueAnimator.ofFloat(getBackgroundAlpha(), 1f);
+        mBackgroundFadeInAnimation.addUpdateListener(new AnimatorUpdateListener() {
+            public void onAnimationUpdate(ValueAnimator animation) {
+                setBackgroundAlpha(((Float) animation.getAnimatedValue()).floatValue());
+            }
+        });
         mBackgroundFadeInAnimation.setInterpolator(new DecelerateInterpolator(1.5f));
         mBackgroundFadeInAnimation.setDuration(BACKGROUND_FADE_IN_DURATION);
         mBackgroundFadeInAnimation.start();
@@ -948,7 +954,12 @@
         if (mBackground == null) return;
         if (mBackgroundFadeInAnimation != null) mBackgroundFadeInAnimation.cancel();
         if (mBackgroundFadeOutAnimation != null) mBackgroundFadeOutAnimation.cancel();
-        mBackgroundFadeOutAnimation = ObjectAnimator.ofFloat(this, "backgroundAlpha", 0.0f);
+        mBackgroundFadeOutAnimation = ValueAnimator.ofFloat(getBackgroundAlpha(), 0f);
+        mBackgroundFadeOutAnimation.addUpdateListener(new AnimatorUpdateListener() {
+            public void onAnimationUpdate(ValueAnimator animation) {
+                setBackgroundAlpha(((Float) animation.getAnimatedValue()).floatValue());
+            }
+        });
         mBackgroundFadeOutAnimation.setInterpolator(new DecelerateInterpolator(1.5f));
         mBackgroundFadeOutAnimation.setDuration(BACKGROUND_FADE_OUT_DURATION);
         mBackgroundFadeOutAnimation.start();
@@ -1317,6 +1328,19 @@
         shrink(shrinkState, true);
     }
 
+    private int getCustomizeDrawerHeight() {
+        TabHost customizationDrawer = mLauncher.getCustomizationDrawer();
+        int height = customizationDrawer.getHeight();
+        TabWidget tabWidget = (TabWidget)
+            customizationDrawer.findViewById(com.android.internal.R.id.tabs);
+        if (tabWidget.getTabCount() > 0) {
+            TextView tabText = (TextView) tabWidget.getChildTabViewAt(0);
+            // subtract the empty space above the tab text
+            height -= ((tabWidget.getHeight() - tabText.getLineHeight())) / 2;
+        }
+        return height;
+    }
+
     // we use this to shrink the workspace for the all apps view and the customize view
     public void shrink(ShrinkState shrinkState, boolean animated) {
         // In the launcher interaction model, we're never in the state where we're shrunken and
@@ -1393,9 +1417,7 @@
             y = screenHeight / 2 - scaledPageHeight / 2;
             finalAlpha = 1.0f;
         } else if (shrinkState == ShrinkState.TOP) {
-            y = (isPortrait ?
-                getResources().getDimension(R.dimen.customizeSmallScreenVerticalMarginPortrait) :
-                getResources().getDimension(R.dimen.customizeSmallScreenVerticalMarginLandscape));
+            y = (screenHeight - getCustomizeDrawerHeight() - scaledPageHeight) / 2;
         }
 
         int duration;
@@ -1517,9 +1539,13 @@
             final float newVerticalWallpaperOffset = wallpaperOffset;
             animWithInterpolator.addUpdateListener(new AnimatorUpdateListener() {
                 public void onAnimationUpdate(ValueAnimator animation) {
-                    fastInvalidate();
                     final float b = (Float) animation.getAnimatedValue();
                     final float a = 1f - b;
+                    if (b == 0f) {
+                        // an optimization, and required for correct behavior.
+                        return;
+                    }
+                    fastInvalidate();
                     setHorizontalWallpaperOffset(
                             a * oldHorizontalWallpaperOffset + b * newHorizontalWallpaperOffset);
                     setVerticalWallpaperOffset(
@@ -1847,9 +1873,13 @@
                 final float newVerticalWallpaperOffset = 0.5f;
                 animWithInterpolator.addUpdateListener(new AnimatorUpdateListener() {
                     public void onAnimationUpdate(ValueAnimator animation) {
-                        fastInvalidate();
                         final float b = (Float) animation.getAnimatedValue();
                         final float a = 1f - b;
+                        if (b == 0f) {
+                            // an optimization, but not required
+                            return;
+                        }
+                        fastInvalidate();
                         setHorizontalWallpaperOffset(
                                 a * oldHorizontalWallpaperOffset + b * newHorizontalWallpaperOffset);
                         setVerticalWallpaperOffset(
@@ -1880,6 +1910,10 @@
                         // don't invalidate workspace because we did it above
                         final float b = (Float) animation.getAnimatedValue();
                         final float a = 1f - b;
+                        if (b == 0f) {
+                            // an optimization, but not required
+                            return;
+                        }
                         for (int i = 0; i < screenCount; i++) {
                             final CellLayout cl = (CellLayout) getChildAt(i);
                             cl.setFastRotationY(a * oldRotationYs[i] + b * newRotationYs[i]);
@@ -2051,8 +2085,8 @@
         final int screenX = (int) mTempXY[0] + (child.getWidth() - bmpWidth) / 2;
         final int screenY = (int) mTempXY[1] + (child.getHeight() - bmpHeight) / 2;
         mLauncher.lockScreenOrientation();
-        mDragController.startDrag(b, screenX, screenY, 0, 0, bmpWidth, bmpHeight, this,
-                child.getTag(), DragController.DRAG_ACTION_MOVE, null);
+        mDragController.startDrag(
+                b, screenX, screenY, this, child.getTag(), DragController.DRAG_ACTION_MOVE);
         b.recycle();
     }
 
@@ -2180,9 +2214,9 @@
 
     public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset,
             DragView dragView, Object dragInfo) {
-
-        int originX = x - xOffset;
-        int originY = y - yOffset;
+        boolean largeOrSpringLoaded = !mIsSmall || mWasSpringLoadedOnDragExit;
+        int originX = largeOrSpringLoaded ? x - xOffset : x - xOffset + dragView.getWidth() / 2;
+        int originY = largeOrSpringLoaded ? y - yOffset : y - yOffset + dragView.getHeight() / 2;
 
         if (mIsSmall || mIsInUnshrinkAnimation) {
             // get originX and originY in the local coordinate system of the screen
@@ -2191,6 +2225,10 @@
             mapPointFromSelfToChild(mDragTargetLayout, mTempOriginXY);
             originX = (int)mTempOriginXY[0];
             originY = (int)mTempOriginXY[1];
+            if (!largeOrSpringLoaded) {
+               originX -= mDragTargetLayout.getCellWidth() / 2;
+               originY -= mDragTargetLayout.getCellHeight() / 2;
+            }
         }
 
         // When you are in customization mode and drag to a particular screen, make that the
@@ -2203,13 +2241,12 @@
         }
 
         if (source != this) {
-            if (!mIsSmall || mWasSpringLoadedOnDragExit) {
-                onDropExternal(originX, originY, dragInfo, mDragTargetLayout, false);
-            } else {
-                // if we drag and drop to small screens, don't pass the touch x/y coords (when we
-                // enable spring-loaded adding, however, we do want to pass the touch x/y coords)
-                onDropExternal(-1, -1, dragInfo, mDragTargetLayout, false);
+            if ((mIsSmall || mIsInUnshrinkAnimation) && !mLauncher.isAllAppsVisible()) {
+                // When the workspace is shrunk and the drop comes from customize, don't actually
+                // add the item to the screen -- customize will do this itself
+                return;
             }
+            onDropExternal(new int[] { originX, originY }, dragInfo, mDragTargetLayout, false);
         } else if (mDragInfo != null) {
             final View cell = mDragInfo.cell;
             CellLayout dropTargetLayout = mDragTargetLayout;
@@ -2418,7 +2455,7 @@
                 if (isShortcut) {
                     final Intent intent = data.getItemAt(index).getIntent();
                     Object info = model.infoFromShortcutIntent(mContext, intent, data.getIcon());
-                    onDropExternal(x, y, info, layout, false);
+                    onDropExternal(new int[] { x, y }, info, layout, false);
                 } else {
                     if (widgets.size() == 1) {
                         // If there is only one item, then go ahead and add and configure
@@ -2681,8 +2718,6 @@
                     final View child = (mDragInfo == null) ? null : mDragInfo.cell;
                     float[] localOrigin = { originX, originY };
                     mapPointFromSelfToChild(mDragTargetLayout, localOrigin, null);
-                    mSpringLoadedDropX = (int) localOrigin[0];
-                    mSpringLoadedDropY = (int) localOrigin[1];
                     mDragTargetLayout.visualizeDropLocation(child, mDragOutline,
                             (int) localOrigin[0], (int) localOrigin[1], item.spanX, item.spanY);
                 }
@@ -2723,7 +2758,7 @@
      */
     public boolean addExternalItemToScreen(ItemInfo dragInfo, CellLayout layout) {
         if (layout.findCellForSpan(mTempEstimate, dragInfo.spanX, dragInfo.spanY)) {
-            onDropExternal(-1, -1, (ItemInfo) dragInfo, (CellLayout) layout, false);
+            onDropExternal(null, (ItemInfo) dragInfo, (CellLayout) layout, false);
             return true;
         }
         mLauncher.showOutOfSpaceMessage();
@@ -2738,17 +2773,13 @@
      * NOTE: This can also be called when we are outside of a drag event, when we want
      * to add an item to one of the workspace screens.
      */
-    private void onDropExternal(int x, int y, Object dragInfo,
+    private void onDropExternal(int[] touchXY, Object dragInfo,
             CellLayout cellLayout, boolean insertAtFirst) {
         int screen = indexOfChild(cellLayout);
         if (dragInfo instanceof PendingAddItemInfo) {
             PendingAddItemInfo info = (PendingAddItemInfo) dragInfo;
             // When dragging and dropping from customization tray, we deal with creating
             // widgets/shortcuts/folders in a slightly different way
-            // Only set touchXY if you are supporting spring loaded adding of items
-            int[] touchXY = new int[2];
-            touchXY[0] = mSpringLoadedDropX;
-            touchXY[1] = mSpringLoadedDropY;
             switch (info.itemType) {
                 case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
                     mLauncher.addAppWidgetFromDrop((PendingAddWidgetInfo) info, screen, touchXY);
@@ -2787,14 +2818,9 @@
             }
 
             mTargetCell = new int[2];
-            if (x != -1 && y != -1) {
+            if (touchXY != null) {
                 // when dragging and dropping, just find the closest free spot
-
-                // When we get a drop in Spring Loaded mode, at this point we've already called
-                // onDragExit, which starts us shrinking again and screws up the transforms we
-                // need to get the right value. Instead, as a temporary solution, we've saved the
-                // proper point, mSpringLoadedDropX/Y, from the last onDragOver
-                cellLayout.findNearestVacantArea(mSpringLoadedDropX, mSpringLoadedDropY, 1, 1, mTargetCell);
+                cellLayout.findNearestVacantArea(touchXY[0], touchXY[1], 1, 1, mTargetCell);
             } else {
                 cellLayout.findCellForSpan(mTargetCell, 1, 1);
             }
@@ -2815,11 +2841,8 @@
      * Return the current {@link CellLayout}, correctly picking the destination
      * screen while a scroll is in progress.
      */
-    private CellLayout getCurrentDropLayout() {
-        // if we're currently small, use findMatchingPageForDragOver instead
-        if (mIsSmall) return null;
-        int index = mScroller.isFinished() ? mCurrentPage : mNextPage;
-        return (CellLayout) getChildAt(index);
+    public CellLayout getCurrentDropLayout() {
+        return (CellLayout) getChildAt(mNextPage == INVALID_PAGE ? mCurrentPage : mNextPage);
     }
 
     /**
@@ -2864,7 +2887,7 @@
     /**
      * Called at the end of a drag which originated on the workspace.
      */
-    public void onDropCompleted(View target, boolean success) {
+    public void onDropCompleted(View target, Object dragInfo, boolean success) {
         if (success) {
             if (target != this && mDragInfo != null) {
                 final CellLayout cellLayout = (CellLayout) getChildAt(mDragInfo.screen);
@@ -2931,6 +2954,10 @@
                     mDragTargetLayout.onDragExit();
                     mDragTargetLayout = null;
                 }
+                // In portrait, need to redraw the edge glow when entering the scroll area
+                if (getHeight() > getWidth()) {
+                    invalidate();
+                }
             }
         }
     }
@@ -2941,6 +2968,12 @@
             ((CellLayout) getChildAt(i)).setIsDragOverlapping(false);
         }
         mSpringLoadedDragController.onDragExit();
+
+        // In portrait, workspace is responsible for drawing the edge glow on adjacent pages,
+        // so we need to redraw the workspace when this may have changed.
+        if (getHeight() > getWidth()) {
+            invalidate();
+        }
     }
 
     @Override