Merge remote-tracking branch 'goog/ics-aah'
diff --git a/res/anim/paged_view_click_feedback.xml b/res/anim/paged_view_click_feedback.xml
deleted file mode 100644
index eb7ecef..0000000
--- a/res/anim/paged_view_click_feedback.xml
+++ /dev/null
@@ -1,24 +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.
--->
-
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
-    android:valueFrom="1.0"
-    android:valueTo="0.5"
-    android:valueType="floatType"
-    android:duration="100"
-    android:propertyName="alpha"
-    android:repeatCount="1"
-    android:repeatMode="reverse"/>
diff --git a/res/drawable-land-mdpi/divider_launcher_holo.9.png b/res/drawable-land-mdpi/divider_launcher_holo.9.png
index 7bdf323..e4c0c40 100644
--- a/res/drawable-land-mdpi/divider_launcher_holo.9.png
+++ b/res/drawable-land-mdpi/divider_launcher_holo.9.png
Binary files differ
diff --git a/res/drawable-land-xhdpi/divider_launcher_holo.9.png b/res/drawable-land-xhdpi/divider_launcher_holo.9.png
new file mode 100644
index 0000000..0b2956d
--- /dev/null
+++ b/res/drawable-land-xhdpi/divider_launcher_holo.9.png
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/ic_allapps.png b/res/drawable-sw600dp-hdpi/ic_allapps.png
new file mode 100644
index 0000000..4353a45
--- /dev/null
+++ b/res/drawable-sw600dp-hdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-sw600dp-hdpi/ic_allapps_pressed.png b/res/drawable-sw600dp-hdpi/ic_allapps_pressed.png
new file mode 100644
index 0000000..bb18919
--- /dev/null
+++ b/res/drawable-sw600dp-hdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-sw600dp-land-hdpi/divider_launcher_holo.9.png b/res/drawable-sw600dp-land-hdpi/divider_launcher_holo.9.png
new file mode 100644
index 0000000..e8bcf0a
--- /dev/null
+++ b/res/drawable-sw600dp-land-hdpi/divider_launcher_holo.9.png
Binary files differ
diff --git a/res/drawable-sw600dp-land-mdpi/divider_launcher_holo.9.png b/res/drawable-sw600dp-land-mdpi/divider_launcher_holo.9.png
new file mode 100644
index 0000000..5c3e9f3
--- /dev/null
+++ b/res/drawable-sw600dp-land-mdpi/divider_launcher_holo.9.png
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/ic_allapps.png b/res/drawable-sw600dp-mdpi/ic_allapps.png
new file mode 100644
index 0000000..f85c895
--- /dev/null
+++ b/res/drawable-sw600dp-mdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-sw600dp-mdpi/ic_allapps_pressed.png b/res/drawable-sw600dp-mdpi/ic_allapps_pressed.png
new file mode 100644
index 0000000..8fb7144
--- /dev/null
+++ b/res/drawable-sw600dp-mdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_allapps.png b/res/drawable-sw600dp-xhdpi/ic_allapps.png
new file mode 100644
index 0000000..5da19c8
--- /dev/null
+++ b/res/drawable-sw600dp-xhdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-sw600dp-xhdpi/ic_allapps_pressed.png b/res/drawable-sw600dp-xhdpi/ic_allapps_pressed.png
new file mode 100644
index 0000000..59ac2bc
--- /dev/null
+++ b/res/drawable-sw600dp-xhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-sw720dp-land-hdpi/divider_launcher_holo.9.png b/res/drawable-sw720dp-land-hdpi/divider_launcher_holo.9.png
new file mode 100644
index 0000000..0a1bd2a
--- /dev/null
+++ b/res/drawable-sw720dp-land-hdpi/divider_launcher_holo.9.png
Binary files differ
diff --git a/res/drawable-sw720dp-land-mdpi/divider_launcher_holo.9.png b/res/drawable-sw720dp-land-mdpi/divider_launcher_holo.9.png
new file mode 100644
index 0000000..6d101f4
--- /dev/null
+++ b/res/drawable-sw720dp-land-mdpi/divider_launcher_holo.9.png
Binary files differ
diff --git a/res/drawable/button_bg.xml b/res/drawable/button_bg.xml
deleted file mode 100644
index e7b1bcd..0000000
--- a/res/drawable/button_bg.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_focused="true" android:drawable="@drawable/tab_unselected_focused_holo" />
-    <item android:state_pressed="true" android:drawable="@drawable/tab_unselected_focused_holo" />
-    <item android:drawable="@android:color/transparent" />
-</selector>
diff --git a/res/layout-land/folder_icon.xml b/res/layout-land/folder_icon.xml
index 4c92fca..808ff5e 100644
--- a/res/layout-land/folder_icon.xml
+++ b/res/layout-land/folder_icon.xml
@@ -16,7 +16,6 @@
 
 <com.android.launcher2.FolderIcon
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
diff --git a/res/layout-land/hotseat.xml b/res/layout-land/hotseat.xml
index c0c87af..6802ea0 100644
--- a/res/layout-land/hotseat.xml
+++ b/res/layout-land/hotseat.xml
@@ -18,7 +18,7 @@
     xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     android:background="@drawable/hotseat_bg_panel"
     launcher:cellCountX="1"
-    launcher:cellCountY="5">
+    launcher:cellCountY="@integer/hotseat_cell_count">
     <com.android.launcher2.CellLayout
         android:id="@+id/layout"
         android:layout_width="wrap_content"
diff --git a/res/layout-land/launcher.xml b/res/layout-land/launcher.xml
index c11c788..0c1a195 100644
--- a/res/layout-land/launcher.xml
+++ b/res/layout-land/launcher.xml
@@ -30,8 +30,8 @@
         android:paddingLeft="@dimen/qsb_bar_height"
         android:paddingRight="@dimen/button_bar_height"
         launcher:defaultScreen="2"
-        launcher:cellCountX="4"
-        launcher:cellCountY="4"
+        launcher:cellCountX="@integer/cell_count_x"
+        launcher:cellCountY="@integer/cell_count_y"
         launcher:pageSpacing="@dimen/workspace_page_spacing"
         launcher:scrollIndicatorPaddingLeft="@dimen/qsb_bar_height"
         launcher:scrollIndicatorPaddingRight="@dimen/button_bar_height">
diff --git a/res/layout-land/search_bar.xml b/res/layout-land/search_bar.xml
index c606173f..3352fbb 100644
--- a/res/layout-land/search_bar.xml
+++ b/res/layout-land/search_bar.xml
@@ -15,7 +15,6 @@
 -->
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     style="@style/SearchDropTargetBar"
     android:layout_width="@dimen/qsb_bar_height"
     android:layout_height="match_parent">
diff --git a/res/layout-port/folder_icon.xml b/res/layout-port/folder_icon.xml
index 0df16b8..5ee1327 100644
--- a/res/layout-port/folder_icon.xml
+++ b/res/layout-port/folder_icon.xml
@@ -16,7 +16,6 @@
 
 <com.android.launcher2.FolderIcon
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
diff --git a/res/layout-port/hotseat.xml b/res/layout-port/hotseat.xml
index 035d958..b937043 100644
--- a/res/layout-port/hotseat.xml
+++ b/res/layout-port/hotseat.xml
@@ -17,7 +17,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     android:background="@drawable/hotseat_bg_panel"
-    launcher:cellCountX="5"
+    launcher:cellCountX="@integer/hotseat_cell_count"
     launcher:cellCountY="1">
     <com.android.launcher2.CellLayout
         android:id="@+id/layout"
diff --git a/res/layout-port/launcher.xml b/res/layout-port/launcher.xml
index 062656f..f6ff2e8 100644
--- a/res/layout-port/launcher.xml
+++ b/res/layout-port/launcher.xml
@@ -47,8 +47,8 @@
         android:paddingTop="@dimen/qsb_bar_height_inset"
         android:paddingBottom="@dimen/button_bar_height"
         launcher:defaultScreen="2"
-        launcher:cellCountX="4"
-        launcher:cellCountY="4"
+        launcher:cellCountX="@integer/cell_count_x"
+        launcher:cellCountY="@integer/cell_count_y"
         launcher:pageSpacing="@dimen/workspace_page_spacing"
         launcher:scrollIndicatorPaddingLeft="@dimen/workspace_divider_padding_left"
         launcher:scrollIndicatorPaddingRight="@dimen/workspace_divider_padding_right">
@@ -70,6 +70,15 @@
         android:id="@+id/qsb_bar"
         layout="@layout/qsb_bar" />
 
+    <com.android.launcher2.DrawableStateProxyView
+        android:id="@+id/voice_button_proxy"
+        android:layout_width="@dimen/qsb_bar_height"
+        android:layout_height="@dimen/qsb_bar_height"
+        android:layout_gravity="right"
+        android:clickable="true"
+        android:onClick="onClickVoiceButton"
+        launcher:sourceViewId="@+id/voice_button" />
+
     <include layout="@layout/apps_customize_pane"
         android:id="@+id/apps_customize_pane"
         android:layout_width="match_parent"
diff --git a/res/layout-sw600dp-land/application.xml b/res/layout-sw720dp-land/application.xml
similarity index 100%
rename from res/layout-sw600dp-land/application.xml
rename to res/layout-sw720dp-land/application.xml
diff --git a/res/layout-sw600dp-port/application.xml b/res/layout-sw720dp-port/application.xml
similarity index 100%
rename from res/layout-sw600dp-port/application.xml
rename to res/layout-sw720dp-port/application.xml
diff --git a/res/layout-sw600dp-port/folder_cling.xml b/res/layout-sw720dp-port/folder_cling.xml
similarity index 100%
rename from res/layout-sw600dp-port/folder_cling.xml
rename to res/layout-sw720dp-port/folder_cling.xml
diff --git a/res/layout-sw600dp-port/workspace_cling.xml b/res/layout-sw720dp-port/workspace_cling.xml
similarity index 100%
rename from res/layout-sw600dp-port/workspace_cling.xml
rename to res/layout-sw720dp-port/workspace_cling.xml
diff --git a/res/layout-sw600dp/all_apps_cling.xml b/res/layout-sw720dp/all_apps_cling.xml
similarity index 100%
rename from res/layout-sw600dp/all_apps_cling.xml
rename to res/layout-sw720dp/all_apps_cling.xml
diff --git a/res/layout-sw600dp/external_widget_drop_list_item.xml b/res/layout-sw720dp/external_widget_drop_list_item.xml
similarity index 100%
rename from res/layout-sw600dp/external_widget_drop_list_item.xml
rename to res/layout-sw720dp/external_widget_drop_list_item.xml
diff --git a/res/layout-sw600dp/folder_cling.xml b/res/layout-sw720dp/folder_cling.xml
similarity index 100%
rename from res/layout-sw600dp/folder_cling.xml
rename to res/layout-sw720dp/folder_cling.xml
diff --git a/res/layout-sw600dp/launcher.xml b/res/layout-sw720dp/launcher.xml
similarity index 96%
rename from res/layout-sw600dp/launcher.xml
rename to res/layout-sw720dp/launcher.xml
index 94c69a6..65149f2 100644
--- a/res/layout-sw600dp/launcher.xml
+++ b/res/layout-sw720dp/launcher.xml
@@ -16,7 +16,6 @@
 
 <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"
diff --git a/res/layout-sw600dp/market_button.xml b/res/layout-sw720dp/market_button.xml
similarity index 94%
rename from res/layout-sw600dp/market_button.xml
rename to res/layout-sw720dp/market_button.xml
index 4ccecd9..7eaeafa 100644
--- a/res/layout-sw600dp/market_button.xml
+++ b/res/layout-sw720dp/market_button.xml
@@ -15,13 +15,13 @@
 -->
 <TextView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     style="@style/MarketButton"
     android:onClick="onClickAppMarketButton"
     android:gravity="center"
     android:paddingLeft="32dp"
     android:paddingRight="32dp"
     android:drawablePadding="10dp"
+    android:background="@drawable/tab_widget_indicator_selector"
     android:text="@string/market"
     android:contentDescription="@string/market"
     android:textColor="@color/workspace_all_apps_and_delete_zone_text_color"
diff --git a/res/layout-sw600dp/search_bar.xml b/res/layout-sw720dp/search_bar.xml
similarity index 95%
rename from res/layout-sw600dp/search_bar.xml
rename to res/layout-sw720dp/search_bar.xml
index ebaf960..55ec959 100644
--- a/res/layout-sw600dp/search_bar.xml
+++ b/res/layout-sw720dp/search_bar.xml
@@ -15,7 +15,6 @@
 -->
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     style="@style/SearchDropTargetBar"
     android:layout_width="match_parent"
     android:layout_height="match_parent">
@@ -63,7 +62,6 @@
         android:layout_height="wrap_content"
         android:layout_alignParentRight="true"
         android:layout_alignParentTop="true"
-        android:layout_toLeftOf="@+id/all_apps_divider"
         android:paddingLeft="@dimen/toolbar_button_horizontal_padding"
         android:paddingRight="@dimen/toolbar_button_horizontal_padding"
         android:paddingTop="@dimen/all_apps_button_vertical_padding"
@@ -73,4 +71,4 @@
         android:focusable="true"
         android:clickable="true"
         android:contentDescription="@string/accessibility_all_apps_button" />
-</RelativeLayout>
\ No newline at end of file
+</RelativeLayout>
diff --git a/res/layout-sw600dp/wallpaper_item.xml b/res/layout-sw720dp/wallpaper_item.xml
similarity index 100%
rename from res/layout-sw600dp/wallpaper_item.xml
rename to res/layout-sw720dp/wallpaper_item.xml
diff --git a/res/layout-sw600dp/workspace.xml b/res/layout-sw720dp/workspace.xml
similarity index 100%
rename from res/layout-sw600dp/workspace.xml
rename to res/layout-sw720dp/workspace.xml
diff --git a/res/layout-sw600dp/workspace_cling.xml b/res/layout-sw720dp/workspace_cling.xml
similarity index 100%
rename from res/layout-sw600dp/workspace_cling.xml
rename to res/layout-sw720dp/workspace_cling.xml
diff --git a/res/layout-sw600dp/workspace_screen.xml b/res/layout-sw720dp/workspace_screen.xml
similarity index 100%
rename from res/layout-sw600dp/workspace_screen.xml
rename to res/layout-sw720dp/workspace_screen.xml
diff --git a/res/layout/apps_customize_progressbar.xml b/res/layout/apps_customize_progressbar.xml
index 6a8010f..6aa9099 100644
--- a/res/layout/apps_customize_progressbar.xml
+++ b/res/layout/apps_customize_progressbar.xml
@@ -15,7 +15,6 @@
 -->
 <ProgressBar
    xmlns:android="http://schemas.android.com/apk/res/android"
-   xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
    style="?android:attr/progressBarStyleLarge"
    android:id="@+id/apps_customize_progress_bar"
    android:layout_width="wrap_content"
diff --git a/res/layout/market_button.xml b/res/layout/market_button.xml
index 27eb3fd..41e6ec7 100644
--- a/res/layout/market_button.xml
+++ b/res/layout/market_button.xml
@@ -15,7 +15,6 @@
 -->
 <TextView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     style="@style/MarketButton"
     android:onClick="onClickAppMarketButton"
     android:gravity="center"
diff --git a/res/layout/qsb_bar.xml b/res/layout/qsb_bar.xml
index 9daf7bf..ad9027f 100644
--- a/res/layout/qsb_bar.xml
+++ b/res/layout/qsb_bar.xml
@@ -15,7 +15,6 @@
 -->
 <com.android.launcher2.SearchDropTargetBar
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     style="@style/QSBBar"
     android:focusable="false">
 
diff --git a/res/layout/scroll_indicator.xml b/res/layout/scroll_indicator.xml
index 33eed8b..4ea312b 100644
--- a/res/layout/scroll_indicator.xml
+++ b/res/layout/scroll_indicator.xml
@@ -15,8 +15,7 @@
 -->
 <ImageView
     xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     android:visibility="gone"
     android:alpha="0"
     android:scaleType="fitXY"
-    android:src="@drawable/hotseat_scrubber_holo" />
\ No newline at end of file
+    android:src="@drawable/hotseat_scrubber_holo" />
diff --git a/res/layout/workspace_divider.xml b/res/layout/workspace_divider.xml
index 257ea7c..c9cbca6 100644
--- a/res/layout/workspace_divider.xml
+++ b/res/layout/workspace_divider.xml
@@ -15,10 +15,9 @@
 -->
 <ImageView
     xmlns:android="http://schemas.android.com/apk/res/android"
-xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
     android:paddingLeft="@dimen/workspace_divider_padding_left"
     android:paddingRight="@dimen/workspace_divider_padding_right"
     android:paddingTop="@dimen/workspace_divider_padding_top"
     android:paddingBottom="@dimen/workspace_divider_padding_bottom"
     android:scaleType="fitXY"
-    android:src="@drawable/hotseat_track_holo" />
\ No newline at end of file
+    android:src="@drawable/hotseat_track_holo" />
diff --git a/res/values-af-sw600dp/strings.xml b/res/values-af-sw600dp/strings.xml
deleted file mode 100644
index 9ef490f..0000000
--- a/res/values-af-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Kies muurpapier"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Geen muurpapier beskikbaar nie"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Kanselleer"</string>
-</resources>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index d4e7f51..ae5a8c7 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Legstukke"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Raak en hou in om \'n legstuk op te tel."</string>
     <string name="market" msgid="2652226429823445833">"Winkel"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Kon nie item op hierdie Tuisskerm plaas nie."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Kan nie item op hierdie Tuis-skerm laat los nie."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Kies legstuk om te skep"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Vouernaam"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Hernoem vouer"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Kortpaaie"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Legstukke"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Muurpapier"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Geen meer spasie op tuisskerm nie."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Geen spasie op tuisskerm oor nie."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Geen plek meer op die warmlaai nie."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Hierdie legstuk is te groot vir die hoofposisie."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Kortpad \"<xliff:g id="NAME">%s</xliff:g>\" is geskep."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Kortpad \"<xliff:g id="NAME">%s</xliff:g>\" is verwyder."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Kortpad \"<xliff:g id="NAME">%s</xliff:g>\" bestaan reeds."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Kies kortpad"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Kies kortpad"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Kies program"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Programme"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Tuis"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"installeer kortpaaie"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Stel \'n program in staat om kortpaaie by te voeg sonder gebruikerhandeling."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"deïnstalleer kortpaaie"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Stel \'n program in staat om kortpaaie te verwyder sonder gebruikerhandeling."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Laat die program toe om kortpaaie te sonder gebruikerhandeling te verwyder."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"lees Tuis-instellings en -kortpaaie"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Stel \'n program in staat om die instellings en kortpaaie in Tuis te lees."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Laat die program toe om die instellings en kortpaaie in Tuis te lees."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"skryf Tuis-instellings en -kortpaaie"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Stel program in staat om die instellings en kortpaaie in Tuis te verander."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Laat die program toe om die instellings en kortpaaie in Tuis te verander."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Kon nie legstuk laai nie"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Hierdie is \'n stelselprogram en kan nie gedeïnstalleer word nie."</string>
     <string name="dream_name" msgid="2847171357608437154">"Vuurpyllanseerder"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Om \'n program te skuif, raak en hou dit."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Om \'n nuwe vouer op jou Tuisskerm te maak, stapel een program bo-op \'n ander."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Vouer oopgemaak, %1$d van %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Tik om die vouer toe te maak"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tik om herbenoeming te bevestig"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Vouer oopgemaak, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Raak om vouer toe te maak"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Raak om stoor te hernoem"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Vouer is gesluit"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Vouer hernoem na %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Vouer: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Vouer hernoem na <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Vouer: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-am-sw600dp/strings.xml b/res/values-am-sw600dp/strings.xml
deleted file mode 100644
index 9d5f29f..0000000
--- a/res/values-am-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"ልጣፍ ምረጥ"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"ምንም ልጣፎች የሉም"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"ተወው"</string>
-</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index bba4123..9e25766 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">" ፍርግሞች"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"ፍርግም ለማንሳት ንካ &amp; በመጫን ያዝ"</string>
     <string name="market" msgid="2652226429823445833">"ሸምት"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"እዚህ የመነሻ ማያ ላይ አይነት ማኖር አልተቻለም።"</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"እዚህ የመነሻ ማያ ላይ ንጥል ማኖር አልተቻለም።"</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"ለመፍጠር ምግብር  ምረጥ"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"አቃፊ ስም"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"አቃፊእንደገና ሰይም"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"አቋራጮች"</string>
     <string name="group_widgets" msgid="6704978494073105844">"ፍርግሞች"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"ልጣፍ"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"በዚህ መነሻ ማያ ላይ ምንም ቦታ የለም።"</string>
+    <string name="out_of_space" msgid="3056555298801463098">"የመነሻ ማያ ገጾችህ ላይ ተጨማሪ ቦታ የለም።"</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"በመትከያ ቦታው ላይ ተጨማሪ ክፍል የለም።"</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"ይህ ፍርግም ለማስቀመጫው በጣም ትልቅ ነው።"</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"አቋራጭ\"<xliff:g id="NAME">%s</xliff:g> \"ተፈጥሯል።"</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"አቋራጭ \"<xliff:g id="NAME">%s</xliff:g>\" ተወግዶ ነበር።"</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"አቋራጭ \"<xliff:g id="NAME">%s</xliff:g>\" አስቀድሞ አለ።"</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"አቋራጭ ምረጥ"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"አቋራጭ ምረጥ"</string>
     <string name="title_select_application" msgid="1793455815754848652">"መተግበሪያ ምረጥ"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"ትግበራ"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"መነሻ"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"አቋራጮችን ጫን።"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"መተግበሪያ  ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ ለማከል ይፈቅዳል።"</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"አቋራጮችን አራግፍ"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"ያለተጠቃሚ ጣልቃ ገብነት መተግበሪያ  አቋራጭ ለማስወገድ ይፈቅዳል።"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ ለማስወገድ ለመተግበሪያ ይፈቅዳል።"</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"የመነሻቅንብሮች እና አቋራጮችን አንብብ"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለማንበብ ትግበራ ይፈቅዳል።"</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለማንበብ ለትግበራ ይፈቅዳል።"</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"መነሻ ቅንብሮች እና አቋራጮች ፃፍ"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለመለወጥ መተግበሪያ ይፈቅዳል።"</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"ቅንጅቶችን እና አቋራጮችን በመነሻ ለመለወጥ ለመተግበሪያ ይፈቅዳል።"</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"ፍርግም የመጫን ችግር"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"ይህ የስርዓት ትግበራ ነው እና አለማራገፍ አይቻልም።"</string>
     <string name="dream_name" msgid="2847171357608437154">"የሮኬት ማስነሻ"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"መተግበሪያ ለማንቀሳቀስ፣ ንካው እና &amp; ያዘው::"</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"በመነሻ ማያህ ላይ አዲስ ዓቃፊ ለመፍጠር፣ አንዱን መተግበሪያ በሌላው ላይ ቆልል፡፡"</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"እሺ"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"አቃፊ ተከፍቷል, %1$d በ %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"አቃፊን ለመዝጋት ምታ"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"ዳግም ሰይምን ለማስፈፀም ምታ"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"አቃፊ ተከፍቷል፣ <xliff:g id="WIDTH">%1$d</xliff:g> በ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"አቃፊን ለመዝጋት ንካ"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"ዳግም ሰይምን ለማስቀመጥ ንካ"</string>
     <string name="folder_closed" msgid="3130534551370511932">"አቃፊ ተዘግቷል"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"አቃፊ ዳግም ተሰይሟል ለ %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"አቃፊ: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"አቃፊ ዳግም ወደ <xliff:g id="NAME">%1$s</xliff:g> ተሰይሟል"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"አቃፊ ስም፦ <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-ar-sw600dp/strings.xml b/res/values-ar-sw600dp/strings.xml
deleted file mode 100644
index b780019..0000000
--- a/res/values-ar-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"تحديد خلفية"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"لا تتوفر أية خلفيات"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"إلغاء"</string>
-</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 109f26a..3dcd631 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"الأدوات"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"المس مع الاستمرار لاختيار إحدى الأدوات."</string>
     <string name="market" msgid="2652226429823445833">"تسوق"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"تعذر إسقاط العنصر في هذه الشاشة الرئيسية."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"تعذر إسقاط العنصر في هذه الشاشة الرئيسية."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"اختيار أداة لإنشائها"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"اسم المجلد"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"إعادة تسمية المجلد"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"الاختصارات"</string>
     <string name="group_widgets" msgid="6704978494073105844">"الأدوات"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"الخلفيات"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"ليس هناك مساحة أخرى في هذه الشاشة الرئيسية."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"ليس هناك مساحة أخرى في الشاشات الرئيسية."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"ليست هناك مساحة أخرى في منطقة الإرساء القابلة للتخصيص."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"حجم هذه الأداة كبير للغاية بحيث لا يتسع له الموقع المهم."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"تم إنشاء الاختصار \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"تمت إزالة الاختصار \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"الاختصار \"<xliff:g id="NAME">%s</xliff:g>\" موجود فعلاً."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"تحديد اختصار"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"اختيار اختصار"</string>
     <string name="title_select_application" msgid="1793455815754848652">"اختيار تطبيق"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"التطبيقات"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"الرئيسية"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"اختصارات التثبيت"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"للسماح لتطبيق ما بإضافة اختصارات بدون تدخل المستخدم."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"إزالة الاختصارات"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"للسماح لتطبيق بإزالة الاختصارات بدون تدخل المستخدم."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"للسماح للتطبيق بإزالة الاختصارات بدون تدخل المستخدم."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"قراءة إعدادات الشاشة الرئيسية والاختصارات"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"للسماح لتطبيق ما بقراءة الإعدادات والاختصارات في الشاشة الرئيسية."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"للسماح للتطبيق بقراءة الإعدادات والاختصارات في الصفحة الرئيسية."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"كتابة إعدادات الشاشة الرئيسية والاختصارات"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"للسماح لتطبيق ما بتغيير الإعدادات والاختصارات في الشاشة الرئيسية."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"للسماح للتطبيق بتغيير الإعدادات والاختصارات في الصفحة الرئيسية."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"حدثت مشكلة أثناء تحميل الأداة"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"هذا تطبيق نظام وتتعذر إزالته."</string>
     <string name="dream_name" msgid="2847171357608437154">"راجمة"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"لنقل التطبيق، المسه مع الاستمرار."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"لإنشاء مجلد جديد على الشاشة الرئيسية، يمكنك تكديس أحد التطبيقات فوق تطبيق آخر."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"موافق"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"تم فتح المجلد، %1$d × %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"انقر لإغلاق المجلد"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"انقر لحفظ إعادة التسمية"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"تم فتح المجلد، بحجم <xliff:g id="WIDTH">%1$d</xliff:g> في <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"المس لإغلاق المجلد"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"المس لحفظ إعادة التسمية"</string>
     <string name="folder_closed" msgid="3130534551370511932">"تم إغلاق المجلد"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"تمت إعادة تسمية المجلد إلى %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"المجلد: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"تمت إعادة تسمية المجلد إلى <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"المجلد: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-be-sw600dp/strings.xml b/res/values-be-sw600dp/strings.xml
deleted file mode 100644
index 54e788c..0000000
--- a/res/values-be-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Выбраць шпалеры"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Шпалер няма"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Адмена"</string>
-</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 1cd2a2f..459b87b 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Віджэты"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Націсніце і ўтрымлiвайце віджэт, каб дадаць яго."</string>
     <string name="market" msgid="2652226429823445833">"Крама"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Немагчыма выдаліць элемент на галоўным экране."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Немагчыма выдалiць элемент на галоўным экране."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Выберыце віджэт для стварэння"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Назва тэчкі"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Пераназваць тэчку"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Хуткі доступ"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Віджэты"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Шпалеры"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"На Галоўнай старонцы больш няма месца."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"На галоўных экранах больш няма месца."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"На Hotseat больш няма месца."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Гэты віджэт занадта вялікі для hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Створаны цэтлік \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Цэтлік \"<xliff:g id="NAME">%s</xliff:g>\" быў выдалены."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Цэтлік \"<xliff:g id="NAME">%s</xliff:g>\" ужо існуе."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Выбраць хуткі доступ"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Выберыце шлях хуткага доступу"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Выберыце прыкладанне"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Прыкладанні"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Галоўная старонка"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"усталяваць хуткі доступ"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Дазваляе прыкладанням дадаваць цэтлікі без умяшання карыстальніка."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"выдаліць хуткі доступ"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Дазваляе прыкладанням выдаляць шляхi хуткага доступу без умяшання карыстальнiка."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Дазваляе прыкладанням выдаляць шляхi хуткага доступу без умяшання карыстальнiка."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"чытаць налады і спосабы хуткага доступу на Галоўнай старонцы"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Дазваляе прыкладанню чытаць налады і шляхі хуткага доступу на галоўнай старонцы."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Дазваляе прыкладанню чытаць налады і шляхі хуткага доступу на галоўнай старонцы."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"напісаць налады і спосабы хуткага доступа на Галоўнай старонцы"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Дазваляе прыкладанню змяняць налады і шляхi хуткага доступу на галоўнай старонцы."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Дазваляе прыкладанню змяняць налады і шляхi хуткага доступу на галоўнай старонцы."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Праблема пры загрузцы віджэта"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Гэта сістэмнае прыкладанне, і яго нельга выдаліць."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Каб перамясціць прыкладанне, дакраніцеся дя яго і ўтрымлівайце."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Каб зрабіць новую тэчку на працоўным стале, перасуньце адно прыкладанне на другое."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"ОК"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Тэчка адкрыта, %1$d ад %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Націсніце, каб закрыць тэчку"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Націсніце, каб перайменаваць"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Тэчка адкрыта, <xliff:g id="WIDTH">%1$d</xliff:g> на <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Нацiснiце, каб закрыць тэчку"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Краніце, каб захаваць новую назву"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Тэчка закрыта"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Тэчка перайменавана: %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Тэчка: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Тэчка перайменавана ў <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Тэчка <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-bg-sw600dp/strings.xml b/res/values-bg-sw600dp/strings.xml
deleted file mode 100644
index cf98a72..0000000
--- a/res/values-bg-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Избор на тапет"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Няма налични тапети"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Отказ"</string>
-</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 5b429b7..109e460 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Приспособления"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Докоснете и задръжте за избор на приспособление"</string>
     <string name="market" msgid="2652226429823445833">"Магазин"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Не можа да се премести на началния екран."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Не можа да се премести на началния екран."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Избор на приспособл. за създаване"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Име на папка"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Преименуване на папка"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Преки пътища"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Приспособления"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Тапети"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"На този начален екран няма повече място."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"На началните ви екрани няма повече място."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"В трамплина няма повече място."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Това приспособление е твърде голямо за трамплина."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Прекият път за „<xliff:g id="NAME">%s</xliff:g>“ бе създаден."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Прекият път към „<xliff:g id="NAME">%s</xliff:g>“ бе премахнат."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Прекият път за „<xliff:g id="NAME">%s</xliff:g>“ вече съществува."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Избор на пряк път"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Избор на пряк път"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Избор на приложение"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Приложения"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Начало"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"инсталиране на преки пътища"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Разрешава на приложението да добавя преки пътища без намеса на потребителя."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"деинсталиране на преките пътища"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Разрешава на приложението да премахва преките пътища без намеса на потребителя."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Разрешава на приложението да премахва преките пътища без намеса на потребителя."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"прочетете настройките за „Начало“ и преки пътища"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Разрешава на приложението да прочете настройките и преките пътища в Начало."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Разрешава на приложението да чете настройките и преките пътища в Начало."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"въведете настройките за „Начало“ и преки пътища"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Разрешава на приложението да променя настройките и преките пътища в Начало."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Разрешава на приложението да променя настройките и преките пътища в Начало."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Проблем при зареждане на приспособление"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Това е системно приложение и не може да се деинсталира."</string>
     <string name="dream_name" msgid="2847171357608437154">"Ракетна площадка"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"За да преместите приложение, го докоснете и задръжте."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"За да създадете нова папка на началния си екран, поставете едно приложение върху друго."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Папката е отворена %1$d на %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Докоснете, за да затворите папката"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Докоснете, за да преименувате"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Папката е отворена – <xliff:g id="WIDTH">%1$d</xliff:g> на <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Докоснете, за да затворите папката"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Докоснете, за да запазите преименуването"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Папката бе затворена"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Папката е преименувана на „%1$s“"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Папка: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Папката е преименувана на „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Папка: „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
 </resources>
diff --git a/res/values-ca-sw600dp/strings.xml b/res/values-ca-sw600dp/strings.xml
deleted file mode 100644
index 2acff21..0000000
--- a/res/values-ca-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Selecció d\'un fons de pantalla"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"No hi ha fons de pantalla disponibles"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Cancel·la"</string>
-</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 5a6063f..a520bea 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Mantén premut un widget per triar-lo."</string>
     <string name="market" msgid="2652226429823445833">"Botiga"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"No s\'ha pogut deixar anar aquest element a la pantalla d\'inici."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"No s\'ha pogut deixar anar aquest element a la pantalla d\'inici."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Selecciona el widget que vulguis crear"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nom de la carpeta"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Canvi de nom de carpeta"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Dreceres"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Empaperats"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Ja no queda espai en aquesta pantalla Inici."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"No queda espai a les pantalles d\'inici."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"No queda espai al hotseat."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Aquest widget és massa gran per al hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"S\'ha creat la drecera \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"S\'ha eliminat la drecera \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"La drecera \"<xliff:g id="NAME">%s</xliff:g>\" ja existeix."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Selecció d\'una drecera"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Tria una drecera"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Tria una aplicació"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplicacions"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Pàgina d\'inici"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"instal·lar dreceres"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permet a una aplicació afegir dreceres sense intervenció de l\'usuari."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstal·lar dreceres"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permet que una aplicació elimini dreceres sense intervenció de l\'usuari."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permet que l\'aplicació elimini dreceres sense la intervenció de l\'usuari."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"llegir la configuració i les dreceres de la pantalla Inici"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Permet que una aplicació llegeixi la configuració i les dreceres de la pàgina d\'inici."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Permet que una aplicació llegeixi la configuració i les dreceres de la pàgina d\'inici."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"escriure la configuració i les dreceres de la pantalla Inici"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Permet que una aplicació canviï la configuració i les dreceres de la pàgina d\'inici."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Permet que una aplicació canviï la configuració i les dreceres de la pàgina d\'inici."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"S\'ha produït un problema en carregar el widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Això és una aplicació del sistema i no es pot desinstal·lar."</string>
     <string name="dream_name" msgid="2847171357608437154">"Llançamíssils"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Per moure una aplicació, mantén-la premuda."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Per fer una carpeta nova a la pàgina d\'inici, apila una aplicació sobre una altra."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"D\'acord"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Carpeta oberta, %1$d de %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Toca per tancar la carpeta"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toca per fer el canvi de nom"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"S\'ha obert la carpeta, <xliff:g id="WIDTH">%1$d</xliff:g> per <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Toca per tancar la carpeta"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toca per desar el canvi de nom"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Carpeta tancada"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Canvi de nom de la carpeta de %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Carpeta: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"S\'ha canviat el nom de la carpeta a <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-cs-sw600dp/strings.xml b/res/values-cs-sw600dp/strings.xml
deleted file mode 100644
index ad1bcbe..0000000
--- a/res/values-cs-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Výběr tapety"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Nejsou k dispozici žádné tapety"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Zrušit"</string>
-</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 2658900..be575d4 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgety"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Widget vyberete dotykem a podržením."</string>
     <string name="market" msgid="2652226429823445833">"Obchod"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Na tuto plochu položku nelze přesunout."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Na tuto plochu položku nelze přesunout."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Vyberte widget k vytvoření"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Název složky"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Přejmenovat složku"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Zástupce"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgety"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Tapety"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Na této ploše již není místo."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Na plochách již není místo."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"V části hotseat již není místo."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Widget je pro hotseat příliš velký."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Zástupce <xliff:g id="NAME">%s</xliff:g> byl vytvořen."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Zástupce <xliff:g id="NAME">%s</xliff:g> byl odebrán."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Zástupce <xliff:g id="NAME">%s</xliff:g> již existuje."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Vyberte zástupce"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Výběr zástupce"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Vybrat aplikaci"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplikace"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Plocha"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"instalovat zástupce"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Umožňuje aplikaci přidat zástupce bez zásahu uživatele."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"odinstalace zástupců"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Umožňuje aplikaci odstranit zástupce bez zásahu uživatele."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Umožňuje aplikaci odstranit zástupce bez zásahu uživatele."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"čtení nastavení a odkazů plochy"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Umožňuje aplikaci číst nastavení a odkazy na ploše."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Umožňuje aplikaci číst nastavení a odkazy na ploše."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"zápis nastavení a odkazů plochy"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Umožňuje aplikaci změnit nastavení a odkazy na ploše."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Umožňuje aplikaci změnit nastavení a odkazy na ploše."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problém s načtením widgetu"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Toto je systémová aplikace a nelze ji odinstalovat."</string>
     <string name="dream_name" msgid="2847171357608437154">"Raketomet"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Chcete-li aplikaci přesunout, dotkněte se jí a podržte ji."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Chcete-li na ploše vytvořit novou složku, přesuňte jednu aplikaci na druhou."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Složka otevřena, %1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Klepnutím zavřete složku"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Klepnutím přejmenování potvrdíte"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Složka otevřena, rozměry <xliff:g id="WIDTH">%1$d</xliff:g> × <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Dotykem složku zavřete"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dotykem uložíte změnu názvu"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Složka je uzavřena"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Složka přejmenována na %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Složka: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Složka přejmenována na <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Složka: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-da-sw600dp/strings.xml b/res/values-da-sw600dp/strings.xml
deleted file mode 100644
index 552c728..0000000
--- a/res/values-da-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Vælg baggrund"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Der er ingen tilgængelige baggrunde"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Annuller"</string>
-</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 742788b..f392747 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Tryk og hold nede for at vælge en widget."</string>
     <string name="market" msgid="2652226429823445833">"Butik"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Elementet kunne ikke trækkes til startskærmen."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Elementet kunne ikke trækkes til startskærmen."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Vælg en widget for at oprette"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Mappenavn"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Omdøb mappe"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Genveje"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Tapeter"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Der er ikke mere plads på Startskærmen."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Der er ikke mere plads på dine startskærme."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Der er ikke mere plads i hotseatet."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Denne widget er for stor til hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Genvejen \"<xliff:g id="NAME">%s</xliff:g>\" blev oprettet."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Genvejen \"<xliff:g id="NAME">%s</xliff:g>\" blev fjernet."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Genvejen \"<xliff:g id="NAME">%s</xliff:g>\" findes allerede."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Vælg genvej"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Vælg genvej"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Vælg app"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Applikationer"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Start"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"installer genveje"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Tillader, at en app tilføjer genveje uden brugerens indgriben."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"afinstaller genveje"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Tillader, at en app fjerner genveje uden brugerens indgriben."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Tillader, at appen fjerner genveje uden brugerens indgriben."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"læs indstillinger og genveje for Start"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Tillader, at en app læser indstillingerne og genvejene på startskærmen."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Tillader, at appen læser indstillingerne og genvejene på startskærmen."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"skriv indstillinger og genveje for Start"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Tillader, at en app ændrer indstillingerne og genvejene på startskærmen."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Tillader, at appen ændrer indstillingerne og genvejene på startskærmen."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Der er problemer med indlæsning af widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Dette er en systemapp, som ikke kan afinstalleres."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Tryk på en app, og hold den nede for at flytte den."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Du kan oprette en ny mappe på din startskærm ved at stable apps oven på hinanden."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Mappen blev åbnet, %1$d af %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Tryk for at lukke mappen"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tryk for at omdøbe"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Åben mappe, <xliff:g id="WIDTH">%1$d</xliff:g> gange <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Tryk for at lukke mappen"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Tryk for at gemme det nye navn"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Mappen er lukket"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Mappen blev omdøbt til %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Mappe: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Mappen er omdøbt til <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-de-sw600dp/strings.xml b/res/values-de-sw600dp/strings.xml
deleted file mode 100644
index 7846c5f..0000000
--- a/res/values-de-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Hintergrund auswählen"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Keine Hintergründe verfügbar"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Abbrechen"</string>
-</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index a125524..91d025a 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Zum Hinzufügen Widget berühren und halten"</string>
     <string name="market" msgid="2652226429823445833">"Shop"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Symbol wurde nicht auf Startbildschirm abgelegt."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Element wurde nicht auf Startbildschirm abgelegt."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Widget zum Erstellen auswählen"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Ordnername"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Ordner umbenennen"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Verknüpfungen"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Hintergründe"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Auf dem Startbildschirm ist kein Platz mehr vorhanden."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Auf Ihrem Startbildschirm ist kein Platz mehr vorhanden."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Auf der App-Leiste ist kein Platz mehr vorhanden."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Dieses Widget ist zu groß für die App-Leiste."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"\"<xliff:g id="NAME">%s</xliff:g>\"-Verknüpfung wurde erstellt."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"\"<xliff:g id="NAME">%s</xliff:g>\"-Verknüpfung wurde entfernt."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"\"<xliff:g id="NAME">%s</xliff:g>\"-Verknüpfung ist bereits vorhanden."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Tastenkürzel auswählen"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Verknüpfung auswählen"</string>
     <string name="title_select_application" msgid="1793455815754848652">"App wählen"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Startseite"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"Verknüpfungen installieren"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Ermöglicht einer App das Hinzufügen von Verknüpfungen ohne Eingriff des Nutzers"</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"Verknüpfungen deinstallieren"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Ermöglicht einer App das Entfernen von Verknüpfungen ohne Eingriff des Nutzers"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Ermöglicht einer App das Entfernen von Verknüpfungen ohne Eingriff des Nutzers"</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"Einstellungen und Shortcuts für Startseite lesen"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu lesen"</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu lesen"</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"Einstellungen und Shortcuts für Startseite schreiben"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu ändern"</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Ermöglicht einer App, die Einstellungen und Verknüpfungen auf dem Startbildschirm zu ändern"</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Fehler beim Laden des Widgets"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Dies ist eine Systemanwendung, die nicht deinstalliert werden kann."</string>
     <string name="dream_name" msgid="2847171357608437154">"Raketenstartgerät"</string>
@@ -91,16 +92,16 @@
     <string name="workspace_cling_title" msgid="738396473989890567">"Fühlen Sie sich wie zu Hause"</string>
     <string name="workspace_cling_move_item" msgid="791013895761065070">"Hier können Sie Ihre Lieblings-Apps ablegen."</string>
     <string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"Berühren Sie den Kreis für eine Übersicht aller Apps."</string>
-    <string name="all_apps_cling_title" msgid="2559734712581447107">"Einige Apps auswählen"</string>
+    <string name="all_apps_cling_title" msgid="2559734712581447107">"Apps auswählen"</string>
     <string name="all_apps_cling_add_item" msgid="5665035103260318891">"Berühren und halten Sie eine App, um sie zum Startbildschirm hinzuzufügen."</string>
     <string name="folder_cling_title" msgid="4308949882377840953">"Apps mit Ordnern organisieren"</string>
     <string name="folder_cling_move_item" msgid="270598675060435169">"Berühren und halten Sie eine App, um sie zu verschieben."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Stapeln Sie Apps übereinander, um einen neuen Ordner auf Ihrem Startbildschirm zu erstellen."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Ordner geöffnet, %1$d von %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Ordner durch Berühren schließen"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Umbenennung durch Berühren bestätigen"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Ordner geöffnet, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Ordner durch Berühren schließen"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Umbenennung durch Berühren speichern"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Ordner wurde geschlossen"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Ordner umbenannt in %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Ordner: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Ordner umbenannt in <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Ordner: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-el-sw600dp/strings.xml b/res/values-el-sw600dp/strings.xml
deleted file mode 100644
index ff4807d..0000000
--- a/res/values-el-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Επιλογή ταπετσαρίας"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Δεν υπάρχουν διαθέσιμες ταπετσαρίες"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Ακύρωση"</string>
-</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index dc4c536..f6c200e 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Γραφικά στοιχεία"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Αγγίξτε παρατεταμένα για να πάρετε ένα γραφ.στοιχ."</string>
     <string name="market" msgid="2652226429823445833">"Αγορές"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Αδύνατη η τοποθ. του στοιχείου στην αρχική οθόνη."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Αδυναμία τοποθέτησης στοιχείου στην Αρχική οθόνη."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Επιλ. γραφ. στοιχείο για δημιουργία"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Όνομα φακέλου"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Μετονομασία φακέλου"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Συντομεύσεις"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Γραφικά στοιχεία"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Ταπετσαρίες"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Δεν υπάρχει χώρος σε αυτήν την αρχική οθόνη."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Δεν υπάρχει άλλος χώρος στις Αρχικές οθόνες σας."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Δεν υπάρχει άλλος χώρος στο hotseat."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Αυτό το γραφικό στοιχείο είναι πολύ μεγάλο για το hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Δημιουργήθηκε η συντόμευση \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Η συντόμευση \"<xliff:g id="NAME">%s</xliff:g>\" καταργήθηκε."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Η συντόμευση \"<xliff:g id="NAME">%s</xliff:g>\" υπάρχει ήδη."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Επιλογή συντόμευσης"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Επιλέξτε συντόμευση"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Επιλογή εφαρμογής"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Εφαρμογές"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Αρχική σελίδα"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"εγκατάσταση συντομεύσεων"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Επιτρέπει σε μια εφαρμογή την προσθήκη συντομεύσεων χωρίς την παρέμβαση του χρήστη."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"κατάργηση εγκατάστασης συντομεύσεων"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Επιτρέπει σε μια εφαρμογή την κατάργηση συντομεύσεων χωρίς την παρέμβαση του χρήστη."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Επιτρέπει στην εφαρμογή την κατάργηση συντομεύσεων χωρίς την παρέμβαση του χρήστη."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"ανάγνωση ρυθμίσεων και συντομεύσεων αρχικής οθόνης"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Επιτρέπει σε μια εφαρμογή την ανάγνωση των ρυθμίσεων και των συντομεύσεων στην αρχική οθόνη."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Επιτρέπει στην εφαρμογή την ανάγνωση των ρυθμίσεων και των συντομεύσεων στην Αρχική οθόνη."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"εγγραφή ρυθμίσεων και συντομεύσεων αρχικής οθόνης"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Επιτρέπει σε μια εφαρμογή την αλλαγή των ρυθμίσεων και των συντομεύσεων στην αρχική οθόνη."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Επιτρέπει στην εφαρμογή την αλλαγή των ρυθμίσεων και των συντομεύσεων στην Αρχική οθόνη."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Παρουσιάστηκε πρόβλημα στη φόρτωση του γραφικού στοιχείου"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Αυτή είναι μια εφαρμογή συστήματος και δεν είναι δυνατή η κατάργηση της εγκατάστασής της."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Για να μετακινήσετε μια εφαρμογή, αγγίξτε την παρατεταμένα."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Για να δημιουργήσετε ένα νέο φάκελο στην αρχική οθόνη, τοποθετήστε μια εφαρμογή πάνω σε μια άλλη."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Ο φάκελος άνοιξε, %1$d από %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Πατήστε για να κλείσετε τον φάκελο"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Πατήστε για να πραγματοποιήσετε μετονομασία"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Άνοιγμα φακέλου, <xliff:g id="WIDTH">%1$d</xliff:g> επί <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Αγγίξτε για να κλείσετε τον φάκελο"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Αγγίξτε για να αποθηκεύσετε το νέο όνομα"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Ο φάκελος έκλεισε"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Ο φάκελος μετονομάστηκε σε %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Φάκελος: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Ο φάκελος μετονομάστηκε σε <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Φάκελος: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-en-rGB-sw600dp/strings.xml b/res/values-en-rGB-sw600dp/strings.xml
deleted file mode 100644
index 8f9556e..0000000
--- a/res/values-en-rGB-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Select wallpaper"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"No wallpaper available"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Cancel"</string>
-</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 22d9804..939f1d7 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Touch &amp; hold to pick up a widget."</string>
     <string name="market" msgid="2652226429823445833">"Shop"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Couldn\'t drop item onto this Home screen."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Couldn\'t drop item on this Home screen."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Choose widget to create"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Folder name"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Rename folder"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Shortcuts"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Wallpaper"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"No more room on this Home screen."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"No more room on your Home screens."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"No more room on the hotseat."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"This widget is too large for the hot-seat."</string>
-    <string name="shortcut_installed" msgid="7071557296331322355">"<xliff:g id="NAME">%s</xliff:g>Shortcut \"\" created."</string>
-    <string name="shortcut_uninstalled" msgid="2129499669449749995">"<xliff:g id="NAME">%s</xliff:g>Shortcut \"\" was removed."</string>
-    <string name="shortcut_duplicate" msgid="4757756326465060694">"<xliff:g id="NAME">%s</xliff:g>Shortcut \"\" already exists."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Select shortcut"</string>
+    <string name="shortcut_installed" msgid="7071557296331322355">"Shortcut \"<xliff:g id="NAME">%s</xliff:g>\" created."</string>
+    <string name="shortcut_uninstalled" msgid="2129499669449749995">"Shortcut \"<xliff:g id="NAME">%s</xliff:g>\" was removed."</string>
+    <string name="shortcut_duplicate" msgid="4757756326465060694">"Shortcut \"<xliff:g id="NAME">%s</xliff:g>\" already exists."</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Choose shortcut"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Choose app"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Home"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"install shortcuts"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Allows an app to add shortcuts without user intervention."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"uninstall shortcuts"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Allows an app to remove shortcuts without user intervention."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Allows the app to remove shortcuts without user intervention."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"read Home settings and short cuts"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Allows an app to read the settings and shortcuts in Home."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Allows an app to read the settings and shortcuts in Home."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"write Home settings and shortcuts"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Allows an app to change the settings and shortcuts in Home."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Allows the app to change the settings and shortcuts in Home."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problem loading widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"This is a system application and cannot be uninstalled."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"To move an app, touch &amp; hold it."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"To make a new folder on your Home screen, stack one app on top of another."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Folder opened, %1$d by %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Tap to close folder"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tap to commit rename"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Folder opened, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Touch to close folder"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Touch to save rename"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Folder closed"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Folder renamed to %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Folder: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Folder renamed to <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-es-rUS-sw600dp/strings.xml b/res/values-es-rUS-sw600dp/strings.xml
deleted file mode 100644
index 1109c83..0000000
--- a/res/values-es-rUS-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Seleccionar el fondo de pantalla"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Ningún fondo de pantalla disponible"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Cancelar"</string>
-</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 72dd217..2f8b4cc 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Mantén presionado el widget que deseas elegir."</string>
     <string name="market" msgid="2652226429823445833">"Comprar"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"El elemento no se soltó en la pantalla principal."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Error al soltar elemento en la pantalla principal"</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Elegir los widgets para crear"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nombre de carpeta"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Cambiar nombre de carpeta"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Accesos directos"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Papeles tapiz"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"No hay más espacio en esta pantalla de la página principal"</string>
+    <string name="out_of_space" msgid="3056555298801463098">"No hay más espacio en tu pantalla principal."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"No queda espacio en la barra de accesos directos."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Este widget es demasiado grande para el banquillo."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Acceso directo \"<xliff:g id="NAME">%s</xliff:g>\" creado."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"El acceso directo \"<xliff:g id="NAME">%s</xliff:g>\" ha sido eliminado."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"El acceso directo \"<xliff:g id="NAME">%s</xliff:g>\" ya existe."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Seleccionar acceso directo"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Elegir acceso directo"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Elegir una aplicación"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplicaciones"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Página principal"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"instalar accesos directos"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite que una aplicación agregue accesos directos sin que el usuario intervenga."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstalar papel tapiz"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite que una aplicación elimine accesos directos sin que el usuario intervenga."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite que la aplicación elimine accesos directos sin que el usuario intervenga."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"leer configuración y accesos directos de la página principal"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite que una aplicación lea la configuración y los accesos directos de la página principal."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite que la aplicación lea la configuración y los accesos directos de la página principal."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"escribir configuración y accesos directos de la página principal"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite que una aplicación cambie la configuración y los accesos directos de la página principal."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite que la aplicación cambie la configuración y los accesos directos de la página principal."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problema al cargar el widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Esta es una aplicación del sistema y no se puede desinstalar."</string>
     <string name="dream_name" msgid="2847171357608437154">"Lanzacohetes"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Para mover una aplicación, tócala &amp; mantenla presionada."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Para crear una carpeta nueva en tu pantalla principal, coloca una aplicación encima de la otra."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"Aceptar"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Se abrió la carpeta, %1$d por %2$d."</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Toca para cerrar la carpeta."</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toca para cambiar el nombre de la carpeta."</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Carpeta abierta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Toca para cerrar la carpeta."</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toca para guardar el nuevo nombre."</string>
     <string name="folder_closed" msgid="3130534551370511932">"Se cerró la carpeta."</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Se cambió el nombre de la carpeta a %1$s."</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Carpeta: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"El nombre de la carpeta se cambió a <xliff:g id="NAME">%1$s</xliff:g>."</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-es-sw600dp/strings.xml b/res/values-es-sw600dp/strings.xml
deleted file mode 100644
index 640d415..0000000
--- a/res/values-es-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Seleccionar fondo de pantalla"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"No hay fondos de pantalla disponibles."</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Cancelar"</string>
-</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 46645a7..86892c2 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Mantén pulsado el widget que quieras seleccionar."</string>
     <string name="market" msgid="2652226429823445833">"Tienda"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"No se ha podido añadir el elemento en este escritorio."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Error al arrastrar elemento a este escritorio"</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Selecciona el widget que quieres añadir"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nombre de carpeta"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Cambiar nombre de carpeta"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Accesos directos"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Fondos de pantalla"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"No queda espacio en el escritorio."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"No queda espacio en las pantallas del escritorio."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"No queda espacio en la barra de accesos directos."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Este widget es demasiado grande para la barra de accesos directos."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Se ha creado el acceso directo \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Se ha eliminado el acceso directo \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"El acceso directo \"<xliff:g id="NAME">%s</xliff:g>\" ya existe."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Seleccionar acceso directo"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Elegir acceso directo"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Selecciona una aplicación"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplicaciones"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Inicio"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"instalar accesos directos"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite que una aplicación añada accesos directos sin intervención del usuario."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstalar accesos directos"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite que una aplicación elimine accesos directos sin intervención del usuario."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite que la aplicación elimine accesos directos sin intervención del usuario."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"leer información de accesos directos y de configuración del escritorio"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite que una aplicación lea los ajustes y accesos directos del escritorio."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite que la aplicación lea los ajustes y los accesos directos del escritorio."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"escribir información de accesos directos y de configuración del escritorio"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite que las aplicaciones cambien los ajustes y los accesos directos del escritorio."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite que las aplicaciones cambien los ajustes y los accesos directos del escritorio."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problema al cargar el widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Esta aplicación es del sistema y no se puede desinstalar."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Para mover una aplicación, solo tienes que mantenerla pulsada."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Para crear una carpeta nueva en el escritorio, coloca una aplicación encima de otra."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"Aceptar"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Carpeta abierta de %1$d por %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Toca para cerrar la carpeta."</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toca para cambiar el nombre."</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Carpeta abierta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Toca para cerrar la carpeta."</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toca para cambiar el nuevo nombre."</string>
     <string name="folder_closed" msgid="3130534551370511932">"Carpeta cerrada"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Se ha cambiado el nombre de la carpeta a %1$s."</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Carpeta: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Se ha cambiado el nombre de la carpeta a <xliff:g id="NAME">%1$s</xliff:g>."</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Carpeta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-et-sw600dp/strings.xml b/res/values-et-sw600dp/strings.xml
deleted file mode 100644
index d4cef8d..0000000
--- a/res/values-et-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Taustapildi valimine"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Saadaval pole ühtegi taustapilti"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Tühista"</string>
-</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index f8e7cc8..6262f06 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Vidinad"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Vidina valimiseks puudutage seda pikalt."</string>
     <string name="market" msgid="2652226429823445833">"Pood"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Üksust ei saa sellele avakuvale tuua."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Üksust ei saa sellele avaekraanile tuua."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Valige loomiseks vidin"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Kausta nimi"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Nimeta kaust ümber"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Otseteed"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Vidinad"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Taustapildid"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Sellel avalehel pole enam ruumi."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Teie avakuvadel ei ole enam ruumi."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Kohandataval dokialal pole rohkem ruumi."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"See vidin on tööpunkti jaoks liiga suur."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Otsetee „<xliff:g id="NAME">%s</xliff:g>” loodud."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Otsetee „<xliff:g id="NAME">%s</xliff:g>” eemaldatud."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Otsetee „<xliff:g id="NAME">%s</xliff:g>” on juba olemas."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Valige otsetee"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Otsetee valimine"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Rakenduse valimine"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Rakendused"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Kodu"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"otseteede installimine"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Võimaldab rakendusel lisada otseteid kasutaja sekkumiseta."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"otseteede desinstallimine"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Võimaldab rakendusel eemaldada otseteid kasutaja sekkumiseta."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Võimaldab rakendusel eemaldada otseteid kasutaja sekkumiseta."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"avalehe seadete ja otseteede lugemine"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Võimaldab rakendusel lugeda avalehe seadeid ja otseteid."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Võimaldab rakendusel lugeda avalehe seadeid ja otseteid."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"avalehe seadete ja otseteede kirjutamine"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Võimaldab rakendusel muuta avalehe seadeid ja otseteid."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Võimaldab rakendusel muuta avalehel seadeid ja otseteid."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Probleem vidina laadimisel"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"See on süsteemirakendus ja seda ei saa desinstallida."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Rakenduse liigutamiseks pange sõrm rakendusele ja hoidke seda."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Avakuval uue kausta tegemiseks virnastage üks rakendus teisele."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Kaust avatud %1$d, %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Puudutage kausta sulgemiseks"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Puudutage ümbernimetamise kinnitamiseks"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Kaust on avatud, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Puudutage kausta sulgemiseks"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Puudutage uue nime salvestamiseks"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Kaust suletud"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Kausta uus nimi %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Kaust: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Kausta uus nimi: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"<xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-fa-sw600dp/strings.xml b/res/values-fa-sw600dp/strings.xml
deleted file mode 100644
index f0fc0b6..0000000
--- a/res/values-fa-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"انتخاب تصویر زمینه"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"تصویر زمینه‌ای موجود نیست"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"لغو"</string>
-</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 46c7019..707abec 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"ابزارک ها"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"برای انتخاب یک ابزارک لمس کنید و نگه دارید."</string>
     <string name="market" msgid="2652226429823445833">"فروشگاه"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"این مورد را نمی‌توان در این صفحه اصلی رها کرد."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"این مورد را نمی‌توان در این صفحه اصلی رها کرد."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"انتخاب ابزارک برای ایجاد"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"نام پوشه"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"تغییر نام پوشه"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"میانبرها"</string>
     <string name="group_widgets" msgid="6704978494073105844">"ابزارک ها"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"تصاویر زمینه"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"اتاق دیگری در این صفحه اصلی موجود نیست."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"فضای بیشتری در صفحات نمایش اصلی شما موجود نیست."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"فضای بیشتری در صندلی داغ نیست."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"این ابزارک بیش از حد برای صندلی داغ بزرگ است."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"میانبر \"<xliff:g id="NAME">%s</xliff:g>\" ایجاد شد."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"میانبر \"<xliff:g id="NAME">%s</xliff:g>\" حذف شد."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"میانبر \"<xliff:g id="NAME">%s</xliff:g>\" در حال حاضر وجود دارد."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"انتخاب میانبر"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"انتخاب میانبر"</string>
     <string name="title_select_application" msgid="1793455815754848652">"انتخاب برنامه"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"برنامه های کاربردی"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"صفحه اصلی"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"نصب میانبرها"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"به یک برنامه اجازه می‌دهد میانبرها را بدون دخالت کاربر اضافه کند."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"حذف نصب میانبرها"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"به یک برنامه اجازه می‌دهد میانبرها را بدون دخالت کاربر حذف کند."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"به یک برنامه اجازه می‌دهد میانبرها را بدون دخالت کاربر حذف کند."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"خواندن تنظیمات صفحه اصلی و میانبرها"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"به یک برنامه اجازه خواندن تنظیمات و میانبرها را در صفحه اصلی می‌دهد."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"به برنامه اجازه خواندن تنظیمات و میانبرها را در صفحه اصلی می‌دهد."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"نوشتن تنظیمات صفحه اصلی و میانبرها"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"به یک برنامه برای تغییر تنظیمات و میانبرها در صفحه اصلی اجازه می‌دهد."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"به برنامه اجازه تغییر تنظیمات و میانبرها را در صفحه اصلی می‌دهد."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"مشکل در بارگیری ابزارک"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"این یک برنامه سیستمی است و حذف نصب نمی‌شود."</string>
     <string name="dream_name" msgid="2847171357608437154">"پرتاب کننده موشک"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"برای جابجا کردن یک برنامه، آن را لمس کرده و نگهدارید."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"برای ایجاد یک پوشه جدید در صفحه اصلی خود، یک برنامه را در بالای دیگری قرار دهید."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"تأیید"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"پوشه باز شد، %1$d در %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"برای بستن پوشه، ضربه بزنید"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"برای تأیید تغییرنام، ضربه بزنید"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"پوشه باز شده، <xliff:g id="WIDTH">%1$d</xliff:g> در <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"برای بستن پوشه لمس کنید"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"برای ذخیره تغییر نام لمس کنید"</string>
     <string name="folder_closed" msgid="3130534551370511932">"پوشه بسته شد"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"نام پوشه به %1$s تغییر کرد"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"پوشه: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"نام پوشه به <xliff:g id="NAME">%1$s</xliff:g> تغییر کرد"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"پوشه: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-fi-sw600dp/strings.xml b/res/values-fi-sw600dp/strings.xml
deleted file mode 100644
index 6978d1e..0000000
--- a/res/values-fi-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Valitse taustakuva"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Ei taustakuvia saatavilla"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Peruuta"</string>
-</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 6633402..59754fd 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgetit"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Valitse widget painamalla sitä pitkään."</string>
     <string name="market" msgid="2652226429823445833">"Myymälä"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Kohdetta ei voi lisätä aloitusruutuun."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Kohteen lisääminen tähän aloitusruutuun epäonnistui."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Valitse luotava widget"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Kansion nimi"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Nimeä kansio uudelleen"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Pikakuvakkeet"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgetit"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Taustakuvat"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Etusivulla ei ole enää tilaa."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Aloitusruuduilla ei ole enää tilaa."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Hotseatissa ei ole enää tilaa."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Tämä widget on liian suuri tähän paikkaan."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Pikakuvake <xliff:g id="NAME">%s</xliff:g> luotu"</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Pikakuvake <xliff:g id="NAME">%s</xliff:g> poistettiin."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Pikakuvake <xliff:g id="NAME">%s</xliff:g> on jo olemassa."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Valitse pikakuvake"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Valitse pikakuvake"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Valitse sovellus"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Sovellukset"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Etusivu"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"asentaa pikakuvakkeita"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Antaa sovelluksen lisätä pikakuvakkeita itsenäisesti ilman käyttäjän valintaa."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"poistaa pikakuvakkeita"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Antaa sovelluksen poistaa pikakuvakkeita itsenäisesti ilman käyttäjän valintaa."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Antaa sovelluksen poistaa pikakuvakkeita ilman käyttäjän valintaa."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"lukea etusivun asetuksia ja pikakuvakkeita"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Antaa sovelluksen lukea aloitusruudun asetuksia ja pikakuvakkeita."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Antaa sovelluksen lukea aloitusruudun asetukset ja pikakuvakkeet."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"kirjoittaa etusivun asetuksia ja pikakuvakkeita"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Antaa sovelluksen muuttaa aloitusruudun asetuksia ja pikakuvakkeita."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Antaa sovelluksen muuttaa aloitusruudun asetuksia ja pikakuvakkeita."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Ongelma ladattaessa widgetiä"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Tämä on järjestelmäsovellus, eikä sitä voi poistaa."</string>
     <string name="dream_name" msgid="2847171357608437154">"Sinko"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Voit siirtää sovelluksia koskettamalla sovellusta pitkään."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Voit luoda uuden kansion aloitusruutuun pinoamalla yhden sovelluksen toisen päälle."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Kansio avattu, %1$d avaaja: %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Sulje kansio napauttamalla"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Aseta uusi nimi napauttamalla"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Kansio avattu, koko <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Sulje kansio koskettamalla"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Tallenna uudella nimellä koskettamalla"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Kansio on suljettu"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Kansio nimetty uudelleen: %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Kansio: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Kansion nimeksi vaihdettiin <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Kansio: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-fr-sw600dp/strings.xml b/res/values-fr-sw600dp/strings.xml
deleted file mode 100644
index 099ea29..0000000
--- a/res/values-fr-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Sélectionner un fond d\'écran"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Aucun fond d\'écran disponible."</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Annuler"</string>
-</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 284bbdf..d0d104f 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Appuyez de manière prolongée pour ajouter widget."</string>
     <string name="market" msgid="2652226429823445833">"Acheter"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Impossible de déposer élément sur écran d\'accueil."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Impossible de déposer élément sur écran d\'accueil."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Sélectionnez le widget à créer"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nom du dossier"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Renommer le dossier"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Raccourcis"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Fonds d\'écran"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Plus d\'espace libre sur l\'écran d\'accueil."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Vous n\'avez plus d\'espace libre sur vos écrans d\'accueil."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Vous n\'avez plus de place sur la barre d\'accès rapide."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Ce widget est trop volumineux pour la barre d\'accès rapide."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Le raccourci \"<xliff:g id="NAME">%s</xliff:g>\" a été créé."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Le raccourci \"<xliff:g id="NAME">%s</xliff:g>\" a été supprimé."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Le raccourci \"<xliff:g id="NAME">%s</xliff:g>\" existe déjà."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Sélectionner un raccourci"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Sélectionner un raccourci"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Sélectionner une application"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Applications"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Page d\'accueil"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"installer des raccourcis"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permet à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"désinstaller les raccourcis"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permet à une application de supprimer des raccourcis sans l\'intervention de l\'utilisateur."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permet à l\'application de supprimer des raccourcis sans l\'intervention de l\'utilisateur."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"Lire les paramètres et les raccourcis de la page d\'accueil"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Permet à une application de lire les paramètres et les raccourcis de l\'écran d\'accueil."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Permet à l\'application de lire les paramètres et les raccourcis de l\'écran d\'accueil."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"Enregistrer les paramètres de la page d\'accueil et des raccourcis"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Permet à une application de modifier les paramètres et les raccourcis de l\'écran d\'accueil."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Permet à l\'application de modifier les paramètres et les raccourcis de l\'écran d\'accueil."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problème lors du chargement du widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Impossible de désinstaller cette application, car il s\'agit d\'une application système."</string>
     <string name="dream_name" msgid="2847171357608437154">"Lance-missile"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Pour déplacer une application, appuyez dessus de manière prolongée."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Pour créer un dossier sur votre écran d\'accueil, superposez les applications les unes sur les autres."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Dossier ouvert, %1$d par %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Appuyez pour fermer le dossier."</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Appuyez pour confirmer le nouveau nom."</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Dossier ouvert, <xliff:g id="WIDTH">%1$d</xliff:g> par <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Appuyez pour fermer le dossier."</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Appuyez pour enregistrer le nouveau nom."</string>
     <string name="folder_closed" msgid="3130534551370511932">"Dossier fermé"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Nouveau nom du dossier : %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Dossier : %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Nouveau nom du dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Dossier : <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-hi-sw600dp/strings.xml b/res/values-hi-sw600dp/strings.xml
deleted file mode 100644
index b6982b8..0000000
--- a/res/values-hi-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"वॉलपेपर का चयन करें"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"कोई वॉलपेपर उपलब्ध नहीं"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"रद्द करें"</string>
-</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index a37ee5a..4511c31 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"विजेट"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"किसी विजेट को चुनने के लिए स्‍पर्श करके रखें."</string>
     <string name="market" msgid="2652226429823445833">"दुकान"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"इस मुखपृष्ठ स्‍क्रीन पर आइटम को नहीं छोड़ सका."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"इस मुखपृष्ठ स्‍क्रीन पर आइटम को नहीं छोड़ा जा सका."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"बनाने के लिए विजेट चुनें"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"फ़ोल्‍डर का नाम"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"फ़ोल्‍डर का नाम बदलें"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"शॉर्टकट"</string>
     <string name="group_widgets" msgid="6704978494073105844">"विजेट"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"वॉलपेपर"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"इस होम स्‍क्रीन पर और स्थान नहीं है."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"आपकी होम स्‍क्रीन पर अधिक स्थान नहीं है."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"हॉटसीट पर अधिक स्‍थान नहीं है."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"हॉटसीट के लि‍ए यह वि‍जेट बहुत बड़ा है."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"\"<xliff:g id="NAME">%s</xliff:g>\" शार्टकट बना दिया गया."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"\"<xliff:g id="NAME">%s</xliff:g>\" शॉर्टकट हटाया गया."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"शार्टकट \"<xliff:g id="NAME">%s</xliff:g>\" पहले से मौजूद है."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"शॉर्टकट का चयन करें"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"शॉर्टकट चुनें"</string>
     <string name="title_select_application" msgid="1793455815754848652">"एप्‍लिकेशन चुनें"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"एप्लिकेशन"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"होम"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"शॉर्टकट स्‍थापित करें"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"एप्लिकेशन को उपयोगकर्ता के हस्‍तक्षेप के बिना शॉर्टकट जोड़ने देता है."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"शॉर्टकट अनइंस्टॉल करें"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"एप्लिकेशन को उपयोगकर्ता के हस्‍तक्षेप के बिना शॉर्टकट निकालने देता है."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"एप्लिकेशन को उपयोगकर्ता के हस्‍तक्षेप के बिना शॉर्टकट निकालने देता है."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"होम सेटिंग और शॉर्टकट पढ़ें"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"एप्लिकेशन को मुखपृष्ठ पर सेटिंग और शॉर्टकट पढ़ने देता है."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"एप्लिकेशन को मुखपृष्ठ पर सेटिंग और शॉर्टकट पढ़ने देता है."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"होम सेटिंग और शॉर्टकट लिखें"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"एप्लिकेशन को मुखपृष्ठ पर सेटिंग और शॉर्टकट बदलने देता है."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"एप्लिकेशन को मुखपृष्ठ पर सेटिंग और शॉर्टकट बदलने देता है."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"विजेट लोड करने में समस्‍या"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"यह सिस्‍टम एप्लिकेशन है और इसे अनइंस्‍टॉल नहीं किया जा सकता."</string>
     <string name="dream_name" msgid="2847171357608437154">"रॉकेट लॉन्‍चर"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"किसी एप्लिकेशन को ले जाने के लिए, उसे स्‍पर्श करके रखें."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"अपनी मुखपृष्ठ स्‍क्रीन पर कोई नया फ़ोल्डर बनाने के लिए, एक एप्लिकेशन को दूसरे के शीर्ष पर स्‍टैक करें."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"ठीक"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"फ़ोल्डर खोला गया, %2$d द्वारा %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"फ़ोल्डर बंद करने के लिए टैप करें"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"नाम बदलना सुनिश्चित करने के लिए टैप करें"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"फ़ोल्डर खोला गया, <xliff:g id="WIDTH">%1$d</xliff:g> गुणा <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"फ़ोल्‍डर बंद करने के लिए स्‍पर्श करें"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"परिवर्तित नाम सहेजने के लिए स्पर्श करें"</string>
     <string name="folder_closed" msgid="3130534551370511932">"फ़ोल्डर बंद किया गया"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"फ़ोल्डर का नाम बदलकर %1$s कर दिया गया"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"फ़ोल्डर: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"फ़ोल्डर का नाम बदलकर <xliff:g id="NAME">%1$s</xliff:g> किया गया"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"फ़ोल्डर: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-hr-sw600dp/strings.xml b/res/values-hr-sw600dp/strings.xml
deleted file mode 100644
index 9b6d094..0000000
--- a/res/values-hr-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Odaberite pozadinsku sliku"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Nema dostupnih pozadinskih slika"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Odustani"</string>
-</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 9eb2aed..8c2051e 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgeti"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Dodirnite i držite kako biste preuzeli widget."</string>
     <string name="market" msgid="2652226429823445833">"Trgovina"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Nije bilo moguće spustiti stavku na početni zaslon"</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Nije bilo moguće spustiti stavku na početni zaslon."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Odabir widgeta za stvaranje"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Naziv mape"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Preimenuj mapu"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Prečaci"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgeti"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Pozadinske slike"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Na ovom početnom zaslonu više nema mjesta."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Na vašim početnim zaslonima više nema mjesta."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Na hotseatu više nema mjesta."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Ovaj je widget prevelik za hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Izrađen je prečac za \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Prečac za \"<xliff:g id="NAME">%s</xliff:g>\" je uklonjen."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Prečac za \"<xliff:g id="NAME">%s</xliff:g>\" već postoji."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Odaberite prečac"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Odabir prečaca"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Odabir aplikacije"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplikacije"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Početna"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"instaliraj prečace"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Omogućuje aplikaciji dodavanje prečaca bez intervencije korisnika."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"deinstaliraj prečace"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Dopušta aplikaciji uklanjanje prečaca bez intervencije korisnika."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Dopušta aplikaciji uklanjanje prečaca bez intervencije korisnika."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"pročitaj postavke početnog zaslona i prečaca"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Dopušta aplikaciji čitanje postavki i prečaca na početnom zaslonu."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Dopušta aplikaciji čitanje postavki i prečaca na početnom zaslonu."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"zapiši postavke početnog zaslona i prečaca"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Dopušta aplikaciji promjenu postavki i prečaca na početnom zaslonu."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Dopušta aplikaciji promjenu postavki i prečaca na početnom zaslonu."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problem pri učitavanju widgeta"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Ovo je aplikacija sustava i ne može se ukloniti."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Da biste premjestili aplikaciju, dodirnite je i zadržite."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Da biste napravili novu mapu na početnom zaslonu, stavite jednu aplikaciju na drugu."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"U redu"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Mapa je otvorena, %1$d s %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Dotaknite za zatvaranje mape"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Dotaknite za izvršavanje preimenovanja"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Mapa je otvorena, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Dodirnite za zatvaranje mape"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dodirnite da biste spremili preimenovanje"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Mapa zatvorena"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Mapa je preimenovana u %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Mapa: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Mapa je preimenovana u <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Mapa: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-hu-sw600dp/strings.xml b/res/values-hu-sw600dp/strings.xml
deleted file mode 100644
index 0e7bc22..0000000
--- a/res/values-hu-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Háttérkép kiválasztása"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Nincs elérhető háttérkép"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Mégse"</string>
-</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 75deb12..2912f37 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Modulok"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Modul felvételéhez érintse meg, és tartsa lenyomva"</string>
     <string name="market" msgid="2652226429823445833">"Bolt"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Nem lehet elemeket dobni erre a Kezdőképernyőre."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Nem lehet elemeket dobni erre a Kezdőképernyőre."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"A létrehozáshoz válasszon modult"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Mappa neve"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Mappa átnevezése"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Parancsikonok"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Modulok"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Háttérképek"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Nincs több hely ezen a főoldalon."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Nincs több hely a Kezdőképernyőkön."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Nincs több hely a hotseaten."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Ez a modul túl nagy a hotseat számára."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"\"<xliff:g id="NAME">%s</xliff:g>\" parancsikon létrehozva."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"A(z) \"<xliff:g id="NAME">%s</xliff:g>\" parancsikon eltávolításra került."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"\"<xliff:g id="NAME">%s</xliff:g>\" parancsikon már létezik."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Parancsikon kiválasztása"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Parancsikon választása"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Válasszon alkalmazást"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Alkalmazások"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Főoldal"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"parancsikonok telepítése"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Lehetővé teszi egy alkalmazás számára, hogy felhasználói beavatkozás nélkül adjon hozzá parancsikonokat."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"parancsikonok eltávolítása"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Lehetővé teszi egy alkalmazás számára, hogy felhasználói beavatkozás nélkül távolítson el parancsikonokat."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Lehetővé teszi egy alkalmazás számára, hogy felhasználói beavatkozás nélkül távolítson el parancsikonokat."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"Főoldal beállításainak és parancsikonjainak beolvasása"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Lehetővé teszi egy alkalmazás számára, hogy beolvassa a Kezdőképernyő beállításait és parancsikonjait."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Lehetővé teszi az alkalmazás számára, hogy beolvassa a Kezdőképernyő beállításait és parancsikonjait."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"Főoldal beállításainak és parancsikonjainak írása"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Lehetővé teszi egy alkalmazás számára, hogy módosítsa a Kezdőképernyő beállításait és parancsikonjait."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Lehetővé teszi az alkalmazás számára, hogy módosítsa a Kezdőképernyő beállításait és parancsikonjait."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Probléma történt a modul betöltésekor"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Ez egy rendszeralkalmazás, és nem lehet eltávolítani."</string>
     <string name="dream_name" msgid="2847171357608437154">"Aknavető"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Ha egy alkalmazást át szeretne helyezni, érintse meg, és tartsa lenyomva."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Ha egy új mappát szeretne létrehozni a kezdőképernyőn, helyezzen egymásra két alkalmazást."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Megnyitott mappa: %1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Érintse meg a mappa bezárásához"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Átnevezéshez érintse meg"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Mappa megnyitva -- szélesség: <xliff:g id="WIDTH">%1$d</xliff:g>; magasság: <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Érintse meg a mappa bezárásához"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Érintse meg az átnevezés mentéséhez"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Mappa lezárva"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Mappa átnevezve a következőre: %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Mappa: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Mappa új neve: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Mappa: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-in-sw600dp/strings.xml b/res/values-in-sw600dp/strings.xml
deleted file mode 100644
index 0e96a14..0000000
--- a/res/values-in-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Pilih wallpaper"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Tidak tersedia wallpaper"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Batal"</string>
-</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index a7214d8..4e4360a 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -27,12 +27,12 @@
     <string name="pick_wallpaper" msgid="5630222540525626723">"Wallpaper"</string>
     <string name="activity_not_found" msgid="217823393239365967">"Apl tidak dipasang."</string>
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widget"</string>
-    <string name="long_press_widget_to_add" msgid="7395697462851217506">"Sentuh &amp; tahan untuk memilih gawit."</string>
+    <string name="long_press_widget_to_add" msgid="7395697462851217506">"Sentuh &amp; tahan untuk memilih widget."</string>
     <string name="market" msgid="2652226429823445833">"Belanja"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Tidak dapat melepas item ke layar Utama ini."</string>
-    <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Pilih gawit untuk membuat"</string>
-    <string name="rename_folder_label" msgid="5646236631298452787">"Nama map"</string>
-    <string name="rename_folder_title" msgid="4544573104191526550">"Ubah nama map"</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Tidak dapat melepas item ke layar Utama ini."</string>
+    <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Pilih widget untuk membuat"</string>
+    <string name="rename_folder_label" msgid="5646236631298452787">"Nama folder"</string>
+    <string name="rename_folder_title" msgid="4544573104191526550">"Ganti nama folder"</string>
     <string name="rename_action" msgid="6016003384693240896">"OK"</string>
     <string name="cancel_action" msgid="3811860427489435048">"Batal"</string>
     <string name="menu_item_add_item" msgid="6233177331075781114">"Tambahkan ke Layar Utama"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Pintasan"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widget"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Wallpaper"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Tidak ada ruang lagi pada layar Utama ini."</string>
-    <string name="invalid_hotseat_item" msgid="6545340627805449250">"Gawit ini terlalu besar untuk hotseat tersebut."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Tidak ada ruang lagi pada layar Utama Anda."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Tidak ada ruang lagi di hotseat."</string>
+    <string name="invalid_hotseat_item" msgid="6545340627805449250">"Widget ini terlalu besar untuk hotseat tersebut."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" sudah dibuat."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" telah dihapus."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" sudah ada."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Pilih pintasan"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Pilih pintasan"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Pilih apl"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Rumah"</string>
@@ -58,9 +59,9 @@
     <string name="accessibility_voice_search_button" msgid="3938249215065842475">"Penelusuran Suara"</string>
     <string name="accessibility_all_apps_button" msgid="8803738611398979849">"Apl"</string>
     <string name="accessibility_delete_button" msgid="3628162007991023603">"Hapus"</string>
-    <string name="delete_zone_label_all_apps_system_app" msgid="3683920959591819044">"Copot pemasangan pemutakhiran"</string>
+    <string name="delete_zone_label_all_apps_system_app" msgid="3683920959591819044">"Copot pemasangan pembaruan"</string>
     <string name="menu_add" msgid="3065046628354640854">"Tambahkan"</string>
-    <string name="menu_manage_apps" msgid="2308685199463588895">"Mengelola aplikasi"</string>
+    <string name="menu_manage_apps" msgid="2308685199463588895">"Kelola apl"</string>
     <string name="menu_wallpaper" msgid="5837429080911269832">"Wallpaper"</string>
     <string name="menu_search" msgid="4826514464423239041">"Telusuri"</string>
     <string name="menu_notifications" msgid="6424587053194766192">"Pemberitahuan"</string>
@@ -70,37 +71,37 @@
     <string name="cab_menu_app_info" msgid="914548323652698884">"Detail apl"</string>
     <string name="cab_app_selection_text" msgid="6378522164293415735">"1 apl dipilih"</string>
     <string name="cab_widget_selection_text" msgid="962527270506951955">"1 widget dipilih"</string>
-    <string name="cab_folder_selection_text" msgid="8916111874189565067">"1 map dipilih"</string>
+    <string name="cab_folder_selection_text" msgid="8916111874189565067">"1 folder dipilih"</string>
     <string name="cab_shortcut_selection_text" msgid="8115847384500412878">"1 pintasan dipilih"</string>
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"pasang pintasan"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Mengizinkan apl menambahkan pintasan tanpa campur tangan pengguna."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"copot pemasangan pintasan"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Mengizinkan apl menghapus pintasan tanpa campur tangan pengguna."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Mengizinkan apl menghapus pintasan tanpa campur tangan pengguna."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"baca setelan dan pintasan Beranda"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Mengizinkan aplikasi membaca setelan dan pintasan di layar Utama."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Mengizinkan apl membaca setelan dan pintasan di layar Utama."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"tuliskan setelan dan pintasan Beranda"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Mengizinkan apl mengubah setelan dan pintasan di layar Utama."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Mengizinkan apl mengubah setelan dan pintasan di layar Utama."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Masalah memuat widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Ini adalah apl sistem dan tidak dapat dicopot pemasangannya."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
-    <string name="folder_hint_text" msgid="8633351560105748141">"Map Tanpa Nama"</string>
+    <string name="folder_hint_text" msgid="8633351560105748141">"Folder Tanpa Nama"</string>
     <string name="default_scroll_format" msgid="4057140866420001240">"Laman %1$d dari %2$d"</string>
     <string name="workspace_scroll_format" msgid="7911126267695001437">"Ruang kerja %1$d dari %2$d"</string>
     <string name="apps_customize_apps_scroll_format" msgid="5494241912377704885">"Laman apl %1$d dari %2$d"</string>
-    <string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"Laman gawit %1$d dari %2$d"</string>
+    <string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"Laman widget %1$d dari %2$d"</string>
     <string name="workspace_cling_title" msgid="738396473989890567">"Anggap rumah sendiri"</string>
     <string name="workspace_cling_move_item" msgid="791013895761065070">"Anda dapat meletakkan apl favorit Anda di sini."</string>
     <string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"Untuk melihat semua apl Anda, sentuh lingkaran."</string>
     <string name="all_apps_cling_title" msgid="2559734712581447107">"Pilih beberapa apl"</string>
     <string name="all_apps_cling_add_item" msgid="5665035103260318891">"Untuk menambah apl ke layar Utama Anda, sentuh &amp; tahan apl tersebut."</string>
-    <string name="folder_cling_title" msgid="4308949882377840953">"Atur apl Anda dengan map"</string>
+    <string name="folder_cling_title" msgid="4308949882377840953">"Atur apl Anda dengan folder"</string>
     <string name="folder_cling_move_item" msgid="270598675060435169">"Untuk memindahkan apl, sentuh &amp; tahan apl tersebut."</string>
-    <string name="folder_cling_create_folder" msgid="8352867485656129478">"Untuk membuat map baru di layar Utama Anda, tumpuk satu apl di atas apl yang lain."</string>
+    <string name="folder_cling_create_folder" msgid="8352867485656129478">"Untuk membuat folder baru di layar Utama Anda, tumpuk satu apl di atas apl yang lain."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Map dibuka, %1$d kali %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Ketuk untuk menutup map"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Ketuk untuk mengubah nama"</string>
-    <string name="folder_closed" msgid="3130534551370511932">"Map ditutup"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Map diubah namanya menjadi %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Map: %1$s"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Folder dibuka, <xliff:g id="WIDTH">%1$d</xliff:g> kali <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Sentuh untuk menutup folder"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Sentuh untuk menyimpan pengubahan nama"</string>
+    <string name="folder_closed" msgid="3130534551370511932">"Folder ditutup"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Folder diubah namanya menjadi <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-it-sw600dp/strings.xml b/res/values-it-sw600dp/strings.xml
deleted file mode 100644
index e668f10..0000000
--- a/res/values-it-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Seleziona sfondo"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Nessuno sfondo disponibile"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Annulla"</string>
-</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index f935303..1a3edbd 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widget"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Tocca e tieni premuto per scegliere un widget."</string>
     <string name="market" msgid="2652226429823445833">"Acquista"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Rilascio elemento in schermata Home non riuscito."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Rilascio elemento in schermata Home non riuscito."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Scegli il widget da creare"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nome cartella"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Rinomina cartella"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Scorciatoie"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widget"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Sfondi"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Spazio nella schermata Home esaurito."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Spazio nelle schermate Home esaurito."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Spazio nell\'area hotseat esaurito."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Questo widget è troppo grande per l\'area hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" creata."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"La scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" è stata rimossa."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Scorciatoia \"<xliff:g id="NAME">%s</xliff:g>\" già presente."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Seleziona scorciatoia"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Scegli scorciatoia"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Scegli applicazione"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Applicazioni"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Home"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"aggiungere scorciatoie"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Consente a un\'applicazione di aggiungere scorciatoie automaticamente."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"eliminare scorciatoie"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Consente a un\'applicazione di rimuovere scorciatoie automaticamente."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Consente all\'applicazione di rimuovere scorciatoie automaticamente."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"leggere impostazioni e scorciatoie in Home"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Consente a un\'applicazione di leggere le impostazioni e le scorciatoie in Home."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Consente all\'applicazione di leggere le impostazioni e le scorciatoie in Home."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"creare impostazioni e scorciatoie in Home"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Consente a un\'applicazione di modificare le impostazioni e le scorciatoie in Home."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Consente all\'applicazione di modificare le impostazioni e le scorciatoie in Home."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Errore durante il caricamento del widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Questa è un\'applicazione di sistema e non può essere disinstallata."</string>
     <string name="dream_name" msgid="2847171357608437154">"Lanciamissili"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Per spostare un\'applicazione, tocca e tieni premuto."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Per creare una nuova cartella sulla schermata Home, impila un\'applicazione su un\'altra."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Cartella aperta, %1$d per %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Tocca per chiudere la cartella"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tocca per applicare nuovo nome"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Cartella aperta, <xliff:g id="WIDTH">%1$d</xliff:g> per <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Tocca per chiudere la cartella"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Tocca per salvare nuovo nome"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Cartella chiusa"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Nome della cartella sostituito con %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Cartella: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Cartella rinominata in <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Cartella: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-iw-sw600dp/strings.xml b/res/values-iw-sw600dp/strings.xml
deleted file mode 100644
index 9a1ecaf..0000000
--- a/res/values-iw-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"בחר טפט"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"אין טפטים זמינים"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"ביטול"</string>
-</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index d6f18fd..2835105 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"רכיבי Widget"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"גע בפריט והחזק בו כדי לבחור Widget."</string>
     <string name="market" msgid="2652226429823445833">"קנה"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"לא ניתן לשחרר את הפריט במסך דף הבית הזה."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"לא ניתן לשחרר את הפריט במסך דף בית זה."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"בחר Widget ליצירה"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"שם תיקיה"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"שנה את שם התיקיה"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"קיצורי דרך"</string>
     <string name="group_widgets" msgid="6704978494073105844">"רכיבי Widget"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"טפטים"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"אין עוד מקום במסך דף הבית הזה."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"אין יותר מקום במסכי דף הבית."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"אין יותר מקום בפס היישומים."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Widget זה גדול מדי עבור אזור העגינה."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"הקיצור \'<xliff:g id="NAME">%s</xliff:g>\' נוצר."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"הקיצור \'<xliff:g id="NAME">%s</xliff:g>\' הוסר."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"הקיצור \'<xliff:g id="NAME">%s</xliff:g>\' כבר קיים."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"בחר קיצור דרך"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"בחר קיצור דרך"</string>
     <string name="title_select_application" msgid="1793455815754848652">"בחר יישום"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"יישומים"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"בית"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"התקן קיצורי דרך"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"מאפשר ליישום להוסיף קיצורי דרך ללא התערבות המשתמש."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"הסר קיצורי דרך"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"מאפשר ליישום להסיר קיצורי דרך ללא התערבות המשתמש."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"מאפשר ליישום להסיר קיצורי דרך ללא התערבות המשתמש."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"קרא הגדרות וקיצורי דרך של דף הבית"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"מאפשר ליישום לקרוא את ההגדרות וקיצורי הדרך בדף הבית."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"מאפשר ליישום לקרוא את ההגדרות וקיצורי הדרך בדף הבית."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"כתוב הגדרות וקיצורי דרך של דף הבית"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"מאפשר ליישום לשנות את ההגדרות וקיצורי הדרך בדף הבית."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"מאפשר ליישום לשנות את ההגדרות וקיצורי הדרך בדף הבית."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"בעיה בטעינת Widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"זהו יישום מערכת ולא ניתן להסיר את התקנתו."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"כדי להעביר יישום, גע בו והחזק אותו."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"כדי ליצור תיקיה חדשה במסך דף הבית, הצב יישום אחד בערימה מעל יישום אחר."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"בסדר"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"התיקייה נפתחה, %1$d על %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"הקש כדי לסגור את התיקייה"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"הקש כדי לבצע שינוי שם"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"תיקיה פתוחה, <xliff:g id="WIDTH">%1$d</xliff:g> על <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"גע כדי לסגור את התיקייה"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"גע כדי לשמור שינוי שם"</string>
     <string name="folder_closed" msgid="3130534551370511932">"התיקייה נסגרה"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"שם התיקייה שונה ל-%1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"תיקייה: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"שם התיקיה שונה ל-<xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"תיקיה: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-ja-sw600dp/strings.xml b/res/values-ja-sw600dp/strings.xml
deleted file mode 100644
index bfa4d11..0000000
--- a/res/values-ja-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"壁紙の選択"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"利用できる壁紙がありません"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"キャンセル"</string>
-</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index c172fa0..f8ff0a7 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"ウィジェット"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"ウィジェットを追加するには押し続けます。"</string>
     <string name="market" msgid="2652226429823445833">"ショップ"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"このホーム画面にアイテムをドロップできませんでした"</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"このホーム画面にアイテムをドロップできませんでした。"</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"作成するウィジェットの選択"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"フォルダ名"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"フォルダ名を変更"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"ショートカット"</string>
     <string name="group_widgets" msgid="6704978494073105844">"ウィジェット"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"壁紙"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"ホーム画面に空きスペースがありません。"</string>
+    <string name="out_of_space" msgid="3056555298801463098">"ホーム画面に空きスペースがありません。"</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"ホットシートに空きスペースがありません。"</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"このウィジェットはホットシートには大きすぎます。"</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"ショートカット「<xliff:g id="NAME">%s</xliff:g>」を作成しました。"</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"ショートカット「<xliff:g id="NAME">%s</xliff:g>」を削除しました。"</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"ショートカット「<xliff:g id="NAME">%s</xliff:g>」は既に存在します。"</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"ショートカットを選択"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"ショートカットを選択"</string>
     <string name="title_select_application" msgid="1793455815754848652">"アプリの選択"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"アプリ"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"ホーム"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"ショートカットのインストール"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"ユーザー操作なしでショートカットを追加することをアプリに許可します。"</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"ショートカットのアンインストール"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"ユーザー操作なしでショートカットを削除することをアプリに許可します。"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"ユーザー操作なしでショートカットを削除することをアプリに許可します。"</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"ホーム設定とショートカットの読み取り"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"ホームの設定とショートカットの読み取りをアプリに許可します。"</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"ホームの設定とショートカットの読み取りをアプリに許可します。"</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"ホームの設定とショートカットの書き込み"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"ホームの設定とショートカットの変更をアプリに許可します。"</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"ホームの設定とショートカットの変更をアプリに許可します。"</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"ウィジェットを表示できません"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"このシステムアプリはアンインストールできません。"</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"アプリを移動するにはアプリを押し続けます。"</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"ホーム画面に新しいフォルダを作成するには、アプリを他のアプリの上に重ねます。"</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"フォルダが開いています。%1$dx%2$dの大きさです"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"タップしてフォルダを閉じます"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"タップして名前の変更を確定"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"フォルダが開いています。<xliff:g id="WIDTH">%1$d</xliff:g>x<xliff:g id="HEIGHT">%2$d</xliff:g>の大きさです"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"タップしてフォルダを閉じます"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"タップして名前の変更を保存します"</string>
     <string name="folder_closed" msgid="3130534551370511932">"フォルダは閉じています"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"フォルダの名前を「%1$s」に変更しました"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"フォルダ: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"フォルダの名前を「<xliff:g id="NAME">%1$s</xliff:g>」に変更しました"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"フォルダ: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-ko-sw600dp/strings.xml b/res/values-ko-sw600dp/strings.xml
deleted file mode 100644
index b2b0469..0000000
--- a/res/values-ko-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"배경화면 선택"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"배경화면이 없습니다."</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"취소"</string>
-</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 34657e8..5a8a2cc 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"위젯"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"위젯을 선택하려면 길게 터치하세요."</string>
     <string name="market" msgid="2652226429823445833">"쇼핑"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"홈 화면에 항목을 놓을 수 없습니다."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"홈 화면에 항목을 놓을 수 없습니다."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"만들 위젯 선택"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"폴더 이름"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"폴더 이름 바꾸기"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"바로가기"</string>
     <string name="group_widgets" msgid="6704978494073105844">"위젯"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"배경화면"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"홈 화면에 더 이상 공간이 없습니다."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"홈 화면에 더 이상 공간이 없습니다."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"즐겨찾는 앱 모음에 더 이상 빈 공간이 없습니다."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"이 위젯은 핫시트에 너무 큽니다."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"바로가기(\'<xliff:g id="NAME">%s</xliff:g>\')가 생성되었습니다."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"바로가기(\'<xliff:g id="NAME">%s</xliff:g>\')가 삭제되었습니다."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"바로가기(\'<xliff:g id="NAME">%s</xliff:g>\')가 이미 있습니다."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"바로가기 선택"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"바로가기 선택"</string>
     <string name="title_select_application" msgid="1793455815754848652">"앱 선택"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"애플리케이션"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"홈"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"바로가기 설치"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"앱이 사용자의 작업 없이 바로가기를 추가할 수 있도록 합니다."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"바로가기 제거"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"앱이 사용자의 작업 없이 바로가기를 삭제할 수 있도록 합니다."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"앱이 사용자의 작업 없이 바로가기를 삭제할 수 있도록 합니다."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"홈 설정 및 바로가기 읽기"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"앱이 홈에 있는 설정 및 바로가기를 읽을 수 있도록 합니다."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"앱이 홈에 있는 설정 및 바로가기를 읽을 수 있도록 합니다."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"홈 설정 및 바로가기 쓰기"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"앱이 홈에 있는 설정 및 바로가기를 변경할 수 있도록 합니다."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"앱이 홈에 있는 설정 및 바로가기를 변경할 수 있도록 합니다."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"위젯을 로드하는 중 문제가 발생했습니다."</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"시스템 앱은 제거할 수 없습니다."</string>
     <string name="dream_name" msgid="2847171357608437154">"로켓 실행기"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"앱을 이동하려면 길게 터치합니다."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"홈 화면에 새로운 폴더를 만들려면 앱 하나를 다른 앱 위에 겹쳐 놓습니다."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"확인"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"폴더 열림, %1$d 곱하기 %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"탭하여 폴더를 닫음"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"탭하여 이름을 바꿈"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"폴더 열림(<xliff:g id="WIDTH">%1$d</xliff:g>X<xliff:g id="HEIGHT">%2$d</xliff:g>)"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"터치하여 폴더를 닫음"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"터치하여 바꾼 이름을 저장"</string>
     <string name="folder_closed" msgid="3130534551370511932">"폴더 닫음"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"%1$s(으)로 폴더 이름 바꿈"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"폴더: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"폴더 이름 변경: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"폴더: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 6d0261f..5f03510 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -33,7 +33,7 @@
     <dimen name="workspace_bottom_padding">0dp</dimen>
     <!-- We really want the page spacing to be the max of either the button bar
          height or the qsb bar height -->
-    <dimen name="workspace_page_spacing">@dimen/button_bar_height</dimen>
+    <dimen name="workspace_page_spacing">-1dp</dimen>
     <dimen name="workspace_divider_padding_left">0dp</dimen>
     <dimen name="workspace_divider_padding_right">0dp</dimen>
     <dimen name="workspace_divider_padding_top">12dp</dimen>
@@ -69,10 +69,6 @@
     <integer name="apps_customize_cling_focused_x">2</integer>
     <integer name="apps_customize_cling_focused_y">1</integer>
 
-    <!-- Padding applied to AppWidgets -->
-    <dimen name="app_widget_padding_top">8dp</dimen>
-    <dimen name="app_widget_padding_bottom">8dp</dimen>
-
 <!-- Folders -->
     <!-- The size of the image which sits behind the preview of the folder contents -->
     <dimen name="folder_preview_size">58dp</dimen>
diff --git a/res/values-lt-sw600dp/strings.xml b/res/values-lt-sw600dp/strings.xml
deleted file mode 100644
index bad4c24..0000000
--- a/res/values-lt-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Pasirinkti darbalaukio foną"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Nepasiekiami jokie darbalaukio fonai"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Atšaukti"</string>
-</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 2b12981..4e977e5 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Valdikliai"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Kad pasirinkt. valdiklį, palieskite ir laikykite."</string>
     <string name="market" msgid="2652226429823445833">"Parduotuvė"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Nepavyko palikti elemento šiame pagrind. ekrane."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Nepavyko nuvilkti elemento į šį pagrind. ekraną."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Pasirinkite norimą kurti valdiklį"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Aplanko pavadinimas"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Sukurti aplankui naują pavadinimą"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Spartieji klavišai"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Valdikliai"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Darbalaukio fonai"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Šiame pagrindiniame ekrane vietos nebėra."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Pagrindiniuose ekranuose vietos nebėra."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Įtvirtintoje srityje nebėra vietos."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Šis valdiklis per didelis keliems žaidėjams."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Sukurtas „<xliff:g id="NAME">%s</xliff:g>“ spartusis klavišas."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Spartusis klavišas „<xliff:g id="NAME">%s</xliff:g>“ pašalintas."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Spartusis klavišas „<xliff:g id="NAME">%s</xliff:g>“ jau yra."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Pasirinkti spartųjį klavišą"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Pasirinkite spartųjį klavišą"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Pasirinkite programą"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Pagrindinis"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"įdiegti sparčiuosius klavišus"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Leidžiama programai pridėti sparčiuosius klavišus be naudotojo įsikišimo."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"pašalinti sparčiuosius klavišus"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Leidžiama programai pašalinti sparčiuosius klavišus be naudotojo įsikišimo."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Programai leidžiama pašalinti sparčiuosius klavišus be naudotojo įsikišimo."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"skaityti pagrindinio puslapio nustatymus ir sparčiuosius klavišus"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Leidžiama programai skaityti pagrindinio puslapio nustatymus ir sparčiuosius klavišus."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Programai leidžiama skaityti pagrindinio puslapio nustatymus ir sparčiuosius klavišus."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"rašyti pagrindinio puslapio nustatymus ir sparčiuosius klavišus"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Leidžiama programai keisti pagrindinio puslapio nustatymus ir sparčiuosius klavišus."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Programai leidžiama keisti pagrindinio puslapio nustatymus ir sparčiuosius klavišus."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problema įkeliant valdiklį"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Tai sistemos programa ir jos negalima pašalinti."</string>
     <string name="dream_name" msgid="2847171357608437154">"Raketinis prieštankinis šautuvas"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Jei norite perkelti programą, palieskite ją ir laikykite."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Jei pagrindiniame ekrane norite sukurti naują aplanką, uždėkite vieną programą ant kitos."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"Gerai"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Aplankas atidarytas, %1$d ir %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Palieskite, kad uždarytumėte aplanką"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Palieskite, kad pervardytumėte"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Atidarytas aplankas, <xliff:g id="WIDTH">%1$d</xliff:g> ir <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Palieskite, kad uždarytumėte aplanką"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Palieskite, kad išsaugotumėte naują pavadinimą"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Aplankas uždarytas"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Aplankas pervardytas į %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Aplankas: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Aplankas pervardytas kaip „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Aplankas: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-lv-sw600dp/strings.xml b/res/values-lv-sw600dp/strings.xml
deleted file mode 100644
index 06cfea1..0000000
--- a/res/values-lv-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Fona tapetes atlase"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Fona tapetes nav pieejamas."</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Atcelt"</string>
-</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 96686c3..fc34d21 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Logrīki"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Lai izvēlētos logrīku, pieskarieties tam un turiet to."</string>
     <string name="market" msgid="2652226429823445833">"Iepirkties"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Nevarēja nomest vienumu šajā sākuma ekrānā."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Nevarēja nomest vienumu šajā sākuma ekrānā."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Izveidojamā logrīka izvēlēšanās"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Mapes nosaukums"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Mapes pārdēvēšana"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Saīsnes"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Logrīki"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Tapetes"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Šajā sākuma ekrānā vairs nav vietas."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Sākuma ekrānos vairs nav vietas."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Režīmā Hotseat vairs nav vietas."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Šis logrīks ir pārāk liels režīmam “hotseat”."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Saīsne “<xliff:g id="NAME">%s</xliff:g>” tika izveidota."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Saīsne “<xliff:g id="NAME">%s</xliff:g>” tika noņemta."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Saīsne “<xliff:g id="NAME">%s</xliff:g>” jau pastāv."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Saīsnes atlase"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Saīsnes izvēle"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Lietotnes izvēlēšanās"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Lietotnes"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Sākums"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"ievietot saīsnes"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Ļauj lietotnei pievienot saīsnes, nejautājot lietotājam."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"atinstalēt saīsnes"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Ļauj lietotnei noņemt saīsnes, nejautājot lietotājam."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Ļauj lietotnei noņemt saīsnes, nejautājot lietotājam."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"lasīt sākuma ekrāna iestatījumus un saīsnes"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Ļauj lietotnei lasīt iestatījumus un saīsnes sākuma ekrānā."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Ļauj lietotnei lasīt iestatījumus un saīsnes sākuma ekrānā."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"rakstīt sākuma ekrāna iestatījumus un saīsnes"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Ļauj lietotnei mainīt iestatījumus un saīsnes sākuma ekrānā."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Ļauj lietotnei mainīt iestatījumus un saīsnes sākuma ekrānā."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Radās problēma, ielādējot logrīku"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Šī ir sistēmas lietotne, un to nevar atinstalēt."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Lai pārvietotu lietotni, pieskarieties tai un turiet to nospiestu."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Lai sākuma ekrānā izveidotu jaunu mapi, novietojiet vienu lietotni virs citas lietotnes."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"Labi"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Mape atvērta, %1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Pieskarieties, lai aizvērtu mapi."</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Pieskarieties, lai pārdēvētu"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Atvērta mape: <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Pieskarieties, lai aizvērtu mapi."</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Pieskarieties, lai saglabātu pārdēvēto nosaukumu."</string>
     <string name="folder_closed" msgid="3130534551370511932">"Mape aizvērta"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Mape pārdēvēta par: %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Mape: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Mape pārdēvēta par: <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Mape: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-ms-sw600dp/strings.xml b/res/values-ms-sw600dp/strings.xml
deleted file mode 100644
index 4068e59..0000000
--- a/res/values-ms-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Pilih kertas dinding"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Tiada kertas dinding tersedia"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Batal"</string>
-</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 44f38d1..4ea571e 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widget"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Sentuh &amp; tahan untuk mengambil widget."</string>
     <string name="market" msgid="2652226429823445833">"Kedai"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Tidak dapat melepaskan item pada skrin Utama ini."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Tidak dapat melepaskan item pada skrin Utama ini."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Pilih widget untuk dibuat"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nama folder"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Namakan semula folder"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Pintasan"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widget"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Kertas dinding"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Tiada lagi ruang pada skrin Utama ini"</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Tiada lagi ruang pada skrin Utama anda."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Tiada lagi ruang pada kerusi panas."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Widget ini terlalu besar untuk kerusi panas."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" diwujudkan."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" telah dialih keluar."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Pintasan \"<xliff:g id="NAME">%s</xliff:g>\" sudah pun wujud."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Pilih pintasan"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Pilih pintasan"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Pilih aplikasi"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Apl"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Laman Utama"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"pasang pintasan"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Membenarkan aplikasi menambah pintasan tanpa campur tangan pengguna."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"nyahpasang pintasan"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Membenarkan aplikasi mengalih keluar pintasan tanpa campur tangan pengguna."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Membenarkan apl mengalih keluar pintasan tanpa campur tangan pengguna."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"membaca tetapan dan pintasan Laman Utama"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Membenarkan aplikasi untuk membaca tetapan dan pintasan di Laman Utama."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Membenarkan apl membaca tetapan dan pintasan di Laman Utama."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"menulis tetapan dan pintasan Laman Utama"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Membenarkan aplikasi untuk menukar tetapan dan pintasan di Laman Utama."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Membenarkan apl menukar tetapan dan pintasan di Laman Utama."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Masalah memuatkan widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Ini adalah aplikasi sistem dan tidak boleh dinyahpasang."</string>
     <string name="dream_name" msgid="2847171357608437154">"Pelancar Roket"</string>
@@ -97,12 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Untuk memindahkan aplikasi, sentuh &amp; tahankannya."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Untuk membuat folder baharu pada skrin Utama anda, tindihkan satu aplikasi di atas yang lain."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Folder dibuka, %1$d daripada %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Ketik untuk tutup folder"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Ketik untuk melakukan menamakan semula"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Folder dibuka, <xliff:g id="WIDTH">%1$d</xliff:g> kali <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Sentuh untuk menutup folder"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Sentuh untuk menyimpan penamaan semula"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Folder ditutup"</string>
-    <!-- String.format failed for translation -->
-    <!-- no translation found for folder_renamed (781234745487414781) -->
-    <skip />
-    <string name="folder_name_format" msgid="4513766553514769310">"Folder: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Folder dinamakan semula kepada <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-nb-sw600dp/strings.xml b/res/values-nb-sw600dp/strings.xml
deleted file mode 100644
index 116ac2e..0000000
--- a/res/values-nb-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Angi bakgrunn"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Ingen bakgrunner er tilgjengelig"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Avbryt"</string>
-</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 18c5ac3..1210b05 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Moduler"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Trykk og hold inne for å plukke opp en modul."</string>
     <string name="market" msgid="2652226429823445833">"Butikk"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Kunne ikke slippe elementet på denne startsiden."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Kunne ikke slippe elementet på denne startsiden."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Velg modul for oppretting"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Mappenavn"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Gi nytt navn til mappe"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Snarveier"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Skrivebordselementer"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Bakgrunner"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Ikke nok plass på skrivebordet."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Ikke mer plass på startsideskjermene."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Dokksonen er full."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Denne modulen er for stor for hotseat-feltet."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Opprettet snarveien «<xliff:g id="NAME">%s</xliff:g>»."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Fjernet snarveien «<xliff:g id="NAME">%s</xliff:g>»."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Snarveien «<xliff:g id="NAME">%s</xliff:g>» fins allerede."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Velg snarvei"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Valg av snarvei"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Velg app"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Apper"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Startsiden"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"installere snarveier"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Gir apper tillatelse til å legge til snarveier uten innblanding fra brukeren."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"avinstallere snarveier"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Gir apper tillatelse til å fjerne snarveier uten innblanding fra brukeren."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"La appen fjerne snarveier uten innblanding fra brukeren."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"lese skrivebordsinnstillinger og -snarveier"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Gir apper tillatelse til å lese innstillingene og snarveiene på startsiden."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Lar appen lese innstillingene og snarveiene på startsiden."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"skrive skrivebordsinnstillinger og -snarveier"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Gir apper tillatelse til å endre innstillingene og snarveiene på startsiden."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Lar appen endre innstillingene og snarveiene på startsiden."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problem under lasting av gadget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Dette er en systemapp som ikke kan avinstalleres."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Berør og hold nede en app for å flytte den."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Du kan lage en ny mappe på startsiden ved å stable én app oppå en annen."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Mappe åpnet, %1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Trykk for å lukke mappen"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Trykk for gjennomføre navnebytte"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Mappen er åpnet – <xliff:g id="WIDTH">%1$d</xliff:g> ganger <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Trykk for å lukke mappen"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Trykk for å lagre nytt navn"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Mappen ble lukket"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Mappen har endret navn til %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Mappe: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Mappen heter nå <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Mappe: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-nl-sw600dp/strings.xml b/res/values-nl-sw600dp/strings.xml
deleted file mode 100644
index b966319..0000000
--- a/res/values-nl-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Achtergrond selecteren"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Geen achtergronden beschikbaar"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Annuleren"</string>
-</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 157743a..b9e5121 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Blijf aanraken om een widget toe te voegen"</string>
     <string name="market" msgid="2652226429823445833">"Winkel"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Kan item niet neerzetten op dit startscherm."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Kan item niet neerzetten in dit startscherm."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Widget selecteren om te maken"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Mapnaam"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Naam van map wijzigen"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Sneltoetsen"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Achtergronden"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Er is geen ruimte meer op dit startscherm."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Er is geen ruimte meer op uw startschermen."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Er is geen ruimte meer op de hotseat."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Deze widget is te groot voor de hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Snelkoppeling \'<xliff:g id="NAME">%s</xliff:g>\' is gemaakt."</string>
     <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_shortcut" msgid="1873670208166882222">"Snelkoppeling selecteren"</string>
     <string name="title_select_application" msgid="1793455815754848652">"App selecteren"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Startpagina"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"snelkoppelingen installeren"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Een app toestaan 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="7811223557950931994">"Een app toestaan snelkoppelingen te verwijderen zonder tussenkomst van de gebruiker."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Toestaan dat de app snelkoppelingen verwijdert 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="1836104524215167383">"Hiermee kan een app de instellingen en snelkoppelingen op de startpagina lezen."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Toestaan dat de app de instellingen en snelkoppelingen op de startpagina leest."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"instellingen en snelkoppelingen voor de startpagina schrijven"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Hiermee kan een app de instellingen en snelkoppelingen op de startpagina wijzigen."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Toestaan dat de app de instellingen en snelkoppelingen op de startpagina wijzigt."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Probleem bij het laden van widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Dit is een systeemapp die niet kan worden verwijderd."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Als u een app wilt verplaatsen, blijft u de app aanraken."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Als u een nieuwe map op het startscherm wilt maken, stapelt u een app boven op een andere app."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Map geopend, %1$d door %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Tik om de map te sluiten"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tik om wijzigen van naam toe te passen"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Map geopend, <xliff:g id="WIDTH">%1$d</xliff:g> bij <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Raak dit aan om de map te sluiten"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Raak dit aan om naam wijzigen op te slaan"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Map gesloten"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"De naam van de map is gewijzigd in %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Map: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"De naam van de map is gewijzigd in <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Map: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-pl-sw600dp/strings.xml b/res/values-pl-sw600dp/strings.xml
deleted file mode 100644
index a510418..0000000
--- a/res/values-pl-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Wybierz tapetę"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Brak tapet"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Anuluj"</string>
-</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 7433c55..e38a887 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widżety"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Aby dodać widżet, dotknij go i przytrzymaj."</string>
     <string name="market" msgid="2652226429823445833">"Sklep"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Nie można upuścić elementu na tym ekranie głównym."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Nie można upuścić elementu na tym ekranie głównym."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Wybierz widżet, który chcesz dodać"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nazwa folderu"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Zmień nazwę folderu"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Skróty"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widżety"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Tapety"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Brak miejsca na tej stronie głównej"</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Brak miejsca na Twoich ekranach głównych."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Brak miejsca w kieszonce."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Ten widżet jest za duży, aby umieścić go w kieszonce."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Skrót „<xliff:g id="NAME">%s</xliff:g>” został utworzony."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Skrót „<xliff:g id="NAME">%s</xliff:g>” został usunięty."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Skrót „<xliff:g id="NAME">%s</xliff:g>” już istnieje."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Wybierz skrót"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Wybierz skrót"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Wybierz aplikację"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplikacje"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Ekran główny"</string>
@@ -53,7 +54,7 @@
     <string name="delete_zone_label_all_apps" msgid="6664588234817475108">"Odinstaluj"</string>
     <string name="delete_target_label" msgid="665300185123139530">"Usuń"</string>
     <string name="delete_target_uninstall_label" msgid="748894921183769150">"Odinstaluj"</string>
-    <string name="info_target_label" msgid="4019495079517426980">"Informacje o aplikacji"</string>
+    <string name="info_target_label" msgid="4019495079517426980">"O aplikacji"</string>
     <string name="accessibility_search_button" msgid="816822994629942611">"Szukaj"</string>
     <string name="accessibility_voice_search_button" msgid="3938249215065842475">"Wyszukiwanie głosowe"</string>
     <string name="accessibility_all_apps_button" msgid="8803738611398979849">"Aplikacje"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"zainstaluj skróty"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Pozwala aplikacji dodawać skróty bez interwencji użytkownika."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"odinstaluj skróty"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Pozwala aplikacji usuwać skróty bez interwencji użytkownika."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Pozwala aplikacji usuwać skróty bez interwencji użytkownika."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"odczytywanie ustawień i skrótów strony głównej"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Pozwala aplikacji na odczyt ustawień i skrótów na ekranie głównym."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Umożliwia aplikacji odczytywanie ustawień i skrótów na ekranie głównym."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"zapisywanie ustawień i skrótów strony głównej"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Umożliwia aplikacji zmianę ustawień i skrótów na ekranie głównym."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Umożliwia aplikacji zmianę ustawień i skrótów na ekranie głównym."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problem podczas ładowania widżetu"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"To jest aplikacja systemowa, której nie możesz odinstalować."</string>
     <string name="dream_name" msgid="2847171357608437154">"Wyrzutnia rakiet"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Dotknij i przytrzymaj, aby przenieść aplikację."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Aby utworzyć nowy folder na ekranie głównym, ułóż aplikacje jedna na drugiej."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Folder otwarty, %1$d na %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Dotknij, aby zamknąć folder."</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Dotknij, aby zmienić nazwę."</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Folder otwarty, <xliff:g id="WIDTH">%1$d</xliff:g> na <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Dotknij, aby zamknąć folder"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dotknij, aby zapisać zmianę nazwy"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Folder zamknięty"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Nazwa folderu zmieniona na %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Folder: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Nazwa folderu zmieniona na <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-pt-rPT-sw600dp/strings.xml b/res/values-pt-rPT-sw600dp/strings.xml
deleted file mode 100644
index f196124..0000000
--- a/res/values-pt-rPT-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Selecionar imagem de fundo"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Nenhuma imagem de fundo disponível"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Cancelar"</string>
-</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index db74198..4f91467 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Prima sem soltar para escolher um widget."</string>
     <string name="market" msgid="2652226429823445833">"Loja"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Não foi possível largar o item neste Ecrã inicial."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Não foi possível largar o item neste Ecrã Principal."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Escolher um widget para criar"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nome da pasta"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Mudar o nome da pasta"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Atalhos"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Imagens de fundo"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Não existe espaço suficiente neste ecrã principal."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Sem espaço nos Ecrãs principais."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Não existe espaço suficiente na barra personalizável."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Este widget é demasiado grande para a barra inferior."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" foi criado."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" foi removido."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" já existe."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Seleccione o atalho"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Escolher atalho"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Escolher aplicação"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplicações"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Página inicial"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"instalar atalhos"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite que uma aplicação adicione atalhos sem a intervenção do utilizador."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstalar atalhos"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite que uma aplicação remova atalhos sem a intervenção do utilizador."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite que a aplicação remova atalhos sem intervenção do utilizador."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"ler definições e atalhos do ecrã principal"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite que uma aplicação leia as definições e os atalhos do Ecrã principal."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite que a aplicação leia as definições e os atalhos no Ecrã Principal."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"escrever definições e atalhos do ecrã principal"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite que uma aplicação altere as definições e os atalhos do Ecrã principal."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite que uma aplicação altere as definições e os atalhos no Ecrã Principal."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Erro ao carregar o widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"É uma aplicação de sistema e não pode ser desinstalada."</string>
     <string name="dream_name" msgid="2847171357608437154">"Lança-mísseis"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Para mover uma aplicação, toque na mesma sem largar."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Para criar uma nova pasta no Ecrã principal, empilhe uma aplicação por cima de outra."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Pasta aberta, %1$d por %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Toque para fechar a pasta"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toque para mudar o nome"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Pasta aberta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Toque para fechar a pasta"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toque para guardar o nome novo"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Pasta fechada"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Nome da pasta alterado para %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Pasta: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Nome de pasta alterado para <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Pasta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-pt-sw600dp/strings.xml b/res/values-pt-sw600dp/strings.xml
deleted file mode 100644
index 9443868..0000000
--- a/res/values-pt-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Selecionar papel de parede"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Nenhum papel de parede disponível"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Cancelar"</string>
-</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index f1e5d6f..d5657b6 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgets"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Toque e pressione para selecionar um widget."</string>
     <string name="market" msgid="2652226429823445833">"Comprar"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Não foi possível soltar este item na tela inicial."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Não foi possível soltar este item na tela inicial."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Selecione um widget para criar"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nome da pasta"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Renomear pasta"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Atalhos"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Papéis de parede"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Não há mais espaço nesta tela da Página inicial."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Não há mais espaço nas telas iniciais."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Não há mais espaço no hotseat."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Este widget é muito grande para o hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Atalho \"<xliff:g id="NAME">%s</xliff:g>\" criado."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" foi removido."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"O atalho \"<xliff:g id="NAME">%s</xliff:g>\" já existe."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Selecionar atalho"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Escolher atalho"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Selecione um aplicativo"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplicativos"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Página inicial"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"instalar atalhos"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite que um aplicativo adicione atalhos sem intervenção do usuário."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"desinstalar atalhos"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite que um aplicativo remova os atalhos sem a intervenção do usuário."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite que o aplicativo remova atalhos sem a intervenção do usuário."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"ler configurações e atalhos da Página inicial"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite que um aplicativo leia as configurações e os atalhos na Página inicial."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite que o aplicativo leia as configurações e os atalhos na Página inicial."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"gravar configurações e atalhos da Página inicial"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite que um aplicativo altere as configurações e os atalhos na Página inicial."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite que o aplicativo altere as configurações e os atalhos na Página inicial."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problema ao carregar o widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Este é um aplicativo do sistema e não pode ser desinstalado."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Para mover um aplicativo, toque e mantenha-o pressionado."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Para criar uma nova pasta em sua tela inicial, coloque um aplicativo em cima do outro."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Pasta aberta, %1$d por %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Toque para fechar a pasta"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Toque para confirmar renomeação"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Pasta aberta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Toque para fechar a pasta"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Toque para salvar o novo nome"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Pasta fechada"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Pasta renomeada para %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Pasta: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Pasta renomeada para <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Pasta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-rm/strings.xml b/res/values-rm/strings.xml
index b4249c6..4048e63 100644
--- a/res/values-rm/strings.xml
+++ b/res/values-rm/strings.xml
@@ -34,7 +34,7 @@
     <skip />
     <!-- no translation found for market (2652226429823445833) -->
     <skip />
-    <!-- no translation found for external_drop_widget_error (127440783198670829) -->
+    <!-- no translation found for external_drop_widget_error (2285187188524172774) -->
     <skip />
     <!-- no translation found for external_drop_widget_pick_title (7040647073452295370) -->
     <skip />
@@ -48,13 +48,17 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Scursanidas"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgets"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Funds davos"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Nagin spazi liber sin il visur da partenza."</string>
+    <!-- no translation found for out_of_space (3056555298801463098) -->
+    <skip />
+    <!-- no translation found for hotseat_out_of_space (6304886797358479361) -->
+    <skip />
     <!-- no translation found for invalid_hotseat_item (6545340627805449250) -->
     <skip />
     <string name="shortcut_installed" msgid="7071557296331322355">"\"Creà ina scursanida \"\"<xliff:g id="NAME">%s</xliff:g>\"\".\""</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"\"La scursanida \"\"<xliff:g id="NAME">%s</xliff:g>\"\" è vegnida stizzada.\""</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"\"La scursanida \"\"<xliff:g id="NAME">%s</xliff:g>\"\" exista gia.\""</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Tscherner ina cumbinaziun da tastas"</string>
+    <!-- no translation found for title_select_shortcut (1873670208166882222) -->
+    <skip />
     <!-- no translation found for title_select_application (1793455815754848652) -->
     <skip />
     <!-- no translation found for all_apps_button_label (2578400570124163469) -->
@@ -106,13 +110,13 @@
     <!-- no translation found for permdesc_install_shortcut (8634424803272077038) -->
     <skip />
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"deinstallar scursanidas"</string>
-    <!-- no translation found for permdesc_uninstall_shortcut (7811223557950931994) -->
+    <!-- no translation found for permdesc_uninstall_shortcut (274355570620220977) -->
     <skip />
     <string name="permlab_read_settings" msgid="3452408290738106747">"Leger ils parameters e las scursanidas da la pagina da partenza"</string>
-    <!-- no translation found for permdesc_read_settings (1836104524215167383) -->
+    <!-- no translation found for permdesc_read_settings (5788109303585403679) -->
     <skip />
     <string name="permlab_write_settings" msgid="1360567537236705628">"Definir ils parameters e las scursanidas per la pagina da partenza"</string>
-    <!-- no translation found for permdesc_write_settings (6763846563231494591) -->
+    <!-- no translation found for permdesc_write_settings (8530105489115785531) -->
     <skip />
     <string name="gadget_error_text" msgid="8359351016167075858">"Problems cun chargiar il widget"</string>
     <!-- no translation found for uninstall_system_app_text (6429814133777046491) -->
@@ -147,16 +151,16 @@
     <skip />
     <!-- no translation found for cling_dismiss (2780907108735868381) -->
     <skip />
-    <!-- no translation found for folder_opened (4129072635480822768) -->
+    <!-- no translation found for folder_opened (1262064100943801533) -->
     <skip />
-    <!-- no translation found for folder_tap_to_close (4076794242530255812) -->
+    <!-- no translation found for folder_tap_to_close (1335478160661137579) -->
     <skip />
-    <!-- no translation found for folder_tap_to_rename (2125528923948315223) -->
+    <!-- no translation found for folder_tap_to_rename (5201612989905472442) -->
     <skip />
     <!-- no translation found for folder_closed (3130534551370511932) -->
     <skip />
-    <!-- no translation found for folder_renamed (781234745487414781) -->
+    <!-- no translation found for folder_renamed (7951233572858053642) -->
     <skip />
-    <!-- no translation found for folder_name_format (4513766553514769310) -->
+    <!-- no translation found for folder_name_format (3051680259794759037) -->
     <skip />
 </resources>
diff --git a/res/values-ro-sw600dp/strings.xml b/res/values-ro-sw600dp/strings.xml
deleted file mode 100644
index cc2d4ed..0000000
--- a/res/values-ro-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Selectaţi o imagine de fundal"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Nu există imagini de fundal disponibile"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Anulaţi"</string>
-</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 67d536d..3d46177 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Obiecte widget"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Atingeţi/menţineţi apăsat un widget pt. a-l alege."</string>
     <string name="market" msgid="2652226429823445833">"Cumpăraţi"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Nu am putut plasa articolul pe ecranul de pornire."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Nu am putut plasa articolul pe ecranul de pornire."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Alegeţi widgetul de creare"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Nume dosar"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Redenumiţi dosarul"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Comenzi rapide"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Obiecte widget"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Imagini de fundal"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Niciun spaţiu rămas pe acest Ecran de pornire."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Nu mai este loc pe ecranele de pornire."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Nu mai există loc în bara de lansare rapidă."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Acest widget este prea mare pentru hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>”·a fost creată."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>” a fost eliminată."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Comanda rapidă „<xliff:g id="NAME">%s</xliff:g>” deja există."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Selectaţi comanda rapidă"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Alegeţi o comandă rapidă"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Alegeţi aplicaţia"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplicaţii"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Domiciliu"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"instalaţi comenzi rapide"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Permite unei aplicaţii să adauge comenzi rapide, fără intervenţia utilizatorului."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"dezinstalaţi comenzile rapide"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Permite unei aplicaţii să elimine comenzile rapide, fără intervenţia utilizatorului."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Permite aplicaţiei să elimine comenzile rapide, fără intervenţia utilizatorului."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"citiţi setările Paginii de pornire şi comenzile rapide"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Permite unei aplicaţii să citească setările şi comenzile rapide din ecranul de pornire."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Permite aplicaţiei să citească setările şi comenzile rapide din ecranul de pornire."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"scrieţi setări şi comenzi rapide pentru Ecranul de pornire"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Permite unei aplicaţii să modifice setările şi comenzile rapide din ecranul de pornire."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Permite aplicaţiei să modifice setările şi comenzile rapide din ecranul de pornire."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Probleme la încărcarea obiectului widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Aceasta este o aplicaţie de sistem şi nu poate fi dezinstalată."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Pentru a muta o aplicaţie, atingeţi şi ţineţi apăsat."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Pentru a crea un dosar nou pe ecranul de pornire, plasaţi o aplicaţie deasupra alteia."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Dosar deschis, %1$d - %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Apăsaţi pentru a închide dosarul"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Apăsaţi pentru a finaliza redenumirea"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Dosar deschis, <xliff:g id="WIDTH">%1$d</xliff:g> pe <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Atingeţi pentru a închide dosarul"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Atingeţi pentru a salva redenumirea"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Dosar închis"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Dosar redenumit „%1$s”"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Dosar: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Dosar redenumit <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Dosar: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-ru-sw600dp/strings.xml b/res/values-ru-sw600dp/strings.xml
deleted file mode 100644
index 0c5eb41..0000000
--- a/res/values-ru-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Выбор обоев"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Обои недоступны"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Отмена"</string>
-</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 84085fe..0557447 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -20,7 +20,7 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="application_name" msgid="8424725141379931883">"Launcher"</string>
-    <string name="uid_name" msgid="3371120195364560632">"Основные приложения Android"</string>
+    <string name="uid_name" msgid="3371120195364560632">"Основные приложения"</string>
     <string name="folder_name" msgid="8551881338202938211"></string>
     <string name="chooser_wallpaper" msgid="6063168087625352235">"Установка обоев"</string>
     <string name="wallpaper_instructions" msgid="4215640646180727542">"Установить обои"</string>
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Виджеты"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Чтобы выбрать виджет, нажмите на значок и удерживайте его."</string>
     <string name="market" msgid="2652226429823445833">"Маркет"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Не удалось добавить элемент на главный экран."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Не удалось добавить элемент на главный экран."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Выберите виджет"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Название папки"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Переименовать папку"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Ярлыки"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Виджеты"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Обои"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"На этом экране всё занято."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"На главных экранах всё занято."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Нет свободного места в слоте."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Виджет слишком велик для слота."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Ярлык \"<xliff:g id="NAME">%s</xliff:g>\" создан"</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Ярлык \"<xliff:g id="NAME">%s</xliff:g>\" удален."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Ярлык \"<xliff:g id="NAME">%s</xliff:g>\" уже существует."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Выберите ярлык"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Выбор ярлыка"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Выберите приложение"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Приложения"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Главная"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"устанавливать ярлыки"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Приложение сможет самостоятельно добавлять ярлыки."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"удалять ярлыки"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Приложение сможет самостоятельно удалять ярлыки."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Приложение сможет самостоятельно удалять ярлыки."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"считывать настройки и ярлыки главного экрана"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Приложение получит доступ к данным о настройках и ярлыках на главном экране."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Приложение получит доступ к данным о настройках и ярлыках на главном экране."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"изменять настройки и ярлыки главного экрана"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Приложение сможет изменять настройки и ярлыки на главном экране."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Приложение сможет изменять настройки и ярлыки на главном экране."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Не удалось загрузить виджет"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Это системное приложение, его нельзя удалить."</string>
     <string name="dream_name" msgid="2847171357608437154">"Фейерверк"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Чтобы переместить значок приложения, нажмите на него и удерживайте."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Чтобы создать папку на главном экране, перенесите одно приложение на другое."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"ОК"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Папка открыта, %1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Нажмите, чтобы закрыть папку."</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Нажмите, чтобы переименовать."</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Папка открыта, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Нажмите, чтобы закрыть папку"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Нажмите, чтобы подтвердить переименование"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Папка закрыта"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Новое название папки: %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Папка: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Папка переименована в \"<xliff:g id="NAME">%1$s</xliff:g>\""</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Папка: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-sk-sw600dp/strings.xml b/res/values-sk-sw600dp/strings.xml
deleted file mode 100644
index 02140db..0000000
--- a/res/values-sk-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Výber tapety"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"K dispozícii nie sú žiadne tapety"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Zrušiť"</string>
-</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 80c8a3c..a9648fd 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Miniaplikácie"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Miniaplikáciu pridáte stlačením a podržaním."</string>
     <string name="market" msgid="2652226429823445833">"Obchod"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Položku sa nepodarilo pretiahnuť na túto plochu."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Položku sa nepodarilo presunúť na túto plochu."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Zvoľte miniaplikáciu na vytvorenie"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Názov priečinka"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Premenovať priečinok"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Odkazy"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Miniaplikácie"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Tapety"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Na tejto ploche už nie je miesto"</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Na plochách už nie je miesto."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"V časti hotseat už nie je miesto."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Táto miniaplikácia je pre hotseat príliš veľká."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Odkaz <xliff:g id="NAME">%s</xliff:g> bol vytvorený."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Odkaz <xliff:g id="NAME">%s</xliff:g> bol odstránený."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Odkaz <xliff:g id="NAME">%s</xliff:g> už existuje."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Vyberte odkaz"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Vyberte odkaz"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Vyberte aplikáciu"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Aplikácie"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Domovská stránka"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"inštalovať odkazy"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Povoľuje aplikácii pridať odkazy bez zásahu používateľa."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"odinštalovať odkazy"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Povoľuje aplikácii odstrániť odkazy bez zásahu používateľa."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Povoľuje aplikácii odstrániť odkazy bez zásahu používateľa."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"čítanie nastavení a odkazov plochy"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Povoľuje aplikácii čítať nastavenia a odkazy na ploche."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Povoľuje aplikácii čítať nastavenia a odkazy na ploche."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"zápis nastavení a odkazov plochy"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Povoľuje aplikácii zmeniť nastavenia a odkazy na ploche."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Povoľuje aplikácii zmeniť nastavenia a odkazy na ploche."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problém s načítaním miniaplikácií"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Toto je systémová aplikácia a nedá sa odinštalovať."</string>
     <string name="dream_name" msgid="2847171357608437154">"Raketomet"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Ak chcete presunúť aplikáciu, dotknite sa jej a podržte ju."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Ak chcete vytvoriť nový priečinok na ploche, presuňte jednu aplikáciu na inú."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Priečinok je otvorený, %1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Klepnutím zavrite priečinok"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Klepnutím potvrďte premenovanie"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Otvorený priečinok, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Dotykom zavriete priečinok"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dotykom premenovanie uložíte"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Priečinok je uzavretý"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Priečinok bol premenovaný na %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Priečinok: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Priečinok bol premenovaný na <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Priečinok: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-sl-sw600dp/strings.xml b/res/values-sl-sw600dp/strings.xml
deleted file mode 100644
index 9a22792..0000000
--- a/res/values-sl-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Izberite sliko za ozadje"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Ni slik za ozadje"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Prekliči"</string>
-</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 88442c5..4b64f0a 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Pripomočki"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Za izbiro pripomočka se ga dotaknite in pridržite."</string>
     <string name="market" msgid="2652226429823445833">"Nakup"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Elemen. ni bilo mogoče spustiti na začetni zaslon."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Elemen. ni bilo mogoče spustiti na začetni zaslon."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Izberite pripomoček za ustvarjanje"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Ime mape"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Preimenuj mapo"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Bližnjice"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Pripomočki"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Slike za ozadje"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Na tem začetnem zaslonu ni več prostora."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Na začetnih zaslonih ni več prostora."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"V vrstici z ikonami ni več prostora."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Ta pripomoček je prevelik za podnožje."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Bližnjica »<xliff:g id="NAME">%s</xliff:g>« je bila ustvarjena."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Bližnjica »<xliff:g id="NAME">%s</xliff:g>« je bila odstranjena."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Bližnjica »<xliff:g id="NAME">%s</xliff:g>« že obstaja."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Izberi bližnjico"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Izbira bližnjice"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Izberite program"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Programi"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Začetni zaslon"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"namesti bližnjice"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Programu omogoča dodajanje bližnjic brez posredovanja uporabnika."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"odstrani bližnjice"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Programu omogoča odstranjevanje bližnjic brez posredovanja uporabnika."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Programu omogoča odstranjevanje bližnjic brez posredovanja uporabnika."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"branje nastavitev in bližnjic začetnega zaslona"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Dovoli programu branje nastavitev in bližnjic na začetnem zaslonu."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Dovoli programu branje nastavitev in bližnjic na začetnem zaslonu."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"zapis nastavitev in bližnjic začetnega zaslona"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Dovoli programu spreminjanje nastavitev in bližnjic na začetnem zaslonu."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Dovoli programu spreminjanje nastavitev in bližnjic na začetnem zaslonu."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Težave pri nalaganju pripomočka"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"To je sistemski program in ga ni mogoče odstraniti."</string>
     <string name="dream_name" msgid="2847171357608437154">"Raketno izstrelišče"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Če želite premakniti program, se ga dotaknite in ga pridržite."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Če želite na začetnem zaslonu ustvariti novo mapo, postavite en program na drugega."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"V redu"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Mapa je odprta, %1$d krat %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Tapnite, da zaprete mapo"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tapnite, da potrdite preimenovanje"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Mapa je odprta, <xliff:g id="WIDTH">%1$d</xliff:g> krat <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Dotaknite se, da zaprete mapo"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Dotaknite se, da shranite preimenovanje"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Mapa je zaprta"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Mapa je bila preimenovana v %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Mapa: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Mapa je preimenovana v <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Mapa: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-sr-sw600dp/strings.xml b/res/values-sr-sw600dp/strings.xml
deleted file mode 100644
index bfa7962..0000000
--- a/res/values-sr-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Избор позадине"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Није доступна ниједна позадина"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Откажи"</string>
-</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 32b79dd..d0ee441 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Виџети"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Додирните и задржите да бисте узели виџет."</string>
     <string name="market" msgid="2652226429823445833">"Куповина"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Није могуће испустити ставку на почетни екран."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Није могуће отпустити ставку на почетни екран."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Избор виџета за прављење"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Име директоријума"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Преименовање директоријума"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Пречице"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Виџети"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Позадине"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Нема више простора на овом почетном екрану."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Нема више простора на Почетним екранима."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Нема више простора на траци актуелности."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Овај виџет је превелики за траку актуелности."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Пречица „<xliff:g id="NAME">%s</xliff:g>“ је направљена."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Пречица „<xliff:g id="NAME">%s</xliff:g>“ је уклоњена."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Пречица „<xliff:g id="NAME">%s</xliff:g>“ већ постоји."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Избор пречице"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Избор пречице"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Избор апликације"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Почетна"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"инсталирај пречице"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Дозвољава апликацији да додаје пречице без интервенције корисника."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"деинсталирај пречице"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Дозвољава апликацији да уклања пречице без интервенције корисника."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Дозвољава апликацији да уклања пречице без интервенције корисника."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"читај подешавања и пречице на почетном екрану"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Дозвољава апликацији да чита подешавања и пречице на Почетној."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Дозвољава апликацији да чита подешавања и пречице на почетном екрану."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"уписивање подешавања и пречица на почетном екрану"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Дозвољава апликацији да мења подешавања и пречице на Почетној."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Дозвољава апликацији да мења подешавања и пречице на почетном екрану."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Проблем приликом учитавања виџета"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Ово је системска апликација и не може да се деинсталира."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Да бисте преместили апликацију, додирните је и задржите."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Да бисте направили нови директоријум на почетном екрану, поређајте апликације једну на другу."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"Потврди"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Директоријум је отворен, %1$d пута %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Додирните да бисте затворили директоријум"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Додирните да бисте применили преименовање"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Директоријум је отворен, <xliff:g id="WIDTH">%1$d</xliff:g> пута <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Додирните да бисте затворили директоријум"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Додирните да бисте сачували промену имена"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Директоријум је затворен"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Директоријум је преименован у %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Директоријум: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Директоријум је преименован у <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Директоријум: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-sv-sw600dp/strings.xml b/res/values-sv-sw600dp/strings.xml
deleted file mode 100644
index ae88ddf..0000000
--- a/res/values-sv-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Välj bakgrund"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Inga tillgängliga bakgrunder"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Avbryt"</string>
-</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 5ed8d7c..0d98de8 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widgetar"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Tryck länge om du vill flytta en widget."</string>
     <string name="market" msgid="2652226429823445833">"Butik"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Objektet kunde inte släppas på den här startsidan."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Objektet kunde inte släppas på den här startsidan."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Ange vilken widget du vill använda"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Mappnamn"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Byt namn på mapp"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Genvägar"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widgetar"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Bakgrundsbilder"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Det finns inte plats för mer på den här startsidan."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Det finns inte plats för mer på dina startsidor."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Utrymmet på Hotseat är fullt."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Denna widget är för stor för Hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Genvägen \"<xliff:g id="NAME">%s</xliff:g>\" har skapats."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Genvägen \"<xliff:g id="NAME">%s</xliff:g>\" har tagits bort."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Genvägen \"<xliff:g id="NAME">%s</xliff:g>\" finns redan."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Välj genväg"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Välj genväg"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Välj app"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Appar"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Startsida"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"installera genvägar"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Tillåter att en app lägger till genvägar utan åtgärd från användaren."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"avinstallera genvägar"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Tillåter att en app tar bort genvägar utan åtgärd från användaren."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Tillåter att appen tar bort genvägar utan åtgärd från användaren."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"läsa inställningar och genvägar för startsidan"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Tillåter att en app läser inställningar och genvägar på startsidan."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Tillåter att appen läser inställningar och genvägar på startsidan."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"skriva inställningar och genvägar för startsidan"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Tillåter att en app ändrar inställningar och genvägar på startsidan."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Tillåter att appen ändrar inställningar och genvägar på startsidan."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Det gick inte att läsa in widgeten"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Det här är en systemapp som inte kan  avinstalleras."</string>
     <string name="dream_name" msgid="2847171357608437154">"Raketavfyringsramp"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Om du vill flytta en app trycker du på den länge."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Om du vill skapa en ny mapp på startskärmen placerar du en app på en annan."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Mappen har öppnats, %1$d av %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Stäng mappen genom att knacka lätt"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Byt namn genom att knacka lätt"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Mappen är öppen, <xliff:g id="WIDTH">%1$d</xliff:g> gånger <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Tryck om du vill stänga mappen"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Tryck om du vill spara det nya namnet"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Mappen är stängd"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Mappen döptes om till %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Mappen: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Mappen har bytt namn till <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Mapp: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-sw-sw600dp/strings.xml b/res/values-sw-sw600dp/strings.xml
deleted file mode 100644
index 20b6c86..0000000
--- a/res/values-sw-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Chagua mandhari"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Hakuna mandhari zinazopatikana"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Ghairi"</string>
-</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 886a123..0fc2a5a 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Wijeti"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Gusa &amp; ushikilie ili kuteua wijeti."</string>
     <string name="market" msgid="2652226429823445833">"Duka"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Hakuweza kuachilia kipengee kwenye skrini hii ya Nyumbani."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Haikuweza kudondosha kipengee kwenye skrini hii ya Nyumbani."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Chagua wijeti ili uunde"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Jina la folda"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Ipe jina jipya folda"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Njia za mkato"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Wijeti"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Mandhari"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Hakuna nafasi katika skrini hii ya nyumbani."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Hakuna nafasi zaidi kwenye skrini zako za nyumbani."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Hakuna nafasi zaidi kwenye eneo kali."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Wijeti hii ni kubwa zaidi kwa hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" imeundwa."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" iliondolewa."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Njia ya mkato ya \"<xliff:g id="NAME">%s</xliff:g>\" tayari ipo."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Chagua njia ya mkato"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Chagua njia ya mkato"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Chagua programu"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Programu"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Nyumbani"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"njia mikato za moja kwa moja"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Huruhusu programu kuongeza njia za mkato bila mtumiaji kuhusika."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"Sakunua mikato"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Huruhusu programu kuondoa njia za mkato bila mtumiaji kuhusika."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Inaruhusu programu kuondoa njia za mikato bila juhudi za mtumiaji."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"soma mipangilio ya Nyumbani na njia za mkato"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Huruhusu programu kusoma mipangilio na njia za mkato katika Nyumbani."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Inaruhusu programu kusoma mipangilio na njia za mikato katika Nyumbani."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"andika mipangilio ya Nyumbani na njia za mkato"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Huruhusu programu kubadilisha mipangilio na njia za mkato katika Nyumbani."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Huruhusu programu kubadilisha mipangilio na njia za mkato katika Nyumbani."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Tatizo la kupakia wijeti"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Hii ni programu ya mfumo na haiwezi kusaniduliwa."</string>
     <string name="dream_name" msgid="2847171357608437154">"Kizinduzi cha Roketi"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Kuhamisha programu, gusa na; uishikilie."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Kuunda folda mpya katika skrini yako ya nyumbani, rundika programu moja juu ya nyingine."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"Sawa"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Folda imefunguliwa,%1$d na %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Gonga ili kufunga folda"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Gonga ili kukubali jina"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Folda imefunguliwa, <xliff:g id="WIDTH">%1$d</xliff:g> kwa <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Gusa ili ufunge folda"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Gusa kuhifadhi upaji jina jipya"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Folda imefungwa"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Folda imebadilishwa jina hadi %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Folda: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Folda imebadilishwa jina hadi <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Folda: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-sw340dp-land/dimens.xml b/res/values-sw340dp-land/dimens.xml
index b469ac0..facbf56 100644
--- a/res/values-sw340dp-land/dimens.xml
+++ b/res/values-sw340dp-land/dimens.xml
@@ -19,30 +19,8 @@
     <dimen name="folderClingMarginTop">50dp</dimen>
 
 <!-- Workspace -->
-    <dimen name="workspace_width_gap">0dp</dimen>
-    <dimen name="workspace_height_gap">0dp</dimen>
-    <dimen name="workspace_top_padding">8dp</dimen>
-    <dimen name="workspace_bottom_padding">8dp</dimen>
-    <dimen name="workspace_left_padding">8dp</dimen>
-    <dimen name="workspace_right_padding">8dp</dimen>
     <dimen name="workspace_divider_padding_top">6dp</dimen>
     <dimen name="workspace_divider_padding_bottom">6dp</dimen>
 
-    <dimen name="hotseat_width_gap">0dp</dimen>
-    <dimen name="hotseat_height_gap">0dp</dimen>
-    <dimen name="hotseat_top_padding">-1dp</dimen>
-    <dimen name="hotseat_bottom_padding">-1dp</dimen>
-    <dimen name="hotseat_left_padding">-1dp</dimen>
-    <dimen name="hotseat_right_padding">-1dp</dimen>
-
     <dimen name="qsb_bar_height">48dp</dimen>
-    <!-- height of the bottom row of controls -->
-    <dimen name="button_bar_height">80dip</dimen>
-    <!-- Because portal animations go beyond the bounds of an icon, we need
-         to make the dock layout slightly larger than the button_bar_height -->
-    <dimen name="button_bar_height_top_padding">8dp</dimen>
-    <dimen name="button_bar_height_bottom_padding">8dp</dimen>
-    <dimen name="button_bar_width_left_padding">8dp</dimen>
-    <dimen name="button_bar_width_right_padding">8dp</dimen>
-    <dimen name="button_bar_height_plus_padding">80dp</dimen>
 </resources>
diff --git a/res/values-sw340dp-port/dimens.xml b/res/values-sw340dp-port/dimens.xml
index bf7ebc3..18f2831 100644
--- a/res/values-sw340dp-port/dimens.xml
+++ b/res/values-sw340dp-port/dimens.xml
@@ -19,22 +19,9 @@
     <dimen name="folderClingMarginTop">70dp</dimen>
 
 <!-- Workspace -->
-    <dimen name="workspace_width_gap">0dp</dimen>
-    <dimen name="workspace_height_gap">0dp</dimen>
-    <dimen name="workspace_top_padding">8dp</dimen>
-    <dimen name="workspace_bottom_padding">8dp</dimen>
-    <dimen name="workspace_left_padding">8dp</dimen>
-    <dimen name="workspace_right_padding">8dp</dimen>
     <dimen name="workspace_divider_padding_left">6dp</dimen>
     <dimen name="workspace_divider_padding_right">6dp</dimen>
 
-    <dimen name="hotseat_width_gap">0dp</dimen>
-    <dimen name="hotseat_height_gap">0dp</dimen>
-    <dimen name="hotseat_top_padding">-1dp</dimen>
-    <dimen name="hotseat_bottom_padding">-1dp</dimen>
-    <dimen name="hotseat_left_padding">-1dp</dimen>
-    <dimen name="hotseat_right_padding">-1dp</dimen>
-
     <!-- qsb_bar_height_inset represents qsb_bar_height minus the padding
          that we put on each page for allowing folders to draw out of bounds -->
     <dimen name="qsb_bar_height_inset">48dp</dimen>
@@ -42,15 +29,6 @@
     <dimen name="qsb_padding_left">6dp</dimen>
     <dimen name="qsb_padding_right">6dp</dimen>
     <dimen name="search_bar_height">48dp</dimen>
-    <!-- height of the bottom row of controls -->
-    <dimen name="button_bar_height">80dip</dimen>
-    <!-- Because portal animations go beyond the bounds of an icon, we need
-         to make the dock layout slightly larger than the button_bar_height -->
-    <dimen name="button_bar_height_top_padding">8dp</dimen>
-    <dimen name="button_bar_height_bottom_padding">8dp</dimen>
-    <dimen name="button_bar_width_left_padding">8dp</dimen>
-    <dimen name="button_bar_width_right_padding">8dp</dimen>
-    <dimen name="button_bar_height_plus_padding">80dp</dimen>
 
 <!-- AppsCustomize -->
     <dimen name="apps_customize_pageLayoutPaddingTop">16dp</dimen>
diff --git a/res/values-sw340dp/dimens.xml b/res/values-sw340dp/dimens.xml
index 69d6e58..2a2dac6 100644
--- a/res/values-sw340dp/dimens.xml
+++ b/res/values-sw340dp/dimens.xml
@@ -17,4 +17,24 @@
 <resources>
     <!-- Drag padding to add to the bottom of drop targets -->
     <dimen name="drop_target_drag_padding">20dp</dimen>
+
+<!-- Workspace -->
+    <dimen name="workspace_width_gap">0dp</dimen>
+    <dimen name="workspace_height_gap">0dp</dimen>
+    <dimen name="workspace_top_padding">8dp</dimen>
+    <dimen name="workspace_bottom_padding">8dp</dimen>
+    <dimen name="workspace_left_padding">8dp</dimen>
+    <dimen name="workspace_right_padding">8dp</dimen>
+
+<!-- Hotseat -->
+    <dimen name="hotseat_width_gap">0dp</dimen>
+    <dimen name="hotseat_height_gap">0dp</dimen>
+    <!-- height of the bottom row of controls -->
+    <dimen name="button_bar_height">80dip</dimen>
+    <!-- Because portal animations go beyond the bounds of an icon, we need
+         to make the dock layout slightly larger than the button_bar_height -->
+    <dimen name="button_bar_height_bottom_padding">8dp</dimen>
+    <dimen name="button_bar_width_left_padding">8dp</dimen>
+    <dimen name="button_bar_width_right_padding">8dp</dimen>
+    <dimen name="button_bar_height_plus_padding">80dp</dimen>
 </resources>
diff --git a/res/values-sw600dp-land/dimens.xml b/res/values-sw600dp-land/dimens.xml
index 42c4353..7db0a8a 100644
--- a/res/values-sw600dp-land/dimens.xml
+++ b/res/values-sw600dp-land/dimens.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
+<!-- Copyright (C) 2009 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.
@@ -15,33 +15,30 @@
 -->
 
 <resources>
+    <dimen name="app_icon_padding_top">0dp</dimen>
+    <dimen name="app_icon_drawable_padding_land">0dp</dimen>
+    <integer name="app_icon_scale_percent">90</integer>
+
+<!-- Hotseat -->
+    <dimen name="hotseat_cell_width">75dp</dimen>
+    <dimen name="hotseat_cell_height">75dp</dimen>
+
 <!-- Workspace -->
-    <dimen name="workspace_left_padding">24dip</dimen>
-    <dimen name="workspace_right_padding">24dip</dimen>
-    <!-- We need padding on the screens for portals to look right -->
-    <dimen name="workspace_top_padding">12dip</dimen>
-    <dimen name="workspace_bottom_padding">12dip</dimen>
+    <dimen name="workspace_cell_width">96dp</dimen>
+    <dimen name="workspace_cell_height">86dp</dimen>
     <dimen name="workspace_width_gap">32dp</dimen>
-    <dimen name="workspace_height_gap">2dp</dimen>
-    <dimen name="workspace_page_spacing">50dp</dimen>
+    <dimen name="workspace_height_gap">0dp</dimen>
+    <dimen name="workspace_icon_text_size">11sp</dimen>
 
-    <!-- the area at the edge of the screen that makes the workspace go left
-         or right while you're dragging. -->
-    <dimen name="scroll_zone">100dip</dimen>
+<!-- Folders -->
+    <!-- The size of the image which sits behind the preview of the folder contents -->
+    <dimen name="folder_preview_size">70dp</dimen>
+    <dimen name="folder_cell_width">86dp</dimen>
+    <dimen name="folder_cell_height">86dp</dimen>
 
+<!-- AppsCustomize -->
     <dimen name="apps_customize_pageLayoutWidthGap">36dp</dimen>
     <dimen name="apps_customize_pageLayoutHeightGap">8dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingTop">20dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingBottom">14dp</dimen>
-    <dimen name="apps_customize_pageLayoutPaddingLeft">30dp</dimen>
-    <dimen name="apps_customize_pageLayoutPaddingRight">30dp</dimen>
-    <integer name="apps_customize_widget_cell_count_x">3</integer>
-    <integer name="apps_customize_widget_cell_count_y">2</integer>
-    <integer name="apps_customize_cling_focused_x">4</integer>
-    <integer name="apps_customize_cling_focused_y">2</integer>
-
-<!-- Cling -->
-    <!-- The offset for the text in the cling -->
-    <dimen name="cling_text_block_offset_x">140dp</dimen>
-    <dimen name="cling_text_block_offset_y">80dp</dimen>
 </resources>
diff --git a/res/values-sw600dp-port/dimens.xml b/res/values-sw600dp-port/dimens.xml
index 5de73b6..9565992 100644
--- a/res/values-sw600dp-port/dimens.xml
+++ b/res/values-sw600dp-port/dimens.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
+<!-- Copyright (C) 2009 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.
@@ -15,36 +15,21 @@
 -->
 
 <resources>
+<!-- Workspace -->
+    <integer name="app_icon_scale_percent">-1</integer>
+    <dimen name="workspace_width_gap">0dp</dimen>
+    <dimen name="workspace_height_gap">32dp</dimen>
+
 <!-- AppsCustomize -->
     <dimen name="apps_customize_cell_width">96dp</dimen>
     <dimen name="apps_customize_cell_height">96dp</dimen>
-
-<!-- Workspace -->
-    <!-- the area at the edge of the screen that makes the workspace go left
-         or right while you're dragging. -->
-    <dimen name="scroll_zone">40dp</dimen>
-
-    <dimen name="workspace_left_padding">15dip</dimen>
-    <dimen name="workspace_right_padding">15dip</dimen>
-    <dimen name="workspace_top_padding">25dip</dimen>
-    <dimen name="workspace_bottom_padding">25dip</dimen>
-    <dimen name="workspace_width_gap">0dp</dimen>
-    <dimen name="workspace_height_gap">32dp</dimen>
-    <dimen name="workspace_page_spacing">16dp</dimen>
-
     <dimen name="apps_customize_pageLayoutWidthGap">24dp</dimen>
     <dimen name="apps_customize_pageLayoutHeightGap">36dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingTop">25dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingBottom">10dp</dimen>
-    <dimen name="apps_customize_pageLayoutPaddingLeft">30dp</dimen>
-    <dimen name="apps_customize_pageLayoutPaddingRight">30dp</dimen>
-    <integer name="apps_customize_widget_cell_count_x">2</integer>
-    <integer name="apps_customize_widget_cell_count_y">3</integer>
-    <integer name="apps_customize_cling_focused_x">2</integer>
-    <integer name="apps_customize_cling_focused_y">2</integer>
 
-<!-- Cling -->
-    <!-- The offset for the text in the cling -->
-    <dimen name="cling_text_block_offset_x">80dp</dimen>
-    <dimen name="cling_text_block_offset_y">160dp</dimen>
-</resources>
\ No newline at end of file
+<!-- Hotseat -->
+    <dimen name="hotseat_cell_width">75dp</dimen>
+    <dimen name="hotseat_cell_height">75dp</dimen>
+
+</resources>
diff --git a/res/values-sw600dp/config.xml b/res/values-sw600dp/config.xml
index 7a07898..a701e69 100644
--- a/res/values-sw600dp/config.xml
+++ b/res/values-sw600dp/config.xml
@@ -1,26 +1,12 @@
 <resources>
-    <bool name="config_largeHeap">true</bool>
+    <integer name="cell_count_x">6</integer>
+    <integer name="cell_count_y">6</integer>
+    <integer name="hotseat_cell_count">7</integer>
+    <integer name="hotseat_all_apps_index">3</integer>
 
-<!-- AllApps/Customize/AppsCustomize -->
-    <!-- Out of 100, the percent to shrink the workspace during spring loaded mode. -->
-    <integer name="config_workspaceSpringLoadShrinkPercentage">90</integer>
-
-<!-- Workspace -->
-    <!-- Whether or not the drop targets drop down as opposed to fade in -->
-    <bool name="config_useDropTargetDownTransition">true</bool>
-    <!-- Whether or not to fade the side pages -->
-    <bool name="config_workspaceFadeAdjacentScreens">true</bool>
-
-    <!-- When dragging items on the workspace, how much bigger (in pixels) the dragged view
-         should be, as compared to the original view. If 0, it will not be scaled at all.
-         Should be an even number, for pixel alignment. -->
-    <integer name="config_dragViewExtraPixels">0</integer>
-
-    <!-- When shrinking the workspace, this is the percentage of its original size. -->
-    <integer name="config_workspaceShrinkPercent">17</integer>
-
+<!-- Folders -->
     <!-- Folder max bounds and max number of items. Note: folder_max_count_x * folder_max_count_y
-         >= folder_max_num_items. When these are set to -1, they are automatically determined. -->
+        >= folder_max_num_items. When these are set to -1, they are automatically determined. -->
     <integer name="folder_max_count_x">-1</integer>
     <integer name="folder_max_count_y">-1</integer>
     <integer name="folder_max_num_items">-1</integer>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index d265c36..a0d7ec8 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -15,67 +15,39 @@
 -->
 
 <resources>
-<!-- QSB -->
-    <dimen name="toolbar_button_vertical_padding">12dip</dimen>
-    <dimen name="toolbar_button_horizontal_padding">12dip</dimen>
-
-<!-- Workspace -->
-    <dimen name="qsb_bar_height">56dp</dimen>
-    <!-- This should be @dimen/qsb_bar_height - @dimen/workspace_top_padding
-         to fix the extra space given to draw portals -->
-    <dimen name="workspace_content_large_only_top_margin">36dp</dimen>
-    <dimen name="workspace_cell_width">96dip</dimen>
-    <dimen name="workspace_cell_height">96dip</dimen>
-    <dimen name="folder_cell_width">96dp</dimen>
-    <dimen name="folder_cell_height">96dp</dimen>
-
+    <dimen name="app_icon_size">72dp</dimen>
+    <integer name="app_icon_hotseat_scale_percent">78</integer>
+    <dimen name="app_icon_drawable_padding">3dp</dimen>
     <dimen name="app_icon_padding_top">4dp</dimen>
 
-<!-- AppsCustomize -->
-    <dimen name="apps_customize_tab_bar_height">60dp</dimen>
-    <dimen name="apps_customize_tab_bar_margin_top">8dp</dimen>
-    <dimen name="apps_customize_cell_width">96dp</dimen>
-    <dimen name="apps_customize_cell_height">98dp</dimen>
-    <dimen name="apps_customize_widget_cell_width_gap">36dp</dimen>
-    <dimen name="apps_customize_widget_cell_height_gap">36dp</dimen>
+<!-- Workspace -->
+    <dimen name="workspace_cell_width">96dp</dimen>
+    <dimen name="workspace_cell_height">96dp</dimen>
 
-    <!-- The corner radius to draw the external drop icon rounded rect -->
-    <dimen name="external_drop_icon_rect_radius">10dp</dimen>
-    
-    <!-- Size of icons in workspace -->
-    <dimen name="app_icon_size">72dp</dimen>
-
-    <!-- extra horizontal spacing between mini screen thumbnails ie. in all
-         apps and in customization mode -->
-    <dimen name="smallScreenExtraSpacing">0dip</dimen>
-
-    <!-- Vertical spacing between edge of screen and mini cell layouts when they
-         are minimized to the bottom in all apps -->
-    <dimen name="allAppsSmallScreenVerticalMarginLandscape">30dip</dimen>
-    <dimen name="allAppsSmallScreenVerticalMarginPortrait">60dip</dimen>
-
-    <dimen name="all_apps_button_vertical_padding">4dip</dimen>
-
-    <!-- roughly a status bar (for determining how many rows of icons are in home) -->
-    <dimen name="status_bar_height">48dip</dimen>
-
-    <!-- dimensions for the wallpaper picker wallpaper thumbnail width -->
-    <dimen name="wallpaper_chooser_grid_width">196dp</dimen>
-    <dimen name="wallpaper_chooser_grid_height">140dp</dimen>
-    <dimen name="live_wallpaper_grid_item_padding">8dip</dimen>
-
-    <!-- How much the content view of an alert dialog should be inset (currently used
-        for the WallpaperChooser in XLarge mode) -->
-    <dimen name="alert_dialog_content_inset">0dp</dimen>
-
-    <!-- When dragging items on the workspace, the number of dps by which the position of
-     the drag view should be offset from the position of the original view. -->
-    <dimen name="dragViewOffsetX">0dp</dimen>
-    <dimen name="dragViewOffsetY">-12dp</dimen>
+<!-- Hotseat -->
+    <dimen name="hotseat_width_gap">-1dp</dimen>
+    <dimen name="hotseat_height_gap">-1dp</dimen>
+    <dimen name="button_bar_height">94dip</dimen>
+    <dimen name="button_bar_height_bottom_padding">9dp</dimen>
+    <dimen name="button_bar_height_top_padding">9dp</dimen>
+    <dimen name="button_bar_width_left_padding">9dp</dimen>
+    <dimen name="button_bar_width_right_padding">9dp</dimen>
+    <dimen name="button_bar_height_plus_padding">94dp</dimen>
 
 <!-- Folders -->
     <!-- The size of the image which sits behind the preview of the folder contents -->
-    <dimen name="folder_preview_size">78dp</dimen>
-    <!-- The amount that the preview contents are inset from the preview background -->
-    <dimen name="folder_preview_padding">4dp</dimen>
+    <dimen name="folder_preview_size">75dp</dimen>
+    <dimen name="folder_cell_width">96dp</dimen>
+    <dimen name="folder_cell_height">96dp</dimen>
+    <dimen name="folder_icon_padding_top">0dp</dimen>
+
+<!-- AppsCustomize -->
+    <dimen name="apps_customize_cell_width">96dp</dimen>
+    <dimen name="apps_customize_cell_height">98dp</dimen>
+    <dimen name="apps_customize_pageLayoutPaddingLeft">10dp</dimen>
+    <dimen name="apps_customize_pageLayoutPaddingRight">10dp</dimen>
+    <dimen name="apps_customize_tab_bar_height">60dp</dimen>
+    <dimen name="apps_customize_tab_bar_margin_top">8dp</dimen>
+    <dimen name="apps_customize_widget_cell_width_gap">36dp</dimen>
+    <dimen name="apps_customize_widget_cell_height_gap">36dp</dimen>
 </resources>
diff --git a/res/values-sw600dp/strings.xml b/res/values-sw600dp/strings.xml
deleted file mode 100644
index 75a22a2..0000000
--- a/res/values-sw600dp/strings.xml
+++ /dev/null
@@ -1,29 +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.
-*/
--->
-
-<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <!-- Title of the wallpaper selection dialog [CHAR_LIMIT=40]-->
-    <string name="wallpaper_dialog_title">Select wallpaper</string>
-
-    <!-- Text to show when there are no wallpapers [CHAR_LIMIT=40]-->
-    <string name="wallpaper_chooser_empty">No wallpapers available</string>
-
-    <!-- Negative button text for the wallpaper selection dialog [CHAR_LIMIT=40]-->
-    <string name="wallpaper_cancel">Cancel</string>
-</resources>
\ No newline at end of file
diff --git a/res/values-sw720dp-land/dimens.xml b/res/values-sw720dp-land/dimens.xml
index 239bdf5..e7fe32c 100644
--- a/res/values-sw720dp-land/dimens.xml
+++ b/res/values-sw720dp-land/dimens.xml
@@ -15,12 +15,33 @@
 -->
 
 <resources>
-    <integer name="apps_customize_widget_cell_count_x">4</integer>
-    <integer name="apps_customize_widget_cell_count_y">2</integer>
-
 <!-- AppsCustomize -->
     <dimen name="apps_customize_pageLayoutWidthGap">28dp</dimen>
     <dimen name="apps_customize_pageLayoutHeightGap">16dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingLeft">16dp</dimen>
     <dimen name="apps_customize_pageLayoutPaddingRight">16dp</dimen>
-</resources>
\ No newline at end of file
+
+<!-- Workspace -->
+    <dimen name="workspace_left_padding">24dip</dimen>
+    <dimen name="workspace_right_padding">24dip</dimen>
+    <!-- We need padding on the screens for portals to look right -->
+    <dimen name="workspace_top_padding">12dip</dimen>
+    <dimen name="workspace_bottom_padding">12dip</dimen>
+    <dimen name="workspace_width_gap">32dp</dimen>
+    <dimen name="workspace_height_gap">2dp</dimen>
+    <dimen name="workspace_page_spacing">50dp</dimen>
+
+    <!-- the area at the edge of the screen that makes the workspace go left
+         or right while you're dragging. -->
+    <dimen name="scroll_zone">100dip</dimen>
+
+    <integer name="apps_customize_widget_cell_count_x">4</integer>
+    <integer name="apps_customize_widget_cell_count_y">2</integer>
+    <integer name="apps_customize_cling_focused_x">4</integer>
+    <integer name="apps_customize_cling_focused_y">2</integer>
+
+<!-- Cling -->
+    <!-- The offset for the text in the cling -->
+    <dimen name="cling_text_block_offset_x">140dp</dimen>
+    <dimen name="cling_text_block_offset_y">80dp</dimen>
+</resources>
diff --git a/res/values-sw720dp-port/dimens.xml b/res/values-sw720dp-port/dimens.xml
index 52c105d..2e0d74a 100644
--- a/res/values-sw720dp-port/dimens.xml
+++ b/res/values-sw720dp-port/dimens.xml
@@ -15,9 +15,6 @@
 -->
 
 <resources>
-<!-- Workspace -->
-    <dimen name="workspace_page_spacing">24dp</dimen>
-
 <!-- AppsCustomize -->
     <integer name="apps_customize_maxCellCountX">-1</integer>
     <integer name="apps_customize_maxCellCountY">7</integer>
@@ -29,4 +26,25 @@
          xlarge -->
     <integer name="apps_customize_widget_cell_count_x">3</integer>
     <integer name="apps_customize_widget_cell_count_y">3</integer>
-</resources>
\ No newline at end of file
+
+<!-- Workspace -->
+    <!-- the area at the edge of the screen that makes the workspace go left
+         or right while you're dragging. -->
+    <dimen name="scroll_zone">40dp</dimen>
+
+    <dimen name="workspace_left_padding">15dip</dimen>
+    <dimen name="workspace_right_padding">15dip</dimen>
+    <dimen name="workspace_top_padding">25dip</dimen>
+    <dimen name="workspace_bottom_padding">25dip</dimen>
+    <dimen name="workspace_width_gap">0dp</dimen>
+    <dimen name="workspace_height_gap">32dp</dimen>
+    <dimen name="workspace_page_spacing">24dp</dimen>
+
+    <integer name="apps_customize_cling_focused_x">2</integer>
+    <integer name="apps_customize_cling_focused_y">2</integer>
+
+<!-- Cling -->
+    <!-- The offset for the text in the cling -->
+    <dimen name="cling_text_block_offset_x">80dp</dimen>
+    <dimen name="cling_text_block_offset_y">160dp</dimen>
+</resources>
diff --git a/res/values-sw600dp-port/styles.xml b/res/values-sw720dp-port/styles.xml
similarity index 100%
rename from res/values-sw600dp-port/styles.xml
rename to res/values-sw720dp-port/styles.xml
diff --git a/res/values-sw720dp/config.xml b/res/values-sw720dp/config.xml
new file mode 100644
index 0000000..c52328f
--- /dev/null
+++ b/res/values-sw720dp/config.xml
@@ -0,0 +1,14 @@
+<resources>
+    <bool name="config_largeHeap">true</bool>
+    <bool name="is_large_screen">true</bool>
+
+<!-- AllApps/Customize/AppsCustomize -->
+    <!-- Out of 100, the percent to shrink the workspace during spring loaded mode. -->
+    <integer name="config_workspaceSpringLoadShrinkPercentage">90</integer>
+
+<!-- Workspace -->
+    <!-- Whether or not the drop targets drop down as opposed to fade in -->
+    <bool name="config_useDropTargetDownTransition">true</bool>
+    <!-- Whether or not to fade the side pages -->
+    <bool name="config_workspaceFadeAdjacentScreens">true</bool>
+</resources>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
index 48faf9a..62bf9a8 100644
--- a/res/values-sw720dp/dimens.xml
+++ b/res/values-sw720dp/dimens.xml
@@ -15,9 +15,42 @@
 -->
 
 <resources>
+<!-- QSB -->
+    <dimen name="toolbar_button_vertical_padding">12dip</dimen>
+    <dimen name="toolbar_button_horizontal_padding">12dip</dimen>
+
+<!-- Workspace -->
+    <dimen name="qsb_bar_height">56dp</dimen>
+    <!-- This should be @dimen/qsb_bar_height - @dimen/workspace_top_padding
+         to fix the extra space given to draw portals -->
+    <dimen name="workspace_content_large_only_top_margin">36dp</dimen>
+    <dimen name="workspace_cell_width">96dip</dimen>
+    <dimen name="workspace_cell_height">96dip</dimen>
+
+    <dimen name="folder_cell_width">96dp</dimen>
+    <dimen name="folder_cell_height">96dp</dimen>
+
 <!-- AppsCustomize -->
     <integer name="apps_customize_maxCellCountX">-1</integer>
     <integer name="apps_customize_maxCellCountY">-1</integer>
     <dimen name="app_widget_preview_padding_left">0dp</dimen>
     <dimen name="app_widget_preview_padding_top">10dp</dimen>
-</resources>
\ No newline at end of file
+
+    <!-- Size of icons in workspace -->
+    <integer name="app_icon_scale_percent">-1</integer>
+    <integer name="app_icon_hotseat_scale_percent">-1</integer>
+
+    <dimen name="all_apps_button_vertical_padding">4dip</dimen>
+
+    <!-- roughly a status bar (for determining how many rows of icons are in home) -->
+    <dimen name="status_bar_height">48dip</dimen>
+
+    <!-- dimensions for the wallpaper picker wallpaper thumbnail width -->
+    <dimen name="wallpaper_chooser_grid_width">196dp</dimen>
+    <dimen name="wallpaper_chooser_grid_height">140dp</dimen>
+
+    <!-- When dragging items on the workspace, the number of dps by which the position of
+     the drag view should be offset from the position of the original view. -->
+    <dimen name="dragViewOffsetX">0dp</dimen>
+    <dimen name="dragViewOffsetY">0dp</dimen>
+</resources>
diff --git a/res/values-sw600dp/styles.xml b/res/values-sw720dp/styles.xml
similarity index 100%
rename from res/values-sw600dp/styles.xml
rename to res/values-sw720dp/styles.xml
diff --git a/res/values-sw600dp/wallpapers.xml b/res/values-sw720dp/wallpapers.xml
similarity index 100%
rename from res/values-sw600dp/wallpapers.xml
rename to res/values-sw720dp/wallpapers.xml
diff --git a/res/values-th-sw600dp/strings.xml b/res/values-th-sw600dp/strings.xml
deleted file mode 100644
index bfee7ee..0000000
--- a/res/values-th-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"เลือกวอลเปเปอร์"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"ไม่มีวอลเปเปอร์ให้ใช้งาน"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"ยกเลิก"</string>
-</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 509dc81..e832972 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"วิดเจ็ต"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"แตะค้างเพื่อรับวิดเจ็ต"</string>
     <string name="market" msgid="2652226429823445833">"ร้าน"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"ไม่สามารถวางรายการลงในหน้าจอหลักนี้ได้"</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"ไม่สามารถวางรายการลงในหน้าจอหลักนี้"</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"เลือกวิดเจ็ตที่จะสร้าง"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"ชื่อโฟลเดอร์"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"เปลี่ยนชื่อโฟลเดอร์"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"ทางลัด"</string>
     <string name="group_widgets" msgid="6704978494073105844">"วิดเจ็ต"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"วอลเปเปอร์"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"ไม่มีที่ว่างในหน้าจอหลักนี้"</string>
+    <string name="out_of_space" msgid="3056555298801463098">"ไม่มีที่ว่างในหน้าจอหลักของคุณ"</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"ไม่มีที่ว่างใน hotseat"</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"วิดเจ็ตนี้มีขนาดใหญ่เกินไปสำหรับ hotseat"</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"สร้างทางลัด \"<xliff:g id="NAME">%s</xliff:g>\" แล้ว"</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"ทางลัด \"<xliff:g id="NAME">%s</xliff:g>\" ถูกนำออกแล้ว"</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"ทางลัด \"<xliff:g id="NAME">%s</xliff:g>\" มีอยู่แล้ว"</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"เลือกทางลัด"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"เลือกทางลัด"</string>
     <string name="title_select_application" msgid="1793455815754848652">"เลือกแอปพลิเคชัน"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"แอปพลิเคชัน"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"บ้าน"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"ติดตั้งทางลัด"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"อนุญาตให้แอปพลิเคชันเพิ่มทางลัดโดยไม่ต้องให้ผู้ใช้จัดการ"</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"ถอนการติดตั้งทางลัด"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"อนุญาตให้แอปพลิเคชันนำทางลัดออกโดยไม่ต้องให้ผู้ใช้จัดการ"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"อนุญาตให้แอปพลิเคชันนำทางลัดออกโดยไม่ต้องให้ผู้ใช้จัดการ"</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"อ่านการตั้งค่าและทางลัดหน้าแรกแล้ว"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"อนุญาตให้แอปพลิเคชันอ่านการตั้งค่าและทางลัดในหน้าแรก"</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"อนุญาตให้แอปพลิเคชันอ่านการตั้งค่าและทางลัดในหน้าหลัก"</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"เขียนการตั้งค่าและทางลัดหน้าแรกแล้ว"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"อนุญาตให้แอปพลิเคชันเปลี่ยนการตั้งค่าและทางลัดในหน้าแรก"</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"อนุญาตให้แอปพลิเคชันเปลี่ยนการตั้งค่าและทางลัดในหน้าหลัก"</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"มีปัญหาขณะโหลดวิดเจ็ต"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"นี่เป็นแอปพลิเคชันระบบและไม่สามารถถอนการติดตั้งได้"</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"หากต้องการย้ายแอปพลิเคชัน ให้แตะแอปพลิเคชันนั้นค้างไว้"</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"หากต้องการสร้างโฟลเดอร์ใหม่บนหน้าจอหลัก ให้วางแอปพลิเคชันหนึ่งซ้อนบนแอปพลิเคชันอื่น"</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"ตกลง"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"โฟลเดอร์เปิดอยู่, %1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"แตะเพื่อปิดโฟลเดอร์"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"แตะเพื่อยอมรับการเปลี่ยนชื่อ"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"เปิดโฟลเดอร์ <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"แตะเพื่อปิดโฟลเดอร์"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"แตะเพื่อบัน​​ทึกการเปลี่ยนชื่อ"</string>
     <string name="folder_closed" msgid="3130534551370511932">"โฟลเดอร์ปิดอยู่"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"เปลี่ยนชื่อโฟลเดอร์เป็น %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"โฟลเดอร์: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"เปลี่ยนชื่อโฟลเดอร์เป็น <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"โฟลเดอร์: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-tl-sw600dp/strings.xml b/res/values-tl-sw600dp/strings.xml
deleted file mode 100644
index e4745b7..0000000
--- a/res/values-tl-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Pumili ng wallpaper"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Walang available na mga wallpaper"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Kanselahin"</string>
-</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index f7239e9..a20ca09 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Mga Widget"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Pindutin nang matagal upang kumuha ng widget."</string>
     <string name="market" msgid="2652226429823445833">"Mamili"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Hindi ma-drop ang item sa Home screen na ito."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Hindi ma-drop ang item sa Home screen na ito."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Pumili ng widget na lilikhain"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Pangalan ng folder"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Palitan ng pangalan ang folder"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Mga Shortcut"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Mga Widget"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Mga Wallpaper"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Wala nang lugar sa Home screen na ito."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Wala nang puwang sa iyong mga Home screen."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Wala nang lugar sa hotseat."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Masyadong malaki ang widget na ito para sa hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Nalikha ang shortcut na \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Inalis ang shortcut na \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Umiiral na ang shortcut na \"<xliff:g id="NAME">%s</xliff:g>\"."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Pumili ng shortcut"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Pumili ng shortcut"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Pumili ng app"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Apps"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Home"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"i-install ang mga shortcut"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Binibigyang-daan ang isang app na magdagdag ng mga shortcut nang walang panghihimasok ng user."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"huwag i-install ang mga shortcut"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Bibigyang-daan ang isang app na mag-alis ng mga shortcut nang walang panghihimasok ng user."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Binibigyang-daan ang app na mag-alis ng mga shortcut nang walang panghihimasok ng user."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"basahin ang mga setting ng Home at shortcut"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Binibigyang-daan ang isang app na basahin ang mga setting at shortcut sa Home."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Binibigyang-daan ang app na basahin ang mga setting at shortcut sa Home."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"magsulat ng mga setting ng Home at mga shortcut"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Binibigyang-daan ang isang app na baguhin ang mga setting at shortcut sa Home."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Binibigyang-daan ang app na baguhin ang mga setting at shortcut sa Home."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Problema sa pag-load ng widget"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Isa itong app ng system at hindi maaaring i-uninstall."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Upang ilipat ang isang app, pindutin ito nang matagal."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Upang gumawa ng bagong folder sa iyong home screen, magpatong ng isang app sa ibabaw ng isa pa."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Binuksan ang folder, %1$d by %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Tapikin upang isara ang folder"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Tapikin upang kumpirmahin ang pagpapalit ng pangalan"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Binuksan ang folder, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Pindutin upang isara ang folder"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Pindutin upang i-save ang pagpapalit ng pangalan"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Nakasara ang folder"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Pinangalanan ang folder na %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Folder: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Binago ang pangalan ng folder patungong <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Folder: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-tr-sw600dp/strings.xml b/res/values-tr-sw600dp/strings.xml
deleted file mode 100644
index d896430..0000000
--- a/res/values-tr-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Duvar kağıdı seçin"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Kullanılabilir hiç duvar kağıdı yok"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"İptal"</string>
-</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index a9b844a..28de742 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Widget\'lar"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Widget seçmek için dokunun ve basılı tutun."</string>
     <string name="market" msgid="2652226429823445833">"Alışveriş"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Öğe bu Ana Ekrana bırakılamadı."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Öğe bu Ana Ekrana bırakılamadı."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Oluşturmak için widget seçin"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Klasör adı"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Klasörü yeniden adlandır"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Kısayollar"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Widget\'lar"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Duvar Kağıtları"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Bu Ana Sayfada yer yok."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Ana ekranlarınızda başka yer kalmadı."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Favori kısa yollarda yer yok"</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Bu widget, hotseat için çok büyük."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu oluşturuldu."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu kaldırıldı."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"\"<xliff:g id="NAME">%s</xliff:g>\" kısayolu zaten var."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Kısayolu seçin"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Kısayolu seçin"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Uygulama seçin"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Uygulamalar"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Ana Sayfa"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"kısayolları yükle"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Uygulamaya, kullanıcı müdahalesi olmadan kısayol ekleme izni verir."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"kısayolları kaldır"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Uygulamaya, kullanıcı müdahalesi olmadan kısayolları kaldırma izni verir."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Uygulamaya kullanıcı müdahalesi olmadan kısayolları kaldırma izni verir."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"Ana Sayfa ayarlarını ve kısayollarını oku"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Uygulamaya, Ana Ekrandaki ayarları ve kısayolları okuma izni verir."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Uygulamaya Ana Ekrandaki ayarları ve kısayolları okuma izni verir."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"Ana Sayfa ayarlarını ve kısayollarını yaz"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Uygulamaya, Ana Ekrandaki ayarları ve kısayolları değiştirme izni verir."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Uygulamaya Ana Ekrandaki ayarları ve kısayolları değiştirme izni verir."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Widget yüklenirken sorun oluştu"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Bu bir sistem uygulamasıdır ve kaldırılamaz."</string>
     <string name="dream_name" msgid="2847171357608437154">"Roket Fırlatıcı"</string>
@@ -89,18 +90,18 @@
     <string name="apps_customize_apps_scroll_format" msgid="5494241912377704885">"Uygulama sayfası %1$d / %2$d"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"Widget sayfası %1$d / %2$d"</string>
     <string name="workspace_cling_title" msgid="738396473989890567">"Kendinizi evinizde hissedin"</string>
-    <string name="workspace_cling_move_item" msgid="791013895761065070">"Farvori uygulamalarınızı buraya koyabilirsiniz."</string>
+    <string name="workspace_cling_move_item" msgid="791013895761065070">"Favori uygulamalarınızı buraya koyabilirsiniz."</string>
     <string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"Tüm uygulamalarınızı görmek için çembere dokunun."</string>
-    <string name="all_apps_cling_title" msgid="2559734712581447107">"Bazı uygulamalar seçin"</string>
+    <string name="all_apps_cling_title" msgid="2559734712581447107">"İstediğiniz uygulamaları seçin"</string>
     <string name="all_apps_cling_add_item" msgid="5665035103260318891">"Ana Ekranınıza bir uygulama eklemek için, ilgili uygulamaya dokunup basılı tutun."</string>
     <string name="folder_cling_title" msgid="4308949882377840953">"Uygulamalarınızı klasörlerle düzenleyin"</string>
     <string name="folder_cling_move_item" msgid="270598675060435169">"Bir uygulamayı taşımak için, uygulamaya dokunun ve basılı tutun."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Ana Ekranınızda yeni bir klasör oluşturmak için, bir uygulamayı diğerinin üzerine getirin."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"Tamam"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Klasör açıldı, boyutları %1$d ve %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Klasörü kapatmak için hafifçe dokunun"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Yeniden adlandırmayı uygulamak için hafifçe dokunun"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Klasör açıldı, <xliff:g id="WIDTH">%1$d</xliff:g> genişlik, <xliff:g id="HEIGHT">%2$d</xliff:g> yükseklik"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Klasörü kapatmak için dokunun"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Yeni adı kaydetmek için dokunun"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Klasör kapatıldı"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Klasör %1$s olarak yeniden adlandırıldı"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Klasör: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Klasörün adı <xliff:g id="NAME">%1$s</xliff:g> olarak değiştirildi"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Klasör: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-uk-sw600dp/strings.xml b/res/values-uk-sw600dp/strings.xml
deleted file mode 100644
index 6b60e04..0000000
--- a/res/values-uk-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Вибрати фоновий малюнок"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Фонові малюнки недоступні"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Скасувати"</string>
-</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index bd54fd4..7426a74 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Віджети"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Торкніться й утримуйте, щоб вибрати віджет."</string>
     <string name="market" msgid="2652226429823445833">"Магазин"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Не вдалося помістити елемент на цей головний екран"</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Не вдалося помістити елемент на цей головний екран"</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Вибрати віджет для створення"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Назва папки"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Переймен. папку"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Ярлики"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Віджети"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Фонові мал."</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Немає більше місця на гол. екрані."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"На головних екранах більше немає місця."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"На гарячій панелі більше немає місця."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Цей віджет завеликий для Hotseat."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" створено."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" видалено."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Ярлик \"<xliff:g id="NAME">%s</xliff:g>\" уже існує."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Вибрати ярлик"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Вибрати ярлик"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Вибрати програму"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Прогр."</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Головна"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"установити ярлики"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Дозволяє програмі додавати ярлики без втручання користувача."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"видалити ярлики"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Дозволяє програмі видаляти ярлики без втручання користувача."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Дозволяє програмі видаляти ярлики без втручання користувача."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"читати налашт-ня Головної та ярлики"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Дозволяє програмі читати налаштування та ярлики на головному екрані."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Дозволяє програмі читати налаштування та ярлики на головному екрані."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"писати налашт-ня Головної та ярлики"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Дозволяє програмі змінювати налаштування та ярлики на головному екрані."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Дозволяє програмі змінювати налаштування та ярлики на головному екрані."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Пробл із завантаж. віджета"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Це системна програма, її неможливо видалити."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Щоб перемістити програму, торкніться й утримуйте її."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Щоб створити нову папку на головному екрані, помістіть одну програму на іншу."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"ОК"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Папку відкрито, %1$d–%2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Натисніть, щоб закрити папку"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Натисніть, щоб перейменувати"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Папку відкрито: <xliff:g id="WIDTH">%1$d</xliff:g> х <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Торкніться, щоб закрити папку"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Торкніться, щоб зберегти перейменування"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Папку закрито"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Папку перейменовано на %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Папка: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Папку перейменовано на <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Папка: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-vi-sw600dp/strings.xml b/res/values-vi-sw600dp/strings.xml
deleted file mode 100644
index b2c1342..0000000
--- a/res/values-vi-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Chọn hình nền"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Không có hình nền nào"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Hủy"</string>
-</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 73896b4..c19a9d8 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Tiện ích"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Chạm &amp; giữ để chọn tiện ích con."</string>
     <string name="market" msgid="2652226429823445833">"Mua hàng"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Không thể thả mục vào Màn hình chính này."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Không thể thả mục vào Màn hình chính này."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Chọn tiện ích con để tạo"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Tên thư mục"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Đổi tên thư mục"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Lối tắt"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Tiện ích"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Hình nền"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Không còn khoảng trống trên Màn hình chính này."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Không còn chỗ trên màn hình chính của bạn."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Không còn chỗ trên vùng gắn."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Tiện ích này quá lớn cho điểm giới hạn."</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Lối tắt \"<xliff:g id="NAME">%s</xliff:g>\" đã được tạo."</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Lối tắt \"<xliff:g id="NAME">%s</xliff:g>\" đã bị xóa."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Lối tắt \"<xliff:g id="NAME">%s</xliff:g>\" đã tồn tại."</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Chọn lối tắt"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Chọn lối tắt"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Chọn ứng dụng"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Ứng dụng"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Màn hình trang chủ"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"cài đặt lối tắt"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Cho phép ứng dụng thêm lối tắt mà không cần sự can thiệp của người dùng."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"gỡ cài đặt lối tắt"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Cho phép ứng dụng xóa lối tắt mà không cần sự can thiệp của người dùng."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Cho phép ứng dụng xóa lối tắt mà không cần sự can thiệp của người dùng."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"đọc cài đặt Màn hình trang chủ và lối tắt"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Cho phép ứng dụng đọc cài đặt và lối tắt trên Màn hình chính."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Cho phép ứng dụng đọc cài đặt và lối tắt trên Màn hình chính."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"ghi cài đặt Màn hình trang chủ và lối tắt"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Cho phép ứng dụng thay đổi cài đặt và lối tắt trên Màn hình chính."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Cho phép ứng dụng thay đổi cài đặt và lối tắt trên Màn hình chính."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Sự cố khi tải tiện ích"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Đây là ứng dụng hệ thống và không thể gỡ cài đặt."</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Để di chuyển ứng dụng, chạm &amp; giữ ứng dụng đó."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Để tạo thư mục mới trên Màn hình chính của bạn, xếp ứng dụng này lên trên ứng dụng khác."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"OK"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Đã mở thư mục, %1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Chạm để đóng thư mục"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Chạm để cho phép đổi tên"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Đã mở thư mục, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Chạm để đóng thư mục"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Chạm để lưu tên mới"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Đã đóng thư mục"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Thư mục được đổi tên thành %1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Thư mục: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Đã đổi tên thư mục thành <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Thư mục: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-zh-rCN-sw600dp/strings.xml b/res/values-zh-rCN-sw600dp/strings.xml
deleted file mode 100644
index 70a42df..0000000
--- a/res/values-zh-rCN-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"选择壁纸"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"无可用壁纸"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"取消"</string>
-</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 5058d2e..7c30da4 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -20,87 +20,88 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="application_name" msgid="8424725141379931883">"启动器"</string>
-    <string name="uid_name" msgid="3371120195364560632">"Android 核心应用程序"</string>
+    <string name="uid_name" msgid="3371120195364560632">"Android 核心应用"</string>
     <string name="folder_name" msgid="8551881338202938211"></string>
     <string name="chooser_wallpaper" msgid="6063168087625352235">"选择壁纸来源"</string>
     <string name="wallpaper_instructions" msgid="4215640646180727542">"设置壁纸"</string>
     <string name="pick_wallpaper" msgid="5630222540525626723">"壁纸"</string>
-    <string name="activity_not_found" msgid="217823393239365967">"未安装该应用程序。"</string>
+    <string name="activity_not_found" msgid="217823393239365967">"未安装该应用。"</string>
     <string name="widgets_tab_label" msgid="9145860100000983599">"窗口小部件"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"触摸并按住可选取窗口小部件。"</string>
     <string name="market" msgid="2652226429823445833">"购买"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"无法将该项拖放到此主屏幕上。"</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"无法将项拖放到此主屏幕上。"</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"选择要处理拖放操作的窗口小部件"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"文件夹名称"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"重命名文件夹"</string>
     <string name="rename_action" msgid="6016003384693240896">"确定"</string>
     <string name="cancel_action" msgid="3811860427489435048">"取消"</string>
     <string name="menu_item_add_item" msgid="6233177331075781114">"添加到主屏幕"</string>
-    <string name="group_applications" msgid="2103752818818161976">"应用程序"</string>
+    <string name="group_applications" msgid="2103752818818161976">"应用"</string>
     <string name="group_shortcuts" msgid="9133529424900391877">"快捷方式"</string>
     <string name="group_widgets" msgid="6704978494073105844">"窗口小部件"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"壁纸"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"此主屏幕上已没有空间。"</string>
+    <string name="out_of_space" msgid="3056555298801463098">"您的主屏幕上没有空间了。"</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"底部区域已无空间。"</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"该窗口小部件太大,超出基座区域可用空间。"</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"已创建“<xliff:g id="NAME">%s</xliff:g>”快捷方式。"</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"已删除“<xliff:g id="NAME">%s</xliff:g>”快捷方式。"</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"“<xliff:g id="NAME">%s</xliff:g>”快捷方式已存在。"</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"选择快捷方式"</string>
-    <string name="title_select_application" msgid="1793455815754848652">"选择应用程序"</string>
-    <string name="all_apps_button_label" msgid="2578400570124163469">"应用程序"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"选择快捷方式"</string>
+    <string name="title_select_application" msgid="1793455815754848652">"选择应用"</string>
+    <string name="all_apps_button_label" msgid="2578400570124163469">"应用"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"主屏幕"</string>
     <string name="delete_zone_label_workspace" msgid="7153615831493049150">"删除"</string>
     <string name="delete_zone_label_all_apps" msgid="6664588234817475108">"卸载"</string>
     <string name="delete_target_label" msgid="665300185123139530">"删除"</string>
     <string name="delete_target_uninstall_label" msgid="748894921183769150">"卸载"</string>
-    <string name="info_target_label" msgid="4019495079517426980">"应用程序信息"</string>
+    <string name="info_target_label" msgid="4019495079517426980">"应用信息"</string>
     <string name="accessibility_search_button" msgid="816822994629942611">"搜索"</string>
     <string name="accessibility_voice_search_button" msgid="3938249215065842475">"语音搜索"</string>
-    <string name="accessibility_all_apps_button" msgid="8803738611398979849">"应用程序"</string>
+    <string name="accessibility_all_apps_button" msgid="8803738611398979849">"应用"</string>
     <string name="accessibility_delete_button" msgid="3628162007991023603">"删除"</string>
     <string name="delete_zone_label_all_apps_system_app" msgid="3683920959591819044">"卸载更新"</string>
     <string name="menu_add" msgid="3065046628354640854">"添加"</string>
-    <string name="menu_manage_apps" msgid="2308685199463588895">"管理应用程序"</string>
+    <string name="menu_manage_apps" msgid="2308685199463588895">"管理应用"</string>
     <string name="menu_wallpaper" msgid="5837429080911269832">"壁纸"</string>
     <string name="menu_search" msgid="4826514464423239041">"搜索"</string>
     <string name="menu_notifications" msgid="6424587053194766192">"通知"</string>
     <string name="menu_settings" msgid="3946232973327980394">"系统设置"</string>
     <string name="menu_help" msgid="4901160661634590633">"帮助"</string>
-    <string name="cab_menu_delete_app" msgid="4089398025537640349">"卸载该应用程序"</string>
-    <string name="cab_menu_app_info" msgid="914548323652698884">"应用程序详情"</string>
-    <string name="cab_app_selection_text" msgid="6378522164293415735">"选中了 1 个应用程序"</string>
+    <string name="cab_menu_delete_app" msgid="4089398025537640349">"卸载该应用"</string>
+    <string name="cab_menu_app_info" msgid="914548323652698884">"应用详情"</string>
+    <string name="cab_app_selection_text" msgid="6378522164293415735">"选中了 1 个应用"</string>
     <string name="cab_widget_selection_text" msgid="962527270506951955">"已选中 1 个窗口小部件"</string>
     <string name="cab_folder_selection_text" msgid="8916111874189565067">"已选中 1 个文件夹"</string>
     <string name="cab_shortcut_selection_text" msgid="8115847384500412878">"已选中 1 个快捷方式"</string>
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"安装快捷方式"</string>
-    <string name="permdesc_install_shortcut" msgid="8634424803272077038">"允许应用程序自行添加快捷方式。"</string>
+    <string name="permdesc_install_shortcut" msgid="8634424803272077038">"允许应用自行添加快捷方式。"</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"卸载快捷方式"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"允许应用程序自行删除快捷方式。"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"允许应用自行删除快捷方式,而无需用户干预。"</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"读取主屏幕的设置和快捷方式"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"允许应用程序读取主屏幕中的设置和快捷方式。"</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"允许应用读取主屏幕中的设置和快捷方式。"</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"写入主屏幕的设置和快捷方式"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"允许应用程序更改主屏幕中的设置和快捷方式。"</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"允许应用更改主屏幕中的设置和快捷方式。"</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"载入窗口小部件时出现问题"</string>
-    <string name="uninstall_system_app_text" msgid="6429814133777046491">"这是系统应用程序,无法卸载。"</string>
+    <string name="uninstall_system_app_text" msgid="6429814133777046491">"这是系统应用,无法卸载。"</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
     <string name="folder_hint_text" msgid="8633351560105748141">"未命名文件夹"</string>
     <string name="default_scroll_format" msgid="4057140866420001240">"第 %1$d 页,共 %2$d 页"</string>
     <string name="workspace_scroll_format" msgid="7911126267695001437">"工作区:第 %1$d 页,共 %2$d 页"</string>
-    <string name="apps_customize_apps_scroll_format" msgid="5494241912377704885">"应用程序:第 %1$d 页,共 %2$d 页"</string>
+    <string name="apps_customize_apps_scroll_format" msgid="5494241912377704885">"应用:第 %1$d 页,共 %2$d 页"</string>
     <string name="apps_customize_widgets_scroll_format" msgid="5383009742241717437">"窗口小部件:第 %1$d 页,共 %2$d 页"</string>
     <string name="workspace_cling_title" msgid="738396473989890567">"随意浏览"</string>
-    <string name="workspace_cling_move_item" msgid="791013895761065070">"您可以在此处放置自己喜爱的应用程序。"</string>
-    <string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"要查看您的所有应用程序,请触摸该圆圈。"</string>
-    <string name="all_apps_cling_title" msgid="2559734712581447107">"选择一些应用程序"</string>
-    <string name="all_apps_cling_add_item" msgid="5665035103260318891">"要将某个应用程序添加到主屏幕,请触摸并按住该应用程序。"</string>
-    <string name="folder_cling_title" msgid="4308949882377840953">"使用文件夹整理应用程序"</string>
-    <string name="folder_cling_move_item" msgid="270598675060435169">"要移动应用程序,请触摸并按住该应用程序。"</string>
-    <string name="folder_cling_create_folder" msgid="8352867485656129478">"要在主屏幕上创建新文件夹,请将一个应用程序叠放到另一个上。"</string>
+    <string name="workspace_cling_move_item" msgid="791013895761065070">"您可以在此处放置自己喜爱的应用。"</string>
+    <string name="workspace_cling_open_all_apps" msgid="2459977609848572588">"要查看您的所有应用,请触摸该圆圈。"</string>
+    <string name="all_apps_cling_title" msgid="2559734712581447107">"选择一些应用"</string>
+    <string name="all_apps_cling_add_item" msgid="5665035103260318891">"要将某个应用添加到主屏幕,请触摸并按住该应用。"</string>
+    <string name="folder_cling_title" msgid="4308949882377840953">"使用文件夹整理应用"</string>
+    <string name="folder_cling_move_item" msgid="270598675060435169">"要移动应用,请触摸并按住该应用。"</string>
+    <string name="folder_cling_create_folder" msgid="8352867485656129478">"要在主屏幕上创建新文件夹,请将一个应用叠放到另一个上。"</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"确定"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"文件夹已打开,尺寸为 %1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"点按可关闭文件夹"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"点按即可重命名"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"文件夹已打开,尺寸为 <xliff:g id="WIDTH">%1$d</xliff:g> × <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"触摸可关闭文件夹"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"触摸可保存重命名"</string>
     <string name="folder_closed" msgid="3130534551370511932">"文件夹已关闭"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"已将文件夹重命名为“%1$s”"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"文件夹:%1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"已将文件夹重命名为“<xliff:g id="NAME">%1$s</xliff:g>”"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"文件夹:<xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-zh-rTW-sw600dp/strings.xml b/res/values-zh-rTW-sw600dp/strings.xml
deleted file mode 100644
index b52fc55..0000000
--- a/res/values-zh-rTW-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"選取桌布"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"沒有可用的桌布"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"取消"</string>
-</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index baaf1e2..00eeaf1 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"小工具"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"輕觸並按住小工具即可選取。"</string>
     <string name="market" msgid="2652226429823445833">"商店"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"無法將項目拖放至主螢幕上。"</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"無法將項目拖放至這個主螢幕上。"</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"選擇要建立的小工具"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"資料夾名稱"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"重新命名資料夾"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"捷徑"</string>
     <string name="group_widgets" msgid="6704978494073105844">"小工具"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"桌布"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"主螢幕已無空間"</string>
+    <string name="out_of_space" msgid="3056555298801463098">"主螢幕已無空間。"</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"停駐區已無可用空間。"</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"這個小工具過大,超出可用的空間。"</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"已建立「<xliff:g id="NAME">%s</xliff:g>」捷徑。"</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"已移除「<xliff:g id="NAME">%s</xliff:g>」捷徑。"</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"「<xliff:g id="NAME">%s</xliff:g>」捷徑已經存在。"</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"選取捷徑"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"選擇捷徑"</string>
     <string name="title_select_application" msgid="1793455815754848652">"選擇應用程式"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"應用程式"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"主螢幕"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"安裝捷徑"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"允許應用程式自動新增捷徑。"</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"解除安裝捷徑"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"允許應用程式自動移除捷徑。"</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"允許應用程式自動移除捷徑。"</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"讀取主螢幕設定和捷徑"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"允許應用程式讀取主螢幕的設定與捷徑。"</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"允許應用程式讀取主螢幕中的設定與捷徑。"</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"寫入主螢幕設定和捷徑"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"允許應用程式變更主螢幕中的設定與捷徑。"</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"允許應用程式變更主螢幕中的設定與捷徑。"</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"載入小工具時發生問題"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"這是系統應用程式,不可解除安裝。"</string>
     <string name="dream_name" msgid="2847171357608437154">"Rocket Launcher"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"如要移動應用程式,請輕觸並按住目標。"</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"如要在主螢幕建立新資料夾,請將應用程式一個個堆疊起來。"</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"確定"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"已開啟資料夾,%1$d x %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"輕按即可關閉資料夾"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"輕按即可重新命名"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"資料夾已開啟 (<xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>)"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"輕觸即可關閉資料夾"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"輕觸即可儲存重新命名後的名稱"</string>
     <string name="folder_closed" msgid="3130534551370511932">"已關閉資料夾"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"已將資料夾重新命名為「%1$s」"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"資料夾:%1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"已將資料夾重新命名為 <xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"資料夾:<xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values-zu-sw600dp/strings.xml b/res/values-zu-sw600dp/strings.xml
deleted file mode 100644
index 93604e2..0000000
--- a/res/values-zu-sw600dp/strings.xml
+++ /dev/null
@@ -1,25 +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.
-*/
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="wallpaper_dialog_title" msgid="6395005465873616423">"Khetha iphephadonga"</string>
-    <string name="wallpaper_chooser_empty" msgid="5909737215399452696">"Awekho amaphephadonga atholakalayo"</string>
-    <string name="wallpaper_cancel" msgid="1110492200533814461">"Khansela"</string>
-</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 799c064..8855db5 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -29,7 +29,7 @@
     <string name="widgets_tab_label" msgid="9145860100000983599">"Amawijethi"</string>
     <string name="long_press_widget_to_add" msgid="7395697462851217506">"Thinta &amp; bamba ukuthatha iwijethi"</string>
     <string name="market" msgid="2652226429823445833">"Thenga"</string>
-    <string name="external_drop_widget_error" msgid="127440783198670829">"Ayikwazanga ukubeka into kulesi sikrini sasekhaya."</string>
+    <string name="external_drop_widget_error" msgid="2285187188524172774">"Ayikwazanga ukubeka into kulesi sikrini sasekhaya."</string>
     <string name="external_drop_widget_pick_title" msgid="7040647073452295370">"Khetha i-wijethi ongayidala"</string>
     <string name="rename_folder_label" msgid="5646236631298452787">"Igama lefolda"</string>
     <string name="rename_folder_title" msgid="4544573104191526550">"Qamba kabusha ifolda"</string>
@@ -40,12 +40,13 @@
     <string name="group_shortcuts" msgid="9133529424900391877">"Izinqamuleli"</string>
     <string name="group_widgets" msgid="6704978494073105844">"Izinqunjwana"</string>
     <string name="group_wallpapers" msgid="1568191644272224858">"Amaphephadonga"</string>
-    <string name="out_of_space" msgid="8365249326091984698">"Asisekho isikhala kulesi sikrini Sasekhaya."</string>
+    <string name="out_of_space" msgid="3056555298801463098">"Akusenagumbi ezikrinini zakho zekhaya."</string>
+    <string name="hotseat_out_of_space" msgid="6304886797358479361">"Akusenagumbi ku-hotseat."</string>
     <string name="invalid_hotseat_item" msgid="6545340627805449250">"Le wijethi inkulu kakhulu ukuba ibe esihlalweni esishisayo"</string>
     <string name="shortcut_installed" msgid="7071557296331322355">"Isinqamuleli \"<xliff:g id="NAME">%s</xliff:g>\" senziwe"</string>
     <string name="shortcut_uninstalled" msgid="2129499669449749995">"Isinqamuleli \"<xliff:g id="NAME">%s</xliff:g>\" sikhishiwe."</string>
     <string name="shortcut_duplicate" msgid="4757756326465060694">"Isinqamuleli \"<xliff:g id="NAME">%s</xliff:g>\" sivele sikhona"</string>
-    <string name="title_select_shortcut" msgid="2858897527672831763">"Khetha isinqamuleli"</string>
+    <string name="title_select_shortcut" msgid="1873670208166882222">"Khetha isinqamulelo"</string>
     <string name="title_select_application" msgid="1793455815754848652">"Khetha i-app"</string>
     <string name="all_apps_button_label" msgid="2578400570124163469">"Izinhlelo zokusebenza"</string>
     <string name="all_apps_home_button_label" msgid="1022222300329398558">"Ekhaya"</string>
@@ -75,11 +76,11 @@
     <string name="permlab_install_shortcut" msgid="1201690825493376489">"engeza izinqamuleli"</string>
     <string name="permdesc_install_shortcut" msgid="8634424803272077038">"Ivumela uhlelo lokusebenza ukufaka izinqamuleli ngaphandle kokungenela komsebenzisi."</string>
     <string name="permlab_uninstall_shortcut" msgid="7696645932555926449">"khipha izinqamuleli"</string>
-    <string name="permdesc_uninstall_shortcut" msgid="7811223557950931994">"Ivumela uhlelo lokusebenza ukukhipha izinqamuleli ngaphandle kokungenela komsebenzisi."</string>
+    <string name="permdesc_uninstall_shortcut" msgid="274355570620220977">"Vumela i-app ukususa izinqamuleli ngaphandle kukubandakanyeka komsebenzisi."</string>
     <string name="permlab_read_settings" msgid="3452408290738106747">"funda izilungiselelo zaseKhaya nezinqamuleli"</string>
-    <string name="permdesc_read_settings" msgid="1836104524215167383">"Ivumela uhlelo lokusebenza ukufunda izilungiselelo nezinqamuleli Ekhaya."</string>
+    <string name="permdesc_read_settings" msgid="5788109303585403679">"Vumela ama-app ukufunda izilungiselelo nezinqamulelo eKhaya."</string>
     <string name="permlab_write_settings" msgid="1360567537236705628">"bhala izilungiselelo zaseKhaya nezinqamuleli"</string>
-    <string name="permdesc_write_settings" msgid="6763846563231494591">"Ivumela izinhlelo ukushintsha izilungiselelo nezinqamuleli Ekhaya."</string>
+    <string name="permdesc_write_settings" msgid="8530105489115785531">"Vumela ama-app ukushintsha izilungiselelo nezinqamulelo eKhaya."</string>
     <string name="gadget_error_text" msgid="8359351016167075858">"Inkinga yokulayisha iwijethi"</string>
     <string name="uninstall_system_app_text" msgid="6429814133777046491">"Lolu uhlelo lokusebenza lwesistimu futhi alikwazi ukukhishwa."</string>
     <string name="dream_name" msgid="2847171357608437154">"Isiqalisi se-Rocket"</string>
@@ -97,10 +98,10 @@
     <string name="folder_cling_move_item" msgid="270598675060435169">"Ukususa insiza, thinta &amp; uyibambe."</string>
     <string name="folder_cling_create_folder" msgid="8352867485656129478">"Ukwenza ifolda entsha eskrinini sakho sasekhaya, beka insiza eyodwa phezulu kwenye."</string>
     <string name="cling_dismiss" msgid="2780907108735868381">"KULUNGILE"</string>
-    <string name="folder_opened" msgid="4129072635480822768">"Ifolda ivulekile, %1$d ngo %2$d"</string>
-    <string name="folder_tap_to_close" msgid="4076794242530255812">"Qhofoza ukuvala ifolda"</string>
-    <string name="folder_tap_to_rename" msgid="2125528923948315223">"Qhofoza ukuqamba kabusha"</string>
+    <string name="folder_opened" msgid="1262064100943801533">"Ifolda ivulwe, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
+    <string name="folder_tap_to_close" msgid="1335478160661137579">"Thinta ukuze uvale ifolda"</string>
+    <string name="folder_tap_to_rename" msgid="5201612989905472442">"Thinta ukuze ulondoloze ukuqamba kabusha"</string>
     <string name="folder_closed" msgid="3130534551370511932">"Ifolda ivaliwe"</string>
-    <string name="folder_renamed" msgid="781234745487414781">"Ifolda iqanjwe kabusha ku-%1$s"</string>
-    <string name="folder_name_format" msgid="4513766553514769310">"Ifolda: %1$s"</string>
+    <string name="folder_renamed" msgid="7951233572858053642">"Ifolda iqanjwe kabusha ngo-<xliff:g id="NAME">%1$s</xliff:g>"</string>
+    <string name="folder_name_format" msgid="3051680259794759037">"Ifolda: <xliff:g id="NAME">%1$s</xliff:g>"</string>
 </resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 1258562..9ed824b 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -27,6 +27,13 @@
 
     <skip />
 
+    <!-- DrawableStateProxyView specific attributes. These attributes are used to customize
+         a DrawableStateProxyView view in XML files. -->
+    <declare-styleable name="DrawableStateProxyView">
+        <!-- The source view to delegate touch presses events to. -->
+        <attr name="sourceViewId" format="integer" />
+    </declare-styleable>
+
     <!-- Cling specific attributes. These attributes are used to customize
          the cling in XML files. -->
     <declare-styleable name="Cling">
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ece0fd8..c2e1e7b 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -23,13 +23,11 @@
     <color name="delete_target_hover_tint">#DAFF0000</color>
     <color name="info_target_hover_tint">#DA0099CC</color>
 
-    <!-- The alpha/color to apply to the drag image -->
-    <color name="drag_view_multiply_color">#CCFFFFFF</color>
-
     <color name="bubble_dark_background">#20000000</color>
 
     <color name="appwidget_error_color">#FCCC</color>
 
     <color name="workspace_all_apps_and_delete_zone_text_color">#CCFFFFFF</color>
     <color name="workspace_all_apps_and_delete_zone_text_shadow_color">#A0000000</color>
+    <color name="workspace_icon_text_color">#FFF</color>
 </resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index 7ab9870..2a75af8 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -1,25 +1,14 @@
 <resources>
     <bool name="config_hardwareAccelerated">true</bool>
     <bool name="config_largeHeap">false</bool>
+    <bool name="is_large_screen">false</bool>
 
 <!-- AllApps/Customize/AppsCustomize -->
     <!-- The alpha of the AppsCustomize bg in spring loaded mode -->
     <integer name="config_appsCustomizeSpringLoadedBgAlpha">45</integer>
-    <!-- Fade in/out duration of icons being dragged from the trays -->
-    <integer name="config_dragAppsCustomizeIconFadeInDuration">150</integer>
-    <integer name="config_dragAppsCustomizeIconFadeOutDuration">200</integer>
-    <integer name="config_dragAppsCustomizeIconFadeAlpha">100</integer>
     <integer name="config_workspaceUnshrinkTime">300</integer>
     <!-- Out of 100, the percent to shrink the workspace during spring loaded mode. -->
     <integer name="config_workspaceSpringLoadShrinkPercentage">80</integer>
-    <!-- When items are dropped on the mini screens in customize mode, we have a bounce animation
-         of the bright green hover outline, and then fade out the outline at the end. These are
-         the values used in that animation -->
-    <integer name="config_screenOnDropScalePercent">120</integer>
-    <integer name="config_screenOnDropScaleUpDuration">200</integer>
-    <integer name="config_screenOnDropScaleDownDuration">200</integer>
-    <integer name="config_screenOnDropAlphaFadeDelay">350</integer>
-    <integer name="config_screenOnDropAlphaFadeDuration">50</integer>
 
     <!-- Fade/zoom in/out duration & scale in the AllApps transition.
          Note: This should be less than the workspaceShrinkTime as they happen together. -->
@@ -50,15 +39,10 @@
     <bool name="config_workspaceFadeAdjacentScreens">false</bool>
 
     <!-- The transition duration for the background of the drop targets -->
-    <integer name="config_dropTargetBgTransitionDuration">100</integer>
+    <integer name="config_dropTargetBgTransitionDuration">0</integer>
 
     <integer name="config_crosshairsFadeInTime">600</integer>
 
-    <!--  When dragging an item on the workspace, how much bigger (in pixels) the dragged view
-          should be, as compared to the original view. If 0, it will not be scaled at all.
-          Should be an even number, for pixel alignment. -->
-    <integer name="config_dragViewExtraPixels">40</integer>
-
     <!-- The duration (in ms) of the fade animation on the object outlines, used when
          we are dragging objects around on the home screen. -->
     <integer name="config_dragOutlineFadeTime">900</integer>
@@ -68,6 +52,7 @@
 
     <!-- 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. -->
+    <integer name="config_dropAnimMinDuration">100</integer>
     <integer name="config_dropAnimMaxDuration">500</integer>
 
     <!-- The duration of the UserFolder opening and closing animation -->
@@ -76,18 +61,18 @@
     <!-- 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>
-
-    <!-- When shrinking the workspace, this is the percentage of its original size. -->
-    <integer name="config_workspaceShrinkPercent">17</integer>
+    <!-- Properties controlling the workspace fade-out during dragging -->
+    <integer name="config_dragFadeOutAlpha">80</integer>
+    <integer name="config_dragFadeOutDuration">250</integer>
 
     <!-- Folder max bounds and max number of items. Note: folder_max_count_x * folder_max_count_y
          >= folder_max_num_items. When these are set to -1, they are automatically determined. -->
     <integer name="folder_max_count_x">4</integer>
     <integer name="folder_max_count_y">4</integer>
     <integer name="folder_max_num_items">16</integer>
+
+    <integer name="cell_count_x">4</integer>
+    <integer name="cell_count_y">4</integer>
+    <integer name="hotseat_cell_count">5</integer>
+    <integer name="hotseat_all_apps_index">2</integer>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index fe0cb00..45e544a 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -37,6 +37,7 @@
     <dimen name="workspace_max_gap">16dp</dimen>
     <dimen name="folder_cell_width">74dp</dimen>
     <dimen name="folder_cell_height">82dp</dimen>
+    <dimen name="folder_icon_padding_top">2dp</dimen>
     <dimen name="workspace_divider_padding_left">3dp</dimen>
     <dimen name="workspace_divider_padding_right">3dp</dimen>
     <dimen name="workspace_divider_padding_top">0dp</dimen>
@@ -46,7 +47,10 @@
     <dimen name="hotseat_width_gap">-1dp</dimen>
     <dimen name="hotseat_height_gap">-1dp</dimen>
     <dimen name="workspace_overscroll_drawable_padding">0dp</dimen>
+    <dimen name="workspace_icon_text_size">12sp</dimen>
 
+    <dimen name="app_icon_drawable_padding">6dp</dimen>
+    <dimen name="app_icon_drawable_padding_land">2dp</dimen>
     <dimen name="app_icon_padding_top">8dp</dimen>
 
 <!-- QSB -->
@@ -64,13 +68,14 @@
     <dimen name="apps_customize_tab_bar_height">52dp</dimen>
     <dimen name="apps_customize_tab_bar_margin_top">0dp</dimen>
     <dimen name="app_icon_size">48dp</dimen>
+    <integer name="app_icon_scale_percent">-1</integer>
+    <integer name="app_icon_hotseat_scale_percent">-1</integer>
     <!-- The width can be 72dp because we don't have L/R padding -->
     <dimen name="apps_customize_cell_width">74dp</dimen>
     <dimen name="apps_customize_cell_height">82dp</dimen>
     <dimen name="apps_customize_max_gap">18dp</dimen>
     <dimen name="apps_customize_widget_cell_width_gap">10dp</dimen>
     <dimen name="apps_customize_widget_cell_height_gap">8dp</dimen>
-    <dimen name="title_texture_width">120px</dimen>
 
     <!-- height of the bottom row of controls -->
     <dimen name="button_bar_height">62dip</dimen>
@@ -82,21 +87,9 @@
     <dimen name="button_bar_width_right_padding">0dp</dimen>
     <dimen name="button_bar_height_plus_padding">70dp</dimen>
 
-    <!-- extra horizontal spacing between mini screen thumbnails ie. in all
-         apps and in customization mode -->
-    <dimen name="smallScreenExtraSpacing">0dip</dimen>
-
-    <!-- Vertical spacing between edge of screen and mini cell layouts when they
-         are minimized to the bottom in all apps -->
-    <dimen name="allAppsSmallScreenVerticalMarginLandscape">30dip</dimen>
-    <dimen name="allAppsSmallScreenVerticalMarginPortrait">60dip</dimen>
-
     <!-- Drag padding to add to the bottom of drop targets -->
     <dimen name="drop_target_drag_padding">14dp</dimen>
 
-    <!-- padding between the delete zone drawable and text -->
-    <dimen name="delete_zone_drawable_padding">8dip</dimen>
-
     <!-- roughly a status bar (for vertically centering the all apps
          home icon in landscape) -->
     <dimen name="status_bar_height">25dip</dimen>
@@ -109,7 +102,10 @@
     <!-- When dragging items on the workspace, the number of dps by which the position of
      the drag view should be offset from the position of the original view. -->
     <dimen name="dragViewOffsetX">0dp</dimen>
-    <dimen name="dragViewOffsetY">-8dp</dimen>
+    <dimen name="dragViewOffsetY">0dp</dimen>
+    <!--  When dragging an item, how much bigger (fixed dps) the dragged view
+          should be. If 0, it will not be scaled at all. -->
+    <dimen name="dragViewScale">12dp</dimen>
 
     <!-- Padding applied to AppWidgets -->
     <dimen name="app_widget_preview_padding_left">8dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 72a915d..f707c8c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -51,7 +51,7 @@
     <!-- External-drop widget error string.  This is the error that is shown
          when you drag and item into the homescreen and it is unable to fit,
          or an error is encountered. [CHAR_LIMIT=50] -->
-    <string name="external_drop_widget_error">Couldn\'t drop item onto this Home screen.</string>
+    <string name="external_drop_widget_error">Couldn\'t drop item on this Home screen.</string>
     <!-- External-drop widget pick title.  This is shown as the title of the
          dialog which allows you to pick which widgets to handle a particular
          drop if there are multiple choices. [CHAR_LIMIT=35] -->
@@ -82,7 +82,9 @@
     <!-- Options in "Add to Home" dialog box; Title of the group containing the list of apps that can set the wallpaper-->
     <string name="group_wallpapers">Wallpapers</string>
     <!-- Error message when user has filled a home screen, possibly not used -->
-    <string name="out_of_space">No more room on this Home screen.</string>
+    <string name="out_of_space">No more room on your Home screens.</string>
+    <!-- Error message when user has filled the hotseat -->
+    <string name="hotseat_out_of_space">No more room on the hotseat.</string>
     <!-- Error message when user tries to drop an invalid item on the hotseat -->
     <string name="invalid_hotseat_item">This widget is too large for the hotseat.</string>
     <!-- Message displayed when a shortcut is created by an external application -->
@@ -93,7 +95,7 @@
     <string name="shortcut_duplicate">Shortcut \"<xliff:g id="name" example="Browser">%s</xliff:g>\" already exists.</string>
 
     <!-- Title of dialog when user is selecting shortcut to add to homescreen -->
-    <string name="title_select_shortcut">Select shortcut</string>
+    <string name="title_select_shortcut">Choose shortcut</string>
     <!-- Title of dialog when user is selecting an application to add to homescreen -->
     <string name="title_select_application">Choose app</string>
 
@@ -176,17 +178,17 @@
     <!-- Permission short label -->
     <string name="permlab_uninstall_shortcut">uninstall shortcuts</string>
     <!-- Permission description -->
-    <string name="permdesc_uninstall_shortcut">Allows an app to remove
+    <string name="permdesc_uninstall_shortcut">Allows the app to remove
         shortcuts without user intervention.</string>
     <!-- Permission short label -->
     <string name="permlab_read_settings">read Home settings and shortcuts</string>
     <!-- Permission description -->
-    <string name="permdesc_read_settings">Allows an app to read the settings and
+    <string name="permdesc_read_settings">Allows the app to read the settings and
         shortcuts in Home.</string>
     <!-- Permission short label -->
     <string name="permlab_write_settings">write Home settings and shortcuts</string>
     <!-- Permission description -->
-    <string name="permdesc_write_settings">Allows an app to change the settings and
+    <string name="permdesc_write_settings">Allows the app to change the settings and
         shortcuts in Home.</string>
 
     <!-- Widgets: -->
@@ -239,16 +241,16 @@
 
     <!-- Folder accessibility -->
     <!-- The format string for when a folder is opened, speaks the dimensions -->
-    <string name="folder_opened">Folder opened, %1$d by %2$d</string>
+    <string name="folder_opened">Folder opened, <xliff:g id="width" example="5">%1$d</xliff:g> by <xliff:g id="height" example="3">%2$d</xliff:g></string>
     <!-- Instruction that clicking outside will close folder -->
-    <string name="folder_tap_to_close">Tap to close folder</string>
+    <string name="folder_tap_to_close">Touch to close folder</string>
     <!-- Instruction that clicking outside will commit folder rename -->
-    <string name="folder_tap_to_rename">Tap to commit rename</string>
+    <string name="folder_tap_to_rename">Touch to save rename</string>
     <!-- Indication that folder closed -->
     <string name="folder_closed">Folder closed</string>
     <!-- Folder renamed format -->
-    <string name="folder_renamed">Folder renamed to %1$s</string>
+    <string name="folder_renamed">Folder renamed to <xliff:g id="name" example="Games">%1$s</xliff:g></string>
     <!-- Folder name format -->
-    <string name="folder_name_format">Folder: %1$s</string>
+    <string name="folder_name_format">Folder: <xliff:g id="name" example="Games">%1$s</xliff:g></string>
 
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 909887c..6506f95 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -62,14 +62,14 @@
         <item name="android:gravity">center_horizontal</item>
         <item name="android:singleLine">true</item>
         <item name="android:ellipsize">marquee</item>
-        <item name="android:textSize">12sp</item>
-        <item name="android:textColor">#FFF</item>
+        <item name="android:textSize">@dimen/workspace_icon_text_size</item>
+        <item name="android:textColor">@color/workspace_icon_text_color</item>
         <item name="android:shadowRadius">2.0</item>
         <item name="android:shadowColor">#B0000000</item>
     </style>
 
     <style name="WorkspaceIcon.Portrait">
-        <item name="android:drawablePadding">8dp</item>
+        <item name="android:drawablePadding">@dimen/app_icon_drawable_padding</item>
         <item name="android:paddingLeft">4dp</item>
         <item name="android:paddingRight">4dp</item>
         <item name="android:paddingTop">@dimen/app_icon_padding_top</item>
@@ -77,7 +77,7 @@
     </style>
 
     <style name="WorkspaceIcon.Landscape">
-        <item name="android:drawablePadding">2dp</item>
+        <item name="android:drawablePadding">@dimen/app_icon_drawable_padding_land</item>
         <item name="android:paddingLeft">4dp</item>
         <item name="android:paddingRight">4dp</item>
         <item name="android:paddingTop">@dimen/app_icon_padding_top</item>
@@ -86,7 +86,7 @@
 
     <style name="WorkspaceIcon.Portrait.Folder">
         <item name="android:drawablePadding">0dp</item>
-        <item name="android:paddingTop">2dp</item>
+        <item name="android:paddingTop">@dimen/folder_icon_padding_top</item>
     </style>
     <style name="WorkspaceIcon.Landscape.Folder">
         <item name="android:drawablePadding">0dp</item>
diff --git a/res/xml-sw600dp/default_workspace.xml b/res/xml-sw600dp/default_workspace.xml
new file mode 100644
index 0000000..3afb3b7
--- /dev/null
+++ b/res/xml-sw600dp/default_workspace.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher">
+    <!-- Far-left screen [0] -->
+
+    <!-- Left screen [1] -->
+    <appwidget
+        launcher:packageName="com.android.settings"
+        launcher:className="com.android.settings.widget.SettingsAppWidgetProvider"
+        launcher:screen="1"
+        launcher:x="0"
+        launcher:y="3"
+        launcher:spanX="4"
+        launcher:spanY="1" />
+
+    <!-- Middle screen [2] -->
+    <appwidget
+        launcher:packageName="com.android.deskclock"
+        launcher:className="com.android.alarmclock.AnalogAppWidgetProvider"
+        launcher:screen="2"
+        launcher:x="1"
+        launcher:y="0"
+        launcher:spanX="2"
+        launcher:spanY="2" />
+    <favorite
+        launcher:packageName="com.android.camera"
+        launcher:className="com.android.camera.Camera"
+        launcher:screen="2"
+        launcher:x="0"
+        launcher:y="3" />
+
+    <!-- Right screen [3] -->
+    <favorite
+        launcher:packageName="com.android.gallery3d"
+        launcher:className="com.android.gallery3d.app.Gallery"
+        launcher:screen="3"
+        launcher:x="1"
+        launcher:y="3" />
+    <favorite
+        launcher:packageName="com.android.settings"
+        launcher:className="com.android.settings.Settings"
+        launcher:screen="3"
+        launcher:x="2"
+        launcher:y="3" />
+
+    <!-- Far-right screen [4] -->
+
+    <!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
+    <favorite
+        launcher:packageName="com.android.contacts"
+        launcher:className="com.android.contacts.activities.DialtactsActivity"
+        launcher:container="-101"
+        launcher:screen="1"
+        launcher:x="1"
+        launcher:y="0" />
+    <favorite
+        launcher:packageName="com.android.contacts"
+        launcher:className="com.android.contacts.activities.PeopleActivity"
+        launcher:container="-101"
+        launcher:screen="2"
+        launcher:x="2"
+        launcher:y="0" />
+    <favorite
+        launcher:packageName="com.android.mms"
+        launcher:className="com.android.mms.ui.ConversationList"
+        launcher:container="-101"
+        launcher:screen="4"
+        launcher:x="4"
+        launcher:y="0" />
+    <favorite
+        launcher:packageName="com.android.browser"
+        launcher:className="com.android.browser.BrowserActivity"
+        launcher:container="-101"
+        launcher:screen="5"
+        launcher:x="5"
+        launcher:y="0" />
+</favorites>
diff --git a/res/xml-sw720dp/default_workspace.xml b/res/xml-sw720dp/default_workspace.xml
new file mode 100644
index 0000000..6302d7e
--- /dev/null
+++ b/res/xml-sw720dp/default_workspace.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2009 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.
+-->
+
+<favorites xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher">
+    <!-- Far-left screen [0] -->
+
+    <!-- Left screen [1] -->
+    <appwidget
+        launcher:packageName="com.android.settings"
+        launcher:className="com.android.settings.widget.SettingsAppWidgetProvider"
+        launcher:screen="1"
+        launcher:x="0"
+        launcher:y="3"
+        launcher:spanX="4"
+        launcher:spanY="1" />
+
+    <!-- Middle screen [2] -->
+    <appwidget
+        launcher:packageName="com.android.deskclock"
+        launcher:className="com.android.alarmclock.AnalogAppWidgetProvider"
+        launcher:screen="2"
+        launcher:x="1"
+        launcher:y="0"
+        launcher:spanX="2"
+        launcher:spanY="2" />
+    <favorite
+        launcher:packageName="com.android.camera"
+        launcher:className="com.android.camera.Camera"
+        launcher:screen="2"
+        launcher:x="0"
+        launcher:y="3" />
+
+    <!-- Right screen [3] -->
+    <favorite
+        launcher:packageName="com.android.gallery3d"
+        launcher:className="com.android.gallery3d.app.Gallery"
+        launcher:screen="3"
+        launcher:x="1"
+        launcher:y="3" />
+    <favorite
+        launcher:packageName="com.android.settings"
+        launcher:className="com.android.settings.Settings"
+        launcher:screen="3"
+        launcher:x="2"
+        launcher:y="3" />
+
+    <!-- Far-right screen [4] -->
+</favorites>
diff --git a/src/com/android/launcher2/AppWidgetResizeFrame.java b/src/com/android/launcher2/AppWidgetResizeFrame.java
index 6d132eb..c01a882 100644
--- a/src/com/android/launcher2/AppWidgetResizeFrame.java
+++ b/src/com/android/launcher2/AppWidgetResizeFrame.java
@@ -80,7 +80,7 @@
         mWorkspace = (Workspace) dragLayer.findViewById(R.id.workspace);
 
         final AppWidgetProviderInfo info = widgetView.getAppWidgetInfo();
-        int[] result = mLauncher.getMinResizeSpanForWidget(info, null);
+        int[] result = mLauncher.getMinSpanForWidget(info, null);
         mMinHSpan = result[0];
         mMinVSpan = result[1];
 
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index 7f0edde..840ec45 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -19,6 +19,7 @@
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.animation.ValueAnimator;
+import android.appwidget.AppWidgetHostView;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProviderInfo;
 import android.content.ComponentName;
@@ -33,9 +34,10 @@
 import android.graphics.Bitmap.Config;
 import android.graphics.Canvas;
 import android.graphics.MaskFilter;
+import android.graphics.Matrix;
 import android.graphics.Paint;
-import android.graphics.PorterDuff;
 import android.graphics.Rect;
+import android.graphics.RectF;
 import android.graphics.TableMaskFilter;
 import android.graphics.drawable.Drawable;
 import android.os.AsyncTask;
@@ -75,8 +77,7 @@
  */
 class AsyncTaskPageData {
     enum Type {
-        LoadWidgetPreviewData,
-        LoadHolographicIconsData
+        LoadWidgetPreviewData
     }
 
     AsyncTaskPageData(int p, ArrayList<Object> l, ArrayList<Bitmap> si, AsyncTaskCallback bgR,
@@ -167,7 +168,9 @@
  * The Apps/Customize page that displays all the applications, widgets, and shortcuts.
  */
 public class AppsCustomizePagedView extends PagedViewWithDraggableItems implements
-        AllAppsView, View.OnClickListener, View.OnKeyListener, DragSource {
+        AllAppsView, View.OnClickListener, View.OnKeyListener, DragSource,
+        PagedViewIcon.PressedCallback, PagedViewWidget.ShortPressListener,
+        LauncherTransitionable {
     static final String LOG_TAG = "AppsCustomizePagedView";
 
     /**
@@ -186,6 +189,7 @@
 
     // Save and Restore
     private int mSaveInstanceStateItemIndex = -1;
+    private PagedViewIcon mPressedIcon;
 
     // Content
     private ArrayList<ApplicationInfo> mApps;
@@ -200,7 +204,6 @@
     private Canvas mCanvas;
     private Drawable mDefaultWidgetBackground;
     private IconCache mIconCache;
-    private int mDragViewMultiplyColor;
 
     // Dimens
     private int mContentWidth;
@@ -226,9 +229,23 @@
 
     // Previews & outlines
     ArrayList<AppsCustomizeAsyncTask> mRunningTasks;
-    private HolographicOutlineHelper mHolographicOutlineHelper;
     private static final int sPageSleepDelay = 200;
 
+    private Runnable mInflateWidgetRunnable = null;
+    private Runnable mBindWidgetRunnable = null;
+    static final int WIDGET_NO_CLEANUP_REQUIRED = -1;
+    static final int WIDGET_BOUND = 0;
+    static final int WIDGET_INFLATED = 1;
+    int mWidgetCleanupState = WIDGET_NO_CLEANUP_REQUIRED;
+    int mWidgetLoadingId = -1;
+    PendingAddWidgetInfo mCreateWidgetInfo = null;
+    private boolean mDraggingWidget = false;
+
+    // Deferral of loading widget previews during launcher transitions
+    private boolean mInTransition;
+    private ArrayList<AsyncTaskPageData> mDeferredSyncWidgetPageItems =
+        new ArrayList<AsyncTaskPageData>();
+
     public AppsCustomizePagedView(Context context, AttributeSet attrs) {
         super(context, attrs);
         mLayoutInflater = LayoutInflater.from(context);
@@ -236,7 +253,6 @@
         mApps = new ArrayList<ApplicationInfo>();
         mWidgets = new ArrayList<Object>();
         mIconCache = ((LauncherApplication) context.getApplicationContext()).getIconCache();
-        mHolographicOutlineHelper = new HolographicOutlineHelper();
         mCanvas = new Canvas();
         mRunningTasks = new ArrayList<AppsCustomizeAsyncTask>();
 
@@ -244,7 +260,6 @@
         Resources resources = context.getResources();
         mDefaultWidgetBackground = resources.getDrawable(R.drawable.default_widget_preview_holo);
         mAppIconSize = resources.getDimensionPixelSize(R.dimen.app_icon_size);
-        mDragViewMultiplyColor = resources.getColor(R.color.drag_view_multiply_color);
 
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AppsCustomizePagedView, 0, 0);
         mMaxAppCellCountX = a.getInt(R.styleable.AppsCustomizePagedView_maxAppCellCountX, -1);
@@ -495,12 +510,12 @@
         if (v instanceof PagedViewIcon) {
             // Animate some feedback to the click
             final ApplicationInfo appInfo = (ApplicationInfo) v.getTag();
-            animateClickFeedback(v, new Runnable() {
-                @Override
-                public void run() {
-                    mLauncher.startActivitySafely(appInfo.intent, appInfo);
-                }
-            });
+            mLauncher.startActivitySafely(appInfo.intent, appInfo);
+
+            // Lock the drawable state to pressed until we return to Launcher
+            if (mPressedIcon != null) {
+                mPressedIcon.lockDrawableState();
+            }
         } else if (v instanceof PagedViewWidget) {
             // Let the user know that they have to long press to add a widget
             Toast.makeText(getContext(), R.string.long_press_widget_to_add,
@@ -537,7 +552,72 @@
         mLauncher.getWorkspace().beginDragShared(v, this);
     }
 
+    private void loadWidgetInBackground(final PendingAddWidgetInfo info) {
+        final AppWidgetProviderInfo pInfo = info.info;
+        if (pInfo.configure != null) {
+            return;
+        }
+
+        mBindWidgetRunnable = new Runnable() {
+            @Override
+            public void run() {
+                mWidgetLoadingId = mLauncher.getAppWidgetHost().allocateAppWidgetId();
+                AppWidgetManager.getInstance(mLauncher).bindAppWidgetId(mWidgetLoadingId,
+                        info.componentName);
+                mWidgetCleanupState = WIDGET_BOUND;
+            }
+        };
+        post(mBindWidgetRunnable);
+
+        mInflateWidgetRunnable = new Runnable() {
+            @Override
+            public void run() {
+                AppWidgetHostView hostView =
+                        mLauncher.getAppWidgetHost().createView(mContext, mWidgetLoadingId, pInfo);
+                info.boundWidget = hostView;
+                mWidgetCleanupState = WIDGET_INFLATED;
+                hostView.setVisibility(INVISIBLE);
+                mLauncher.getDragLayer().addView(hostView);
+            }
+        };
+        post(mInflateWidgetRunnable);
+    }
+
+    @Override
+    public void onShortPress(View v) {
+        // We are anticipating a long press, and we use this time to load bind and instantiate
+        // the widget. This will need to be cleaned up if it turns out no long press occurs.
+        mCreateWidgetInfo = new PendingAddWidgetInfo((PendingAddWidgetInfo) v.getTag());
+        loadWidgetInBackground(mCreateWidgetInfo);
+    }
+
+    private void cleanupWidgetPreloading() {
+        PendingAddWidgetInfo info = mCreateWidgetInfo;
+        mCreateWidgetInfo = null;
+        if (mWidgetCleanupState >= 0 && mWidgetLoadingId != -1) {
+            mLauncher.getAppWidgetHost().deleteAppWidgetId(mWidgetLoadingId);
+        }
+        if (mWidgetCleanupState == WIDGET_BOUND) {
+            removeCallbacks(mInflateWidgetRunnable);
+        } else if (mWidgetCleanupState == WIDGET_INFLATED) {
+            AppWidgetHostView widget = info.boundWidget;
+            int widgetId = widget.getAppWidgetId();
+            mLauncher.getAppWidgetHost().deleteAppWidgetId(widgetId);
+            mLauncher.getDragLayer().removeView(widget);
+        }
+        mWidgetCleanupState = WIDGET_NO_CLEANUP_REQUIRED;
+        mWidgetLoadingId = -1;
+    }
+
+    @Override
+    public void cleanUpShortPress(View v) {
+        if (!mDraggingWidget) {
+            cleanupWidgetPreloading();
+        }
+    }
+
     private void beginDraggingWidget(View v) {
+        mDraggingWidget = true;
         // Get the widget preview as the drag representation
         ImageView image = (ImageView) v.findViewById(R.id.widget_preview);
         PendingAddItemInfo createItemInfo = (PendingAddItemInfo) v.getTag();
@@ -545,16 +625,37 @@
         // Compose the drag image
         Bitmap preview;
         Bitmap outline;
+        float scale = 1f;
         if (createItemInfo instanceof PendingAddWidgetInfo) {
-            PendingAddWidgetInfo createWidgetInfo = (PendingAddWidgetInfo) createItemInfo;
+            PendingAddWidgetInfo createWidgetInfo = mCreateWidgetInfo;
+            createItemInfo = createWidgetInfo;
             int[] spanXY = mLauncher.getSpanForWidget(createWidgetInfo, null);
+            int[] size = mLauncher.getWorkspace().estimateItemSize(spanXY[0],
+                    spanXY[1], createWidgetInfo, true);
             createItemInfo.spanX = spanXY[0];
             createItemInfo.spanY = spanXY[1];
+            int[] minSpanXY = mLauncher.getMinSpanForWidget(createWidgetInfo, null);
+            createWidgetInfo.minSpanX = minSpanXY[0];
+            createWidgetInfo.minSpanY = minSpanXY[1];
 
-            int[] maxSize = mLauncher.getWorkspace().estimateItemSize(spanXY[0], spanXY[1],
-                    createWidgetInfo, true);
+            FastBitmapDrawable previewDrawable = (FastBitmapDrawable) image.getDrawable();
+            float minScale = 1.25f;
+            int minWidth, minHeight;
+            minWidth = Math.max((int) (previewDrawable.getIntrinsicWidth() * minScale), size[0]);
+            minHeight = Math.max((int) (previewDrawable.getIntrinsicHeight() * minScale), size[1]);
             preview = getWidgetPreview(createWidgetInfo.componentName, createWidgetInfo.previewImage,
-                    createWidgetInfo.icon, spanXY[0], spanXY[1], maxSize[0], maxSize[1]);
+                    createWidgetInfo.icon, spanXY[0], spanXY[1], minWidth, minHeight);
+
+            // Determine the image view drawable scale relative to the preview
+            float[] mv = new float[9];
+            Matrix m = new Matrix();
+            m.setRectToRect(
+                    new RectF(0f, 0f, (float) preview.getWidth(), (float) preview.getHeight()),
+                    new RectF(0f, 0f, (float) previewDrawable.getIntrinsicWidth(),
+                            (float) previewDrawable.getIntrinsicHeight()),
+                    Matrix.ScaleToFit.START);
+            m.getValues(mv);
+            scale = (float) mv[0];
         } else {
             // Workaround for the fact that we don't keep the original ResolveInfo associated with
             // the shortcut around.  To get the icon, we just render the preview image (which has
@@ -581,51 +682,98 @@
         // Save the preview for the outline generation, then dim the preview
         outline = Bitmap.createScaledBitmap(preview, preview.getWidth(), preview.getHeight(),
                 false);
-        mCanvas.setBitmap(preview);
-        mCanvas.drawColor(mDragViewMultiplyColor, PorterDuff.Mode.MULTIPLY);
-        mCanvas.setBitmap(null);
 
         // Start the drag
         alphaClipPaint = null;
         mLauncher.lockScreenOrientationOnLargeUI();
         mLauncher.getWorkspace().onDragStartedWithItem(createItemInfo, outline, alphaClipPaint);
         mDragController.startDrag(image, preview, this, createItemInfo,
-                DragController.DRAG_ACTION_COPY, null);
+                DragController.DRAG_ACTION_COPY, null, scale);
         outline.recycle();
         preview.recycle();
     }
+
     @Override
-    protected boolean beginDragging(View v) {
-        // Dismiss the cling
-        mLauncher.dismissAllAppsCling(null);
-
+    protected boolean beginDragging(final View v) {
         if (!super.beginDragging(v)) return false;
 
-        // Go into spring loaded mode (must happen before we startDrag())
-        mLauncher.enterSpringLoadedDragMode();
-
         if (v instanceof PagedViewIcon) {
             beginDraggingApplication(v);
         } else if (v instanceof PagedViewWidget) {
             beginDraggingWidget(v);
         }
+
+        // We delay entering spring-loaded mode slightly to make sure the UI
+        // thready is free of any work.
+        postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                // We don't enter spring-loaded mode if the drag has been cancelled
+                if (mLauncher.getDragController().isDragging()) {
+                    // Dismiss the cling
+                    mLauncher.dismissAllAppsCling(null);
+
+                    // Reset the alpha on the dragged icon before we drag
+                    resetDrawableState();
+
+                    // Go into spring loaded mode (must happen before we startDrag())
+                    mLauncher.enterSpringLoadedDragMode();
+                }
+            }
+        }, 150);
+
         return true;
     }
-    private void endDragging(View target, boolean success) {
+
+    /**
+     * Clean up after dragging.
+     *
+     * @param target where the item was dragged to (can be null if the item was flung)
+     */
+    private void endDragging(View target, boolean isFlingToDelete, boolean success) {
         mLauncher.getWorkspace().onDragStopped(success);
-        if (!success || (target != mLauncher.getWorkspace() &&
+        if (isFlingToDelete || !success || (target != mLauncher.getWorkspace() &&
                 !(target instanceof DeleteDropTarget))) {
             // Exit spring loaded mode if we have not successfully dropped or have not handled the
             // drop in Workspace
             mLauncher.exitSpringLoadedDragMode();
         }
         mLauncher.unlockScreenOrientationOnLargeUI();
-
     }
 
     @Override
-    public void onDropCompleted(View target, DragObject d, boolean success) {
-        endDragging(target, success);
+    public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) {
+        mInTransition = true;
+        if (toWorkspace) {
+            cancelAllTasks();
+        }
+    }
+
+    @Override
+    public View getContent() {
+        return null;
+    }
+
+    @Override
+    public void onLauncherTransitionStep(Launcher l, float t) {
+    }
+
+    @Override
+    public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) {
+        mInTransition = false;
+        for (AsyncTaskPageData d : mDeferredSyncWidgetPageItems) {
+            onSyncWidgetPageItems(d);
+        }
+        mDeferredSyncWidgetPageItems.clear();
+    }
+
+    @Override
+    public void onDropCompleted(View target, DragObject d, boolean isFlingToDelete,
+            boolean success) {
+        // Return early and wait for onFlingToDeleteCompleted if this was the result of a fling
+        if (isFlingToDelete) return;
+
+        endDragging(target, false, success);
 
         // Display an error message if the drag failed due to there not being enough space on the
         // target layout we were dropping on.
@@ -643,9 +791,26 @@
                 }
             }
             if (showOutOfSpaceMessage) {
-                mLauncher.showOutOfSpaceMessage();
+                mLauncher.showOutOfSpaceMessage(false);
             }
+
+            d.deferDragViewCleanupPostAnimation = false;
+            cleanupWidgetPreloading();
         }
+        mDraggingWidget = false;
+    }
+
+    @Override
+    public void onFlingToDeleteCompleted() {
+        // We just dismiss the drag when we fling, so cleanup here
+        endDragging(null, true, true);
+        cleanupWidgetPreloading();
+        mDraggingWidget = false;
+    }
+
+    @Override
+    public boolean supportsFlingToDelete() {
+        return true;
     }
 
     @Override
@@ -673,6 +838,7 @@
             AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
             task.cancel(false);
             iter.remove();
+            mDirtyPageContent.set(task.page, true);
         }
     }
 
@@ -692,7 +858,7 @@
         Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
         while (iter.hasNext()) {
             AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
-            int pageIndex = task.page + mNumAppsPages;
+            int pageIndex = task.page;
             if ((mNextPage > mCurrentPage && pageIndex >= mCurrentPage) ||
                 (mNextPage < mCurrentPage && pageIndex <= mCurrentPage)) {
                 task.setThreadPriority(getThreadPriorityForPage(pageIndex));
@@ -759,7 +925,7 @@
             ApplicationInfo info = mApps.get(i);
             PagedViewIcon icon = (PagedViewIcon) mLayoutInflater.inflate(
                     R.layout.apps_customize_application, layout, false);
-            icon.applyFromApplicationInfo(info, true, mHolographicOutlineHelper);
+            icon.applyFromApplicationInfo(info, true, this);
             icon.setOnClickListener(this);
             icon.setOnLongClickListener(this);
             icon.setOnTouchListener(this);
@@ -775,12 +941,6 @@
         }
 
         layout.createHardwareLayers();
-
-        /* TEMPORARILY DISABLE HOLOGRAPHIC ICONS
-        if (mFadeInAdjacentScreens) {
-            prepareGenerateHoloOutlinesTask(page, items, images);
-        }
-        */
     }
 
     /**
@@ -800,7 +960,7 @@
         int minPageDiff = Integer.MAX_VALUE;
         while (iter.hasNext()) {
             AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
-            minPageDiff = Math.abs(task.page + mNumAppsPages - toPage);
+            minPageDiff = Math.abs(task.page - toPage);
         }
 
         int rawPageDiff = Math.abs(page - toPage);
@@ -835,7 +995,7 @@
         Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
         while (iter.hasNext()) {
             AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
-            int taskPage = task.page + mNumAppsPages;
+            int taskPage = task.page;
             if (taskPage < getAssociatedLowerPageBound(mCurrentPage) ||
                     taskPage > getAssociatedUpperPageBound(mCurrentPage)) {
                 task.cancel(false);
@@ -846,7 +1006,7 @@
         }
 
         // We introduce a slight delay to order the loading of side pages so that we don't thrash
-        final int sleepMs = getSleepForPage(page + mNumAppsPages);
+        final int sleepMs = getSleepForPage(page);
         AsyncTaskPageData pageData = new AsyncTaskPageData(page, widgets, cellWidth, cellHeight,
             new AsyncTaskCallback() {
                 @Override
@@ -866,96 +1026,20 @@
             new AsyncTaskCallback() {
                 @Override
                 public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) {
-                    try {
-                        mRunningTasks.remove(task);
-                        if (task.isCancelled()) return;
-                        onSyncWidgetPageItems(data);
-                    } finally {
-                        data.cleanup(task.isCancelled());
-                    }
+                    mRunningTasks.remove(task);
+                    if (task.isCancelled()) return;
+                    // do cleanup inside onSyncWidgetPageItems
+                    onSyncWidgetPageItems(data);
                 }
             });
 
         // Ensure that the task is appropriately prioritized and runs in parallel
         AppsCustomizeAsyncTask t = new AppsCustomizeAsyncTask(page,
                 AsyncTaskPageData.Type.LoadWidgetPreviewData);
-        t.setThreadPriority(getThreadPriorityForPage(page + mNumAppsPages));
+        t.setThreadPriority(getThreadPriorityForPage(page));
         t.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, pageData);
         mRunningTasks.add(t);
     }
-    /**
-     * Creates and executes a new AsyncTask to load the outlines for a page of content.
-     */
-    private void prepareGenerateHoloOutlinesTask(int page, ArrayList<Object> items,
-            ArrayList<Bitmap> images) {
-        // Prune old tasks for this page
-        Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
-        while (iter.hasNext()) {
-            AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
-            int taskPage = task.page;
-            if ((taskPage == page) &&
-                    (task.dataType == AsyncTaskPageData.Type.LoadHolographicIconsData)) {
-                task.cancel(false);
-                iter.remove();
-            }
-        }
-
-        AsyncTaskPageData pageData = new AsyncTaskPageData(page, items, images,
-            new AsyncTaskCallback() {
-                @Override
-                public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) {
-                    try {
-                        // Ensure that this task starts running at the correct priority
-                        task.syncThreadPriority();
-
-                        ArrayList<Bitmap> images = data.generatedImages;
-                        ArrayList<Bitmap> srcImages = data.sourceImages;
-                        int count = srcImages.size();
-                        Canvas c = new Canvas();
-                        for (int i = 0; i < count && !task.isCancelled(); ++i) {
-                            // Before work on each item, ensure that this task is running at the correct
-                            // priority
-                            task.syncThreadPriority();
-
-                            Bitmap b = srcImages.get(i);
-                            Bitmap outline = Bitmap.createBitmap(b.getWidth(), b.getHeight(),
-                                    Bitmap.Config.ARGB_8888);
-
-                            c.setBitmap(outline);
-                            c.save();
-                            c.drawBitmap(b, 0, 0, null);
-                            c.restore();
-                            c.setBitmap(null);
-
-                            images.add(outline);
-                        }
-                    } finally {
-                        if (task.isCancelled()) {
-                            data.cleanup(true);
-                        }
-                    }
-                }
-            },
-            new AsyncTaskCallback() {
-                @Override
-                public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) {
-                    try {
-                        mRunningTasks.remove(task);
-                        if (task.isCancelled()) return;
-                        onHolographicPageItemsLoaded(data);
-                    } finally {
-                        data.cleanup(task.isCancelled());
-                    }
-                }
-            });
-
-        // Ensure that the outline task always runs in the background, serially
-        AppsCustomizeAsyncTask t =
-            new AppsCustomizeAsyncTask(page, AsyncTaskPageData.Type.LoadHolographicIconsData);
-        t.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
-        t.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, pageData);
-        mRunningTasks.add(t);
-    }
 
     /*
      * Widgets PagedView implementation
@@ -985,9 +1069,6 @@
             d.setBounds(x, y, x + w, y + h);
             d.draw(c);
             d.setBounds(oldBounds); // Restore the bounds
-            if (multiplyColor != 0xFFFFFFFF) {
-                c.drawColor(mDragViewMultiplyColor, PorterDuff.Mode.MULTIPLY);
-            }
             c.setBitmap(null);
         }
     }
@@ -1025,11 +1106,9 @@
         if (widgetPreviewExists) {
             bitmapWidth = drawable.getIntrinsicWidth();
             bitmapHeight = drawable.getIntrinsicHeight();
-
-            // Cap the size so widget previews don't appear larger than the actual widget
-            maxWidth = Math.min(maxWidth, mWidgetSpacingLayout.estimateCellWidth(cellHSpan));
-            maxHeight = Math.min(maxHeight, mWidgetSpacingLayout.estimateCellHeight(cellVSpan));
         } else {
+            if (cellHSpan < 1) cellHSpan = 1;
+            if (cellVSpan < 1) cellVSpan = 1;
             // Determine the size of the bitmap for the preview image we will generate
             // TODO: This actually uses the apps customize cell layout params, where as we make want
             // the Workspace params for more accuracy.
@@ -1102,13 +1181,13 @@
                 - ((mWidgetCountY - 1) * mWidgetHeightGap)) / mWidgetCountY);
 
         // Prepare the set of widgets to load previews for in the background
-        int offset = page * numItemsPerPage;
+        int offset = (page - mNumAppsPages) * numItemsPerPage;
         for (int i = offset; i < Math.min(offset + numItemsPerPage, mWidgets.size()); ++i) {
             items.add(mWidgets.get(i));
         }
 
         // Prepopulate the pages with the other widget info, and fill in the previews later
-        final PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page + mNumAppsPages);
+        final PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page);
         layout.setColumnCount(layout.getCellCountX());
         for (int i = 0; i < items.size(); ++i) {
             Object rawInfo = items.get(i);
@@ -1120,9 +1199,9 @@
                 AppWidgetProviderInfo info = (AppWidgetProviderInfo) rawInfo;
                 createItemInfo = new PendingAddWidgetInfo(info, null, null);
                 int[] cellSpans = mLauncher.getSpanForWidget(info, null);
-                widget.applyFromAppWidgetProviderInfo(info, -1, cellSpans,
-                        mHolographicOutlineHelper);
+                widget.applyFromAppWidgetProviderInfo(info, -1, cellSpans);
                 widget.setTag(createItemInfo);
+                widget.setShortPressListener(this);
             } else if (rawInfo instanceof ResolveInfo) {
                 // Fill in the shortcuts information
                 ResolveInfo info = (ResolveInfo) rawInfo;
@@ -1130,7 +1209,7 @@
                 createItemInfo.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
                 createItemInfo.componentName = new ComponentName(info.activityInfo.packageName,
                         info.activityInfo.name);
-                widget.applyFromResolveInfo(mPackageManager, info, mHolographicOutlineHelper);
+                widget.applyFromResolveInfo(mPackageManager, info);
                 widget.setTag(createItemInfo);
             }
             widget.setOnClickListener(this);
@@ -1204,8 +1283,13 @@
             if (rawInfo instanceof AppWidgetProviderInfo) {
                 AppWidgetProviderInfo info = (AppWidgetProviderInfo) rawInfo;
                 int[] cellSpans = mLauncher.getSpanForWidget(info, null);
+
+                int maxWidth = Math.min(data.maxImageWidth,
+                        mWidgetSpacingLayout.estimateCellWidth(cellSpans[0]));
+                int maxHeight = Math.min(data.maxImageHeight,
+                        mWidgetSpacingLayout.estimateCellHeight(cellSpans[1]));
                 Bitmap b = getWidgetPreview(info.provider, info.previewImage, info.icon,
-                        cellSpans[0], cellSpans[1], data.maxImageWidth, data.maxImageHeight);
+                        cellSpans[0], cellSpans[1], maxWidth, maxHeight);
                 images.add(b);
             } else if (rawInfo instanceof ResolveInfo) {
                 // Fill in the shortcuts information
@@ -1214,58 +1298,38 @@
             }
         }
     }
+
     private void onSyncWidgetPageItems(AsyncTaskPageData data) {
-        int page = data.page;
-        PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page + mNumAppsPages);
-
-        ArrayList<Object> items = data.items;
-        int count = items.size();
-        for (int i = 0; i < count; ++i) {
-            PagedViewWidget widget = (PagedViewWidget) layout.getChildAt(i);
-            if (widget != null) {
-                Bitmap preview = data.generatedImages.get(i);
-                widget.applyPreview(new FastBitmapDrawable(preview), i);
-            }
+        if (mInTransition) {
+            mDeferredSyncWidgetPageItems.add(data);
+            return;
         }
+        try {
+            int page = data.page;
+            PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page);
 
-        layout.createHardwareLayer();
-        invalidate();
-
-        /* TEMPORARILY DISABLE HOLOGRAPHIC ICONS
-        if (mFadeInAdjacentScreens) {
-            prepareGenerateHoloOutlinesTask(data.page, data.items, data.generatedImages);
-        }
-        */
-
-        // Update all thread priorities
-        Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
-        while (iter.hasNext()) {
-            AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
-            int pageIndex = task.page + mNumAppsPages;
-            task.setThreadPriority(getThreadPriorityForPage(pageIndex));
-        }
-    }
-    private void onHolographicPageItemsLoaded(AsyncTaskPageData data) {
-        // Invalidate early to short-circuit children invalidates
-        invalidate();
-
-        int page = data.page;
-        ViewGroup layout = (ViewGroup) getPageAt(page);
-        if (layout instanceof PagedViewCellLayout) {
-            PagedViewCellLayout cl = (PagedViewCellLayout) layout;
-            int count = cl.getPageChildCount();
-            if (count != data.generatedImages.size()) return;
+            ArrayList<Object> items = data.items;
+            int count = items.size();
             for (int i = 0; i < count; ++i) {
-                PagedViewIcon icon = (PagedViewIcon) cl.getChildOnPageAt(i);
-                icon.setHolographicOutline(data.generatedImages.get(i));
+                PagedViewWidget widget = (PagedViewWidget) layout.getChildAt(i);
+                if (widget != null) {
+                    Bitmap preview = data.generatedImages.get(i);
+                    widget.applyPreview(new FastBitmapDrawable(preview), i);
+                }
             }
-        } else {
-            int count = layout.getChildCount();
-            if (count != data.generatedImages.size()) return;
-            for (int i = 0; i < count; ++i) {
-                View v = layout.getChildAt(i);
-                ((PagedViewWidget) v).setHolographicOutline(data.generatedImages.get(i));
+
+            layout.createHardwareLayer();
+            invalidate();
+
+            // Update all thread priorities
+            Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator();
+            while (iter.hasNext()) {
+                AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next();
+                int pageIndex = task.page;
+                task.setThreadPriority(getThreadPriorityForPage(pageIndex));
             }
+        } finally {
+            data.cleanup(false);
         }
     }
 
@@ -1279,7 +1343,7 @@
             PagedViewGridLayout layout = new PagedViewGridLayout(context, mWidgetCountX,
                     mWidgetCountY);
             setupPage(layout);
-            addView(layout, new PagedViewGridLayout.LayoutParams(LayoutParams.MATCH_PARENT,
+            addView(layout, new PagedView.LayoutParams(LayoutParams.MATCH_PARENT,
                     LayoutParams.MATCH_PARENT));
         }
 
@@ -1295,14 +1359,14 @@
         if (page < mNumAppsPages) {
             syncAppsPageItems(page, immediate);
         } else {
-            syncWidgetPageItems(page - mNumAppsPages, immediate);
+            syncWidgetPageItems(page, immediate);
         }
     }
 
     // We want our pages to be z-ordered such that the further a page is to the left, the higher
     // it is in the z-order. This is important to insure touch events are handled correctly.
     View getPageAt(int index) {
-        return getChildAt(getChildCount() - index - 1);
+        return getChildAt(indexToPage(index));
     }
 
     @Override
@@ -1490,6 +1554,9 @@
 
     @Override
     public void reset() {
+        // If we have reset, then we should not continue to restore the previous state
+        mSaveInstanceStateItemIndex = -1;
+
         AppsCustomizeTabHost tabHost = getTabHost();
         String tag = tabHost.getCurrentTabTag();
         if (tag != null) {
@@ -1497,6 +1564,7 @@
                 tabHost.setCurrentTabFromContent(ContentType.Applications);
             }
         }
+
         if (mCurrentPage != 0) {
             invalidatePageData(0);
         }
@@ -1540,6 +1608,22 @@
         cancelAllTasks();
     }
 
+    @Override
+    public void iconPressed(PagedViewIcon icon) {
+        // Reset the previously pressed icon and store a reference to the pressed icon so that
+        // we can reset it on return to Launcher (in Launcher.onResume())
+        if (mPressedIcon != null) {
+            mPressedIcon.resetDrawableState();
+        }
+        mPressedIcon = icon;
+    }
+
+    public void resetDrawableState() {
+        if (mPressedIcon != null) {
+            mPressedIcon.resetDrawableState();
+            mPressedIcon = null;
+        }
+    }
 
     /*
      * We load an extra page on each side to prevent flashes from scrolling and loading of the
diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java
index 2963240..0199d01 100644
--- a/src/com/android/launcher2/AppsCustomizeTabHost.java
+++ b/src/com/android/launcher2/AppsCustomizeTabHost.java
@@ -53,12 +53,19 @@
     private LinearLayout mContent;
 
     private boolean mInTransition;
+    private boolean mTransitioningToWorkspace;
     private boolean mResetAfterTransition;
-    private Animator mLauncherTransition;
+    private Runnable mRelayoutAndMakeVisible;
 
     public AppsCustomizeTabHost(Context context, AttributeSet attrs) {
         super(context, attrs);
         mLayoutInflater = LayoutInflater.from(context);
+        mRelayoutAndMakeVisible = new Runnable() {
+                public void run() {
+                    mTabs.requestLayout();
+                    mTabsContainer.setAlpha(1f);
+                }
+            };
     }
 
     /**
@@ -144,19 +151,29 @@
             if (contentWidth > 0 && mTabs.getLayoutParams().width != contentWidth) {
                 // Set the width and show the tab bar
                 mTabs.getLayoutParams().width = contentWidth;
-                post(new Runnable() {
-                    public void run() {
-                        mTabs.requestLayout();
-                        mTabsContainer.setAlpha(1f);
-                    }
-                });
+                post(mRelayoutAndMakeVisible);
             }
         }
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
     }
 
+     public boolean onInterceptTouchEvent(MotionEvent ev) {
+         // If we are mid transition then intercept touch events here so we can ignore them
+         if (mInTransition) {
+             return true;
+         }
+         return super.onInterceptTouchEvent(ev);
+     };
+
     @Override
     public boolean onTouchEvent(MotionEvent event) {
+        // Allow touch events to fall through if we are transitioning to the workspace
+        if (mInTransition) {
+            if (mTransitioningToWorkspace) {
+                return super.onTouchEvent(event);
+            }
+        }
+
         // Intercept all touch events up to the bottom of the AppsCustomizePane so they do not fall
         // through to the workspace and trigger showWorkspace()
         if (event.getY() < mAppsCustomizePane.getBottom()) {
@@ -238,8 +255,8 @@
                     PagedViewWidget.setDeletePreviewsWhenDetachedFromWindow(true);
                     mAnimationBuffer.setAlpha(1f);
                     mAnimationBuffer.setVisibility(View.VISIBLE);
-                    LayoutParams p = new FrameLayout.LayoutParams(child.getWidth(),
-                            child.getHeight());
+                    LayoutParams p = new FrameLayout.LayoutParams(child.getMeasuredWidth(),
+                            child.getMeasuredHeight());
                     p.setMargins((int) child.getLeft(), (int) child.getTop(), 0, 0);
                     mAnimationBuffer.addView(child, p);
                 }
@@ -338,61 +355,72 @@
             // force building the layer, so you don't get a blip early in an animation
             // when the layer is created layer
             buildLayer();
+
+            // Let the GC system know that now is a good time to do any garbage
+            // collection; makes it less likely we'll get a GC during the all apps
+            // to workspace animation
+            System.gc();
         }
     }
 
-    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-        super.onLayout(changed, left, top, right, bottom);
-        if (mLauncherTransition != null) {
-            enableAndBuildHardwareLayer();
-            mLauncherTransition.start();
-            mLauncherTransition = null;
-        }
+    @Override
+    public View getContent() {
+        return mContent;
     }
 
     /* LauncherTransitionable overrides */
     @Override
-    public boolean onLauncherTransitionStart(Launcher l, Animator animation, boolean toWorkspace) {
+    public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) {
+        mAppsCustomizePane.onLauncherTransitionStart(l, animated, toWorkspace);
         mInTransition = true;
-        boolean delayLauncherTransitionUntilLayout = false;
-        boolean animated = (animation != null);
-        mLauncherTransition = null;
+        mTransitioningToWorkspace = toWorkspace;
 
-        // if the content wasn't visible before, delay the launcher animation until after a call
-        // to layout -- this prevents a blip
-        if (animated && mContent.getVisibility() == GONE) {
-            mLauncherTransition = animation;
-            delayLauncherTransitionUntilLayout = true;
-        }
-        mContent.setVisibility(VISIBLE);
+        if (toWorkspace) {
+            // Going from All Apps -> Workspace
+            setVisibilityOfSiblingsWithLowerZOrder(VISIBLE);
+            // Stop the scrolling indicator - we don't want All Apps to be invalidating itself
+            // during the transition, especially since it has a hardware layer set on it
+            mAppsCustomizePane.cancelScrollingIndicatorAnimations();
+        } else {
+            // Going from Workspace -> All Apps
+            mContent.setVisibility(VISIBLE);
 
-        if (!toWorkspace) {
             // Make sure the current page is loaded (we start loading the side pages after the
             // transition to prevent slowing down the animation)
             mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage(), true);
-        }
-        if (animated && !delayLauncherTransitionUntilLayout) {
-            enableAndBuildHardwareLayer();
+
+            if (!LauncherApplication.isScreenLarge()) {
+                mAppsCustomizePane.showScrollingIndicator(true);
+            }
         }
 
-        if (!toWorkspace && !LauncherApplication.isScreenLarge()) {
-            mAppsCustomizePane.showScrollingIndicator(false);
-        }
         if (mResetAfterTransition) {
             mAppsCustomizePane.reset();
             mResetAfterTransition = false;
         }
-        return delayLauncherTransitionUntilLayout;
+
+        if (animated) {
+            enableAndBuildHardwareLayer();
+        }
     }
 
     @Override
-    public void onLauncherTransitionEnd(Launcher l, Animator animation, boolean toWorkspace) {
+    public void onLauncherTransitionStep(Launcher l, float t) {
+        // Do nothing
+    }
+
+    @Override
+    public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) {
+        mAppsCustomizePane.onLauncherTransitionEnd(l, animated, toWorkspace);
         mInTransition = false;
-        if (animation != null) {
+        if (animated) {
             setLayerType(LAYER_TYPE_NONE, null);
         }
 
         if (!toWorkspace) {
+            // Going from Workspace -> All Apps
+            setVisibilityOfSiblingsWithLowerZOrder(INVISIBLE);
+
             // Dismiss the workspace cling and show the all apps cling (if not already shown)
             l.dismissWorkspaceCling(null);
             mAppsCustomizePane.showAllAppsCling();
@@ -406,7 +434,27 @@
         }
     }
 
-    public void onResume() {
+    private void setVisibilityOfSiblingsWithLowerZOrder(int visibility) {
+        ViewGroup parent = (ViewGroup) getParent();
+        final int count = parent.getChildCount();
+        if (!isChildrenDrawingOrderEnabled()) {
+            for (int i = 0; i < count; i++) {
+                final View child = parent.getChildAt(i);
+                if (child == this) {
+                    break;
+                } else {
+                    if (child.getVisibility() == GONE) {
+                        continue;
+                    }
+                    child.setVisibility(visibility);
+                }
+            }
+        } else {
+            throw new RuntimeException("Failed; can't get z-order of views");
+        }
+    }
+
+    public void onWindowVisible() {
         if (getVisibility() == VISIBLE) {
             mContent.setVisibility(VISIBLE);
             // We unload the widget previews when the UI is hidden, so need to reload pages
diff --git a/src/com/android/launcher2/BubbleTextView.java b/src/com/android/launcher2/BubbleTextView.java
index dc498a4..a775ed5 100644
--- a/src/com/android/launcher2/BubbleTextView.java
+++ b/src/com/android/launcher2/BubbleTextView.java
@@ -47,8 +47,6 @@
     static final float PADDING_H = 8.0f;
     static final float PADDING_V = 3.0f;
 
-    private Paint mPaint;
-    private float mBubbleColorAlpha;
     private int mPrevAlpha = -1;
 
     private final HolographicOutlineHelper mOutlineHelper = new HolographicOutlineHelper();
@@ -65,6 +63,7 @@
     private Drawable mBackground;
 
     private boolean mStayPressed;
+    private CheckLongPressHelper mLongPressHelper;
 
     public BubbleTextView(Context context) {
         super(context);
@@ -82,13 +81,11 @@
     }
 
     private void init() {
+        mLongPressHelper = new CheckLongPressHelper(this);
         mBackground = getBackground();
 
         final Resources res = getContext().getResources();
         int bubbleColor = res.getColor(R.color.bubble_dark_background);
-        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
-        mPaint.setColor(bubbleColor);
-        mBubbleColorAlpha = Color.alpha(bubbleColor) / 255.0f;
         mFocusedOutlineColor = mFocusedGlowColor = mPressedOutlineColor = mPressedGlowColor =
             res.getColor(android.R.color.holo_blue_light);
 
@@ -134,7 +131,7 @@
                 mPressedOrFocusedBackground = null;
             }
             if (isFocused()) {
-                if (mLayout == null) {
+                if (getLayout() == null) {
                     // In some cases, we get focus before we have been layed out. Set the
                     // background to null so that it will get created when the view is drawn.
                     mPressedOrFocusedBackground = null;
@@ -176,6 +173,8 @@
         // The translate of scrollX and scrollY is necessary when drawing TextViews, because
         // they set scrollX and scrollY to large values to achieve centered text
         destCanvas.save();
+        destCanvas.scale(getScaleX(), getScaleY(),
+                (getWidth() + padding) / 2, (getHeight() + padding) / 2);
         destCanvas.translate(-getScrollX() + padding / 2, -getScrollY() + padding / 2);
         destCanvas.clipRect(clipRect, Op.REPLACE);
         draw(destCanvas);
@@ -222,6 +221,8 @@
                 } else {
                     mDidInvalidateForPressedState = false;
                 }
+
+                mLongPressHelper.postCheckForLongPress();
                 break;
             case MotionEvent.ACTION_CANCEL:
             case MotionEvent.ACTION_UP:
@@ -230,6 +231,8 @@
                 if (!isPressed()) {
                     mPressedOrFocusedBackground = null;
                 }
+
+                mLongPressHelper.cancelLongPress();
                 break;
         }
         return result;
@@ -244,8 +247,8 @@
     }
 
     void setCellLayoutPressedOrFocusedIcon() {
-        if (getParent() instanceof CellLayoutChildren) {
-            CellLayoutChildren parent = (CellLayoutChildren) getParent();
+        if (getParent() instanceof ShortcutAndWidgetContainer) {
+            ShortcutAndWidgetContainer parent = (ShortcutAndWidgetContainer) getParent();
             if (parent != null) {
                 CellLayout layout = (CellLayout) parent.getParent();
                 layout.setPressedOrFocusedIcon((mPressedOrFocusedBackground != null) ? this : null);
@@ -286,6 +289,14 @@
                 canvas.translate(-scrollX, -scrollY);
             }
         }
+
+        // If text is transparent, don't draw any shadow
+        if (getCurrentTextColor() == getResources().getColor(android.R.color.transparent)) {
+            getPaint().clearShadowLayer();
+            super.draw(canvas);
+            return;
+        }
+
         // We enhance the shadow by drawing the shadow twice
         getPaint().setShadowLayer(SHADOW_LARGE_RADIUS, 0.0f, SHADOW_Y_OFFSET, SHADOW_LARGE_COLOUR);
         super.draw(canvas);
@@ -313,9 +324,15 @@
     protected boolean onSetAlpha(int alpha) {
         if (mPrevAlpha != alpha) {
             mPrevAlpha = alpha;
-            mPaint.setAlpha((int) (alpha * mBubbleColorAlpha));
             super.onSetAlpha(alpha);
         }
         return true;
     }
+
+    @Override
+    public void cancelLongPress() {
+        super.cancelLongPress();
+
+        mLongPressHelper.cancelLongPress();
+    }
 }
diff --git a/src/com/android/launcher2/ButtonDropTarget.java b/src/com/android/launcher2/ButtonDropTarget.java
index 4ff7c96..e9f8ce8 100644
--- a/src/com/android/launcher2/ButtonDropTarget.java
+++ b/src/com/android/launcher2/ButtonDropTarget.java
@@ -18,7 +18,8 @@
 
 import android.content.Context;
 import android.content.res.Resources;
-import android.graphics.Paint;
+import android.graphics.PointF;
+import android.graphics.Rect;
 import android.util.AttributeSet;
 import android.widget.TextView;
 
@@ -41,7 +42,7 @@
     protected boolean mActive;
 
     /** The paint applied to the drag view on hover */
-    protected final Paint mHoverPaint = new Paint();
+    protected int mHoverColor = 0;
 
     public ButtonDropTarget(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
@@ -70,8 +71,12 @@
     public void onDrop(DragObject d) {
     }
 
+    public void onFlingToDelete(DragObject d, int x, int y, PointF vec) {
+        // Do nothing
+    }
+
     public void onDragEnter(DragObject d) {
-        d.dragView.setPaint(mHoverPaint);
+        d.dragView.setColor(mHoverColor);
     }
 
     public void onDragOver(DragObject d) {
@@ -79,7 +84,7 @@
     }
 
     public void onDragExit(DragObject d) {
-        d.dragView.setPaint(null);
+        d.dragView.setColor(0);
     }
 
     public void onDragStart(DragSource source, Object info, int dragAction) {
@@ -100,6 +105,26 @@
         outRect.bottom += mBottomDragPadding;
     }
 
+    Rect getIconRect(int itemWidth, int itemHeight, int drawableWidth, int drawableHeight) {
+        DragLayer dragLayer = mLauncher.getDragLayer();
+
+        // Find the rect to animate to (the view is center aligned)
+        Rect to = new Rect();
+        dragLayer.getViewRectRelativeToSelf(this, to);
+        int width = drawableWidth;
+        int height = drawableHeight;
+        int left = to.left + getPaddingLeft();
+        int top = to.top + (getMeasuredHeight() - height) / 2;
+        to.set(left, top, left + width, top + height);
+
+        // Center the destination rect about the trash icon
+        int xOffset = (int) -(itemWidth - width) / 2;
+        int yOffset = (int) -(itemHeight - height) / 2;
+        to.offset(xOffset, yOffset);
+
+        return to;
+    }
+
     @Override
     public DropTarget getDropTargetDelegate(DragObject d) {
         return null;
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index 8aae809..199c41a 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -18,8 +18,6 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.animation.PropertyValuesHolder;
 import android.animation.TimeInterpolator;
 import android.animation.ValueAnimator;
 import android.animation.ValueAnimator.AnimatorUpdateListener;
@@ -28,13 +26,14 @@
 import android.content.res.TypedArray;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.Color;
 import android.graphics.Paint;
 import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffXfermode;
 import android.graphics.Rect;
-import android.graphics.RectF;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.NinePatchDrawable;
 import android.util.AttributeSet;
@@ -53,10 +52,12 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.Stack;
 
 public class CellLayout extends ViewGroup {
     static final String TAG = "CellLayout";
 
+    private Launcher mLauncher;
     private int mOriginalCellWidth;
     private int mOriginalCellHeight;
     private int mCellWidth;
@@ -83,6 +84,7 @@
     int[] mTempLocation = new int[2];
 
     boolean[][] mOccupied;
+    boolean[][] mTmpOccupied;
     private boolean mLastDownOnOccupiedCell = false;
 
     private OnTouchListener mInterceptTouchListener;
@@ -109,7 +111,7 @@
 
     // These arrays are used to implement the drag visualization on x-large screens.
     // They are used as circular arrays, indexed by mDragOutlineCurrent.
-    private Point[] mDragOutlines = new Point[4];
+    private Rect[] mDragOutlines = new Rect[4];
     private float[] mDragOutlineAlphas = new float[mDragOutlines.length];
     private InterruptibleInOutAnimator[] mDragOutlineAnims =
             new InterruptibleInOutAnimator[mDragOutlines.length];
@@ -124,8 +126,12 @@
     private InterruptibleInOutAnimator mCrosshairsAnimator = null;
     private float mCrosshairsVisibility = 0.0f;
 
-    private HashMap<CellLayout.LayoutParams, ObjectAnimator> mReorderAnimators = new
-            HashMap<CellLayout.LayoutParams, ObjectAnimator>();
+    private HashMap<CellLayout.LayoutParams, Animator> mReorderAnimators = new
+            HashMap<CellLayout.LayoutParams, Animator>();
+    private HashMap<View, ReorderHintAnimation>
+            mShakeAnimators = new HashMap<View, ReorderHintAnimation>();
+
+    private boolean mItemPlacementDirty = false;
 
     // When a drag operation is in progress, holds the nearest cell to the touch point
     private final int[] mDragCell = new int[2];
@@ -133,7 +139,28 @@
     private boolean mDragging = false;
 
     private TimeInterpolator mEaseOutInterpolator;
-    private CellLayoutChildren mChildren;
+    private ShortcutAndWidgetContainer mShortcutsAndWidgets;
+
+    private boolean mIsHotseat = false;
+    private float mChildScale = 1f;
+    private float mHotseatChildScale = 1f;
+
+    public static final int MODE_DRAG_OVER = 0;
+    public static final int MODE_ON_DROP = 1;
+    public static final int MODE_ON_DROP_EXTERNAL = 2;
+    public static final int MODE_ACCEPT_DROP = 3;
+    private static final boolean DESTRUCTIVE_REORDER = false;
+    private static final boolean DEBUG_VISUALIZE_OCCUPIED = false;
+
+    private static final float REORDER_HINT_MAGNITUDE = 0.27f;
+    private static final int REORDER_ANIMATION_DURATION = 150;
+    private float mReorderHintAnimationMagnitude;
+
+    private ArrayList<View> mIntersectingViews = new ArrayList<View>();
+    private Rect mOccupiedRect = new Rect();
+    private int[] mDirectionVector = new int[2];
+    int[] mPreviousReorderDirection = new int[2];
+    private static final int INVALID_DIRECTION = -100;
 
     public CellLayout(Context context) {
         this(context, null);
@@ -149,6 +176,7 @@
         // A ViewGroup usually does not draw, but CellLayout needs to draw a rectangle to show
         // the user where a dragged item will land when dropped.
         setWillNotDraw(false);
+        mLauncher = (Launcher) context;
 
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CellLayout, defStyle, 0);
 
@@ -162,6 +190,9 @@
         mCountX = LauncherModel.getCellCountX();
         mCountY = LauncherModel.getCellCountY();
         mOccupied = new boolean[mCountX][mCountY];
+        mTmpOccupied = new boolean[mCountX][mCountY];
+        mPreviousReorderDirection[0] = INVALID_DIRECTION;
+        mPreviousReorderDirection[1] = INVALID_DIRECTION;
 
         a.recycle();
 
@@ -177,9 +208,21 @@
         mForegroundPadding =
                 res.getDimensionPixelSize(R.dimen.workspace_overscroll_drawable_padding);
 
+        mReorderHintAnimationMagnitude = (REORDER_HINT_MAGNITUDE *
+                res.getDimensionPixelSize(R.dimen.app_icon_size));
+
         mNormalBackground.setFilterBitmap(true);
         mActiveGlowBackground.setFilterBitmap(true);
 
+        int iconScale = res.getInteger(R.integer.app_icon_scale_percent);
+        if (iconScale >= 0) {
+            mChildScale = iconScale / 100f;
+        }
+        int hotseatIconScale = res.getInteger(R.integer.app_icon_hotseat_scale_percent);
+        if (hotseatIconScale >= 0) {
+            mHotseatChildScale = hotseatIconScale / 100f;
+        }
+
         // Initialize the data structures used for the drag visualization.
 
         mCrosshairsDrawable = res.getDrawable(R.drawable.gardening_crosshairs);
@@ -198,7 +241,7 @@
 
         mDragCell[0] = mDragCell[1] = -1;
         for (int i = 0; i < mDragOutlines.length; i++) {
-            mDragOutlines[i] = new Point(-1, -1);
+            mDragOutlines[i] = new Rect(-1, -1, -1, -1);
         }
 
         // When dragging things around the home screens, we show a green outline of
@@ -232,10 +275,7 @@
                         animation.cancel();
                     } else {
                         mDragOutlineAlphas[thisIndex] = (Float) animation.getAnimatedValue();
-                        final int left = mDragOutlines[thisIndex].x;
-                        final int top = mDragOutlines[thisIndex].y;
-                        CellLayout.this.invalidate(left, top,
-                                left + outline.getWidth(), top + outline.getHeight());
+                        CellLayout.this.invalidate(mDragOutlines[thisIndex]);
                     }
                 }
             });
@@ -255,9 +295,9 @@
         mBackgroundRect = new Rect();
         mForegroundRect = new Rect();
 
-        mChildren = new CellLayoutChildren(context);
-        mChildren.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap);
-        addView(mChildren);
+        mShortcutsAndWidgets = new ShortcutAndWidgetContainer(context);
+        mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap);
+        addView(mShortcutsAndWidgets);
     }
 
     static int widthInPortrait(Resources r, int numCells) {
@@ -283,13 +323,15 @@
     }
 
     public void enableHardwareLayers() {
-        mChildren.enableHardwareLayers();
+        mShortcutsAndWidgets.enableHardwareLayers();
     }
 
     public void setGridSize(int x, int y) {
         mCountX = x;
         mCountY = y;
         mOccupied = new boolean[mCountX][mCountY];
+        mTmpOccupied = new boolean[mCountX][mCountY];
+        mTempRectStack.clear();
         requestLayout();
     }
 
@@ -326,13 +368,6 @@
         }
     }
 
-    public CellLayoutChildren getChildrenLayout() {
-        if (getChildCount() > 0) {
-            return (CellLayoutChildren) getChildAt(0);
-        }
-        return null;
-    }
-
     void setIsDragOverlapping(boolean isDragOverlapping) {
         if (mIsDragOverlapping != isDragOverlapping) {
             mIsDragOverlapping = isDragOverlapping;
@@ -419,10 +454,10 @@
         for (int i = 0; i < mDragOutlines.length; i++) {
             final float alpha = mDragOutlineAlphas[i];
             if (alpha > 0) {
-                final Point p = mDragOutlines[i];
+                final Rect r = mDragOutlines[i];
                 final Bitmap b = (Bitmap) mDragOutlineAnims[i].getTag();
                 paint.setAlpha((int)(alpha + .5f));
-                canvas.drawBitmap(b, p.x, p.y, paint);
+                canvas.drawBitmap(b, null, r, paint);
             }
         }
 
@@ -439,6 +474,23 @@
             }
         }
 
+        if (DEBUG_VISUALIZE_OCCUPIED) {
+            int[] pt = new int[2];
+            ColorDrawable cd = new ColorDrawable(Color.RED);
+            cd.setBounds(0, 0, 80, 80);
+            for (int i = 0; i < mCountX; i++) {
+                for (int j = 0; j < mCountY; j++) {
+                    if (mOccupied[i][j]) {
+                        cellToPoint(i, j, pt);
+                        canvas.save();
+                        canvas.translate(pt[0], pt[1]);
+                        cd.draw(canvas);
+                        canvas.restore();
+                    }
+                }
+            }
+        }
+
         // The folder outer / inner ring image(s)
         for (int i = 0; i < mFolderOuterRings.size(); i++) {
             FolderRingAnimator fra = mFolderOuterRings.get(i);
@@ -554,10 +606,63 @@
         return mCountY;
     }
 
+    public void setIsHotseat(boolean isHotseat) {
+        mIsHotseat = isHotseat;
+    }
+
+    public float getChildrenScale() {
+        return mIsHotseat ? mHotseatChildScale : mChildScale;
+    }
+
     public boolean addViewToCellLayout(
             View child, int index, int childId, LayoutParams params, boolean markCells) {
+        return addViewToCellLayout(child, index, childId, params, markCells, false);
+    }
+
+    private void scaleChild(BubbleTextView bubbleChild, float pivot, float scale) {
+        // If we haven't measured the child yet, do it now
+        // (this happens if we're being dropped from all-apps
+        if (bubbleChild.getLayoutParams() instanceof LayoutParams &&
+                (bubbleChild.getMeasuredWidth() | bubbleChild.getMeasuredHeight()) == 0) {
+            getShortcutsAndWidgets().measureChild(bubbleChild);
+        }
+
+        bubbleChild.setScaleX(scale);
+        bubbleChild.setScaleY(scale);
+    }
+
+    private void resetChild(BubbleTextView bubbleChild) {
+        bubbleChild.setScaleX(1f);
+        bubbleChild.setScaleY(1f);
+
+        bubbleChild.setTextColor(getResources().getColor(R.color.workspace_icon_text_color));
+    }
+
+    public boolean addViewToCellLayout(View child, int index, int childId, LayoutParams params,
+            boolean markCells, boolean allApps) {
         final LayoutParams lp = params;
 
+        // Hotseat icons - scale down and remove text
+        // Don't scale the all apps button
+        // scale percent set to -1 means do not scale
+        // Only scale BubbleTextViews
+        if (child instanceof BubbleTextView) {
+            BubbleTextView bubbleChild = (BubbleTextView) child;
+
+            // Start the child with 100% scale and visible text
+            resetChild(bubbleChild);
+
+            if (mIsHotseat && !allApps && mHotseatChildScale >= 0) {
+                // Scale/make transparent for a hotseat
+                scaleChild(bubbleChild, 0f, mHotseatChildScale);
+
+                bubbleChild.setTextColor(getResources().getColor(android.R.color.transparent));
+            } else if (mChildScale >= 0) {
+                // Else possibly still scale it if we need to for smaller icons
+                scaleChild(bubbleChild, 0f, mChildScale);
+            }
+        }
+
         // Generate an id for each view, this assumes we have at most 256x256 cells
         // per workspace screen
         if (lp.cellX >= 0 && lp.cellX <= mCountX - 1 && lp.cellY >= 0 && lp.cellY <= mCountY - 1) {
@@ -568,7 +673,7 @@
 
             child.setId(childId);
 
-            mChildren.addView(child, index, lp);
+            mShortcutsAndWidgets.addView(child, index, lp);
 
             if (markCells) markCellsAsOccupiedForView(child);
 
@@ -580,61 +685,53 @@
     @Override
     public void removeAllViews() {
         clearOccupiedCells();
-        mChildren.removeAllViews();
+        mShortcutsAndWidgets.removeAllViews();
     }
 
     @Override
     public void removeAllViewsInLayout() {
-        if (mChildren.getChildCount() > 0) {
+        if (mShortcutsAndWidgets.getChildCount() > 0) {
             clearOccupiedCells();
-            mChildren.removeAllViewsInLayout();
+            mShortcutsAndWidgets.removeAllViewsInLayout();
         }
     }
 
     public void removeViewWithoutMarkingCells(View view) {
-        mChildren.removeView(view);
+        mShortcutsAndWidgets.removeView(view);
     }
 
     @Override
     public void removeView(View view) {
         markCellsAsUnoccupiedForView(view);
-        mChildren.removeView(view);
+        mShortcutsAndWidgets.removeView(view);
     }
 
     @Override
     public void removeViewAt(int index) {
-        markCellsAsUnoccupiedForView(mChildren.getChildAt(index));
-        mChildren.removeViewAt(index);
+        markCellsAsUnoccupiedForView(mShortcutsAndWidgets.getChildAt(index));
+        mShortcutsAndWidgets.removeViewAt(index);
     }
 
     @Override
     public void removeViewInLayout(View view) {
         markCellsAsUnoccupiedForView(view);
-        mChildren.removeViewInLayout(view);
+        mShortcutsAndWidgets.removeViewInLayout(view);
     }
 
     @Override
     public void removeViews(int start, int count) {
         for (int i = start; i < start + count; i++) {
-            markCellsAsUnoccupiedForView(mChildren.getChildAt(i));
+            markCellsAsUnoccupiedForView(mShortcutsAndWidgets.getChildAt(i));
         }
-        mChildren.removeViews(start, count);
+        mShortcutsAndWidgets.removeViews(start, count);
     }
 
     @Override
     public void removeViewsInLayout(int start, int count) {
         for (int i = start; i < start + count; i++) {
-            markCellsAsUnoccupiedForView(mChildren.getChildAt(i));
+            markCellsAsUnoccupiedForView(mShortcutsAndWidgets.getChildAt(i));
         }
-        mChildren.removeViewsInLayout(start, count);
-    }
-
-    public void drawChildren(Canvas canvas) {
-        mChildren.draw(canvas);
-    }
-
-    void buildChildrenLayer() {
-        mChildren.buildLayer();
+        mShortcutsAndWidgets.removeViewsInLayout(start, count);
     }
 
     @Override
@@ -645,24 +742,29 @@
 
     public void setTagToCellInfoForPoint(int touchX, int touchY) {
         final CellInfo cellInfo = mCellInfo;
-        final Rect frame = mRect;
+        Rect frame = mRect;
         final int x = touchX + mScrollX;
         final int y = touchY + mScrollY;
-        final int count = mChildren.getChildCount();
+        final int count = mShortcutsAndWidgets.getChildCount();
 
         boolean found = false;
         for (int i = count - 1; i >= 0; i--) {
-            final View child = mChildren.getChildAt(i);
+            final View child = mShortcutsAndWidgets.getChildAt(i);
             final LayoutParams lp = (LayoutParams) child.getLayoutParams();
 
             if ((child.getVisibility() == VISIBLE || child.getAnimation() != null) &&
                     lp.isLockedToGrid) {
                 child.getHitRect(frame);
 
+                float scale = child.getScaleX();
+                frame = new Rect(child.getLeft(), child.getTop(), child.getRight(),
+                        child.getBottom());
                 // The child hit rect is relative to the CellLayoutChildren parent, so we need to
                 // offset that by this CellLayout's padding to test an (x,y) point that is relative
                 // to this view.
                 frame.offset(mPaddingLeft, mPaddingTop);
+                frame.inset((int) (frame.width() * (1f - scale) / 2),
+                        (int) (frame.height() * (1f - scale) / 2));
 
                 if (frame.contains(x, y)) {
                     cellInfo.cell = child;
@@ -709,6 +811,7 @@
         if (action == MotionEvent.ACTION_DOWN) {
             setTagToCellInfoForPoint((int) ev.getX(), (int) ev.getY());
         }
+
         return false;
     }
 
@@ -775,7 +878,7 @@
     }
 
     /**
-     * Given a cell coordinate, return the point that represents the upper left corner of that cell
+     * Given a cell coordinate, return the point that represents the center of the cell
      *
      * @param cellX X coordinate of the cell
      * @param cellY Y coordinate of the cell
@@ -783,11 +886,47 @@
      * @param result Array of 2 ints to hold the x and y coordinate of the point
      */
     void cellToCenterPoint(int cellX, int cellY, int[] result) {
+        regionToCenterPoint(cellX, cellY, 1, 1, result);
+    }
+
+    /**
+     * Given a cell coordinate and span return the point that represents the center of the regio
+     *
+     * @param cellX X coordinate of the cell
+     * @param cellY Y coordinate of the cell
+     *
+     * @param result Array of 2 ints to hold the x and y coordinate of the point
+     */
+    void regionToCenterPoint(int cellX, int cellY, int spanX, int spanY, int[] result) {
         final int hStartPadding = getPaddingLeft();
         final int vStartPadding = getPaddingTop();
+        result[0] = hStartPadding + cellX * (mCellWidth + mWidthGap) +
+                (spanX * mCellWidth + (spanX - 1) * mWidthGap) / 2;
+        result[1] = vStartPadding + cellY * (mCellHeight + mHeightGap) +
+                (spanY * mCellHeight + (spanY - 1) * mHeightGap) / 2;
+    }
 
-        result[0] = hStartPadding + cellX * (mCellWidth + mWidthGap) + mCellWidth / 2;
-        result[1] = vStartPadding + cellY * (mCellHeight + mHeightGap) + mCellHeight / 2;
+     /**
+     * Given a cell coordinate and span fills out a corresponding pixel rect
+     *
+     * @param cellX X coordinate of the cell
+     * @param cellY Y coordinate of the cell
+     * @param result Rect in which to write the result
+     */
+     void regionToRect(int cellX, int cellY, int spanX, int spanY, Rect result) {
+        final int hStartPadding = getPaddingLeft();
+        final int vStartPadding = getPaddingTop();
+        final int left = hStartPadding + cellX * (mCellWidth + mWidthGap);
+        final int top = vStartPadding + cellY * (mCellHeight + mHeightGap);
+        result.set(left, top, left + (spanX * mCellWidth + (spanX - 1) * mWidthGap),
+                top + (spanY * mCellHeight + (spanY - 1) * mHeightGap));
+    }
+
+    public float getDistanceFromCell(float x, float y, int[] cell) {
+        cellToCenterPoint(cell[0], cell[1], mTmpPoint);
+        float distance = (float) Math.sqrt( Math.pow(x - mTmpPoint[0], 2) +
+                Math.pow(y - mTmpPoint[1], 2));
+        return distance;
     }
 
     int getCellWidth() {
@@ -842,7 +981,7 @@
             int vFreeSpace = vSpace - (mCountY * mOriginalCellHeight);
             mWidthGap = Math.min(mMaxGap, numWidthGaps > 0 ? (hFreeSpace / numWidthGaps) : 0);
             mHeightGap = Math.min(mMaxGap,numHeightGaps > 0 ? (vFreeSpace / numHeightGaps) : 0);
-            mChildren.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap);
+            mShortcutsAndWidgets.setCellDimensions(mCellWidth, mCellHeight, mWidthGap, mHeightGap);
         } else {
             mWidthGap = mOriginalWidthGap;
             mHeightGap = mOriginalHeightGap;
@@ -891,22 +1030,18 @@
 
     @Override
     protected void setChildrenDrawingCacheEnabled(boolean enabled) {
-        mChildren.setChildrenDrawingCacheEnabled(enabled);
+        mShortcutsAndWidgets.setChildrenDrawingCacheEnabled(enabled);
     }
 
     @Override
     protected void setChildrenDrawnWithCacheEnabled(boolean enabled) {
-        mChildren.setChildrenDrawnWithCacheEnabled(enabled);
+        mShortcutsAndWidgets.setChildrenDrawnWithCacheEnabled(enabled);
     }
 
     public float getBackgroundAlpha() {
         return mBackgroundAlpha;
     }
 
-    public void setFastBackgroundAlpha(float alpha) {
-        mBackgroundAlpha = alpha;
-    }
-
     public void setBackgroundAlphaMultiplier(float multiplier) {
         mBackgroundAlphaMultiplier = multiplier;
     }
@@ -916,50 +1051,39 @@
     }
 
     public void setBackgroundAlpha(float alpha) {
-        mBackgroundAlpha = alpha;
-        invalidate();
+        if (mBackgroundAlpha != alpha) {
+            mBackgroundAlpha = alpha;
+            invalidate();
+        }
     }
 
-    // Need to return true to let the view system know we know how to handle alpha-- this is
-    // because when our children have an alpha of 0.0f, they are still rendering their "dimmed"
-    // versions
-    @Override
-    protected boolean onSetAlpha(int alpha) {
-        return true;
-    }
-
-    public void setAlpha(float alpha) {
-        setChildrenAlpha(alpha);
-        super.setAlpha(alpha);
-    }
-
-    public void setFastAlpha(float alpha) {
-        setFastChildrenAlpha(alpha);
-        super.setFastAlpha(alpha);
-    }
-
-    private void setChildrenAlpha(float alpha) {
+    public void setShortcutAndWidgetAlpha(float alpha) {
         final int childCount = getChildCount();
         for (int i = 0; i < childCount; i++) {
             getChildAt(i).setAlpha(alpha);
         }
     }
 
-    private void setFastChildrenAlpha(float alpha) {
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            getChildAt(i).setFastAlpha(alpha);
+    public ShortcutAndWidgetContainer getShortcutsAndWidgets() {
+        if (getChildCount() > 0) {
+            return (ShortcutAndWidgetContainer) getChildAt(0);
         }
+        return null;
     }
 
     public View getChildAt(int x, int y) {
-        return mChildren.getChildAt(x, y);
+        return mShortcutsAndWidgets.getChildAt(x, y);
     }
 
     public boolean animateChildToPosition(final View child, int cellX, int cellY, int duration,
-            int delay) {
-        CellLayoutChildren clc = getChildrenLayout();
-        if (clc.indexOfChild(child) != -1 && !mOccupied[cellX][cellY]) {
+            int delay, boolean permanent, boolean adjustOccupied) {
+        ShortcutAndWidgetContainer clc = getShortcutsAndWidgets();
+        boolean[][] occupied = mOccupied;
+        if (!permanent) {
+            occupied = mTmpOccupied;
+        }
+
+        if (clc.indexOfChild(child) != -1) {
             final LayoutParams lp = (LayoutParams) child.getLayoutParams();
             final ItemInfo info = (ItemInfo) child.getTag();
 
@@ -969,34 +1093,48 @@
                 mReorderAnimators.remove(lp);
             }
 
-            int oldX = lp.x;
-            int oldY = lp.y;
-            mOccupied[lp.cellX][lp.cellY] = false;
-            mOccupied[cellX][cellY] = true;
-
+            final int oldX = lp.x;
+            final int oldY = lp.y;
+            if (adjustOccupied) {
+                occupied[lp.cellX][lp.cellY] = false;
+                occupied[cellX][cellY] = true;
+            }
             lp.isLockedToGrid = true;
-            lp.cellX = info.cellX = cellX;
-            lp.cellY = info.cellY = cellY;
+            if (permanent) {
+                lp.cellX = info.cellX = cellX;
+                lp.cellY = info.cellY = cellY;
+            } else {
+                lp.tmpCellX = cellX;
+                lp.tmpCellY = cellY;
+            }
             clc.setupLp(lp);
             lp.isLockedToGrid = false;
-            int newX = lp.x;
-            int newY = lp.y;
+            final int newX = lp.x;
+            final int newY = lp.y;
 
             lp.x = oldX;
             lp.y = oldY;
-            child.requestLayout();
 
-            PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", oldX, newX);
-            PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", oldY, newY);
-            ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(lp, x, y);
-            oa.setDuration(duration);
-            mReorderAnimators.put(lp, oa);
-            oa.addUpdateListener(new AnimatorUpdateListener() {
+            // Exit early if we're not actually moving the view
+            if (oldX == newX && oldY == newY) {
+                lp.isLockedToGrid = true;
+                return true;
+            }
+
+            ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
+            va.setDuration(duration);
+            mReorderAnimators.put(lp, va);
+
+            va.addUpdateListener(new AnimatorUpdateListener() {
+                @Override
                 public void onAnimationUpdate(ValueAnimator animation) {
+                    float r = ((Float) animation.getAnimatedValue()).floatValue();
+                    lp.x = (int) ((1 - r) * oldX + r * newX);
+                    lp.y = (int) ((1 - r) * oldY + r * newY);
                     child.requestLayout();
                 }
             });
-            oa.addListener(new AnimatorListenerAdapter() {
+            va.addListener(new AnimatorListenerAdapter() {
                 boolean cancelled = false;
                 public void onAnimationEnd(Animator animation) {
                     // If the animation was cancelled, it means that another animation
@@ -1004,6 +1142,7 @@
                     // place just yet.
                     if (!cancelled) {
                         lp.isLockedToGrid = true;
+                        child.requestLayout();
                     }
                     if (mReorderAnimators.containsKey(lp)) {
                         mReorderAnimators.remove(lp);
@@ -1013,8 +1152,8 @@
                     cancelled = true;
                 }
             });
-            oa.setStartDelay(delay);
-            oa.start();
+            va.setStartDelay(delay);
+            va.start();
             return true;
         }
         return false;
@@ -1050,12 +1189,11 @@
         result[1] = Math.max(0, result[1]); // Snap to top
     }
 
-    void visualizeDropLocation(View v, Bitmap dragOutline, int originX, int originY,
-            int spanX, int spanY, Point dragOffset, Rect dragRegion) {
-
+    void visualizeDropLocation(View v, Bitmap dragOutline, int originX, int originY, int cellX,
+            int cellY, int spanX, int spanY, boolean resize, Point dragOffset, Rect dragRegion) {
         final int oldDragCellX = mDragCell[0];
         final int oldDragCellY = mDragCell[1];
-        final int[] nearest = findNearestVacantArea(originX, originY, spanX, spanY, v, mDragCell);
+
         if (v != null && dragOffset == null) {
             mDragCenter.set(originX + (v.getWidth() / 2), originY + (v.getHeight() / 2));
         } else {
@@ -1069,10 +1207,12 @@
             return;
         }
 
-        if (nearest != null && (nearest[0] != oldDragCellX || nearest[1] != oldDragCellY)) {
+        if (cellX != oldDragCellX || cellY != oldDragCellY) {
+            mDragCell[0] = cellX;
+            mDragCell[1] = cellY;
             // Find the top left corner of the rect the object will occupy
             final int[] topLeft = mTmpPoint;
-            cellToPoint(nearest[0], nearest[1], topLeft);
+            cellToPoint(cellX, cellY, topLeft);
 
             int left = topLeft[0];
             int top = topLeft[1];
@@ -1106,12 +1246,15 @@
                             - dragOutline.getHeight()) / 2;
                 }
             }
-
             final int oldIndex = mDragOutlineCurrent;
             mDragOutlineAnims[oldIndex].animateOut();
             mDragOutlineCurrent = (oldIndex + 1) % mDragOutlines.length;
+            Rect r = mDragOutlines[mDragOutlineCurrent];
+            r.set(left, top, left + dragOutline.getWidth(), top + dragOutline.getHeight());
+            if (resize) {
+                cellToRect(cellX, cellY, spanX, spanY, r);
+            }
 
-            mDragOutlines[mDragOutlineCurrent].set(left, top);
             mDragOutlineAnims[mDragOutlineCurrent].setTag(dragOutline);
             mDragOutlineAnims[mDragOutlineCurrent].animateIn();
         }
@@ -1125,8 +1268,7 @@
     public void clearDragOutlines() {
         final int oldIndex = mDragOutlineCurrent;
         mDragOutlineAnims[oldIndex].animateOut();
-        mDragCell[0] = -1;
-        mDragCell[1] = -1;
+        mDragCell[0] = mDragCell[1] = -1;
     }
 
     /**
@@ -1142,8 +1284,8 @@
      * @return The X, Y cell of a vacant area that can contain this object,
      *         nearest the requested location.
      */
-    int[] findNearestVacantArea(
-            int pixelX, int pixelY, int spanX, int spanY, int[] result) {
+    int[] findNearestVacantArea(int pixelX, int pixelY, int spanX, int spanY,
+            int[] result) {
         return findNearestVacantArea(pixelX, pixelY, spanX, spanY, null, result);
     }
 
@@ -1153,6 +1295,27 @@
      *
      * @param pixelX The X location at which you want to search for a vacant area.
      * @param pixelY The Y location at which you want to search for a vacant area.
+     * @param minSpanX The minimum horizontal span required
+     * @param minSpanY The minimum vertical span required
+     * @param spanX Horizontal span of the object.
+     * @param spanY Vertical span of the object.
+     * @param result Array in which to place the result, or null (in which case a new array will
+     *        be allocated)
+     * @return The X, Y cell of a vacant area that can contain this object,
+     *         nearest the requested location.
+     */
+    int[] findNearestVacantArea(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX,
+            int spanY, int[] result, int[] resultSpan) {
+        return findNearestVacantArea(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY, null,
+                result, resultSpan);
+    }
+
+    /**
+     * Find a vacant area that will fit the given bounds nearest the requested
+     * cell location. Uses Euclidean distance to score multiple vacant areas.
+     *
+     * @param pixelX The X location at which you want to search for a vacant area.
+     * @param pixelY The Y location at which you want to search for a vacant area.
      * @param spanX Horizontal span of the object.
      * @param spanY Vertical span of the object.
      * @param ignoreOccupied If true, the result can be an occupied cell
@@ -1163,8 +1326,47 @@
      */
     int[] findNearestArea(int pixelX, int pixelY, int spanX, int spanY, View ignoreView,
             boolean ignoreOccupied, int[] result) {
+        return findNearestArea(pixelX, pixelY, spanX, spanY,
+                spanX, spanY, ignoreView, ignoreOccupied, result, null, mOccupied);
+    }
+
+    private final Stack<Rect> mTempRectStack = new Stack<Rect>();
+    private void lazyInitTempRectStack() {
+        if (mTempRectStack.isEmpty()) {
+            for (int i = 0; i < mCountX * mCountY; i++) {
+                mTempRectStack.push(new Rect());
+            }
+        }
+    }
+
+    private void recycleTempRects(Stack<Rect> used) {
+        while (!used.isEmpty()) {
+            mTempRectStack.push(used.pop());
+        }
+    }
+
+    /**
+     * Find a vacant area that will fit the given bounds nearest the requested
+     * cell location. Uses Euclidean distance to score multiple vacant areas.
+     *
+     * @param pixelX The X location at which you want to search for a vacant area.
+     * @param pixelY The Y location at which you want to search for a vacant area.
+     * @param minSpanX The minimum horizontal span required
+     * @param minSpanY The minimum vertical span required
+     * @param spanX Horizontal span of the object.
+     * @param spanY Vertical span of the object.
+     * @param ignoreOccupied If true, the result can be an occupied cell
+     * @param result Array in which to place the result, or null (in which case a new array will
+     *        be allocated)
+     * @return The X, Y cell of a vacant area that can contain this object,
+     *         nearest the requested location.
+     */
+    int[] findNearestArea(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX, int spanY,
+            View ignoreView, boolean ignoreOccupied, int[] result, int[] resultSpan,
+            boolean[][] occupied) {
+        lazyInitTempRectStack();
         // mark space take by ignoreView as available (method checks if ignoreView is null)
-        markCellsAsUnoccupiedForView(ignoreView);
+        markCellsAsUnoccupiedForView(ignoreView, occupied);
 
         // For items with a spanX / spanY > 1, the passed in point (pixelX, pixelY) corresponds
         // to the center of the item, but we are searching based on the top-left cell, so
@@ -1175,49 +1377,956 @@
         // Keep track of best-scoring drop area
         final int[] bestXY = result != null ? result : new int[2];
         double bestDistance = Double.MAX_VALUE;
+        final Rect bestRect = new Rect(-1, -1, -1, -1);
+        final Stack<Rect> validRegions = new Stack<Rect>();
 
         final int countX = mCountX;
         final int countY = mCountY;
-        final boolean[][] occupied = mOccupied;
 
-        for (int y = 0; y < countY - (spanY - 1); y++) {
+        if (minSpanX <= 0 || minSpanY <= 0 || spanX <= 0 || spanY <= 0 ||
+                spanX < minSpanX || spanY < minSpanY) {
+            return bestXY;
+        }
+
+        for (int y = 0; y < countY - (minSpanY - 1); y++) {
             inner:
-            for (int x = 0; x < countX - (spanX - 1); x++) {
+            for (int x = 0; x < countX - (minSpanX - 1); x++) {
+                int ySize = -1;
+                int xSize = -1;
                 if (ignoreOccupied) {
-                    for (int i = 0; i < spanX; i++) {
-                        for (int j = 0; j < spanY; j++) {
+                    // First, let's see if this thing fits anywhere
+                    for (int i = 0; i < minSpanX; i++) {
+                        for (int j = 0; j < minSpanY; j++) {
                             if (occupied[x + i][y + j]) {
-                                // small optimization: we can skip to after the column we
-                                // just found an occupied cell
-                                x += i;
                                 continue inner;
                             }
                         }
                     }
+                    xSize = minSpanX;
+                    ySize = minSpanY;
+
+                    // We know that the item will fit at _some_ acceptable size, now let's see
+                    // how big we can make it. We'll alternate between incrementing x and y spans
+                    // until we hit a limit.
+                    boolean incX = true;
+                    boolean hitMaxX = xSize >= spanX;
+                    boolean hitMaxY = ySize >= spanY;
+                    while (!(hitMaxX && hitMaxY)) {
+                        if (incX && !hitMaxX) {
+                            for (int j = 0; j < ySize; j++) {
+                                if (x + xSize > countX -1 || occupied[x + xSize][y + j]) {
+                                    // We can't move out horizontally
+                                    hitMaxX = true;
+                                }
+                            }
+                            if (!hitMaxX) {
+                                xSize++;
+                            }
+                        } else if (!hitMaxY) {
+                            for (int i = 0; i < xSize; i++) {
+                                if (y + ySize > countY - 1 || occupied[x + i][y + ySize]) {
+                                    // We can't move out vertically
+                                    hitMaxY = true;
+                                }
+                            }
+                            if (!hitMaxY) {
+                                ySize++;
+                            }
+                        }
+                        hitMaxX |= xSize >= spanX;
+                        hitMaxY |= ySize >= spanY;
+                        incX = !incX;
+                    }
+                    incX = true;
+                    hitMaxX = xSize >= spanX;
+                    hitMaxY = ySize >= spanY;
                 }
                 final int[] cellXY = mTmpXY;
                 cellToCenterPoint(x, y, cellXY);
 
+                // We verify that the current rect is not a sub-rect of any of our previous
+                // candidates. In this case, the current rect is disqualified in favour of the
+                // containing rect.
+                Rect currentRect = mTempRectStack.pop();
+                currentRect.set(x, y, x + xSize, y + ySize);
+                boolean contained = false;
+                for (Rect r : validRegions) {
+                    if (r.contains(currentRect)) {
+                        contained = true;
+                        break;
+                    }
+                }
+                validRegions.push(currentRect);
                 double distance = Math.sqrt(Math.pow(cellXY[0] - pixelX, 2)
                         + Math.pow(cellXY[1] - pixelY, 2));
-                if (distance <= bestDistance) {
+
+                if ((distance <= bestDistance && !contained) ||
+                        currentRect.contains(bestRect)) {
                     bestDistance = distance;
                     bestXY[0] = x;
                     bestXY[1] = y;
+                    if (resultSpan != null) {
+                        resultSpan[0] = xSize;
+                        resultSpan[1] = ySize;
+                    }
+                    bestRect.set(currentRect);
                 }
             }
         }
         // re-mark space taken by ignoreView as occupied
-        markCellsAsOccupiedForView(ignoreView);
+        markCellsAsOccupiedForView(ignoreView, occupied);
 
         // Return -1, -1 if no suitable location found
         if (bestDistance == Double.MAX_VALUE) {
             bestXY[0] = -1;
             bestXY[1] = -1;
         }
+        recycleTempRects(validRegions);
         return bestXY;
     }
 
+     /**
+     * Find a vacant area that will fit the given bounds nearest the requested
+     * cell location, and will also weigh in a suggested direction vector of the
+     * desired location. This method computers distance based on unit grid distances,
+     * not pixel distances.
+     *
+     * @param cellX The X cell nearest to which you want to search for a vacant area.
+     * @param cellY The Y cell nearest which you want to search for a vacant area.
+     * @param spanX Horizontal span of the object.
+     * @param spanY Vertical span of the object.
+     * @param direction The favored direction in which the views should move from x, y
+     * @param exactDirectionOnly If this parameter is true, then only solutions where the direction
+     *        matches exactly. Otherwise we find the best matching direction.
+     * @param occoupied The array which represents which cells in the CellLayout are occupied
+     * @param blockOccupied The array which represents which cells in the specified block (cellX,
+     *        cellY, spanX, spanY) are occupied. This is used when try to move a group of views. 
+     * @param result Array in which to place the result, or null (in which case a new array will
+     *        be allocated)
+     * @return The X, Y cell of a vacant area that can contain this object,
+     *         nearest the requested location.
+     */
+    private int[] findNearestArea(int cellX, int cellY, int spanX, int spanY, int[] direction,
+            boolean[][] occupied, boolean blockOccupied[][], int[] result) {
+        // Keep track of best-scoring drop area
+        final int[] bestXY = result != null ? result : new int[2];
+        float bestDistance = Float.MAX_VALUE;
+        int bestDirectionScore = Integer.MIN_VALUE;
+
+        final int countX = mCountX;
+        final int countY = mCountY;
+
+        for (int y = 0; y < countY - (spanY - 1); y++) {
+            inner:
+            for (int x = 0; x < countX - (spanX - 1); x++) {
+                // First, let's see if this thing fits anywhere
+                for (int i = 0; i < spanX; i++) {
+                    for (int j = 0; j < spanY; j++) {
+                        if (occupied[x + i][y + j] && (blockOccupied == null || blockOccupied[i][j])) {
+                            continue inner;
+                        }
+                    }
+                }
+
+                float distance = (float)
+                        Math.sqrt((x - cellX) * (x - cellX) + (y - cellY) * (y - cellY));
+                int[] curDirection = mTmpPoint;
+                computeDirectionVector(x - cellX, y - cellY, curDirection);
+                // The direction score is just the dot product of the two candidate direction
+                // and that passed in.
+                int curDirectionScore = direction[0] * curDirection[0] +
+                        direction[1] * curDirection[1];
+                boolean exactDirectionOnly = false;
+                boolean directionMatches = direction[0] == curDirection[0] &&
+                        direction[0] == curDirection[0];
+                if ((directionMatches || !exactDirectionOnly) &&
+                        Float.compare(distance,  bestDistance) < 0 || (Float.compare(distance,
+                        bestDistance) == 0 && curDirectionScore > bestDirectionScore)) {
+                    bestDistance = distance;
+                    bestDirectionScore = curDirectionScore;
+                    bestXY[0] = x;
+                    bestXY[1] = y;
+                }
+            }
+        }
+
+        // Return -1, -1 if no suitable location found
+        if (bestDistance == Float.MAX_VALUE) {
+            bestXY[0] = -1;
+            bestXY[1] = -1;
+        }
+        return bestXY;
+    }
+
+    private int[] findNearestAreaInDirection(int cellX, int cellY, int spanX, int spanY, 
+            int[] direction,boolean[][] occupied,
+            boolean blockOccupied[][], int[] result) {
+        // Keep track of best-scoring drop area
+        final int[] bestXY = result != null ? result : new int[2];
+        bestXY[0] = -1;
+        bestXY[1] = -1;
+        float bestDistance = Float.MAX_VALUE;
+
+        // We use this to march in a single direction
+        if ((direction[0] != 0 && direction[1] != 0) ||
+                (direction[0] == 0 && direction[1] == 0)) {
+            return bestXY;
+        }
+
+        // This will only incrememnet one of x or y based on the assertion above
+        int x = cellX + direction[0];
+        int y = cellY + direction[1];
+        while (x >= 0 && x + spanX <= mCountX && y >= 0 && y + spanY <= mCountY) {
+
+            boolean fail = false;
+            for (int i = 0; i < spanX; i++) {
+                for (int j = 0; j < spanY; j++) {
+                    if (occupied[x + i][y + j] && (blockOccupied == null || blockOccupied[i][j])) {
+                        fail = true;                    
+                    }
+                }
+            }
+            if (!fail) {
+                float distance = (float)
+                        Math.sqrt((x - cellX) * (x - cellX) + (y - cellY) * (y - cellY));
+                if (Float.compare(distance,  bestDistance) < 0) {
+                    bestDistance = distance;
+                    bestXY[0] = x;
+                    bestXY[1] = y;
+                }
+            }
+            x += direction[0];
+            y += direction[1];
+        }
+        return bestXY;
+    }
+
+    private boolean addViewToTempLocation(View v, Rect rectOccupiedByPotentialDrop,
+            int[] direction, ItemConfiguration currentState) {
+        CellAndSpan c = currentState.map.get(v);
+        boolean success = false;
+        markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, false);
+        markCellsForRect(rectOccupiedByPotentialDrop, mTmpOccupied, true);
+
+        findNearestArea(c.x, c.y, c.spanX, c.spanY, direction, mTmpOccupied, null, mTempLocation);
+
+        if (mTempLocation[0] >= 0 && mTempLocation[1] >= 0) {
+            c.x = mTempLocation[0];
+            c.y = mTempLocation[1];
+            success = true;
+
+        }
+        markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, true);
+        return success;
+    }
+
+    // This method looks in the specified direction to see if there is an additional view
+    // immediately adjecent in that direction
+    private boolean addViewInDirection(ArrayList<View> views, Rect boundingRect, int[] direction,
+            boolean[][] occupied, View dragView, ItemConfiguration currentState) {
+        boolean found = false;
+
+        int childCount = mShortcutsAndWidgets.getChildCount();
+        Rect r0 = new Rect(boundingRect);
+        Rect r1 = new Rect();
+
+        int deltaX = 0;
+        int deltaY = 0;
+        if (direction[1] < 0) {
+            r0.set(r0.left, r0.top - 1, r0.right, r0.bottom);
+            deltaY = -1;
+        } else if (direction[1] > 0) {
+            r0.set(r0.left, r0.top, r0.right, r0.bottom + 1);
+            deltaY = 1;
+        } else if (direction[0] < 0) {
+            r0.set(r0.left - 1, r0.top, r0.right, r0.bottom);
+            deltaX = -1;
+        } else if (direction[0] > 0) {
+            r0.set(r0.left, r0.top, r0.right + 1, r0.bottom);
+            deltaX = 1;
+        }
+
+        for (int i = 0; i < childCount; i++) {
+            View child = mShortcutsAndWidgets.getChildAt(i);
+            if (views.contains(child) || child == dragView) continue;
+            CellAndSpan c = currentState.map.get(child);
+
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            r1.set(c.x, c.y, c.x + c.spanX, c.y + c.spanY);
+            if (Rect.intersects(r0, r1)) {
+                if (!lp.canReorder) {
+                    return false;
+                }
+                boolean pushed = false;
+                for (int x = c.x; x < c.x + c.spanX; x++) {
+                    for (int y = c.y; y < c.y + c.spanY; y++) {
+                        boolean inBounds = x - deltaX >= 0 && x -deltaX < mCountX
+                                && y - deltaY >= 0 && y - deltaY < mCountY;
+                        if (inBounds && occupied[x - deltaX][y - deltaY]) {
+                            pushed = true;
+                        }
+                    }
+                }
+                if (pushed) {
+                    views.add(child);
+                    boundingRect.union(c.x, c.y, c.x + c.spanX, c.y + c.spanY);
+                    found = true;
+                }
+            }
+        }
+        return found;
+    }
+
+    private boolean addViewsToTempLocation(ArrayList<View> views, Rect rectOccupiedByPotentialDrop,
+            int[] direction, boolean push, View dragView, ItemConfiguration currentState) {
+        if (views.size() == 0) return true;
+
+        boolean success = false;
+        Rect boundingRect = null;
+        // We construct a rect which represents the entire group of views passed in
+        for (View v: views) {
+            CellAndSpan c = currentState.map.get(v);
+            if (boundingRect == null) {
+                boundingRect = new Rect(c.x, c.y, c.x + c.spanX, c.y + c.spanY);
+            } else {
+                boundingRect.union(c.x, c.y, c.x + c.spanX, c.y + c.spanY);
+            }
+        }
+
+        @SuppressWarnings("unchecked")
+        ArrayList<View> dup = (ArrayList<View>) views.clone();
+        // We try and expand the group of views in the direction vector passed, based on
+        // whether they are physically adjacent, ie. based on "push mechanics".
+        while (push && addViewInDirection(dup, boundingRect, direction, mTmpOccupied, dragView,
+                currentState)) {
+        }
+
+        // Mark the occupied state as false for the group of views we want to move.
+        for (View v: dup) {
+            CellAndSpan c = currentState.map.get(v);
+            markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, false);
+        }
+
+        boolean[][] blockOccupied = new boolean[boundingRect.width()][boundingRect.height()];
+        int top = boundingRect.top;
+        int left = boundingRect.left;
+        // We mark more precisely which parts of the bounding rect are truly occupied, allowing
+        // for tetris-style interlocking.
+        for (View v: dup) {
+            CellAndSpan c = currentState.map.get(v);
+            markCellsForView(c.x - left, c.y - top, c.spanX, c.spanY, blockOccupied, true);
+        }
+
+        markCellsForRect(rectOccupiedByPotentialDrop, mTmpOccupied, true);
+
+        if (push) {
+            findNearestAreaInDirection(boundingRect.left, boundingRect.top, boundingRect.width(),
+                    boundingRect.height(), direction, mTmpOccupied, blockOccupied, mTempLocation);
+        } else {
+            findNearestArea(boundingRect.left, boundingRect.top, boundingRect.width(),
+                    boundingRect.height(), direction, mTmpOccupied, blockOccupied, mTempLocation);
+        }
+
+        // If we successfuly found a location by pushing the block of views, we commit it
+        if (mTempLocation[0] >= 0 && mTempLocation[1] >= 0) {
+            int deltaX = mTempLocation[0] - boundingRect.left;
+            int deltaY = mTempLocation[1] - boundingRect.top;
+            for (View v: dup) {
+                CellAndSpan c = currentState.map.get(v);
+                c.x += deltaX;
+                c.y += deltaY;
+            }
+            success = true;
+        }
+
+        // In either case, we set the occupied array as marked for the location of the views
+        for (View v: dup) {
+            CellAndSpan c = currentState.map.get(v);
+            markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, true);
+        }
+        return success;
+    }
+
+    private void markCellsForRect(Rect r, boolean[][] occupied, boolean value) {
+        markCellsForView(r.left, r.top, r.width(), r.height(), occupied, value);
+    }
+
+    private boolean rearrangementExists(int cellX, int cellY, int spanX, int spanY, int[] direction,
+            View ignoreView, ItemConfiguration solution) {
+
+        mIntersectingViews.clear();
+        mOccupiedRect.set(cellX, cellY, cellX + spanX, cellY + spanY);
+
+        // Mark the desired location of the view currently being dragged.
+        if (ignoreView != null) {
+            CellAndSpan c = solution.map.get(ignoreView);
+            if (c != null) {
+                c.x = cellX;
+                c.y = cellY;
+            }
+        }
+        Rect r0 = new Rect(cellX, cellY, cellX + spanX, cellY + spanY);
+        Rect r1 = new Rect();
+        for (View child: solution.map.keySet()) {
+            if (child == ignoreView) continue;
+            CellAndSpan c = solution.map.get(child);
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            r1.set(c.x, c.y, c.x + c.spanX, c.y + c.spanY);
+            if (Rect.intersects(r0, r1)) {
+                if (!lp.canReorder) {
+                    return false;
+                }
+                mIntersectingViews.add(child);
+            }
+        }
+
+        // We try to move the intersecting views as a block using the push mechanic
+        if (addViewsToTempLocation(mIntersectingViews, mOccupiedRect, direction, true, ignoreView,
+                solution)) {
+            return true;
+        }
+        // Try the opposite direction
+        direction[0] *= -1;
+        direction[1] *= -1;
+        if (addViewsToTempLocation(mIntersectingViews, mOccupiedRect, direction, true, ignoreView,
+                solution)) {
+            return true;
+        }
+        // Switch the direction back
+        direction[0] *= -1;
+        direction[1] *= -1;
+
+        // Next we try moving the views as a block , but without requiring the push mechanic
+        if (addViewsToTempLocation(mIntersectingViews, mOccupiedRect, direction, false, ignoreView,
+                solution)) {
+            return true;
+        }
+
+        // Ok, they couldn't move as a block, let's move them individually
+        for (View v : mIntersectingViews) {
+            if (!addViewToTempLocation(v, mOccupiedRect, direction, solution)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /*
+     * Returns a pair (x, y), where x,y are in {-1, 0, 1} corresponding to vector between
+     * the provided point and the provided cell
+     */
+    private void computeDirectionVector(float deltaX, float deltaY, int[] result) {
+        double angle = Math.atan(((float) deltaY) / deltaX);
+
+        result[0] = 0;
+        result[1] = 0;
+        if (Math.abs(Math.cos(angle)) > 0.5f) {
+            result[0] = (int) Math.signum(deltaX);
+        }
+        if (Math.abs(Math.sin(angle)) > 0.5f) {
+            result[1] = (int) Math.signum(deltaY);
+        }
+    }
+
+    private void copyOccupiedArray(boolean[][] occupied) {
+        for (int i = 0; i < mCountX; i++) {
+            for (int j = 0; j < mCountY; j++) {
+                occupied[i][j] = mOccupied[i][j];
+            }
+        }
+    }
+
+    ItemConfiguration simpleSwap(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX,
+            int spanY, int[] direction, View dragView, boolean decX, ItemConfiguration solution) {
+        // Copy the current state into the solution. This solution will be manipulated as necessary.
+        copyCurrentStateToSolution(solution, false);
+        // Copy the current occupied array into the temporary occupied array. This array will be
+        // manipulated as necessary to find a solution.
+        copyOccupiedArray(mTmpOccupied);
+
+        // We find the nearest cell into which we would place the dragged item, assuming there's
+        // nothing in its way.
+        int result[] = new int[2];
+        result = findNearestArea(pixelX, pixelY, spanX, spanY, result);
+
+        boolean success = false;
+        // First we try the exact nearest position of the item being dragged,
+        // we will then want to try to move this around to other neighbouring positions
+        success = rearrangementExists(result[0], result[1], spanX, spanY, direction, dragView,
+                solution);
+
+        if (!success) {
+            // We try shrinking the widget down to size in an alternating pattern, shrink 1 in
+            // x, then 1 in y etc.
+            if (spanX > minSpanX && (minSpanY == spanY || decX)) {
+                return simpleSwap(pixelX, pixelY, minSpanX, minSpanY, spanX - 1, spanY, direction,
+                        dragView, false, solution);
+            } else if (spanY > minSpanY) {
+                return simpleSwap(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY - 1, direction,
+                        dragView, true, solution);
+            }
+            solution.isSolution = false;
+        } else {
+            solution.isSolution = true;
+            solution.dragViewX = result[0];
+            solution.dragViewY = result[1];
+            solution.dragViewSpanX = spanX;
+            solution.dragViewSpanY = spanY;
+        }
+        return solution;
+    }
+
+    private void copyCurrentStateToSolution(ItemConfiguration solution, boolean temp) {
+        int childCount = mShortcutsAndWidgets.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            View child = mShortcutsAndWidgets.getChildAt(i);
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            CellAndSpan c;
+            if (temp) {
+                c = new CellAndSpan(lp.tmpCellX, lp.tmpCellY, lp.cellHSpan, lp.cellVSpan);
+            } else {
+                c = new CellAndSpan(lp.cellX, lp.cellY, lp.cellHSpan, lp.cellVSpan);
+            }
+            solution.map.put(child, c);
+        }
+    }
+
+    private void copySolutionToTempState(ItemConfiguration solution, View dragView) {
+        for (int i = 0; i < mCountX; i++) {
+            for (int j = 0; j < mCountY; j++) {
+                mTmpOccupied[i][j] = false;
+            }
+        }
+
+        int childCount = mShortcutsAndWidgets.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            View child = mShortcutsAndWidgets.getChildAt(i);
+            if (child == dragView) continue;
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            CellAndSpan c = solution.map.get(child);
+            if (c != null) {
+                lp.tmpCellX = c.x;
+                lp.tmpCellY = c.y;
+                lp.cellHSpan = c.spanX;
+                lp.cellVSpan = c.spanY;
+                markCellsForView(c.x, c.y, c.spanX, c.spanY, mTmpOccupied, true);
+            }
+        }
+        markCellsForView(solution.dragViewX, solution.dragViewY, solution.dragViewSpanX,
+                solution.dragViewSpanY, mTmpOccupied, true);
+    }
+
+    private void animateItemsToSolution(ItemConfiguration solution, View dragView, boolean
+            commitDragView) {
+
+        boolean[][] occupied = DESTRUCTIVE_REORDER ? mOccupied : mTmpOccupied;
+        for (int i = 0; i < mCountX; i++) {
+            for (int j = 0; j < mCountY; j++) {
+                occupied[i][j] = false;
+            }
+        }
+
+        int childCount = mShortcutsAndWidgets.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            View child = mShortcutsAndWidgets.getChildAt(i);
+            if (child == dragView) continue;
+            CellAndSpan c = solution.map.get(child);
+            if (c != null) {
+                animateChildToPosition(child, c.x, c.y, REORDER_ANIMATION_DURATION, 0,
+                        DESTRUCTIVE_REORDER, false);
+                markCellsForView(c.x, c.y, c.spanX, c.spanY, occupied, true);
+            }
+        }
+        if (commitDragView) {
+            markCellsForView(solution.dragViewX, solution.dragViewY, solution.dragViewSpanX,
+                    solution.dragViewSpanY, occupied, true);
+        }
+    }
+
+    // This method starts or changes the reorder hint animations
+    private void beginOrAdjustHintAnimations(ItemConfiguration solution, View dragView, int delay) {
+        int childCount = mShortcutsAndWidgets.getChildCount();
+        int timeForPriorAnimationToComplete = getMaxCompletionTime();
+        for (int i = 0; i < childCount; i++) {
+            View child = mShortcutsAndWidgets.getChildAt(i);
+            if (child == dragView) continue;
+            CellAndSpan c = solution.map.get(child);
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            if (c != null) {
+                ReorderHintAnimation rha = new ReorderHintAnimation(child, lp.cellX, lp.cellY,
+                        c.x, c.y, c.spanX, c.spanY);
+                rha.animate(timeForPriorAnimationToComplete);
+            }
+        }
+    }
+
+    // Class which represents the reorder hint animations. These animations show that an item is
+    // in a temporary state, and hint at where the item will return to.
+    class ReorderHintAnimation {
+        View child;
+        float deltaX;
+        float deltaY;
+        private static final int DURATION = 140;
+        private int repeatCount;
+        private boolean cancelOnCycleComplete = false;
+        ValueAnimator va;
+
+        public ReorderHintAnimation(View child, int cellX0, int cellY0, int cellX1, int cellY1,
+                int spanX, int spanY) {
+            regionToCenterPoint(cellX0, cellY0, spanX, spanY, mTmpPoint);
+            final int x0 = mTmpPoint[0];
+            final int y0 = mTmpPoint[1];
+            regionToCenterPoint(cellX1, cellY1, spanX, spanY, mTmpPoint);
+            final int x1 = mTmpPoint[0];
+            final int y1 = mTmpPoint[1];
+            final int dX = x1 - x0;
+            final int dY = y1 - y0;
+            deltaX = 0;
+            deltaY = 0;
+            if (dX == dY && dX == 0) {
+            } else {
+                if (dY == 0) {
+                    deltaX = mReorderHintAnimationMagnitude;
+                } else if (dX == 0) {
+                    deltaY = mReorderHintAnimationMagnitude;
+                } else {
+                    double angle = Math.atan( (float) (dY) / dX);
+                    deltaX = (int) (Math.cos(angle) * mReorderHintAnimationMagnitude);
+                    deltaY = (int) (Math.sin(angle) * mReorderHintAnimationMagnitude);
+                }
+            }
+            this.child = child;
+        }
+
+        void animate(int delay) {
+            if (mShakeAnimators.containsKey(child)) {
+                ReorderHintAnimation oldAnimation = mShakeAnimators.get(child);
+                oldAnimation.completeAnimation();
+                mShakeAnimators.remove(child);
+            }
+            if (deltaX == 0 && deltaY == 0) {
+                return;
+            }
+            va = ValueAnimator.ofFloat(0f, 1f);
+            va.setRepeatMode(ValueAnimator.REVERSE);
+            va.setRepeatCount(ValueAnimator.INFINITE);
+            va.setDuration(DURATION);
+            va.addUpdateListener(new AnimatorUpdateListener() {
+                @Override
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    float r = ((Float) animation.getAnimatedValue()).floatValue();
+                    float x = r * deltaX;
+                    float y = r * deltaY;
+                    child.setTranslationX(x);
+                    child.setTranslationY(y);
+                }
+            });
+            va.addListener(new AnimatorListenerAdapter() {
+                public void onAnimationRepeat(Animator animation) {
+                    repeatCount++;
+                    // We make sure to end only after a full period
+                    if (cancelOnCycleComplete && repeatCount % 2 == 0) {
+                        va.cancel();
+                    }
+                }
+            });
+            va.setStartDelay(Math.max(REORDER_ANIMATION_DURATION, delay));
+            mShakeAnimators.put(child, this);
+            va.start();
+        }
+
+
+        private void completeAnimation() {
+            cancelOnCycleComplete = true;
+        }
+
+        // Returns the time required to complete the current oscillating animation
+        private int completionTime() {
+            if (repeatCount % 2 == 0) {
+                return (int) (va.getDuration() - va.getCurrentPlayTime() + DURATION);
+            } else {
+                return (int) (va.getDuration() - va.getCurrentPlayTime());
+            }
+        }
+    }
+
+    private void completeAndClearReorderHintAnimations() {
+        for (ReorderHintAnimation a: mShakeAnimators.values()) {
+            a.completeAnimation();
+        }
+        mShakeAnimators.clear();
+    }
+
+    private int getMaxCompletionTime() {
+        int maxTime = 0;
+        for (ReorderHintAnimation a: mShakeAnimators.values()) {
+            maxTime = Math.max(maxTime, a.completionTime());
+        }
+        return maxTime;
+    }
+
+    private void commitTempPlacement() {
+        for (int i = 0; i < mCountX; i++) {
+            for (int j = 0; j < mCountY; j++) {
+                mOccupied[i][j] = mTmpOccupied[i][j];
+            }
+        }
+        int childCount = mShortcutsAndWidgets.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            View child = mShortcutsAndWidgets.getChildAt(i);
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            ItemInfo info = (ItemInfo) child.getTag();
+            // We do a null check here because the item info can be null in the case of the
+            // AllApps button in the hotseat.
+            if (info != null) {
+                info.cellX = lp.cellX = lp.tmpCellX;
+                info.cellY = lp.cellY = lp.tmpCellY;
+            }
+        }
+        mLauncher.getWorkspace().updateItemLocationsInDatabase(this);
+    }
+
+    public void setUseTempCoords(boolean useTempCoords) {
+        int childCount = mShortcutsAndWidgets.getChildCount();
+        for (int i = 0; i < childCount; i++) {
+            LayoutParams lp = (LayoutParams) mShortcutsAndWidgets.getChildAt(i).getLayoutParams();
+            lp.useTmpCoords = useTempCoords;
+        }
+    }
+
+    ItemConfiguration findConfigurationNoShuffle(int pixelX, int pixelY, int minSpanX, int minSpanY,
+            int spanX, int spanY, View dragView, ItemConfiguration solution) {
+        int[] result = new int[2];
+        int[] resultSpan = new int[2];
+        findNearestVacantArea(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY, null, result,
+                resultSpan);
+        if (result[0] >= 0 && result[1] >= 0) {
+            copyCurrentStateToSolution(solution, false);
+            solution.dragViewX = result[0];
+            solution.dragViewY = result[1];
+            solution.dragViewSpanX = resultSpan[0];
+            solution.dragViewSpanY = resultSpan[1];
+            solution.isSolution = true;
+        } else {
+            solution.isSolution = false;
+        }
+        return solution;
+    }
+
+    public void prepareChildForDrag(View child) {
+        markCellsAsUnoccupiedForView(child);
+    }
+
+    /* This seems like it should be obvious and straight-forward, but when the direction vector
+    needs to match with the notion of the dragView pushing other views, we have to employ
+    a slightly more subtle notion of the direction vector. The question is what two points is
+    the vector between? The center of the dragView and its desired destination? Not quite, as
+    this doesn't necessarily coincide with the interaction of the dragView and items occupying
+    those cells. Instead we use some heuristics to often lock the vector to up, down, left
+    or right, which helps make pushing feel right.
+    */
+    private void getDirectionVectorForDrop(int dragViewCenterX, int dragViewCenterY, int spanX,
+            int spanY, View dragView, int[] resultDirection) {
+        int[] targetDestination = new int[2];
+
+        findNearestArea(dragViewCenterX, dragViewCenterY, spanX, spanY, targetDestination);
+        Rect dragRect = new Rect();
+        regionToRect(targetDestination[0], targetDestination[1], spanX, spanY, dragRect);
+        dragRect.offset(dragViewCenterX - dragRect.centerX(), dragViewCenterY - dragRect.centerY());
+
+        Rect dropRegionRect = new Rect();
+        getViewsIntersectingRegion(targetDestination[0], targetDestination[1], spanX, spanY,
+                dragView, dropRegionRect, mIntersectingViews);
+
+        int dropRegionSpanX = dropRegionRect.width();
+        int dropRegionSpanY = dropRegionRect.height();
+
+        regionToRect(dropRegionRect.left, dropRegionRect.top, dropRegionRect.width(),
+                dropRegionRect.height(), dropRegionRect);
+
+        int deltaX = (dropRegionRect.centerX() - dragViewCenterX) / spanX;
+        int deltaY = (dropRegionRect.centerY() - dragViewCenterY) / spanY;
+
+        if (dropRegionSpanX == mCountX || spanX == mCountX) {
+            deltaX = 0;
+        }
+        if (dropRegionSpanY == mCountY || spanY == mCountY) {
+            deltaY = 0;
+        }
+
+        if (deltaX == 0 && deltaY == 0) {
+            // No idea what to do, give a random direction.
+            resultDirection[0] = 1;
+            resultDirection[1] = 0;
+        } else {
+            computeDirectionVector(deltaX, deltaY, resultDirection);
+        }
+    }
+
+    // For a given cell and span, fetch the set of views intersecting the region.
+    private void getViewsIntersectingRegion(int cellX, int cellY, int spanX, int spanY,
+            View dragView, Rect boundingRect, ArrayList<View> intersectingViews) {
+        if (boundingRect != null) {
+            boundingRect.set(cellX, cellY, cellX + spanX, cellY + spanY);
+        }
+        intersectingViews.clear();
+        Rect r0 = new Rect(cellX, cellY, cellX + spanX, cellY + spanY);
+        Rect r1 = new Rect();
+        final int count = mShortcutsAndWidgets.getChildCount();
+        for (int i = 0; i < count; i++) {
+            View child = mShortcutsAndWidgets.getChildAt(i);
+            if (child == dragView) continue;
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            r1.set(lp.cellX, lp.cellY, lp.cellX + lp.cellHSpan, lp.cellY + lp.cellVSpan);
+            if (Rect.intersects(r0, r1)) {
+                mIntersectingViews.add(child);
+                if (boundingRect != null) {
+                    boundingRect.union(r1);
+                }
+            }
+        }
+    }
+
+    boolean isNearestDropLocationOccupied(int pixelX, int pixelY, int spanX, int spanY,
+            View dragView, int[] result) {
+        result = findNearestArea(pixelX, pixelY, spanX, spanY, result);
+        getViewsIntersectingRegion(result[0], result[1], spanX, spanY, dragView, null,
+                mIntersectingViews);
+        return !mIntersectingViews.isEmpty();
+    }
+
+    void revertTempState() {
+        if (!isItemPlacementDirty() || DESTRUCTIVE_REORDER) return;
+        final int count = mShortcutsAndWidgets.getChildCount();
+        for (int i = 0; i < count; i++) {
+            View child = mShortcutsAndWidgets.getChildAt(i);
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            if (lp.tmpCellX != lp.cellX || lp.tmpCellY != lp.cellY) {
+                lp.tmpCellX = lp.cellX;
+                lp.tmpCellY = lp.cellY;
+                animateChildToPosition(child, lp.cellX, lp.cellY, REORDER_ANIMATION_DURATION,
+                        0, false, false);
+            }
+        }
+        completeAndClearReorderHintAnimations();
+        setItemPlacementDirty(false);
+    }
+
+    int[] createArea(int pixelX, int pixelY, int minSpanX, int minSpanY, int spanX, int spanY,
+            View dragView, int[] result, int resultSpan[], int mode) {
+        // First we determine if things have moved enough to cause a different layout
+        result = findNearestArea(pixelX, pixelY, spanX, spanY, result);
+
+        if (resultSpan == null) {
+            resultSpan = new int[2];
+        }
+
+        // When we are checking drop validity or actually dropping, we don't recompute the
+        // direction vector, since we want the solution to match the preview, and it's possible
+        // that the exact position of the item has changed to result in a new reordering outcome.
+        if ((mode == MODE_ON_DROP || mode == MODE_ON_DROP_EXTERNAL || mode == MODE_ACCEPT_DROP)
+               && mPreviousReorderDirection[0] != INVALID_DIRECTION) {
+            mDirectionVector[0] = mPreviousReorderDirection[0];
+            mDirectionVector[1] = mPreviousReorderDirection[1];
+            // We reset this vector after drop
+            if (mode == MODE_ON_DROP || mode == MODE_ON_DROP_EXTERNAL) {
+                mPreviousReorderDirection[0] = INVALID_DIRECTION;
+                mPreviousReorderDirection[1] = INVALID_DIRECTION;
+            }
+            
+        } else {
+            getDirectionVectorForDrop(pixelX, pixelY, spanX, spanY, dragView, mDirectionVector);
+            mPreviousReorderDirection[0] = mDirectionVector[0];
+            mPreviousReorderDirection[1] = mDirectionVector[1];
+        }
+
+        ItemConfiguration swapSolution = simpleSwap(pixelX, pixelY, minSpanX, minSpanY,
+                 spanX,  spanY, mDirectionVector, dragView,  true,  new ItemConfiguration());
+
+        // We attempt the approach which doesn't shuffle views at all
+        ItemConfiguration noShuffleSolution = findConfigurationNoShuffle(pixelX, pixelY, minSpanX,
+                minSpanY, spanX, spanY, dragView, new ItemConfiguration());
+
+        ItemConfiguration finalSolution = null;
+        if (swapSolution.isSolution && swapSolution.area() >= noShuffleSolution.area()) {
+            finalSolution = swapSolution;
+        } else if (noShuffleSolution.isSolution) {
+            finalSolution = noShuffleSolution;
+        }
+
+        boolean foundSolution = true;
+        if (!DESTRUCTIVE_REORDER) {
+            setUseTempCoords(true);
+        }
+
+        if (finalSolution != null) {
+            result[0] = finalSolution.dragViewX;
+            result[1] = finalSolution.dragViewY;
+            resultSpan[0] = finalSolution.dragViewSpanX;
+            resultSpan[1] = finalSolution.dragViewSpanY;
+
+            // If we're just testing for a possible location (MODE_ACCEPT_DROP), we don't bother
+            // committing anything or animating anything as we just want to determine if a solution
+            // exists
+            if (mode == MODE_DRAG_OVER || mode == MODE_ON_DROP || mode == MODE_ON_DROP_EXTERNAL) {
+                if (!DESTRUCTIVE_REORDER) {
+                    copySolutionToTempState(finalSolution, dragView);
+                }
+                setItemPlacementDirty(true);
+                animateItemsToSolution(finalSolution, dragView, mode == MODE_ON_DROP);
+
+                if (!DESTRUCTIVE_REORDER &&
+                        (mode == MODE_ON_DROP || mode == MODE_ON_DROP_EXTERNAL)) {
+                    commitTempPlacement();
+                    completeAndClearReorderHintAnimations();
+                    setItemPlacementDirty(false);
+                } else {
+                    beginOrAdjustHintAnimations(finalSolution, dragView,
+                            REORDER_ANIMATION_DURATION);
+                }
+            }
+        } else {
+            foundSolution = false;
+            result[0] = result[1] = resultSpan[0] = resultSpan[1] = -1;
+        }
+
+        if ((mode == MODE_ON_DROP || !foundSolution) && !DESTRUCTIVE_REORDER) {
+            setUseTempCoords(false);
+        }
+
+        mShortcutsAndWidgets.requestLayout();
+        return result;
+    }
+
+    void setItemPlacementDirty(boolean dirty) {
+        mItemPlacementDirty = dirty;
+    }
+    boolean isItemPlacementDirty() {
+        return mItemPlacementDirty;
+    }
+
+    private class ItemConfiguration {
+        HashMap<View, CellAndSpan> map = new HashMap<View, CellAndSpan>();
+        boolean isSolution = false;
+        int dragViewX, dragViewY, dragViewSpanX, dragViewSpanY;
+
+        int area() {
+            return dragViewSpanX * dragViewSpanY;
+        }
+    }
+
+    private class CellAndSpan {
+        int x, y;
+        int spanX, spanY;
+
+        public CellAndSpan(int x, int y, int spanX, int spanY) {
+            this.x = x;
+            this.y = y;
+            this.spanX = spanX;
+            this.spanY = spanY;
+        }
+    }
+
     /**
      * Find a vacant area that will fit the given bounds nearest the requested
      * cell location. Uses Euclidean distance to score multiple vacant areas.
@@ -1237,6 +2346,27 @@
     }
 
     /**
+     * Find a vacant area that will fit the given bounds nearest the requested
+     * cell location. Uses Euclidean distance to score multiple vacant areas.
+     *
+     * @param pixelX The X location at which you want to search for a vacant area.
+     * @param pixelY The Y location at which you want to search for a vacant area.
+     * @param minSpanX The minimum horizontal span required
+     * @param minSpanY The minimum vertical span required
+     * @param spanX Horizontal span of the object.
+     * @param spanY Vertical span of the object.
+     * @param ignoreView Considers space occupied by this view as unoccupied
+     * @param result Previously returned value to possibly recycle.
+     * @return The X, Y cell of a vacant area that can contain this object,
+     *         nearest the requested location.
+     */
+    int[] findNearestVacantArea(int pixelX, int pixelY, int minSpanX, int minSpanY,
+            int spanX, int spanY, View ignoreView, int[] result, int[] resultSpan) {
+        return findNearestArea(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY, ignoreView, true,
+                result, resultSpan, mOccupied);
+    }
+
+    /**
      * Find a starting cell position that will fit the given bounds nearest the requested
      * cell location. Uses Euclidean distance to score multiple vacant areas.
      *
@@ -1272,7 +2402,7 @@
      * @return True if a vacant cell of the specified dimension was found, false otherwise.
      */
     boolean findCellForSpan(int[] cellXY, int spanX, int spanY) {
-        return findCellForSpanThatIntersectsIgnoring(cellXY, spanX, spanY, -1, -1, null);
+        return findCellForSpanThatIntersectsIgnoring(cellXY, spanX, spanY, -1, -1, null, mOccupied);
     }
 
     /**
@@ -1286,7 +2416,8 @@
      * @return
      */
     boolean findCellForSpanIgnoring(int[] cellXY, int spanX, int spanY, View ignoreView) {
-        return findCellForSpanThatIntersectsIgnoring(cellXY, spanX, spanY, -1, -1, ignoreView);
+        return findCellForSpanThatIntersectsIgnoring(cellXY, spanX, spanY, -1, -1,
+                ignoreView, mOccupied);
     }
 
     /**
@@ -1304,16 +2435,16 @@
     boolean findCellForSpanThatIntersects(int[] cellXY, int spanX, int spanY,
             int intersectX, int intersectY) {
         return findCellForSpanThatIntersectsIgnoring(
-                cellXY, spanX, spanY, intersectX, intersectY, null);
+                cellXY, spanX, spanY, intersectX, intersectY, null, mOccupied);
     }
 
     /**
      * The superset of the above two methods
      */
     boolean findCellForSpanThatIntersectsIgnoring(int[] cellXY, int spanX, int spanY,
-            int intersectX, int intersectY, View ignoreView) {
+            int intersectX, int intersectY, View ignoreView, boolean occupied[][]) {
         // mark space take by ignoreView as available (method checks if ignoreView is null)
-        markCellsAsUnoccupiedForView(ignoreView);
+        markCellsAsUnoccupiedForView(ignoreView, occupied);
 
         boolean foundCell = false;
         while (true) {
@@ -1339,7 +2470,7 @@
                 for (int x = startX; x < endX; x++) {
                     for (int i = 0; i < spanX; i++) {
                         for (int j = 0; j < spanY; j++) {
-                            if (mOccupied[x + i][y + j]) {
+                            if (occupied[x + i][y + j]) {
                                 // small optimization: we can skip to after the column we just found
                                 // an occupied cell
                                 x += i;
@@ -1367,7 +2498,7 @@
         }
 
         // re-mark space taken by ignoreView as occupied
-        markCellsAsOccupiedForView(ignoreView);
+        markCellsAsOccupiedForView(ignoreView, occupied);
         return foundCell;
     }
 
@@ -1403,11 +2534,10 @@
         }
 
         // Invalidate the drag data
-        mDragCell[0] = -1;
-        mDragCell[1] = -1;
+        mDragCell[0] = mDragCell[1] = -1;
         mDragOutlineAnims[mDragOutlineCurrent].animateOut();
         mDragOutlineCurrent = (mDragOutlineCurrent + 1) % mDragOutlineAnims.length;
-
+        revertTempState();
         setIsDragOverlapping(false);
     }
 
@@ -1435,7 +2565,7 @@
      * @param cellVSpan Height in cells
      * @param resultRect Rect into which to put the results
      */
-    public void cellToRect(int cellX, int cellY, int cellHSpan, int cellVSpan, RectF resultRect) {
+    public void cellToRect(int cellX, int cellY, int cellHSpan, int cellVSpan, Rect resultRect) {
         final int cellWidth = mCellWidth;
         final int cellHeight = mCellHeight;
         final int widthGap = mWidthGap;
@@ -1610,28 +2740,35 @@
         }
     }
 
-    public void onMove(View view, int newCellX, int newCellY) {
-        LayoutParams lp = (LayoutParams) view.getLayoutParams();
+    public void onMove(View view, int newCellX, int newCellY, int newSpanX, int newSpanY) {
         markCellsAsUnoccupiedForView(view);
-        markCellsForView(newCellX, newCellY, lp.cellHSpan, lp.cellVSpan, true);
+        markCellsForView(newCellX, newCellY, newSpanX, newSpanY, mOccupied, true);
     }
 
     public void markCellsAsOccupiedForView(View view) {
-        if (view == null || view.getParent() != mChildren) return;
+        markCellsAsOccupiedForView(view, mOccupied);
+    }
+    public void markCellsAsOccupiedForView(View view, boolean[][] occupied) {
+        if (view == null || view.getParent() != mShortcutsAndWidgets) return;
         LayoutParams lp = (LayoutParams) view.getLayoutParams();
-        markCellsForView(lp.cellX, lp.cellY, lp.cellHSpan, lp.cellVSpan, true);
+        markCellsForView(lp.cellX, lp.cellY, lp.cellHSpan, lp.cellVSpan, occupied, true);
     }
 
     public void markCellsAsUnoccupiedForView(View view) {
-        if (view == null || view.getParent() != mChildren) return;
+        markCellsAsUnoccupiedForView(view, mOccupied);
+    }
+    public void markCellsAsUnoccupiedForView(View view, boolean occupied[][]) {
+        if (view == null || view.getParent() != mShortcutsAndWidgets) return;
         LayoutParams lp = (LayoutParams) view.getLayoutParams();
-        markCellsForView(lp.cellX, lp.cellY, lp.cellHSpan, lp.cellVSpan, false);
+        markCellsForView(lp.cellX, lp.cellY, lp.cellHSpan, lp.cellVSpan, occupied, false);
     }
 
-    private void markCellsForView(int cellX, int cellY, int spanX, int spanY, boolean value) {
+    private void markCellsForView(int cellX, int cellY, int spanX, int spanY, boolean[][] occupied,
+            boolean value) {
+        if (cellX < 0 || cellY < 0) return;
         for (int x = cellX; x < cellX + spanX && x < mCountX; x++) {
             for (int y = cellY; y < cellY + spanY && y < mCountY; y++) {
-                mOccupied[x][y] = value;
+                occupied[x][y] = value;
             }
         }
     }
@@ -1694,6 +2831,21 @@
         public int cellY;
 
         /**
+         * Temporary horizontal location of the item in the grid during reorder
+         */
+        public int tmpCellX;
+
+        /**
+         * Temporary vertical location of the item in the grid during reorder
+         */
+        public int tmpCellY;
+
+        /**
+         * Indicates that the temporary coordinates should be used to layout the items
+         */
+        public boolean useTmpCoords;
+
+        /**
          * Number of cells spanned horizontally by the item.
          */
         @ViewDebug.ExportedProperty
@@ -1711,6 +2863,12 @@
          */
         public boolean isLockedToGrid = true;
 
+        /**
+         * Indicates whether this item can be reordered. Always true except in the case of the
+         * the AllApps button.
+         */
+        public boolean canReorder = true;
+
         // X coordinate of the view in the layout.
         @ViewDebug.ExportedProperty
         int x;
@@ -1752,15 +2910,15 @@
             if (isLockedToGrid) {
                 final int myCellHSpan = cellHSpan;
                 final int myCellVSpan = cellVSpan;
-                final int myCellX = cellX;
-                final int myCellY = cellY;
+                final int myCellX = useTmpCoords ? tmpCellX : cellX;
+                final int myCellY = useTmpCoords ? tmpCellY : cellY;
 
                 width = myCellHSpan * cellWidth + ((myCellHSpan - 1) * widthGap) -
                         leftMargin - rightMargin;
                 height = myCellVSpan * cellHeight + ((myCellVSpan - 1) * heightGap) -
                         topMargin - bottomMargin;
-                x = myCellX * (cellWidth + widthGap) + leftMargin;
-                y = myCellY * (cellHeight + heightGap) + topMargin;
+                x = (int) (myCellX * (cellWidth + widthGap) + leftMargin);
+                y = (int) (myCellY * (cellHeight + heightGap) + topMargin);
             }
         }
 
diff --git a/src/com/android/launcher2/CheckLongPressHelper.java b/src/com/android/launcher2/CheckLongPressHelper.java
new file mode 100644
index 0000000..5c3752a
--- /dev/null
+++ b/src/com/android/launcher2/CheckLongPressHelper.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher2;
+
+import android.view.View;
+
+public class CheckLongPressHelper {
+    private View mView;
+    private boolean mHasPerformedLongPress;
+    private CheckForLongPress mPendingCheckForLongPress;
+
+    class CheckForLongPress implements Runnable {
+        public void run() {
+            if ((mView.getParent() != null) && mView.hasWindowFocus()
+                    && !mHasPerformedLongPress) {
+                if (mView.performLongClick()) {
+                    mView.setPressed(false);
+                    mHasPerformedLongPress = true;
+                }
+            }
+        }
+    }
+
+    public CheckLongPressHelper(View v) {
+        mView = v;
+    }
+
+    public void postCheckForLongPress() {
+        mHasPerformedLongPress = false;
+
+        if (mPendingCheckForLongPress == null) {
+            mPendingCheckForLongPress = new CheckForLongPress();
+        }
+        mView.postDelayed(mPendingCheckForLongPress, LauncherApplication.getLongPressTimeout());
+    }
+
+    public void cancelLongPress() {
+        mHasPerformedLongPress = false;
+        if (mPendingCheckForLongPress != null) {
+            mView.removeCallbacks(mPendingCheckForLongPress);
+            mPendingCheckForLongPress = null;
+        }
+    }
+
+    public boolean hasPerformedLongPress() {
+        return mHasPerformedLongPress;
+    }
+}
diff --git a/src/com/android/launcher2/DeleteDropTarget.java b/src/com/android/launcher2/DeleteDropTarget.java
index f199708..7e4225b 100644
--- a/src/com/android/launcher2/DeleteDropTarget.java
+++ b/src/com/android/launcher2/DeleteDropTarget.java
@@ -16,26 +16,34 @@
 
 package com.android.launcher2;
 
+import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
+import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.drawable.TransitionDrawable;
 import android.util.AttributeSet;
 import android.view.View;
+import android.view.ViewConfiguration;
 import android.view.ViewGroup;
+import android.view.animation.AnimationUtils;
 import android.view.animation.DecelerateInterpolator;
+import android.view.animation.LinearInterpolator;
 
 import com.android.launcher.R;
 
 public class DeleteDropTarget extends ButtonDropTarget {
+    private static int DELETE_ANIMATION_DURATION = 285;
+    private static int MODE_FLING_DELETE_TO_TRASH = 0;
+    private static int MODE_FLING_DELETE_ALONG_VECTOR = 1;
 
-    private static int DELETE_ANIMATION_DURATION = 250;
+    private final int mFlingDeleteMode = MODE_FLING_DELETE_ALONG_VECTOR;
+
     private ColorStateList mOriginalTextColor;
-    private int mHoverColor = 0xFFFF0000;
     private TransitionDrawable mUninstallDrawable;
     private TransitionDrawable mRemoveDrawable;
     private TransitionDrawable mCurrentDrawable;
@@ -58,8 +66,6 @@
         // Get the hover color
         Resources r = getResources();
         mHoverColor = r.getColor(R.color.delete_target_hover_tint);
-        mHoverPaint.setColorFilter(new PorterDuffColorFilter(
-                mHoverColor, PorterDuff.Mode.SRC_ATOP));
         mUninstallDrawable = (TransitionDrawable) 
                 r.getDrawable(R.drawable.uninstall_target_selector);
         mRemoveDrawable = (TransitionDrawable) r.getDrawable(R.drawable.remove_target_selector);
@@ -99,6 +105,15 @@
         return (d.dragSource instanceof Workspace) && (d.dragInfo instanceof FolderInfo);
     }
 
+    private void setHoverColor() {
+        mCurrentDrawable.startTransition(mTransitionDuration);
+        setTextColor(mHoverColor);
+    }
+    private void resetHoverColor() {
+        mCurrentDrawable.resetTransition();
+        setTextColor(mOriginalTextColor);
+    }
+
     @Override
     public boolean acceptDrop(DragObject d) {
         // We can remove everything including App shortcuts, folders, widgets, etc.
@@ -134,8 +149,7 @@
         mCurrentDrawable = (TransitionDrawable) getCompoundDrawables()[0];
 
         mActive = isVisible;
-        mCurrentDrawable.resetTransition();
-        setTextColor(mOriginalTextColor);
+        resetHoverColor();
         ((ViewGroup) getParent()).setVisibility(isVisible ? View.VISIBLE : View.GONE);
         if (getText().length() > 0) {
             setText(isUninstall ? R.string.delete_target_uninstall_label
@@ -152,35 +166,27 @@
     public void onDragEnter(DragObject d) {
         super.onDragEnter(d);
 
-        mCurrentDrawable.startTransition(mTransitionDuration);
-        setTextColor(mHoverColor);
+        setHoverColor();
     }
 
     public void onDragExit(DragObject d) {
         super.onDragExit(d);
 
         if (!d.dragComplete) {
-            mCurrentDrawable.resetTransition();
-            setTextColor(mOriginalTextColor);
+            resetHoverColor();
+        } else {
+            // Restore the hover color if we are deleting
+            d.dragView.setColor(mHoverColor);
         }
     }
 
     private void animateToTrashAndCompleteDrop(final DragObject d) {
         DragLayer dragLayer = mLauncher.getDragLayer();
         Rect from = new Rect();
-        Rect to = new Rect();
         dragLayer.getViewRectRelativeToSelf(d.dragView, from);
-        dragLayer.getViewRectRelativeToSelf(this, to);
-
-        int width = mCurrentDrawable.getIntrinsicWidth();
-        int height = mCurrentDrawable.getIntrinsicHeight();
-        to.set(to.left + getPaddingLeft(), to.top + getPaddingTop(),
-                to.left + getPaddingLeft() + width, to.bottom);
-
-        // Center the destination rect about the trash icon
-        int xOffset = (int) -(d.dragView.getMeasuredWidth() - width) / 2;
-        int yOffset = (int) -(d.dragView.getMeasuredHeight() - height) / 2;
-        to.offset(xOffset, yOffset);
+        Rect to = getIconRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight(),
+                mCurrentDrawable.getIntrinsicWidth(), mCurrentDrawable.getIntrinsicHeight());
+        float scale = (float) to.width() / from.width();
 
         mSearchDropTargetBar.deferOnDragEnd();
         Runnable onAnimationEndRunnable = new Runnable() {
@@ -191,9 +197,10 @@
                 completeDrop(d);
             }
         };
-        dragLayer.animateView(d.dragView, from, to, 0.1f, 0.1f,
+        dragLayer.animateView(d.dragView, from, to, scale, 1f, 1f, 0.1f, 0.1f,
                 DELETE_ANIMATION_DURATION, new DecelerateInterpolator(2),
-                new DecelerateInterpolator(1.5f), onAnimationEndRunnable, false);
+                new LinearInterpolator(), onAnimationEndRunnable,
+                DragLayer.ANIMATION_END_DISAPPEAR, null);
     }
 
     private void completeDrop(DragObject d) {
@@ -231,4 +238,187 @@
     public void onDrop(DragObject d) {
         animateToTrashAndCompleteDrop(d);
     }
+
+    /**
+     * Creates an animation from the current drag view to the delete trash icon.
+     */
+    private AnimatorUpdateListener createFlingToTrashAnimatorListener(final DragLayer dragLayer,
+            DragObject d, PointF vel, ViewConfiguration config) {
+        final Rect to = getIconRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight(),
+                mCurrentDrawable.getIntrinsicWidth(), mCurrentDrawable.getIntrinsicHeight());
+        final Rect from = new Rect();
+        dragLayer.getViewRectRelativeToSelf(d.dragView, from);
+
+        // Calculate how far along the velocity vector we should put the intermediate point on
+        // the bezier curve
+        float velocity = Math.abs(vel.length());
+        float vp = Math.min(1f, velocity / (config.getScaledMaximumFlingVelocity() / 2f));
+        int offsetY = (int) (-from.top * vp);
+        int offsetX = (int) (offsetY / (vel.y / vel.x));
+        final float y2 = from.top + offsetY;                        // intermediate t/l
+        final float x2 = from.left + offsetX;
+        final float x1 = from.left;                                 // drag view t/l
+        final float y1 = from.top;
+        final float x3 = to.left;                                   // delete target t/l
+        final float y3 = to.top;
+
+        final TimeInterpolator scaleAlphaInterpolator = new TimeInterpolator() {
+            @Override
+            public float getInterpolation(float t) {
+                return t * t * t * t * t * t * t * t;
+            }
+        };
+        return new AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator animation) {
+                final DragView dragView = (DragView) dragLayer.getAnimatedView();
+                float t = ((Float) animation.getAnimatedValue()).floatValue();
+                float tp = scaleAlphaInterpolator.getInterpolation(t);
+                float initialScale = dragView.getInitialScale();
+                float finalAlpha = 0.5f;
+                float scale = dragView.getScaleX();
+                float x1o = ((1f - scale) * dragView.getMeasuredWidth()) / 2f;
+                float y1o = ((1f - scale) * dragView.getMeasuredHeight()) / 2f;
+                float x = (1f - t) * (1f - t) * (x1 - x1o) + 2 * (1f - t) * t * (x2 - x1o) +
+                        (t * t) * x3;
+                float y = (1f - t) * (1f - t) * (y1 - y1o) + 2 * (1f - t) * t * (y2 - x1o) +
+                        (t * t) * y3;
+
+                dragView.setTranslationX(x);
+                dragView.setTranslationY(y);
+                dragView.setScaleX(initialScale * (1f - tp));
+                dragView.setScaleY(initialScale * (1f - tp));
+                dragView.setAlpha(finalAlpha + (1f - finalAlpha) * (1f - tp));
+            }
+        };
+    }
+
+    /**
+     * Creates an animation from the current drag view along its current velocity vector.
+     * For this animation, the alpha runs for a fixed duration and we update the position
+     * progressively.
+     */
+    private static class FlingAlongVectorAnimatorUpdateListener implements AnimatorUpdateListener {
+        private static float FRICTION = 0.93f;
+
+        private DragLayer mDragLayer;
+        private PointF mVelocity;
+        private Rect mFrom;
+        private long mPrevTime;
+        private boolean mHasOffsetForScale;
+
+        private final TimeInterpolator mAlphaInterpolator = new DecelerateInterpolator(1.5f);
+
+        public FlingAlongVectorAnimatorUpdateListener(DragLayer dragLayer, PointF vel, Rect from,
+                long startTime) {
+            mDragLayer = dragLayer;
+            mVelocity = vel;
+            mFrom = from;
+            mPrevTime = startTime;
+        }
+
+        @Override
+        public void onAnimationUpdate(ValueAnimator animation) {
+            final DragView dragView = (DragView) mDragLayer.getAnimatedView();
+            float t = ((Float) animation.getAnimatedValue()).floatValue();
+            long curTime = AnimationUtils.currentAnimationTimeMillis();
+
+            if (!mHasOffsetForScale) {
+                mHasOffsetForScale = true;
+                float scale = dragView.getScaleX();
+                float xOffset = ((scale - 1f) * dragView.getMeasuredWidth()) / 2f;
+                float yOffset = ((scale - 1f) * dragView.getMeasuredHeight()) / 2f;
+
+                mFrom.left += xOffset;
+                mFrom.top += yOffset;
+            }
+
+            mFrom.left += (mVelocity.x * (curTime - mPrevTime) / 1000f);
+            mFrom.top += (mVelocity.y * (curTime - mPrevTime) / 1000f);
+
+            dragView.setTranslationX(mFrom.left);
+            dragView.setTranslationY(mFrom.top);
+            dragView.setAlpha(1f - mAlphaInterpolator.getInterpolation(t));
+
+            mVelocity.x *= FRICTION;
+            mVelocity.y *= FRICTION;
+            mPrevTime = curTime;
+        }
+    };
+    private AnimatorUpdateListener createFlingAlongVectorAnimatorListener(final DragLayer dragLayer,
+            DragObject d, PointF vel, final long startTime, final int duration,
+            ViewConfiguration config) {
+        final Rect from = new Rect();
+        dragLayer.getViewRectRelativeToSelf(d.dragView, from);
+
+        return new FlingAlongVectorAnimatorUpdateListener(dragLayer, vel, from, startTime);
+    }
+
+    public void onFlingToDelete(final DragObject d, int x, int y, PointF vel) {
+        final boolean isAllApps = d.dragSource instanceof AppsCustomizePagedView;
+
+        // Don't highlight the icon as it's animating
+        d.dragView.setColor(0);
+        d.dragView.updateInitialScaleToCurrentScale();
+        // Don't highlight the target if we are flinging from AllApps
+        if (isAllApps) {
+            resetHoverColor();
+        }
+
+        if (mFlingDeleteMode == MODE_FLING_DELETE_TO_TRASH) {
+            // Defer animating out the drop target if we are animating to it
+            mSearchDropTargetBar.deferOnDragEnd();
+            mSearchDropTargetBar.finishAnimations();
+        }
+
+        final ViewConfiguration config = ViewConfiguration.get(mLauncher);
+        final DragLayer dragLayer = mLauncher.getDragLayer();
+        final int duration = DELETE_ANIMATION_DURATION;
+        final long startTime = AnimationUtils.currentAnimationTimeMillis();
+
+        // NOTE: Because it takes time for the first frame of animation to actually be
+        // called and we expect the animation to be a continuation of the fling, we have
+        // to account for the time that has elapsed since the fling finished.  And since
+        // we don't have a startDelay, we will always get call to update when we call
+        // start() (which we want to ignore).
+        final TimeInterpolator tInterpolator = new TimeInterpolator() {
+            private int mCount = -1;
+            private float mOffset = 0f;
+
+            @Override
+            public float getInterpolation(float t) {
+                if (mCount < 0) {
+                    mCount++;
+                } else if (mCount == 0) {
+                    mOffset = Math.min(0.5f, (float) (AnimationUtils.currentAnimationTimeMillis() -
+                            startTime) / duration);
+                    mCount++;
+                }
+                return Math.min(1f, mOffset + t);
+            }
+        };
+        AnimatorUpdateListener updateCb = null;
+        if (mFlingDeleteMode == MODE_FLING_DELETE_TO_TRASH) {
+            updateCb = createFlingToTrashAnimatorListener(dragLayer, d, vel, config);
+        } else if (mFlingDeleteMode == MODE_FLING_DELETE_ALONG_VECTOR) {
+            updateCb = createFlingAlongVectorAnimatorListener(dragLayer, d, vel, startTime,
+                    duration, config);
+        }
+        Runnable onAnimationEndRunnable = new Runnable() {
+            @Override
+            public void run() {
+                mSearchDropTargetBar.onDragEnd();
+
+                // If we are dragging from AllApps, then we allow AppsCustomizePagedView to clean up
+                // itself, otherwise, complete the drop to initiate the deletion process
+                if (!isAllApps) {
+                    mLauncher.exitSpringLoadedDragMode();
+                    completeDrop(d);
+                }
+                mLauncher.getDragController().onDeferredEndFling(d);
+            }
+        };
+        dragLayer.animateView(d.dragView, updateCb, duration, tInterpolator, onAnimationEndRunnable,
+                DragLayer.ANIMATION_END_DISAPPEAR, null);
+    }
 }
diff --git a/src/com/android/launcher2/DragController.java b/src/com/android/launcher2/DragController.java
index a120ac5..2a1d65a 100644
--- a/src/com/android/launcher2/DragController.java
+++ b/src/com/android/launcher2/DragController.java
@@ -19,6 +19,7 @@
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Point;
+import android.graphics.PointF;
 import android.graphics.Rect;
 import android.os.Handler;
 import android.os.IBinder;
@@ -26,6 +27,7 @@
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
+import android.view.VelocityTracker;
 import android.view.View;
 import android.view.ViewConfiguration;
 import android.view.inputmethod.InputMethodManager;
@@ -47,8 +49,9 @@
     /** Indicates the drag is a copy.  */
     public static int DRAG_ACTION_COPY = 1;
 
-    private static final int SCROLL_DELAY = 600;
-    private static final int VIBRATE_DURATION = 35;
+    private static final int SCROLL_DELAY = 500;
+    private static final int RESCROLL_DELAY = 750;
+    private static final int VIBRATE_DURATION = 15;
 
     private static final boolean PROFILE_DRAWING_DURING_DRAG = false;
 
@@ -59,6 +62,9 @@
     static final int SCROLL_LEFT = 0;
     static final int SCROLL_RIGHT = 1;
 
+    private static final float MAX_FLING_DEGREES = 35f;
+    private static final int FLING_TO_DELETE_THRESHOLD_Y_VELOCITY = -1400;
+
     private Launcher mLauncher;
     private Handler mHandler;
     private final Vibrator mVibrator = new Vibrator();
@@ -85,8 +91,8 @@
 
     /** Who can receive drop events */
     private ArrayList<DropTarget> mDropTargets = new ArrayList<DropTarget>();
-
     private ArrayList<DragListener> mListeners = new ArrayList<DragListener>();
+    private DropTarget mFlingToDeleteDropTarget;
 
     /** The window token used as the parent for the DragView. */
     private IBinder mWindowToken;
@@ -110,6 +116,9 @@
     private int mTmpPoint[] = new int[2];
     private Rect mDragLayerRect = new Rect();
 
+    protected int mFlingToDeleteThresholdVelocity;
+    private VelocityTracker mVelocityTracker;
+
     /**
      * Interface to receive notifications when a drag starts or stops
      */
@@ -140,6 +149,10 @@
         mLauncher = launcher;
         mHandler = new Handler();
         mScrollZone = launcher.getResources().getDimensionPixelSize(R.dimen.scroll_zone);
+        mVelocityTracker = VelocityTracker.obtain();
+
+        float density = launcher.getResources().getDisplayMetrics().density;
+        mFlingToDeleteThresholdVelocity = (int) (FLING_TO_DELETE_THRESHOLD_Y_VELOCITY * density);
     }
 
     public boolean dragging() {
@@ -184,7 +197,7 @@
         int dragLayerX = loc[0];
         int dragLayerY = loc[1];
 
-        startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, dragRegion);
+        startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, dragRegion, 1f);
         b.recycle();
 
         if (dragAction == DRAG_ACTION_MOVE) {
@@ -205,13 +218,16 @@
      *          Makes dragging feel more precise, e.g. you can clip out a transparent border
      */
     public void startDrag(View v, Bitmap bmp, DragSource source, Object dragInfo, int dragAction,
-            Rect dragRegion) {
+            Rect dragRegion, float initialDragViewScale) {
         int[] loc = mCoordinatesTemp;
         mLauncher.getDragLayer().getLocationInDragLayer(v, loc);
-        int dragLayerX = loc[0];
-        int dragLayerY = loc[1];
+        int dragLayerX = loc[0] + v.getPaddingLeft() +
+                (int) ((initialDragViewScale * bmp.getWidth() - bmp.getWidth()) / 2);
+        int dragLayerY = loc[1] + v.getPaddingTop() +
+                (int) ((initialDragViewScale * bmp.getHeight() - bmp.getHeight()) / 2);
 
-        startDrag(bmp, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, dragRegion);
+        startDrag(bmp, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, dragRegion,
+                initialDragViewScale);
 
         if (dragAction == DRAG_ACTION_MOVE) {
             v.setVisibility(View.GONE);
@@ -229,28 +245,12 @@
      * @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 dragLayerX, int dragLayerY,
-            DragSource source, Object dragInfo, int dragAction) {
-        startDrag(b, dragLayerX, dragLayerY, source, dragInfo, dragAction, null, null);
-    }
-
-    /**
-     * Starts a drag.
-     *
-     * @param b The bitmap to display as the drag image.  It will be re-scaled to the
-     *          enlarged size.
-     * @param dragLayerX The x position in the DragLayer of the left-top of the bitmap.
-     * @param dragLayerY The y position in the DragLayer of the left-top of the bitmap.
-     * @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}
      * @param dragRegion Coordinates within the bitmap b for the position of item being dragged.
      *          Makes dragging feel more precise, e.g. you can clip out a transparent border
      */
     public void startDrag(Bitmap b, int dragLayerX, int dragLayerY,
-            DragSource source, Object dragInfo, int dragAction, Point dragOffset, Rect dragRegion) {
+            DragSource source, Object dragInfo, int dragAction, Point dragOffset, Rect dragRegion,
+            float initialDragViewScale) {
         if (PROFILE_DRAWING_DURING_DRAG) {
             android.os.Debug.startMethodTracing("Launcher");
         }
@@ -285,7 +285,7 @@
         mVibrator.vibrate(VIBRATE_DURATION);
 
         final DragView dragView = mDragObject.dragView = new DragView(mLauncher, b, registrationX,
-                registrationY, 0, 0, b.getWidth(), b.getHeight());
+                registrationY, 0, 0, b.getWidth(), b.getHeight(), initialDragViewScale);
 
         if (dragOffset != null) {
             dragView.setDragVisualizeOffset(new Point(dragOffset));
@@ -363,9 +363,10 @@
             if (mLastDropTarget != null) {
                 mLastDropTarget.onDragExit(mDragObject);
             }
+            mDragObject.deferDragViewCleanupPostAnimation = false;
             mDragObject.cancelled = true;
             mDragObject.dragComplete = true;
-            mDragObject.dragSource.onDropCompleted(null, mDragObject, false);
+            mDragObject.dragSource.onDropCompleted(null, mDragObject, false, false);
         }
         endDrag();
     }
@@ -376,7 +377,11 @@
             if (rawDragInfo instanceof ShortcutInfo) {
                 ShortcutInfo dragInfo = (ShortcutInfo) rawDragInfo;
                 for (ApplicationInfo info : apps) {
-                    if (dragInfo.intent.getComponent().equals(info.intent.getComponent())) {
+                    // Added null checks to prevent NPE we've seen in the wild
+                    if (dragInfo != null &&
+                        dragInfo.intent != null &&
+                        info.intent != null &&
+                        dragInfo.intent.getComponent().equals(info.intent.getComponent())) {
                         cancelDrag();
                         return;
                     }
@@ -388,14 +393,41 @@
     private void endDrag() {
         if (mDragging) {
             mDragging = false;
-            for (DragListener listener : mListeners) {
-                listener.onDragEnd();
-            }
+            clearScrollRunnable();
+            boolean isDeferred = false;
             if (mDragObject.dragView != null) {
-                mDragObject.dragView.remove();
+                isDeferred = mDragObject.deferDragViewCleanupPostAnimation;
+                if (!isDeferred) {
+                    mDragObject.dragView.remove();
+                }
                 mDragObject.dragView = null;
             }
+
+            // Only end the drag if we are not deferred
+            if (!isDeferred) {
+                for (DragListener listener : mListeners) {
+                    listener.onDragEnd();
+                }
+            }
         }
+
+        releaseVelocityTracker();
+    }
+
+    /**
+     * This only gets called as a result of drag view cleanup being deferred in endDrag();
+     */
+    void onDeferredEndDrag(DragView dragView) {
+        dragView.remove();
+
+        // If we skipped calling onDragEnd() before, do it now
+        for (DragListener listener : mListeners) {
+            listener.onDragEnd();
+        }
+    }
+
+    void onDeferredEndFling(DropTarget.DragObject d) {
+        d.dragSource.onFlingToDeleteCompleted();
     }
 
     /**
@@ -416,8 +448,11 @@
             Log.d(Launcher.TAG, "DragController.onInterceptTouchEvent " + ev + " mDragging="
                     + mDragging);
         }
-        final int action = ev.getAction();
 
+        // Update the velocity tracker
+        acquireVelocityTrackerAndAddMovement(ev);
+
+        final int action = ev.getAction();
         final int[] dragLayerPos = getClampedDragLayerPos(ev.getX(), ev.getY());
         final int dragLayerX = dragLayerPos[0];
         final int dragLayerY = dragLayerPos[1];
@@ -433,7 +468,12 @@
                 break;
             case MotionEvent.ACTION_UP:
                 if (mDragging) {
-                    drop(dragLayerX, dragLayerY);
+                    PointF vec = isFlingingToDelete(mDragObject.dragSource);
+                    if (vec != null) {
+                        dropOnFlingToDeleteTarget(dragLayerX, dragLayerY, vec);
+                    } else {
+                        drop(dragLayerX, dragLayerY);
+                    }
                 }
                 endDrag();
                 break;
@@ -456,6 +496,15 @@
         return mMoveTarget != null && mMoveTarget.dispatchUnhandledMove(focused, direction);
     }
 
+    private void clearScrollRunnable() {
+        mHandler.removeCallbacks(mScrollRunnable);
+        if (mScrollState == SCROLL_WAITING_IN_ZONE) {
+            mScrollState = SCROLL_OUTSIDE_ZONE;
+            mScrollRunnable.setDirection(SCROLL_RIGHT);
+            mDragScroller.onExitScrollArea();
+        }
+    }
+
     private void handleMoveEvent(int x, int y) {
         mDragObject.dragView.move(x, y);
 
@@ -491,30 +540,32 @@
             Math.sqrt(Math.pow(mLastTouch[0] - x, 2) + Math.pow(mLastTouch[1] - y, 2));
         mLastTouch[0] = x;
         mLastTouch[1] = y;
+        final int delay = mDistanceSinceScroll < slop ? RESCROLL_DELAY : SCROLL_DELAY;
 
         if (x < mScrollZone) {
-            if (mScrollState == SCROLL_OUTSIDE_ZONE && mDistanceSinceScroll > slop) {
+            if (mScrollState == SCROLL_OUTSIDE_ZONE) {
                 mScrollState = SCROLL_WAITING_IN_ZONE;
                 if (mDragScroller.onEnterScrollArea(x, y, SCROLL_LEFT)) {
                     mScrollRunnable.setDirection(SCROLL_LEFT);
-                    mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
+                    mHandler.postDelayed(mScrollRunnable, delay);
                 }
             }
         } else if (x > mScrollView.getWidth() - mScrollZone) {
-            if (mScrollState == SCROLL_OUTSIDE_ZONE && mDistanceSinceScroll > slop) {
+            if (mScrollState == SCROLL_OUTSIDE_ZONE) {
                 mScrollState = SCROLL_WAITING_IN_ZONE;
                 if (mDragScroller.onEnterScrollArea(x, y, SCROLL_RIGHT)) {
                     mScrollRunnable.setDirection(SCROLL_RIGHT);
-                    mHandler.postDelayed(mScrollRunnable, SCROLL_DELAY);
+                    mHandler.postDelayed(mScrollRunnable, delay);
                 }
             }
         } else {
-            if (mScrollState == SCROLL_WAITING_IN_ZONE) {
-                mScrollState = SCROLL_OUTSIDE_ZONE;
-                mScrollRunnable.setDirection(SCROLL_RIGHT);
-                mHandler.removeCallbacks(mScrollRunnable);
-                mDragScroller.onExitScrollArea();
-            }
+            clearScrollRunnable();
+        }
+    }
+
+    public void forceMoveEvent() {
+        if (mDragging) {
+            handleMoveEvent(mDragObject.x, mDragObject.y);
         }
     }
 
@@ -526,6 +577,9 @@
             return false;
         }
 
+        // Update the velocity tracker
+        acquireVelocityTrackerAndAddMovement(ev);
+
         final int action = ev.getAction();
         final int[] dragLayerPos = getClampedDragLayerPos(ev.getX(), ev.getY());
         final int dragLayerX = dragLayerPos[0];
@@ -550,14 +604,20 @@
         case MotionEvent.ACTION_UP:
             // Ensure that we've processed a move event at the current pointer location.
             handleMoveEvent(dragLayerX, dragLayerY);
-
             mHandler.removeCallbacks(mScrollRunnable);
+
             if (mDragging) {
-                drop(dragLayerX, dragLayerY);
+                PointF vec = isFlingingToDelete(mDragObject.dragSource);
+                if (vec != null) {
+                    dropOnFlingToDeleteTarget(dragLayerX, dragLayerY, vec);
+                } else {
+                    drop(dragLayerX, dragLayerY);
+                }
             }
             endDrag();
             break;
         case MotionEvent.ACTION_CANCEL:
+            mHandler.removeCallbacks(mScrollRunnable);
             cancelDrag();
             break;
         }
@@ -565,6 +625,60 @@
         return true;
     }
 
+    /**
+     * Determines whether the user flung the current item to delete it.
+     *
+     * @return the vector at which the item was flung, or null if no fling was detected.
+     */
+    private PointF isFlingingToDelete(DragSource source) {
+        if (mFlingToDeleteDropTarget == null) return null;
+        if (!source.supportsFlingToDelete()) return null;
+
+        ViewConfiguration config = ViewConfiguration.get(mLauncher);
+        mVelocityTracker.computeCurrentVelocity(1000, config.getScaledMaximumFlingVelocity());
+
+        if (mVelocityTracker.getYVelocity() < mFlingToDeleteThresholdVelocity) {
+            // Do a quick dot product test to ensure that we are flinging upwards
+            PointF vel = new PointF(mVelocityTracker.getXVelocity(),
+                    mVelocityTracker.getYVelocity());
+            PointF upVec = new PointF(0f, -1f);
+            float theta = (float) Math.acos(((vel.x * upVec.x) + (vel.y * upVec.y)) /
+                    (vel.length() * upVec.length()));
+            if (theta <= Math.toRadians(MAX_FLING_DEGREES)) {
+                return vel;
+            }
+        }
+        return null;
+    }
+
+    private void dropOnFlingToDeleteTarget(float x, float y, PointF vel) {
+        final int[] coordinates = mCoordinatesTemp;
+
+        mDragObject.x = coordinates[0];
+        mDragObject.y = coordinates[1];
+
+        // Clean up dragging on the target if it's not the current fling delete target otherwise,
+        // start dragging to it.
+        if (mLastDropTarget != null && mFlingToDeleteDropTarget != mLastDropTarget) {
+            mLastDropTarget.onDragExit(mDragObject);
+        }
+
+        // Drop onto the fling-to-delete target
+        boolean accepted = false;
+        mFlingToDeleteDropTarget.onDragEnter(mDragObject);
+        // We must set dragComplete to true _only_ after we "enter" the fling-to-delete target for
+        // "drop"
+        mDragObject.dragComplete = true;
+        mFlingToDeleteDropTarget.onDragExit(mDragObject);
+        if (mFlingToDeleteDropTarget.acceptDrop(mDragObject)) {
+            mFlingToDeleteDropTarget.onFlingToDelete(mDragObject, mDragObject.x, mDragObject.y,
+                    vel);
+            accepted = true;
+        }
+        mDragObject.dragSource.onDropCompleted((View) mFlingToDeleteDropTarget, mDragObject, true,
+                accepted);
+    }
+
     private void drop(float x, float y) {
         final int[] coordinates = mCoordinatesTemp;
         final DropTarget dropTarget = findDropTarget((int) x, (int) y, coordinates);
@@ -580,7 +694,7 @@
                 accepted = true;
             }
         }
-        mDragObject.dragSource.onDropCompleted((View) dropTarget, mDragObject, accepted);
+        mDragObject.dragSource.onDropCompleted((View) dropTarget, mDragObject, false, accepted);
     }
 
     private DropTarget findDropTarget(int x, int y, int[] dropCoordinates) {
@@ -655,6 +769,27 @@
     }
 
     /**
+     * Sets the current fling-to-delete drop target.
+     */
+    public void setFlingToDeleteDropTarget(DropTarget target) {
+        mFlingToDeleteDropTarget = target;
+    }
+
+    private void acquireVelocityTrackerAndAddMovement(MotionEvent ev) {
+        if (mVelocityTracker == null) {
+            mVelocityTracker = VelocityTracker.obtain();
+        }
+        mVelocityTracker.addMovement(ev);
+    }
+
+    private void releaseVelocityTracker() {
+        if (mVelocityTracker != null) {
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+        }
+    }
+
+    /**
      * Set which view scrolls for touch events near the edge of the screen.
      */
     public void setScrollView(View v) {
@@ -681,6 +816,11 @@
                 mScrollState = SCROLL_OUTSIDE_ZONE;
                 mDistanceSinceScroll = 0;
                 mDragScroller.onExitScrollArea();
+
+                if (isDragging()) {
+                    // Force an update so that we can requeue the scroller if necessary
+                    forceMoveEvent();
+                }
             }
         }
 
diff --git a/src/com/android/launcher2/DragLayer.java b/src/com/android/launcher2/DragLayer.java
index 9154771..9452857 100644
--- a/src/com/android/launcher2/DragLayer.java
+++ b/src/com/android/launcher2/DragLayer.java
@@ -18,15 +18,15 @@
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
 import android.animation.TimeInterpolator;
 import android.animation.ValueAnimator;
 import android.animation.ValueAnimator.AnimatorUpdateListener;
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.PointF;
 import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
@@ -34,6 +34,7 @@
 import android.view.ViewParent;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
+import android.view.animation.AnimationUtils;
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.Interpolator;
 import android.widget.FrameLayout;
@@ -62,15 +63,17 @@
     private ValueAnimator mDropAnim = null;
     private ValueAnimator mFadeOutAnim = null;
     private TimeInterpolator mCubicEaseOutInterpolator = new DecelerateInterpolator(1.5f);
-    private View mDropView = null;
+    private DragView mDropView = null;
+    private int mAnchorViewInitialScrollX = 0;
+    private View mAnchorView = null;
 
-    private int[] mDropViewPos = new int[2];
-    private float mDropViewScale;
-    private float mDropViewAlpha;
     private boolean mHoverPointClosesFolder = false;
     private Rect mHitRect = new Rect();
     private int mWorkspaceIndex = -1;
     private int mQsbIndex = -1;
+    public static final int ANIMATION_END_DISAPPEAR = 0;
+    public static final int ANIMATION_END_FADE_OUT = 1;
+    public static final int ANIMATION_END_REMAIN_VISIBLE = 2;
 
     /**
      * Used to create a new DragLayer from XML.
@@ -412,26 +415,29 @@
         animateViewIntoPosition(dragView, child, null);
     }
 
-    public void animateViewIntoPosition(DragView dragView, final int[] pos, float scale,
-            Runnable onFinishRunnable) {
+    public void animateViewIntoPosition(DragView dragView, final int[] pos, float alpha,
+            float scaleX, float scaleY, int animationEndStyle, Runnable onFinishRunnable,
+            int duration) {
         Rect r = new Rect();
         getViewRectRelativeToSelf(dragView, r);
         final int fromX = r.left;
         final int fromY = r.top;
 
-        animateViewIntoPosition(dragView, fromX, fromY, pos[0], pos[1], scale,
-                onFinishRunnable, true, -1);
+        animateViewIntoPosition(dragView, fromX, fromY, pos[0], pos[1], alpha, 1, 1, scaleX, scaleY,
+                onFinishRunnable, animationEndStyle, duration, null);
     }
 
     public void animateViewIntoPosition(DragView dragView, final View child,
             final Runnable onFinishAnimationRunnable) {
-        animateViewIntoPosition(dragView, child, -1, onFinishAnimationRunnable);
+        animateViewIntoPosition(dragView, child, -1, onFinishAnimationRunnable, null);
     }
 
     public void animateViewIntoPosition(DragView dragView, final View child, int duration,
-            final Runnable onFinishAnimationRunnable) {
-        ((CellLayoutChildren) child.getParent()).measureChild(child);
+            final Runnable onFinishAnimationRunnable, View anchorView) {
+        ShortcutAndWidgetContainer parentChildren = (ShortcutAndWidgetContainer) child.getParent();
+        CellLayout parent = (CellLayout) (CellLayout) parentChildren.getParent();
         CellLayout.LayoutParams lp =  (CellLayout.LayoutParams) child.getLayoutParams();
+        parentChildren.measureChild(child);
 
         Rect r = new Rect();
         getViewRectRelativeToSelf(dragView, r);
@@ -439,23 +445,28 @@
         int coord[] = new int[2];
         coord[0] = lp.x;
         coord[1] = lp.y;
+
         // Since the child hasn't necessarily been laid out, we force the lp to be updated with
         // the correct coordinates (above) and use these to determine the final location
         float scale = getDescendantCoordRelativeToSelf((View) child.getParent(), coord);
         int toX = coord[0];
         int toY = coord[1];
         if (child instanceof TextView) {
+            float childrenScale = parent.getChildrenScale();
             TextView tv = (TextView) child;
-            Drawable d = tv.getCompoundDrawables()[1];
 
-            // Center in the y coordinate about the target's drawable
-            toY += Math.round(scale * tv.getPaddingTop());
-            toY -= (dragView.getHeight() - (int) Math.round(scale * d.getIntrinsicHeight())) / 2;
-            // Center in the x coordinate about the target's drawable
+            // The child may be scaled (always about the center of the view) so to account for it,
+            // we have to offset the position by the scaled size.  Once we do that, we can center
+            // the drag view about the scaled child view.
+            toY += Math.round(((1f - childrenScale) * child.getMeasuredHeight()) / 2 +
+                    scale * childrenScale * tv.getPaddingTop());
+            toY -= dragView.getMeasuredHeight() * (1 - scale * childrenScale) / 2;
             toX -= (dragView.getMeasuredWidth() - Math.round(scale * child.getMeasuredWidth())) / 2;
+
+            scale *= childrenScale;
         } else if (child instanceof FolderIcon) {
             // Account for holographic blur padding on the drag view
-            toY -= HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS / 2;
+            toY -= Workspace.DRAG_BITMAP_PADDING / 2;
             // Center in the x coordinate about the target's drawable
             toX -= (dragView.getMeasuredWidth() - Math.round(scale * child.getMeasuredWidth())) / 2;
         } else {
@@ -467,34 +478,27 @@
         final int fromX = r.left;
         final int fromY = r.top;
         child.setVisibility(INVISIBLE);
-        child.setAlpha(0);
         Runnable onCompleteRunnable = new Runnable() {
             public void run() {
                 child.setVisibility(VISIBLE);
-                ObjectAnimator oa = ObjectAnimator.ofFloat(child, "alpha", 0f, 1f);
-                oa.setDuration(60);
-                oa.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(android.animation.Animator animation) {
-                        if (onFinishAnimationRunnable != null) {
-                            onFinishAnimationRunnable.run();
-                        }
-                    }
-                });
-                oa.start();
+                if (onFinishAnimationRunnable != null) {
+                    onFinishAnimationRunnable.run();
+                }
             }
         };
-        animateViewIntoPosition(dragView, fromX, fromY, toX, toY, scale,
-                onCompleteRunnable, true, duration);
+        animateViewIntoPosition(dragView, fromX, fromY, toX, toY, 1, 1, 1, scale, scale,
+                onCompleteRunnable, ANIMATION_END_DISAPPEAR, duration, anchorView);
     }
 
-    private void animateViewIntoPosition(final View view, final int fromX, final int fromY,
-            final int toX, final int toY, float finalScale, Runnable onCompleteRunnable,
-            boolean fadeOut, int duration) {
+    public void animateViewIntoPosition(final DragView view, final int fromX, final int fromY,
+            final int toX, final int toY, float finalAlpha, float initScaleX, float initScaleY,
+            float finalScaleX, float finalScaleY, Runnable onCompleteRunnable,
+            int animationEndStyle, int duration, View anchorView) {
         Rect from = new Rect(fromX, fromY, fromX +
                 view.getMeasuredWidth(), fromY + view.getMeasuredHeight());
         Rect to = new Rect(toX, toY, toX + view.getMeasuredWidth(), toY + view.getMeasuredHeight());
-        animateView(view, from, to, 1f, finalScale, duration, null, null, onCompleteRunnable, true);
+        animateView(view, from, to, finalAlpha, initScaleX, initScaleY, finalScaleX, finalScaleY, duration,
+                null, null, onCompleteRunnable, animationEndStyle, anchorView);
     }
 
     /**
@@ -514,11 +518,16 @@
      * @param onCompleteRunnable Optional runnable to run on animation completion.
      * @param fadeOut Whether or not to fade out the view once the animation completes. If true,
      *        the runnable will execute after the view is faded out.
+     * @param anchorView If not null, this represents the view which the animated view stays
+     *        anchored to in case scrolling is currently taking place. Note: currently this is
+     *        only used for the X dimension for the case of the workspace.
      */
-    public void animateView(final View view, final Rect from, final Rect to, final float finalAlpha,
-            final float finalScale, int duration, final Interpolator motionInterpolator,
-            final Interpolator alphaInterpolator, final Runnable onCompleteRunnable,
-            final boolean fadeOut) {
+    public void animateView(final DragView view, final Rect from, final Rect to,
+            final float finalAlpha, final float initScaleX, final float initScaleY,
+            final float finalScaleX, final float finalScaleY, int duration,
+            final Interpolator motionInterpolator, final Interpolator alphaInterpolator,
+            final Runnable onCompleteRunnable, final int animationEndStyle, View anchorView) {
+
         // Calculate the duration of the animation based on the object's distance
         final float dist = (float) Math.sqrt(Math.pow(to.left - from.left, 2) +
                 Math.pow(to.top - from.top, 2));
@@ -531,63 +540,116 @@
             if (dist < maxDist) {
                 duration *= mCubicEaseOutInterpolator.getInterpolation(dist / maxDist);
             }
+            duration = Math.max(duration, res.getInteger(R.integer.config_dropAnimMinDuration));
         }
 
-        if (mDropAnim != null) {
-            mDropAnim.cancel();
-        }
-
-        if (mFadeOutAnim != null) {
-            mFadeOutAnim.cancel();
-        }
-
-        mDropView = view;
-        final float initialAlpha = view.getAlpha();
-        mDropAnim = new ValueAnimator();
+        // Fall back to cubic ease out interpolator for the animation if none is specified
+        TimeInterpolator interpolator = null;
         if (alphaInterpolator == null || motionInterpolator == null) {
-            mDropAnim.setInterpolator(mCubicEaseOutInterpolator);
+            interpolator = mCubicEaseOutInterpolator;
         }
 
-        mDropAnim.setDuration(duration);
-        mDropAnim.setFloatValues(0.0f, 1.0f);
-        mDropAnim.removeAllUpdateListeners();
-        mDropAnim.addUpdateListener(new AnimatorUpdateListener() {
+        // Animate the view
+        final float initAlpha = view.getAlpha();
+        final float dropViewScale = view.getScaleX();
+        AnimatorUpdateListener updateCb = new AnimatorUpdateListener() {
+            @Override
             public void onAnimationUpdate(ValueAnimator animation) {
                 final float percent = (Float) animation.getAnimatedValue();
-                // Invalidate the old position
-                int width = view.getMeasuredWidth();
-                int height = view.getMeasuredHeight();
-                invalidate(mDropViewPos[0], mDropViewPos[1],
-                        mDropViewPos[0] + width, mDropViewPos[1] + height);
+                final int width = view.getMeasuredWidth();
+                final int height = view.getMeasuredHeight();
 
                 float alphaPercent = alphaInterpolator == null ? percent :
                         alphaInterpolator.getInterpolation(percent);
                 float motionPercent = motionInterpolator == null ? percent :
                         motionInterpolator.getInterpolation(percent);
 
-                mDropViewPos[0] = from.left + (int) Math.round(((to.left - from.left) * motionPercent));
-                mDropViewPos[1] = from.top + (int) Math.round(((to.top - from.top) * motionPercent));
-                mDropViewScale = percent * finalScale + (1 - percent);
-                mDropViewAlpha = alphaPercent * finalAlpha + (1 - alphaPercent) * initialAlpha;
-                invalidate(mDropViewPos[0], mDropViewPos[1],
-                        mDropViewPos[0] + width, mDropViewPos[1] + height);
+                float initialScaleX = initScaleX * dropViewScale;
+                float initialScaleY = initScaleY * dropViewScale;
+                float scaleX = finalScaleX * percent + initialScaleX * (1 - percent);
+                float scaleY = finalScaleY * percent + initialScaleY * (1 - percent);
+                float alpha = finalAlpha * alphaPercent + initAlpha * (1 - alphaPercent);
+
+                float fromLeft = from.left + (initialScaleX - 1f) * width / 2;
+                float fromTop = from.top + (initialScaleY - 1f) * height / 2;
+
+                int x = (int) (fromLeft + Math.round(((to.left - fromLeft) * motionPercent)));
+                int y = (int) (fromTop + Math.round(((to.top - fromTop) * motionPercent)));
+
+                int xPos = x - mDropView.getScrollX() + (mAnchorView != null
+                        ? (mAnchorViewInitialScrollX - mAnchorView.getScrollX()) : 0);
+                int yPos = y - mDropView.getScrollY();
+
+                mDropView.setTranslationX(xPos);
+                mDropView.setTranslationY(yPos);
+                mDropView.setScaleX(scaleX);
+                mDropView.setScaleY(scaleY);
+                mDropView.setAlpha(alpha);
             }
-        });
+        };
+        animateView(view, updateCb, duration, interpolator, onCompleteRunnable, animationEndStyle,
+                anchorView);
+    }
+
+    public void animateView(final DragView view, AnimatorUpdateListener updateCb, int duration,
+            TimeInterpolator interpolator, final Runnable onCompleteRunnable,
+            final int animationEndStyle, View anchorView) {
+        // Clean up the previous animations
+        if (mDropAnim != null) mDropAnim.cancel();
+        if (mFadeOutAnim != null) mFadeOutAnim.cancel();
+
+        // Show the drop view if it was previously hidden
+        mDropView = view;
+        mDropView.cancelAnimation();
+        mDropView.resetLayoutParams();
+
+        // Set the anchor view if the page is scrolling
+        if (anchorView != null) {
+            mAnchorViewInitialScrollX = anchorView.getScrollX();
+        }
+        mAnchorView = anchorView;
+
+        // Create and start the animation
+        mDropAnim = new ValueAnimator();
+        mDropAnim.setInterpolator(interpolator);
+        mDropAnim.setDuration(duration);
+        mDropAnim.setFloatValues(0f, 1f);
+        mDropAnim.addUpdateListener(updateCb);
         mDropAnim.addListener(new AnimatorListenerAdapter() {
             public void onAnimationEnd(Animator animation) {
                 if (onCompleteRunnable != null) {
                     onCompleteRunnable.run();
                 }
-                if (fadeOut) {
+                switch (animationEndStyle) {
+                case ANIMATION_END_DISAPPEAR:
+                    clearAnimatedView();
+                    break;
+                case ANIMATION_END_FADE_OUT:
                     fadeOutDragView();
-                } else {
-                    mDropView = null;
+                    break;
+                case ANIMATION_END_REMAIN_VISIBLE:
+                    break;
                 }
             }
         });
         mDropAnim.start();
     }
 
+    public void clearAnimatedView() {
+        if (mDropAnim != null) {
+            mDropAnim.cancel();
+        }
+        if (mDropView != null) {
+            mDragController.onDeferredEndDrag(mDropView);
+        }
+        mDropView = null;
+        invalidate();
+    }
+
+    public View getAnimatedView() {
+        return mDropView;
+    }
+
     private void fadeOutDragView() {
         mFadeOutAnim = new ValueAnimator();
         mFadeOutAnim.setDuration(150);
@@ -596,16 +658,18 @@
         mFadeOutAnim.addUpdateListener(new AnimatorUpdateListener() {
             public void onAnimationUpdate(ValueAnimator animation) {
                 final float percent = (Float) animation.getAnimatedValue();
-                mDropViewAlpha = 1 - percent;
-                int width = mDropView.getMeasuredWidth();
-                int height = mDropView.getMeasuredHeight();
-                invalidate(mDropViewPos[0], mDropViewPos[1],
-                        mDropViewPos[0] + width, mDropViewPos[1] + height);
+
+                float alpha = 1 - percent;
+                mDropView.setAlpha(alpha);
             }
         });
         mFadeOutAnim.addListener(new AnimatorListenerAdapter() {
             public void onAnimationEnd(Animator animation) {
+                if (mDropView != null) {
+                    mDragController.onDeferredEndDrag(mDropView);
+                }
                 mDropView = null;
+                invalidate();
             }
         });
         mFadeOutAnim.start();
@@ -654,24 +718,4 @@
             return i;
         }
     }
-
-    @Override
-    protected void dispatchDraw(Canvas canvas) {
-        super.dispatchDraw(canvas);
-        if (mDropView != null) {
-            // We are animating an item that was just dropped on the home screen.
-            // Render its View in the current animation position.
-            canvas.save(Canvas.MATRIX_SAVE_FLAG);
-            final int xPos = mDropViewPos[0] - mDropView.getScrollX();
-            final int yPos = mDropViewPos[1] - mDropView.getScrollY();
-            int width = mDropView.getMeasuredWidth();
-            int height = mDropView.getMeasuredHeight();
-            canvas.translate(xPos, yPos);
-            canvas.translate((1 - mDropViewScale) * width / 2, (1 - mDropViewScale) * height / 2);
-            canvas.scale(mDropViewScale, mDropViewScale);
-            mDropView.setAlpha(mDropViewAlpha);
-            mDropView.draw(canvas);
-            canvas.restore();
-        }
-    }
 }
diff --git a/src/com/android/launcher2/DragSource.java b/src/com/android/launcher2/DragSource.java
index 06f5ee1..5440477 100644
--- a/src/com/android/launcher2/DragSource.java
+++ b/src/com/android/launcher2/DragSource.java
@@ -25,5 +25,21 @@
  *
  */
 public interface DragSource {
-    void onDropCompleted(View target, DragObject d, boolean success);
+    /**
+     * @return whether items dragged from this source supports
+     */
+    boolean supportsFlingToDelete();
+
+    /**
+     * A callback specifically made back to the source after an item from this source has been flung
+     * to be deleted on a DropTarget.  In such a situation, this method will be called after
+     * onDropCompleted, and more importantly, after the fling animation has completed.
+     */
+    void onFlingToDeleteCompleted();
+
+    /**
+     * A callback made back to the source after an item from this source has been dropped on a
+     * DropTarget.
+     */
+    void onDropCompleted(View target, DragObject d, boolean isFlingToDelete, boolean success);
 }
diff --git a/src/com/android/launcher2/DragView.java b/src/com/android/launcher2/DragView.java
index dd94175..5636f99 100644
--- a/src/com/android/launcher2/DragView.java
+++ b/src/com/android/launcher2/DragView.java
@@ -25,6 +25,8 @@
 import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Point;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
 import android.graphics.Rect;
 import android.view.View;
 import android.view.animation.DecelerateInterpolator;
@@ -32,7 +34,10 @@
 import com.android.launcher.R;
 
 public class DragView extends View {
+    private static float sDragAlpha = 1f;
+
     private Bitmap mBitmap;
+    private Bitmap mCrossFadeBitmap;
     private Paint mPaint;
     private int mRegistrationX;
     private int mRegistrationY;
@@ -41,12 +46,12 @@
     private Rect mDragRegion = null;
     private DragLayer mDragLayer = null;
     private boolean mHasDrawn = false;
+    private float mCrossFadeProgress = 0f;
 
     ValueAnimator mAnim;
     private float mOffsetX = 0.0f;
     private float mOffsetY = 0.0f;
-
-    private DragLayer.LayoutParams mLayoutParams;
+    private float mInitialScale = 1f;
 
     /**
      * Construct the drag view.
@@ -60,26 +65,20 @@
      * @param registrationY The y coordinate of the registration point.
      */
     public DragView(Launcher launcher, Bitmap bitmap, int registrationX, int registrationY,
-            int left, int top, int width, int height) {
+            int left, int top, int width, int height, final float initialScale) {
         super(launcher);
         mDragLayer = launcher.getDragLayer();
+        mInitialScale = initialScale;
 
         final Resources res = getResources();
-        final int dragScale = res.getInteger(R.integer.config_dragViewExtraPixels);
-
-        Matrix scale = new Matrix();
-        final float scaleFactor = (width + dragScale) / width;
-        if (scaleFactor != 1.0f) {
-            scale.setScale(scaleFactor, scaleFactor);
-        }
-
-        final int offsetX = res.getDimensionPixelSize(R.dimen.dragViewOffsetX);
-        final int offsetY = res.getDimensionPixelSize(R.dimen.dragViewOffsetY);
+        final float offsetX = res.getDimensionPixelSize(R.dimen.dragViewOffsetX);
+        final float offsetY = res.getDimensionPixelSize(R.dimen.dragViewOffsetY);
+        final float scaleDps = res.getDimensionPixelSize(R.dimen.dragViewScale);
+        final float scale = (width + scaleDps) / width;
 
         // Animate the view into the correct position
         mAnim = ValueAnimator.ofFloat(0.0f, 1.0f);
-        mAnim.setDuration(110);
-        mAnim.setInterpolator(new DecelerateInterpolator(2.5f));
+        mAnim.setDuration(150);
         mAnim.addUpdateListener(new AnimatorUpdateListener() {
             @Override
             public void onAnimationUpdate(ValueAnimator animation) {
@@ -90,19 +89,22 @@
 
                 mOffsetX += deltaX;
                 mOffsetY += deltaY;
+                setScaleX(initialScale + (value * (scale - initialScale)));
+                setScaleY(initialScale + (value * (scale - initialScale)));
+                if (sDragAlpha != 1f) {
+                    setAlpha(sDragAlpha * value + (1f - value));
+                }
 
                 if (getParent() == null) {
                     animation.cancel();
                 } else {
-                    DragLayer.LayoutParams lp = mLayoutParams;
-                    lp.x += deltaX;
-                    lp.y += deltaY;
-                    mDragLayer.requestLayout();
+                    setTranslationX(getTranslationX() + deltaX);
+                    setTranslationY(getTranslationY() + deltaY);
                 }
             }
         });
 
-        mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height, scale, true);
+        mBitmap = Bitmap.createBitmap(bitmap, left, top, width, height);
         setDragRegion(new Rect(0, 0, width, height));
 
         // The point in our scaled bitmap that the touch events are located
@@ -112,6 +114,7 @@
         // Force a measure, because Workspace uses getMeasuredHeight() before the layout pass
         int ms = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
         measure(ms, ms);
+        mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
     }
 
     public float getOffsetY() {
@@ -150,6 +153,14 @@
         return mDragRegion;
     }
 
+    public float getInitialScale() {
+        return mInitialScale;
+    }
+
+    public void updateInitialScaleToCurrentScale() {
+        mInitialScale = getScaleX();
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         setMeasuredDimension(mBitmap.getWidth(), mBitmap.getHeight());
@@ -161,16 +172,54 @@
             // for debugging
             Paint p = new Paint();
             p.setStyle(Paint.Style.FILL);
-            p.setColor(0xaaffffff);
+            p.setColor(0x66ffffff);
             canvas.drawRect(0, 0, getWidth(), getHeight(), p);
         }
 
         mHasDrawn = true;
+        boolean crossFade = mCrossFadeProgress > 0 && mCrossFadeBitmap != null;
+        if (crossFade) {
+            int alpha = crossFade ? (int) (255 * (1 - mCrossFadeProgress)) : 255;
+            mPaint.setAlpha(alpha);
+        }
         canvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPaint);
+        if (crossFade) {
+            mPaint.setAlpha((int) (255 * mCrossFadeProgress));
+            canvas.save();
+            float sX = (mBitmap.getWidth() * 1.0f) / mCrossFadeBitmap.getWidth();
+            float sY = (mBitmap.getHeight() * 1.0f) / mCrossFadeBitmap.getHeight();
+            canvas.scale(sX, sY);
+            canvas.drawBitmap(mCrossFadeBitmap, 0.0f, 0.0f, mPaint);
+            canvas.restore();
+        }
     }
 
-    public void setPaint(Paint paint) {
-        mPaint = paint;
+    public void setCrossFadeBitmap(Bitmap crossFadeBitmap) {
+        mCrossFadeBitmap = crossFadeBitmap;
+    }
+
+    public void crossFade(int duration) {
+        ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
+        va.setDuration(duration);
+        va.setInterpolator(new DecelerateInterpolator(1.5f));
+        va.addUpdateListener(new AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator animation) {
+                mCrossFadeProgress = animation.getAnimatedFraction();
+            }
+        });
+        va.start();
+    }
+
+    public void setColor(int color) {
+        if (mPaint == null) {
+            mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
+        }
+        if (color != 0) {
+            mPaint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP));
+        } else {
+            mPaint.setColorFilter(null);
+        }
         invalidate();
     }
 
@@ -181,9 +230,6 @@
     @Override
     public void setAlpha(float alpha) {
         super.setAlpha(alpha);
-        if (mPaint == null) {
-            mPaint = new Paint();
-        }
         mPaint.setAlpha((int) (255 * alpha));
         invalidate();
     }
@@ -197,17 +243,32 @@
      */
     public void show(int touchX, int touchY) {
         mDragLayer.addView(this);
+
+        // Enable hw-layers on this view
+        setLayerType(View.LAYER_TYPE_HARDWARE, null);
+
+        // Start the pick-up animation
         DragLayer.LayoutParams lp = new DragLayer.LayoutParams(0, 0);
         lp.width = mBitmap.getWidth();
         lp.height = mBitmap.getHeight();
-        lp.x = touchX - mRegistrationX;
-        lp.y = touchY - mRegistrationY;
         lp.customPosition = true;
         setLayoutParams(lp);
-        mLayoutParams = lp;
+        setTranslationX(touchX - mRegistrationX);
+        setTranslationY(touchY - mRegistrationY);
         mAnim.start();
     }
 
+    public void cancelAnimation() {
+        if (mAnim != null && mAnim.isRunning()) {
+            mAnim.cancel();
+        }
+    }
+
+    public void resetLayoutParams() {
+        mOffsetX = mOffsetY = 0;
+        requestLayout();
+    }
+
     /**
      * Move the window containing this view.
      *
@@ -215,26 +276,17 @@
      * @param touchY the y coordinate the user touched in DragLayer coordinates
      */
     void move(int touchX, int touchY) {
-        DragLayer.LayoutParams lp = mLayoutParams;
-        lp.x = touchX - mRegistrationX + (int) mOffsetX;
-        lp.y = touchY - mRegistrationY + (int) mOffsetY;
-        mDragLayer.requestLayout();
+        setTranslationX(touchX - mRegistrationX + (int) mOffsetX);
+        setTranslationY(touchY - mRegistrationY + (int) mOffsetY);
     }
 
     void remove() {
-        post(new Runnable() {
-            public void run() {
-                mDragLayer.removeView(DragView.this);
-            }
-        });
-    }
+        if (getParent() != null) {
+            // Disable hw-layers on this view
+            setLayerType(View.LAYER_TYPE_NONE, null);
 
-    int[] getPosition(int[] result) {
-        DragLayer.LayoutParams lp = mLayoutParams;
-        if (result == null) result = new int[2];
-        result[0] = lp.x;
-        result[1] = lp.y;
-        return result;
+            mDragLayer.removeView(DragView.this);
+        }
     }
 }
 
diff --git a/src/com/android/launcher2/DrawableStateProxyView.java b/src/com/android/launcher2/DrawableStateProxyView.java
new file mode 100644
index 0000000..498730f
--- /dev/null
+++ b/src/com/android/launcher2/DrawableStateProxyView.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher2;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+
+import com.android.launcher.R;
+
+public class DrawableStateProxyView extends LinearLayout {
+
+    private View mView;
+    private int mViewId;
+
+    public DrawableStateProxyView(Context context) {
+        this(context, null);
+    }
+
+    public DrawableStateProxyView(Context context, AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public DrawableStateProxyView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+
+        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DrawableStateProxyView,
+                defStyle, 0);
+        mViewId = a.getResourceId(R.styleable.DrawableStateProxyView_sourceViewId, -1);
+        a.recycle();
+
+        setFocusable(false);
+    }
+
+    @Override
+    protected void drawableStateChanged() {
+        super.drawableStateChanged();
+
+        if (mView == null) {
+            View parent = (View) getParent();
+            mView = parent.findViewById(mViewId);
+        }
+        mView.setPressed(isPressed());
+        mView.setHovered(isHovered());
+    }
+}
diff --git a/src/com/android/launcher2/DropTarget.java b/src/com/android/launcher2/DropTarget.java
index 4172da2..fb714c6 100644
--- a/src/com/android/launcher2/DropTarget.java
+++ b/src/com/android/launcher2/DropTarget.java
@@ -16,6 +16,7 @@
 
 package com.android.launcher2;
 
+import android.graphics.PointF;
 import android.graphics.Rect;
 
 /**
@@ -55,6 +56,9 @@
         /** Indicates that the drag operation was cancelled */
         public boolean cancelled = false;
 
+        /** Defers removing the DragView from the DragLayer until after the drop animation. */
+        public boolean deferDragViewCleanupPostAnimation = true;
+
         public DragObject() {
         }
     }
@@ -89,6 +93,13 @@
     void onDragExit(DragObject dragObject);
 
     /**
+     * Handle an object being dropped as a result of flinging to delete and will be called in place
+     * of onDrop().  (This is only called on objects that are set as the DragController's
+     * fling-to-delete target.
+     */
+    void onFlingToDelete(DragObject dragObject, int x, int y, PointF vec);
+
+    /**
      * Allows a DropTarget to delegate drag and drop events to another object.
      *
      * Most subclasses will should just return null from this method.
diff --git a/src/com/android/launcher2/FastBitmapDrawable.java b/src/com/android/launcher2/FastBitmapDrawable.java
index 9fa62da..d317d33 100644
--- a/src/com/android/launcher2/FastBitmapDrawable.java
+++ b/src/com/android/launcher2/FastBitmapDrawable.java
@@ -29,7 +29,7 @@
     private int mAlpha;
     private int mWidth;
     private int mHeight;
-    private final Paint mPaint = new Paint();
+    private final Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
 
     FastBitmapDrawable(Bitmap b) {
 	mAlpha = 255;
diff --git a/src/com/android/launcher2/FocusHelper.java b/src/com/android/launcher2/FocusHelper.java
index 7807b5d..ecc9d9c 100644
--- a/src/com/android/launcher2/FocusHelper.java
+++ b/src/com/android/launcher2/FocusHelper.java
@@ -534,7 +534,7 @@
                 if (handleKeyEvent) {
                     // Select the first bubble text view in the current page of the workspace
                     final CellLayout layout = (CellLayout) workspace.getChildAt(pageIndex);
-                    final CellLayoutChildren children = layout.getChildrenLayout();
+                    final ShortcutAndWidgetContainer children = layout.getShortcutsAndWidgets();
                     final View newIcon = getIconInDirection(layout, children, -1, 1);
                     if (newIcon != null) {
                         newIcon.requestFocus();
@@ -556,9 +556,10 @@
     /**
      * Private helper method to get the CellLayoutChildren given a CellLayout index.
      */
-    private static CellLayoutChildren getCellLayoutChildrenForIndex(ViewGroup container, int i) {
+    private static ShortcutAndWidgetContainer getCellLayoutChildrenForIndex(
+            ViewGroup container, int i) {
         ViewGroup parent = (ViewGroup) container.getChildAt(i);
-        return (CellLayoutChildren) parent.getChildAt(0);
+        return (ShortcutAndWidgetContainer) parent.getChildAt(0);
     }
 
     /**
@@ -664,7 +665,7 @@
      * Handles key events in a Workspace containing.
      */
     static boolean handleIconKeyEvent(View v, int keyCode, KeyEvent e) {
-        CellLayoutChildren parent = (CellLayoutChildren) v.getParent();
+        ShortcutAndWidgetContainer parent = (ShortcutAndWidgetContainer) v.getParent();
         final CellLayout layout = (CellLayout) parent.getParent();
         final Workspace workspace = (Workspace) layout.getParent();
         final ViewGroup launcher = (ViewGroup) workspace.getParent();
@@ -819,7 +820,7 @@
      * Handles key events for items in a Folder.
      */
     static boolean handleFolderKeyEvent(View v, int keyCode, KeyEvent e) {
-        CellLayoutChildren parent = (CellLayoutChildren) v.getParent();
+        ShortcutAndWidgetContainer parent = (ShortcutAndWidgetContainer) v.getParent();
         final CellLayout layout = (CellLayout) parent.getParent();
         final Folder folder = (Folder) layout.getParent();
         View title = folder.mFolderName;
diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java
index fdde4d5..c502fb7 100644
--- a/src/com/android/launcher2/Folder.java
+++ b/src/com/android/launcher2/Folder.java
@@ -20,10 +20,9 @@
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
-import android.animation.ValueAnimator;
-import android.animation.ValueAnimator.AnimatorUpdateListener;
 import android.content.Context;
 import android.content.res.Resources;
+import android.graphics.PointF;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.text.InputType;
@@ -39,14 +38,13 @@
 import android.view.View;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import com.android.launcher.R;
+import com.android.launcher2.DropTarget.DragObject;
 import com.android.launcher2.FolderInfo.FolderListener;
 
 import java.util.ArrayList;
@@ -74,18 +72,13 @@
     private final LayoutInflater mInflater;
     private final IconCache mIconCache;
     private int mState = STATE_NONE;
-    private static final int FULL_GROW = 0;
-    private static final int PARTIAL_GROW = 1;
     private static final int REORDER_ANIMATION_DURATION = 230;
     private static final int ON_EXIT_CLOSE_DELAY = 800;
-    private int mMode = PARTIAL_GROW;
     private boolean mRearrangeOnClose = false;
     private FolderIcon mFolderIcon;
     private int mMaxCountX;
     private int mMaxCountY;
     private int mMaxNumItems;
-    private Rect mNewSize = new Rect();
-    private Rect mIconRect = new Rect();
     private ArrayList<View> mItemsInReadingOrder = new ArrayList<View>();
     private Drawable mIconDrawable;
     boolean mItemsInvalidated = false;
@@ -156,7 +149,7 @@
         super.onFinishInflate();
         mContent = (CellLayout) findViewById(R.id.folder_content);
         mContent.setGridSize(0, 0);
-        mContent.getChildrenLayout().setMotionEventSplittingEnabled(false);
+        mContent.getShortcutsAndWidgets().setMotionEventSplittingEnabled(false);
         mFolderName = (FolderEditText) findViewById(R.id.folder_name);
         mFolderName.setFolder(this);
         mFolderName.setOnFocusChangeListener(this);
@@ -365,21 +358,9 @@
      */
     private void positionAndSizeAsIcon() {
         if (!(getParent() instanceof DragLayer)) return;
-
-        DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams();
-
-        if (mMode == PARTIAL_GROW) {
-            setScaleX(0.8f);
-            setScaleY(0.8f);
-            setAlpha(0f);
-        } else {
-            mLauncher.getDragLayer().getDescendantRectRelativeToSelf(mFolderIcon, mIconRect);
-            lp.width = mIconRect.width();
-            lp.height = mIconRect.height();
-            lp.x = mIconRect.left;
-            lp.y = mIconRect.top;
-            mContent.setAlpha(0);
-        }
+        setScaleX(0.8f);
+        setScaleY(0.8f);
+        setAlpha(0f);
         mState = STATE_SMALL;
     }
 
@@ -387,34 +368,11 @@
         positionAndSizeAsIcon();
 
         if (!(getParent() instanceof DragLayer)) return;
-
-        ObjectAnimator oa;
-        DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams();
-
         centerAboutIcon();
-        if (mMode == PARTIAL_GROW) {
-            PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1);
-            PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f);
-            PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f);
-            oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
-        } else {
-            PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", mNewSize.width());
-            PropertyValuesHolder height = PropertyValuesHolder.ofInt("height", mNewSize.height());
-            PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", mNewSize.left);
-            PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", mNewSize.top);
-            oa = ObjectAnimator.ofPropertyValuesHolder(lp, width, height, x, y);
-            oa.addUpdateListener(new AnimatorUpdateListener() {
-                public void onAnimationUpdate(ValueAnimator animation) {
-                    requestLayout();
-                }
-            });
-
-            PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1.0f);
-            ObjectAnimator alphaOa = ObjectAnimator.ofPropertyValuesHolder(mContent, alpha);
-            alphaOa.setDuration(mExpandDuration);
-            alphaOa.setInterpolator(new AccelerateInterpolator(2.0f));
-            alphaOa.start();
-        }
+        PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 1);
+        PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f);
+        PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 1.0f);
+        ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
 
         oa.addListener(new AnimatorListenerAdapter() {
             @Override
@@ -457,33 +415,10 @@
 
     public void animateClosed() {
         if (!(getParent() instanceof DragLayer)) return;
-
-        ObjectAnimator oa;
-        if (mMode == PARTIAL_GROW) {
-            PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0);
-            PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.9f);
-            PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.9f);
-            oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
-        } else {
-            DragLayer.LayoutParams lp = (DragLayer.LayoutParams) getLayoutParams();
-
-            PropertyValuesHolder width = PropertyValuesHolder.ofInt("width", mIconRect.width());
-            PropertyValuesHolder height = PropertyValuesHolder.ofInt("height", mIconRect.height());
-            PropertyValuesHolder x = PropertyValuesHolder.ofInt("x", mIconRect.left);
-            PropertyValuesHolder y = PropertyValuesHolder.ofInt("y", mIconRect.top);
-            oa = ObjectAnimator.ofPropertyValuesHolder(lp, width, height, x, y);
-            oa.addUpdateListener(new AnimatorUpdateListener() {
-                public void onAnimationUpdate(ValueAnimator animation) {
-                    requestLayout();
-                }
-            });
-
-            PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0f);
-            ObjectAnimator alphaOa = ObjectAnimator.ofPropertyValuesHolder(mContent, alpha);
-            alphaOa.setDuration(mExpandDuration);
-            alphaOa.setInterpolator(new DecelerateInterpolator(2.0f));
-            alphaOa.start();
-        }
+        PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0);
+        PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 0.9f);
+        PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat("scaleY", 0.9f);
+        ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(this, alpha, scaleX, scaleY);
 
         oa.addListener(new AnimatorListenerAdapter() {
             @Override
@@ -594,7 +529,7 @@
                 for (int x = startX; x <= endX; x++) {
                     View v = mContent.getChildAt(x,y);
                     if (mContent.animateChildToPosition(v, empty[0], empty[1],
-                            REORDER_ANIMATION_DURATION, delay)) {
+                            REORDER_ANIMATION_DURATION, delay, true, true)) {
                         empty[0] = x;
                         empty[1] = y;
                         delay += delayAmount;
@@ -611,7 +546,7 @@
                 for (int x = startX; x >= endX; x--) {
                     View v = mContent.getChildAt(x,y);
                     if (mContent.animateChildToPosition(v, empty[0], empty[1],
-                            REORDER_ANIMATION_DURATION, delay)) {
+                            REORDER_ANIMATION_DURATION, delay, true, true)) {
                         empty[0] = x;
                         empty[1] = y;
                         delay += delayAmount;
@@ -685,7 +620,8 @@
         mReorderAlarm.cancelAlarm();
     }
 
-    public void onDropCompleted(View target, DragObject d, boolean success) {
+    public void onDropCompleted(View target, DragObject d, boolean isFlingToDelete,
+            boolean success) {
         if (success) {
             if (mDeleteFolderOnDropCompleted && !mItemAddedBackToSelfViaIcon) {
                 replaceFolderWithFinalItem();
@@ -719,6 +655,20 @@
         updateItemLocationsInDatabase();
     }
 
+    @Override
+    public boolean supportsFlingToDelete() {
+        return true;
+    }
+
+    public void onFlingToDelete(DragObject d, int x, int y, PointF vec) {
+        // Do nothing
+    }
+
+    @Override
+    public void onFlingToDeleteCompleted() {
+        // Do nothing
+    }
+
     private void updateItemLocationsInDatabase() {
         ArrayList<View> list = getItemsInReadingOrder();
         for (int i = 0; i < list.size(); i++) {
@@ -791,11 +741,17 @@
         int centeredLeft = centerX - width / 2;
         int centeredTop = centerY - height / 2;
 
+        int currentPage = mLauncher.getWorkspace().getCurrentPage();
+        // In case the workspace is scrolling, we need to use the final scroll to compute
+        // the folders bounds.
+        mLauncher.getWorkspace().setFinalScrollForPageChange(currentPage);
         // We first fetch the currently visible CellLayoutChildren
-        CellLayout currentPage = mLauncher.getWorkspace().getCurrentDropLayout();
-        CellLayoutChildren boundingLayout = currentPage.getChildrenLayout();
+        CellLayout currentLayout = (CellLayout) mLauncher.getWorkspace().getChildAt(currentPage);
+        ShortcutAndWidgetContainer boundingLayout = currentLayout.getShortcutsAndWidgets();
         Rect bounds = new Rect();
         parent.getDescendantRectRelativeToSelf(boundingLayout, bounds);
+        // We reset the workspaces scroll
+        mLauncher.getWorkspace().resetFinalScrollForPageChange(currentPage);
 
         // We need to bound the folder to the currently visible CellLayoutChildren
         int left = Math.min(Math.max(bounds.left, centeredLeft),
@@ -821,14 +777,10 @@
         mFolderIcon.setPivotX(folderIconPivotX);
         mFolderIcon.setPivotY(folderIconPivotY);
 
-        if (mMode == PARTIAL_GROW) {
-            lp.width = width;
-            lp.height = height;
-            lp.x = left;
-            lp.y = top;
-        } else {
-            mNewSize.set(left, top, left + width, top + height);
-        }
+        lp.width = width;
+        lp.height = height;
+        lp.x = left;
+        lp.y = top;
     }
 
     private void setupContentForNumItems(int count) {
@@ -886,11 +838,11 @@
     }
 
     public int getItemCount() {
-        return mContent.getChildrenLayout().getChildCount();
+        return mContent.getShortcutsAndWidgets().getChildCount();
     }
 
     public View getItemAt(int index) {
-        return mContent.getChildrenLayout().getChildAt(index);
+        return mContent.getShortcutsAndWidgets().getChildAt(index);
     }
 
     private void onCloseComplete() {
diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java
index 3c0829d..c005edf 100644
--- a/src/com/android/launcher2/FolderIcon.java
+++ b/src/com/android/launcher2/FolderIcon.java
@@ -30,6 +30,7 @@
 import android.os.Parcelable;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.AccelerateInterpolator;
@@ -53,6 +54,8 @@
     FolderInfo mInfo;
     private static boolean sStaticValuesDirty = true;
 
+    private CheckLongPressHelper mLongPressHelper;
+
     // The number of icons to display in the
     private static final int NUM_ITEMS_IN_PREVIEW = 3;
     private static final int CONSUMPTION_ANIMATION_DURATION = 100;
@@ -95,10 +98,16 @@
 
     public FolderIcon(Context context, AttributeSet attrs) {
         super(context, attrs);
+        init();
     }
 
     public FolderIcon(Context context) {
         super(context);
+        init();
+    }
+
+    private void init() {
+        mLongPressHelper = new CheckLongPressHelper(this);
     }
 
     public boolean isDropEnabled() {
@@ -295,14 +304,14 @@
     }
 
     public void performCreateAnimation(final ShortcutInfo destInfo, final View destView,
-            final ShortcutInfo srcInfo, final View srcView, Rect dstRect,
+            final ShortcutInfo srcInfo, final DragView srcView, Rect dstRect,
             float scaleRelativeToDragLayer, Runnable postAnimationRunnable) {
 
         Drawable animateDrawable = ((TextView) destView).getCompoundDrawables()[1];
         computePreviewDrawingParams(animateDrawable.getIntrinsicWidth(), destView.getMeasuredWidth());
 
         // This will animate the dragView (srcView) into the new folder
-        onDrop(srcInfo, srcView, dstRect, scaleRelativeToDragLayer, 1, postAnimationRunnable);
+        onDrop(srcInfo, srcView, dstRect, scaleRelativeToDragLayer, 1, postAnimationRunnable, null);
 
         // This will animate the first item from it's position as an icon into its
         // position as the first item in the preview
@@ -320,8 +329,9 @@
         mFolderRingAnimator.animateToNaturalState();
     }
 
-    private void onDrop(final ShortcutInfo item, View animateView, Rect finalRect,
-            float scaleRelativeToDragLayer, int index, Runnable postAnimationRunnable) {
+    private void onDrop(final ShortcutInfo item, DragView animateView, Rect finalRect,
+            float scaleRelativeToDragLayer, int index, Runnable postAnimationRunnable,
+            DragObject d) {
         item.cellX = -1;
         item.cellY = -1;
 
@@ -359,10 +369,11 @@
 
             float finalAlpha = index < NUM_ITEMS_IN_PREVIEW ? 0.5f : 0f;
 
+            float finalScale = scale * scaleRelativeToDragLayer;
             dragLayer.animateView(animateView, from, to, finalAlpha,
-                    scale * scaleRelativeToDragLayer, DROP_IN_ANIMATION_DURATION,
+                    1, 1, finalScale, finalScale, DROP_IN_ANIMATION_DURATION,
                     new DecelerateInterpolator(2), new AccelerateInterpolator(2),
-                    postAnimationRunnable, false);
+                    postAnimationRunnable, DragLayer.ANIMATION_END_DISAPPEAR, null);
             postDelayed(new Runnable() {
                 public void run() {
                     addItem(item);
@@ -382,7 +393,7 @@
             item = (ShortcutInfo) d.dragInfo;
         }
         mFolder.notifyDrop();
-        onDrop(item, d.dragView, null, 1.0f, mInfo.contents.size(), d.postAnimationRunnable);
+        onDrop(item, d.dragView, null, 1.0f, mInfo.contents.size(), d.postAnimationRunnable, d);
     }
 
     public DropTarget getDropTargetDelegate(DragObject d) {
@@ -589,4 +600,29 @@
         setContentDescription(String.format(mContext.getString(R.string.folder_name_format),
                 title));
     }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        // Call the superclass onTouchEvent first, because sometimes it changes the state to
+        // isPressed() on an ACTION_UP
+        boolean result = super.onTouchEvent(event);
+
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_DOWN:
+                mLongPressHelper.postCheckForLongPress();
+                break;
+            case MotionEvent.ACTION_CANCEL:
+            case MotionEvent.ACTION_UP:
+                mLongPressHelper.cancelLongPress();
+                break;
+        }
+        return result;
+    }
+
+    @Override
+    public void cancelLongPress() {
+        super.cancelLongPress();
+
+        mLongPressHelper.cancelLongPress();
+    }
 }
diff --git a/src/com/android/launcher2/HandleView.java b/src/com/android/launcher2/HandleView.java
index 13d07e2..d77138b 100644
--- a/src/com/android/launcher2/HandleView.java
+++ b/src/com/android/launcher2/HandleView.java
@@ -17,13 +17,12 @@
 
 package com.android.launcher2;
 
-import android.widget.ImageView;
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
-import android.view.KeyEvent;
 import android.view.View;
+import android.widget.ImageView;
 
 import com.android.launcher.R;
 
diff --git a/src/com/android/launcher2/HolographicPagedViewIcon.java b/src/com/android/launcher2/HolographicPagedViewIcon.java
deleted file mode 100644
index dda233e..0000000
--- a/src/com/android/launcher2/HolographicPagedViewIcon.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.
- */
-
-package com.android.launcher2;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.widget.TextView;
-
-
-
-/**
- * An icon on a PagedView, specifically for items in the launcher's paged view (with compound
- * drawables on the top).
- */
-public class HolographicPagedViewIcon extends TextView  {
-    PagedViewIcon mOriginalIcon;
-    Paint mPaint;
-
-    public HolographicPagedViewIcon(Context context, PagedViewIcon original) {
-        super(context);
-        mOriginalIcon = original;
-        mPaint = new Paint();
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        Bitmap overlay = mOriginalIcon.getHolographicOutline();
-        if (overlay != null) {
-            final int offset = getScrollX();
-            final int compoundPaddingLeft = getCompoundPaddingLeft();
-            final int compoundPaddingRight = getCompoundPaddingRight();
-            int hspace = getWidth() - compoundPaddingRight - compoundPaddingLeft;
-            canvas.drawBitmap(overlay,
-                    offset + compoundPaddingLeft + (hspace - overlay.getWidth()) / 2,
-                    mOriginalIcon.getPaddingTop(),
-                    mPaint);
-        }
-    }
-}
diff --git a/src/com/android/launcher2/Hotseat.java b/src/com/android/launcher2/Hotseat.java
index f7fa380..9e525bd 100644
--- a/src/com/android/launcher2/Hotseat.java
+++ b/src/com/android/launcher2/Hotseat.java
@@ -29,13 +29,13 @@
 
 public class Hotseat extends FrameLayout {
     private static final String TAG = "Hotseat";
-    private static final int sAllAppsButtonRank = 2; // In the middle of the dock
 
     private Launcher mLauncher;
     private CellLayout mContent;
 
     private int mCellCountX;
     private int mCellCountY;
+    private int mAllAppsButtonRank;
     private boolean mIsLandscape;
 
     public Hotseat(Context context) {
@@ -53,6 +53,7 @@
                 R.styleable.Hotseat, defStyle, 0);
         mCellCountX = a.getInt(R.styleable.Hotseat_cellCountX, -1);
         mCellCountY = a.getInt(R.styleable.Hotseat_cellCountY, -1);
+        mAllAppsButtonRank = context.getResources().getInteger(R.integer.hotseat_all_apps_index);
         mIsLandscape = context.getResources().getConfiguration().orientation ==
             Configuration.ORIENTATION_LANDSCAPE;
     }
@@ -77,8 +78,8 @@
     int getCellYFromOrder(int rank) {
         return mIsLandscape ? (mContent.getCountY() - (rank + 1)) : 0;
     }
-    public static boolean isAllAppsButtonRank(int rank) {
-        return rank == sAllAppsButtonRank;
+    public boolean isAllAppsButtonRank(int rank) {
+        return rank == mAllAppsButtonRank;
     }
 
     @Override
@@ -88,6 +89,7 @@
         if (mCellCountY < 0) mCellCountY = LauncherModel.getCellCountY();
         mContent = (CellLayout) findViewById(R.id.layout);
         mContent.setGridSize(mCellCountX, mCellCountY);
+        mContent.setIsHotseat(true);
 
         resetLayout();
     }
@@ -126,9 +128,10 @@
 
         // Note: We do this to ensure that the hotseat is always laid out in the orientation of
         // the hotseat in order regardless of which orientation they were added
-        int x = getCellXFromOrder(sAllAppsButtonRank);
-        int y = getCellYFromOrder(sAllAppsButtonRank);
-        mContent.addViewToCellLayout(allAppsButton, -1, 0, new CellLayout.LayoutParams(x,y,1,1),
-                true);
+        int x = getCellXFromOrder(mAllAppsButtonRank);
+        int y = getCellYFromOrder(mAllAppsButtonRank);
+        CellLayout.LayoutParams lp = new CellLayout.LayoutParams(x,y,1,1);
+        lp.canReorder = false;
+        mContent.addViewToCellLayout(allAppsButton, -1, 0, lp, true, true);
     }
 }
diff --git a/src/com/android/launcher2/IconCache.java b/src/com/android/launcher2/IconCache.java
index 2430a6b..1e8379d 100644
--- a/src/com/android/launcher2/IconCache.java
+++ b/src/com/android/launcher2/IconCache.java
@@ -16,7 +16,9 @@
 
 package com.android.launcher2;
 
+import android.app.ActivityManager;
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
@@ -24,7 +26,6 @@
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.drawable.Drawable;
-import android.util.DisplayMetrics;
 
 import java.util.HashMap;
 
@@ -49,23 +50,13 @@
     private int mIconDpi;
 
     public IconCache(LauncherApplication context) {
+        ActivityManager activityManager =
+                (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+
         mContext = context;
         mPackageManager = context.getPackageManager();
-        int density = context.getResources().getDisplayMetrics().densityDpi;
-        if (LauncherApplication.isScreenLarge()) {
-            if (density == DisplayMetrics.DENSITY_LOW) {
-                mIconDpi = DisplayMetrics.DENSITY_MEDIUM;
-            } else if (density == DisplayMetrics.DENSITY_MEDIUM) {
-                mIconDpi = DisplayMetrics.DENSITY_HIGH;
-            } else if (density == DisplayMetrics.DENSITY_HIGH) {
-                mIconDpi = DisplayMetrics.DENSITY_XHIGH;
-            } else if (density == DisplayMetrics.DENSITY_XHIGH) {
-                // We'll need to use a denser icon, or some sort of a mipmap
-                mIconDpi = DisplayMetrics.DENSITY_XHIGH;
-            }
-        } else {
-            mIconDpi = context.getResources().getDisplayMetrics().densityDpi;
-        }
+        mIconDpi = activityManager.getLauncherLargeIconDensity();
+
         // need to set mIconDpi before getting default icon
         mDefaultIcon = makeDefaultIcon();
     }
diff --git a/src/com/android/launcher2/InfoDropTarget.java b/src/com/android/launcher2/InfoDropTarget.java
index dba845b..2e0b5c8 100644
--- a/src/com/android/launcher2/InfoDropTarget.java
+++ b/src/com/android/launcher2/InfoDropTarget.java
@@ -21,8 +21,6 @@
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
 import android.graphics.drawable.TransitionDrawable;
 import android.util.AttributeSet;
 import android.view.View;
@@ -34,7 +32,6 @@
 
     private ColorStateList mOriginalTextColor;
     private TransitionDrawable mDrawable;
-    private int mHoverColor = 0xFF0000FF;
 
     public InfoDropTarget(Context context, AttributeSet attrs) {
         this(context, attrs, 0);
@@ -53,8 +50,6 @@
         // Get the hover color
         Resources r = getResources();
         mHoverColor = r.getColor(R.color.info_target_hover_tint);
-        mHoverPaint.setColorFilter(new PorterDuffColorFilter(
-                mHoverColor, PorterDuff.Mode.SRC_ATOP));
         mDrawable = (TransitionDrawable) getCompoundDrawables()[0];
         mDrawable.setCrossFadeEnabled(true);
 
@@ -85,6 +80,9 @@
         if (componentName != null) {
             mLauncher.startApplicationDetailsActivity(componentName);
         }
+
+        // There is no post-drop animation, so clean up the DragView now
+        d.deferDragViewCleanupPostAnimation = false;
         return false;
     }
 
diff --git a/src/com/android/launcher2/InstallShortcutReceiver.java b/src/com/android/launcher2/InstallShortcutReceiver.java
index ed8f299..4c0974f 100644
--- a/src/com/android/launcher2/InstallShortcutReceiver.java
+++ b/src/com/android/launcher2/InstallShortcutReceiver.java
@@ -16,18 +16,32 @@
 
 package com.android.launcher2;
 
-import java.util.ArrayList;
-
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
 import android.widget.Toast;
 
 import com.android.launcher.R;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
 public class InstallShortcutReceiver extends BroadcastReceiver {
     public static final String ACTION_INSTALL_SHORTCUT =
             "com.android.launcher.action.INSTALL_SHORTCUT";
+    public static final String NEW_APPS_PAGE_KEY = "apps.new.page";
+    public static final String NEW_APPS_LIST_KEY = "apps.new.list";
+
+    public static final int NEW_SHORTCUT_BOUNCE_DURATION = 450;
+    public static final int NEW_SHORTCUT_STAGGER_DELAY = 75;
+
+    private static final int INSTALL_SHORTCUT_SUCCESSFUL = 0;
+    private static final int INSTALL_SHORTCUT_IS_DUPLICATE = -1;
+    private static final int INSTALL_SHORTCUT_NO_SPACE = -2;
 
     // A mime-type representing shortcut data
     public static final String SHORTCUT_MIMETYPE =
@@ -39,22 +53,58 @@
         if (!ACTION_INSTALL_SHORTCUT.equals(data.getAction())) {
             return;
         }
+        String spKey = LauncherApplication.getSharedPreferencesKey();
+        SharedPreferences sp = context.getSharedPreferences(spKey, Context.MODE_PRIVATE);
 
-        int screen = Launcher.getScreen();
+        final int screen = Launcher.getScreen();
+        final Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
+        if (intent == null) {
+            return;
+        }
+        // This name is only used for comparisons and notifications, so fall back to activity name
+        // if not supplied
+        String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);
+        if (name == null) {
+            try {
+                PackageManager pm = context.getPackageManager();
+                ActivityInfo info = pm.getActivityInfo(intent.getComponent(), 0);
+                name = info.loadLabel(pm).toString();
+            } catch (PackageManager.NameNotFoundException nnfe) {
+                return;
+            }
+        }
 
-        if (!installShortcut(context, data, screen)) {
-            // The target screen is full, let's try the other screens
-            for (int i = 0; i < Launcher.SCREEN_COUNT; i++) {
-                if (i != screen && installShortcut(context, data, i)) break;
+        final ArrayList<ItemInfo> items = LauncherModel.getItemsInLocalCoordinates(context);
+        final boolean exists = LauncherModel.shortcutExists(context, name, intent);
+        final int[] result = {INSTALL_SHORTCUT_SUCCESSFUL};
+
+        // Try adding the target to the workspace screens incrementally, starting at the current
+        // screen and alternating between +1, -1, +2, -2, etc. (using ~ ceil(i/2f)*(-1)^(i-1))
+        boolean found = false;
+        for (int i = 0; i < (2 * Launcher.SCREEN_COUNT) + 1 && !found; ++i) {
+            int si = screen + (int) ((i / 2f) + 0.5f) * ((i % 2 == 1) ? 1 : -1);
+            if (0 <= si && si < Launcher.SCREEN_COUNT) {
+                found = installShortcut(context, data, items, name, intent, si, exists, sp, result);
+            }
+        }
+
+        // We only report error messages (duplicate shortcut or out of space) as the add-animation
+        // will provide feedback otherwise
+        if (!found) {
+            if (result[0] == INSTALL_SHORTCUT_NO_SPACE) {
+                Toast.makeText(context, context.getString(R.string.out_of_space),
+                        Toast.LENGTH_SHORT).show();
+            } else if (result[0] == INSTALL_SHORTCUT_IS_DUPLICATE) {
+                Toast.makeText(context, context.getString(R.string.shortcut_duplicate, name),
+                        Toast.LENGTH_SHORT).show();
             }
         }
     }
 
-    private boolean installShortcut(Context context, Intent data, int screen) {
-        String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);
-
-        if (findEmptyCell(context, mCoordinates, screen)) {
-            Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT);
+    private boolean installShortcut(Context context, Intent data, ArrayList<ItemInfo> items,
+            String name, Intent intent, int screen, boolean shortcutExists,
+            SharedPreferences sharedPrefs, int[] result) {
+        if (findEmptyCell(context, items, mCoordinates, screen)) {
             if (intent != null) {
                 if (intent.getAction() == null) {
                     intent.setAction(Intent.ACTION_VIEW);
@@ -63,38 +113,47 @@
                 // By default, we allow for duplicate entries (located in
                 // different places)
                 boolean duplicate = data.getBooleanExtra(Launcher.EXTRA_SHORTCUT_DUPLICATE, true);
-                if (duplicate || !LauncherModel.shortcutExists(context, name, intent)) {
+                if (duplicate || !shortcutExists) {
+                    // If the new app is going to fall into the same page as before, then just
+                    // continue adding to the current page
+                    int newAppsScreen = sharedPrefs.getInt(NEW_APPS_PAGE_KEY, screen);
+                    Set<String> newApps = new HashSet<String>();
+                    if (newAppsScreen == screen) {
+                        newApps = sharedPrefs.getStringSet(NEW_APPS_LIST_KEY, newApps);
+                    }
+                    newApps.add(intent.toUri(0).toString());
+                    sharedPrefs.edit()
+                               .putInt(NEW_APPS_PAGE_KEY, screen)
+                               .putStringSet(NEW_APPS_LIST_KEY, newApps)
+                               .commit();
+
+                    // Update the Launcher db
                     LauncherApplication app = (LauncherApplication) context.getApplicationContext();
                     ShortcutInfo info = app.getModel().addShortcut(context, data,
-                            LauncherSettings.Favorites.CONTAINER_DESKTOP, screen, mCoordinates[0],
-                            mCoordinates[1], true);
-                    if (info != null) {
-                        Toast.makeText(context, context.getString(R.string.shortcut_installed, name),
-                                Toast.LENGTH_SHORT).show();
-                    } else {
+                            LauncherSettings.Favorites.CONTAINER_DESKTOP, screen,
+                            mCoordinates[0], mCoordinates[1], true);
+                    if (info == null) {
                         return false;
                     }
                 } else {
-                    Toast.makeText(context, context.getString(R.string.shortcut_duplicate, name),
-                            Toast.LENGTH_SHORT).show();
+                    result[0] = INSTALL_SHORTCUT_IS_DUPLICATE;
                 }
 
                 return true;
             }
         } else {
-            Toast.makeText(context, context.getString(R.string.out_of_space),
-                    Toast.LENGTH_SHORT).show();
+            result[0] = INSTALL_SHORTCUT_NO_SPACE;
         }
 
         return false;
     }
 
-    private static boolean findEmptyCell(Context context, int[] xy, int screen) {
+    private static boolean findEmptyCell(Context context, ArrayList<ItemInfo> items, int[] xy,
+            int screen) {
         final int xCount = LauncherModel.getCellCountX();
         final int yCount = LauncherModel.getCellCountY();
         boolean[][] occupied = new boolean[xCount][yCount];
 
-        ArrayList<ItemInfo> items = LauncherModel.getItemsInLocalCoordinates(context);
         ItemInfo item = null;
         int cellX, cellY, spanX, spanY;
         for (int i = 0; i < items.size(); ++i) {
diff --git a/src/com/android/launcher2/InstallWidgetReceiver.java b/src/com/android/launcher2/InstallWidgetReceiver.java
index 6b3763c..a1e9b11 100644
--- a/src/com/android/launcher2/InstallWidgetReceiver.java
+++ b/src/com/android/launcher2/InstallWidgetReceiver.java
@@ -189,7 +189,7 @@
             final PendingAddWidgetInfo createInfo = new PendingAddWidgetInfo(widgetInfo, mMimeType,
                     mClipData);
             mLauncher.addAppWidgetFromDrop(createInfo, LauncherSettings.Favorites.CONTAINER_DESKTOP,
-                    mTargetLayoutScreen, null, mTargetLayoutPos);
+                    mTargetLayoutScreen, null, null, mTargetLayoutPos);
         }
     }
 }
diff --git a/src/com/android/launcher2/ItemInfo.java b/src/com/android/launcher2/ItemInfo.java
index 8d46624..11a6c0d 100644
--- a/src/com/android/launcher2/ItemInfo.java
+++ b/src/com/android/launcher2/ItemInfo.java
@@ -77,6 +77,15 @@
     int spanY = 1;
 
     /**
+     * Indicates the minimum X cell span.
+     */
+    int minSpanX = 1;
+
+    /**
+     * Indicates the minimum Y cell span.
+     */
+    int minSpanY = 1;
+    /**
      * Indicates whether the item is a gesture.
      */
     boolean isGesture = false;
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 8e074b5..b3ce968 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -23,12 +23,12 @@
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
 import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.SearchManager;
-import android.app.StatusBarManager;
 import android.appwidget.AppWidgetHostView;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProviderInfo;
@@ -54,8 +54,8 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.AsyncTask;
-import android.os.Build;
 import android.os.Bundle;
+import android.os.Debug;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.Message;
@@ -80,10 +80,12 @@
 import android.view.View.OnLongClickListener;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnGlobalLayoutListener;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.AccelerateDecelerateInterpolator;
 import android.view.animation.AccelerateInterpolator;
+import android.view.animation.BounceInterpolator;
 import android.view.animation.DecelerateInterpolator;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.Advanceable;
@@ -103,7 +105,12 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * Default launcher application.
@@ -139,6 +146,7 @@
     static final int DIALOG_RENAME_FOLDER = 2;
 
     private static final String PREFERENCES = "launcher.preferences";
+    static final String FORCE_ENABLE_ROTATION_PROPERTY = "launcher.force_enable_rotation";
 
     // Type: int
     private static final String RUNTIME_STATE_CURRENT_SCREEN = "launcher.current_screen";
@@ -246,7 +254,16 @@
     private static Drawable.ConstantState[] sAppMarketIcon = new Drawable.ConstantState[2];
 
     static final ArrayList<String> sDumpLogs = new ArrayList<String>();
+    PendingAddWidgetInfo mWidgetBeingConfigured = null;
 
+    // We only want to get the SharedPreferences once since it does an FS stat each time we get
+    // it from the context.
+    private SharedPreferences mSharedPrefs;
+
+    // Holds the page that we need to animate to, and the icon views that we need to animate up
+    // when we scroll to that page on resume.
+    private int mNewShortcutAnimatePage = -1;
+    private ArrayList<View> mNewShortcutAnimateViews = new ArrayList<View>();
 
     private BubbleTextView mWaitingForResume;
 
@@ -274,6 +291,8 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         LauncherApplication app = ((LauncherApplication)getApplication());
+        mSharedPrefs = getSharedPreferences(LauncherApplication.getSharedPreferencesKey(),
+                Context.MODE_PRIVATE);
         mModel = app.setLauncher(this);
         mIconCache = app.getIconCache();
         mDragController = new DragController(this);
@@ -310,7 +329,7 @@
         }
 
         if (!mRestoring) {
-            mModel.startLoader(this, true);
+            mModel.startLoader(true);
         }
 
         if (!mModel.isAllAppsLoaded()) {
@@ -348,8 +367,11 @@
         }
         mSearchDropTargetBar.onSearchPackagesChanged(searchVisible, voiceVisible);
 
+        final String forceEnableRotation = 
+                SystemProperties.get(FORCE_ENABLE_ROTATION_PROPERTY, "false");
+
         // On large interfaces, we want the screen to auto-rotate based on the current orientation
-        if (LauncherApplication.isScreenLarge() || Build.TYPE.contentEquals("eng")) {
+        if (LauncherApplication.isScreenLarge() || "true".equalsIgnoreCase(forceEnableRotation)) {
             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
         }
     }
@@ -495,24 +517,35 @@
                 break;
             case REQUEST_CREATE_APPWIDGET:
                 int appWidgetId = args.intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
-                completeAddAppWidget(appWidgetId, args.container, args.screen);
+                completeAddAppWidget(appWidgetId, args.container, args.screen, null, null);
                 result = true;
                 break;
             case REQUEST_PICK_WALLPAPER:
                 // We just wanted the activity result here so we can clear mWaitingForResult
                 break;
         }
-        // In any situation where we have a multi-step drop, we should reset the add info only after
-        // we complete the drop
+        // Before adding this resetAddInfo(), after a shortcut was added to a workspace screen,
+        // if you turned the screen off and then back while in All Apps, Launcher would not
+        // return to the workspace. Clearing mAddInfo.container here fixes this issue
         resetAddInfo();
         return result;
     }
 
     @Override
-    protected void onActivityResult(final int requestCode, int resultCode, final Intent data) {
+    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
         boolean delayExitSpringLoadedMode = false;
+        boolean isWidgetDrop = (requestCode == REQUEST_PICK_APPWIDGET ||
+                requestCode == REQUEST_CREATE_APPWIDGET);
         mWaitingForResult = false;
 
+        // We have special handling for widgets
+        if (isWidgetDrop) {
+            int appWidgetId = data != null ?
+                    data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1) : -1;
+            completeTwoStageWidgetDrop(resultCode, appWidgetId);
+            return;
+        }
+
         // The pattern used here is that a user PICKs a specific application,
         // which, depending on the target, might need to CREATE the actual target.
 
@@ -526,71 +559,75 @@
             args.screen = mPendingAddInfo.screen;
             args.cellX = mPendingAddInfo.cellX;
             args.cellY = mPendingAddInfo.cellY;
-
-            // If the loader is still running, defer the add until it is done.
             if (isWorkspaceLocked()) {
                 sPendingAddList.add(args);
             } else {
                 delayExitSpringLoadedMode = completeAdd(args);
             }
-        } else if ((requestCode == REQUEST_PICK_APPWIDGET ||
-                requestCode == REQUEST_CREATE_APPWIDGET) && resultCode == RESULT_CANCELED) {
-            if (data != null) {
-                // Clean up the appWidgetId if we canceled
-                int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
-                if (appWidgetId != -1) {
-                    mAppWidgetHost.deleteAppWidgetId(appWidgetId);
-                }
-            }
         }
-
+        mDragLayer.clearAnimatedView();
         // Exit spring loaded mode if necessary after cancelling the configuration of a widget
-        exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), delayExitSpringLoadedMode);
+        exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), delayExitSpringLoadedMode,
+                null);
+    }
+
+    private void completeTwoStageWidgetDrop(final int resultCode, final int appWidgetId) {
+        CellLayout cellLayout = (CellLayout) mWorkspace.getChildAt(mWidgetBeingConfigured.screen);
+        Runnable onCompleteRunnable = null;
+        int animationType = 0;
+
+        if (resultCode == RESULT_OK) {
+            animationType = Workspace.COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION;
+            final AppWidgetHostView layout = mAppWidgetHost.createView(this, appWidgetId,
+                    mWidgetBeingConfigured.info);
+            mWidgetBeingConfigured.boundWidget = layout;
+            onCompleteRunnable = new Runnable() {
+                @Override
+                public void run() {
+                    completeAddAppWidget(appWidgetId, mPendingAddInfo.container,
+                            mPendingAddInfo.screen, layout, null);
+                    exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), false,
+                            null);
+                }
+            };
+        } else if (resultCode == RESULT_CANCELED) {
+            animationType = Workspace.CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION;
+            onCompleteRunnable = new Runnable() {
+                @Override
+                public void run() {
+                    exitSpringLoadedDragModeDelayed((resultCode != RESULT_CANCELED), false,
+                            null);
+                }
+            };
+        }
+        mWorkspace.animateWidgetDrop(mWidgetBeingConfigured, cellLayout,
+                (DragView) mDragLayer.getAnimatedView(), onCompleteRunnable,
+                animationType, mWidgetBeingConfigured.boundWidget, true);
+        mWidgetBeingConfigured = null;
     }
 
     @Override
     protected void onResume() {
         super.onResume();
+
         mPaused = false;
         if (mRestoring || mOnResumeNeedsLoad) {
             mWorkspaceLoading = true;
-            mModel.startLoader(this, true);
+            mModel.startLoader(true);
             mRestoring = false;
             mOnResumeNeedsLoad = false;
         }
+
+        // Reset the pressed state of icons that were locked in the press state while activities
+        // were launching
         if (mWaitingForResume != null) {
+            // Resets the previous workspace icon press state
             mWaitingForResume.setStayPressed(false);
         }
-        // When we resume Launcher, a different Activity might be responsible for the app
-        // market intent, so refresh the icon
-        updateAppMarketIcon();
-        mAppsCustomizeTabHost.onResume();
-        if (!mWorkspaceLoading) {
-            final ViewTreeObserver observer = mWorkspace.getViewTreeObserver();
-            final Workspace workspace = mWorkspace;
-            // We want to let Launcher draw itself at least once before we force it to build
-            // layers on all the workspace pages, so that transitioning to Launcher from other
-            // apps is nice and speedy. Usually the first call to preDraw doesn't correspond to
-            // a true draw so we wait until the second preDraw call to be safe
-            observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
-                boolean mFirstTime = true;
-                public boolean onPreDraw() {
-                    if (mFirstTime) {
-                        mFirstTime = false;
-                    } else {
-                        // We delay the layer building a bit in order to give
-                        // other message processing a time to run.  In particular
-                        // this avoids a delay in hiding the IME if it was
-                        // currently shown, because doing that may involve
-                        // some communication back with the app.
-                        workspace.postDelayed(mBuildLayersRunnable, 500);
-                        observer.removeOnPreDrawListener(this);
-                    }
-                    return true;
-                }
-            });
+        if (mAppsCustomizeContent != null) {
+            // Resets the previous all apps icon press state
+            mAppsCustomizeContent.resetDrawableState();
         }
-        clearTypedText();
     }
 
     @Override
@@ -705,7 +742,7 @@
             showAllApps(false);
         }
 
-        final int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN, -1);
+        int currentScreen = savedState.getInt(RUNTIME_STATE_CURRENT_SCREEN, -1);
         if (currentScreen > -1) {
             mWorkspace.setCurrentPage(currentScreen);
         }
@@ -848,7 +885,7 @@
             cellXY[0] = cellX;
             cellXY[1] = cellY;
         } else if (!layout.findCellForSpan(cellXY, 1, 1)) {
-            showOutOfSpaceMessage();
+            showOutOfSpaceMessage(isHotseatLayout(layout));
             return;
         }
 
@@ -892,13 +929,14 @@
             foundCellSpan = true;
 
             // If appropriate, either create a folder or add to an existing folder
-            if (mWorkspace.createUserFolderIfNecessary(view, container, layout, cellXY,
+            if (mWorkspace.createUserFolderIfNecessary(view, container, layout, cellXY, 0,
                     true, null,null)) {
                 return;
             }
             DragObject dragObject = new DragObject();
             dragObject.dragInfo = info;
-            if (mWorkspace.addToExistingFolderIfNecessary(view, layout, cellXY, dragObject, true)) {
+            if (mWorkspace.addToExistingFolderIfNecessary(view, layout, cellXY, 0, dragObject,
+                    true)) {
                 return;
             }
         } else if (touchXY != null) {
@@ -910,7 +948,7 @@
         }
 
         if (!foundCellSpan) {
-            showOutOfSpaceMessage();
+            showOutOfSpaceMessage(isHotseatLayout(layout));
             return;
         }
 
@@ -939,7 +977,7 @@
         return getSpanForWidget(info.provider, info.minWidth, info.minHeight, spanXY);
     }
 
-    int[] getMinResizeSpanForWidget(AppWidgetProviderInfo info, int[] spanXY) {
+    int[] getMinSpanForWidget(AppWidgetProviderInfo info, int[] spanXY) {
         return getSpanForWidget(info.provider, info.minResizeWidth, info.minResizeHeight, spanXY);
     }
 
@@ -947,18 +985,27 @@
         return getSpanForWidget(info.componentName, info.minWidth, info.minHeight, spanXY);
     }
 
+    int[] getMinSpanForWidget(PendingAddWidgetInfo info, int[] spanXY) {
+        return getSpanForWidget(info.componentName, info.minResizeWidth,
+                info.minResizeHeight, spanXY);
+    }
+
     /**
      * Add a widget to the workspace.
      *
      * @param appWidgetId The app widget id
      * @param cellInfo The position on screen where to create the widget.
      */
-    private void completeAddAppWidget(final int appWidgetId, long container, int screen) {
-        AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
+    private void completeAddAppWidget(final int appWidgetId, long container, int screen,
+            AppWidgetHostView hostView, AppWidgetProviderInfo appWidgetInfo) {
+        if (appWidgetInfo == null) {
+            appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
+        }
 
         // Calculate the grid spans needed to fit this widget
         CellLayout layout = getCellLayout(container, screen);
 
+        int[] minSpanXY = getMinSpanForWidget(appWidgetInfo, null);
         int[] spanXY = getSpanForWidget(appWidgetInfo, null);
 
         // Try finding open space on Launcher screen
@@ -966,18 +1013,24 @@
         // if we are placing widgets on a "spring-loaded" screen
         int[] cellXY = mTmpAddItemCellCoordinates;
         int[] touchXY = mPendingAddInfo.dropPos;
+        int[] finalSpan = new int[2];
         boolean foundCellSpan = false;
         if (mPendingAddInfo.cellX >= 0 && mPendingAddInfo.cellY >= 0) {
             cellXY[0] = mPendingAddInfo.cellX;
             cellXY[1] = mPendingAddInfo.cellY;
+            spanXY[0] = mPendingAddInfo.spanX;
+            spanXY[1] = mPendingAddInfo.spanY;
             foundCellSpan = true;
         } else if (touchXY != null) {
             // when dragging and dropping, just find the closest free spot
             int[] result = layout.findNearestVacantArea(
-                    touchXY[0], touchXY[1], spanXY[0], spanXY[1], cellXY);
+                    touchXY[0], touchXY[1], minSpanXY[0], minSpanXY[1], spanXY[0],
+                    spanXY[1], cellXY, finalSpan);
+            spanXY[0] = finalSpan[0];
+            spanXY[1] = finalSpan[1];
             foundCellSpan = (result != null);
         } else {
-            foundCellSpan = layout.findCellForSpan(cellXY, spanXY[0], spanXY[1]);
+            foundCellSpan = layout.findCellForSpan(cellXY, minSpanXY[0], minSpanXY[1]);
         }
 
         if (!foundCellSpan) {
@@ -990,7 +1043,7 @@
                     }
                 }.start();
             }
-            showOutOfSpaceMessage();
+            showOutOfSpaceMessage(isHotseatLayout(layout));
             return;
         }
 
@@ -998,22 +1051,30 @@
         LauncherAppWidgetInfo launcherInfo = new LauncherAppWidgetInfo(appWidgetId);
         launcherInfo.spanX = spanXY[0];
         launcherInfo.spanY = spanXY[1];
+        launcherInfo.minSpanX = mPendingAddInfo.minSpanX;
+        launcherInfo.minSpanY = mPendingAddInfo.minSpanY;
 
         LauncherModel.addItemToDatabase(this, launcherInfo,
                 container, screen, cellXY[0], cellXY[1], false);
 
         if (!mRestoring) {
-            // Perform actual inflation because we're live
-            launcherInfo.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
+            if (hostView == null) {
+                // Perform actual inflation because we're live
+                launcherInfo.hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
+                launcherInfo.hostView.setAppWidget(appWidgetId, appWidgetInfo);
+            } else {
+                // The AppWidgetHostView has already been inflated and instantiated
+                launcherInfo.hostView = hostView;
+            }
 
-            launcherInfo.hostView.setAppWidget(appWidgetId, appWidgetInfo);
             launcherInfo.hostView.setTag(launcherInfo);
-
+            launcherInfo.hostView.setVisibility(View.VISIBLE);
             mWorkspace.addInScreen(launcherInfo.hostView, container, screen, cellXY[0], cellXY[1],
                     launcherInfo.spanX, launcherInfo.spanY, isWorkspaceLocked());
 
             addWidgetToAutoAdvanceIfNeeded(launcherInfo.hostView, appWidgetInfo);
         }
+        resetAddInfo();
     }
 
     private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@@ -1068,6 +1129,35 @@
     public void onWindowVisibilityChanged(int visibility) {
         mVisible = visibility == View.VISIBLE;
         updateRunning();
+        // The following code used to be in onResume, but it turns out onResume is called when
+        // you're in All Apps and click home to go to the workspace. onWindowVisibilityChanged
+        // is a more appropriate event to handle
+        if (mVisible) {
+            mAppsCustomizeTabHost.onWindowVisible();
+            if (!mWorkspaceLoading) {
+                final ViewTreeObserver observer = mWorkspace.getViewTreeObserver();
+                // We want to let Launcher draw itself at least once before we force it to build
+                // layers on all the workspace pages, so that transitioning to Launcher from other
+                // apps is nice and speedy. Usually the first call to preDraw doesn't correspond to
+                // a true draw so we wait until the second preDraw call to be safe
+                observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+                    public boolean onPreDraw() {
+                        // We delay the layer building a bit in order to give
+                        // other message processing a time to run.  In particular
+                        // this avoids a delay in hiding the IME if it was
+                        // currently shown, because doing that may involve
+                        // some communication back with the app.
+                        mWorkspace.postDelayed(mBuildLayersRunnable, 500);
+                        observer.removeOnPreDrawListener(this);
+                        return true;
+                    }
+                });
+            }
+            // When Launcher comes back to foreground, a different Activity might be responsible for
+            // the app market intent, so refresh the icon
+            updateAppMarketIcon();
+            clearTypedText();
+        }
     }
 
     private void sendAdvanceMessage(long delay) {
@@ -1139,8 +1229,9 @@
         launcherInfo.hostView = null;
     }
 
-    void showOutOfSpaceMessage() {
-        Toast.makeText(this, getString(R.string.out_of_space), Toast.LENGTH_SHORT).show();
+    void showOutOfSpaceMessage(boolean isHotseatLayout) {
+        int strId = (isHotseatLayout ? R.string.hotseat_out_of_space : R.string.out_of_space);
+        Toast.makeText(this, getString(strId), Toast.LENGTH_SHORT).show();
     }
 
     public LauncherAppWidgetHost getAppWidgetHost() {
@@ -1408,6 +1499,7 @@
         mPendingAddInfo.screen = -1;
         mPendingAddInfo.cellX = mPendingAddInfo.cellY = -1;
         mPendingAddInfo.spanX = mPendingAddInfo.spanY = -1;
+        mPendingAddInfo.minSpanX = mPendingAddInfo.minSpanY = -1;
         mPendingAddInfo.dropPos = null;
     }
 
@@ -1419,9 +1511,9 @@
         addAppWidgetImpl(appWidgetId, null);
     }
 
-    void addAppWidgetImpl(int appWidgetId, PendingAddWidgetInfo info) {
-        AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
-
+    void addAppWidgetImpl(final int appWidgetId, final PendingAddWidgetInfo info) {
+        final AppWidgetProviderInfo appWidget = info.info;
+        Runnable configurationActivity = null;
         if (appWidget.configure != null) {
             // Launch over to configure widget, if needed
             Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
@@ -1429,9 +1521,8 @@
             intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
             if (info != null) {
                 if (info.mimeType != null && !info.mimeType.isEmpty()) {
-                    intent.putExtra(
-                            InstallWidgetReceiver.EXTRA_APPWIDGET_CONFIGURATION_DATA_MIME_TYPE,
-                            info.mimeType);
+                    intent.putExtra(InstallWidgetReceiver.
+                            EXTRA_APPWIDGET_CONFIGURATION_DATA_MIME_TYPE, info.mimeType);
 
                     final String mimeType = info.mimeType;
                     final ClipData clipData = (ClipData) info.configurationData;
@@ -1442,8 +1533,8 @@
                             final CharSequence stringData = item.getText();
                             final Uri uriData = item.getUri();
                             final Intent intentData = item.getIntent();
-                            final String key =
-                                InstallWidgetReceiver.EXTRA_APPWIDGET_CONFIGURATION_DATA;
+                            final String key = InstallWidgetReceiver.
+                                    EXTRA_APPWIDGET_CONFIGURATION_DATA;
                             if (uriData != null) {
                                 intent.putExtra(key, uriData);
                             } else if (intentData != null) {
@@ -1456,14 +1547,13 @@
                     }
                 }
             }
-
             startActivityForResultSafely(intent, REQUEST_CREATE_APPWIDGET);
+            mWidgetBeingConfigured = info;
         } else {
             // Otherwise just add it
-            completeAddAppWidget(appWidgetId, info.container, info.screen);
-
+            completeAddAppWidget(appWidgetId, info.container, info.screen, info.boundWidget, appWidget);
             // Exit spring loaded mode if necessary after adding the widget
-            exitSpringLoadedDragModeDelayed(true, false);
+            exitSpringLoadedDragModeDelayed(true, false, null);
         }
     }
 
@@ -1501,18 +1591,31 @@
      * @param position The location on the screen where it was dropped, optional
      */
     void addAppWidgetFromDrop(PendingAddWidgetInfo info, long container, int screen,
-            int[] cell, int[] loc) {
+            int[] cell, int[] span, int[] loc) {
         resetAddInfo();
         mPendingAddInfo.container = info.container = container;
         mPendingAddInfo.screen = info.screen = screen;
         mPendingAddInfo.dropPos = loc;
+        mPendingAddInfo.minSpanX = info.minSpanX;
+        mPendingAddInfo.minSpanY = info.minSpanY;
+
         if (cell != null) {
             mPendingAddInfo.cellX = cell[0];
             mPendingAddInfo.cellY = cell[1];
         }
+        if (span != null) {
+            mPendingAddInfo.spanX = span[0];
+            mPendingAddInfo.spanY = span[1];
+        }
 
-        int appWidgetId = getAppWidgetHost().allocateAppWidgetId();
-        AppWidgetManager.getInstance(this).bindAppWidgetId(appWidgetId, info.componentName);
+        AppWidgetHostView hostView = info.boundWidget;
+        int appWidgetId;
+        if (hostView != null) {
+            appWidgetId = hostView.getAppWidgetId();
+        } else {
+            appWidgetId = getAppWidgetHost().allocateAppWidgetId();
+            AppWidgetManager.getInstance(this).bindAppWidgetId(appWidgetId, info.componentName);
+        }
         addAppWidgetImpl(appWidgetId, info);
     }
 
@@ -1662,7 +1765,7 @@
             return;
         }
 
-        if (mWorkspace.isSwitchingState()) {
+        if (!mWorkspace.isFinishedSwitchingState()) {
             return;
         }
 
@@ -1743,6 +1846,8 @@
     public void onClickAppMarketButton(View v) {
         if (mAppMarketIntent != null) {
             startActivitySafely(mAppMarketIntent, "app market");
+        } else {
+            Log.e(TAG, "Invalid app market intent.");
         }
     }
 
@@ -1931,6 +2036,7 @@
     }
 
     public boolean onLongClick(View v) {
+
         if (mState != State.WORKSPACE) {
             return false;
         }
@@ -2098,7 +2204,7 @@
 
                 if (mWorkspaceLoading) {
                     lockAllApps();
-                    mModel.startLoader(Launcher.this, false);
+                    mModel.startLoader(false);
                 } else {
                     final FolderIcon folderIcon = (FolderIcon)
                             mWorkspace.getViewForTag(mFolderInfo);
@@ -2110,7 +2216,7 @@
                     } else {
                         lockAllApps();
                         mWorkspaceLoading = true;
-                        mModel.startLoader(Launcher.this, false);
+                        mModel.startLoader(false);
                     }
                 }
             }
@@ -2129,6 +2235,10 @@
         return (mState == State.APPS_CUSTOMIZE);
     }
 
+    public boolean isAllAppsButtonRank(int rank) {
+        return mHotseat.isAllAppsButtonRank(rank);
+    }
+
     // AllAppsView.Watcher
     public void zoomed(float zoom) {
         if (zoom == 1.0f) {
@@ -2156,6 +2266,30 @@
         }
     }
 
+    private void dispatchOnLauncherTransitionStart(View v, boolean animated, boolean toWorkspace) {
+        if (v instanceof LauncherTransitionable) {
+            ((LauncherTransitionable) v).onLauncherTransitionStart(this, animated, toWorkspace);
+        }
+
+        // Update the workspace transition step as well
+        dispatchOnLauncherTransitionStep(v, 0f);
+    }
+
+    private void dispatchOnLauncherTransitionStep(View v, float t) {
+        if (v instanceof LauncherTransitionable) {
+            ((LauncherTransitionable) v).onLauncherTransitionStep(this, t);
+        }
+    }
+
+    private void dispatchOnLauncherTransitionEnd(View v, boolean animated, boolean toWorkspace) {
+        if (v instanceof LauncherTransitionable) {
+            ((LauncherTransitionable) v).onLauncherTransitionEnd(this, animated, toWorkspace);
+        }
+
+        // Update the workspace transition step as well
+        dispatchOnLauncherTransitionStep(v, 1f);
+    }
+
     /**
      * Things to test when changing the following seven functions.
      *   - Home from workspace
@@ -2201,7 +2335,7 @@
      * Assumes that the view to show is anchored at either the very top or very bottom
      * of the screen.
      */
-    private void showAppsCustomizeHelper(boolean animated, final boolean springLoaded) {
+    private void showAppsCustomizeHelper(final boolean animated, final boolean springLoaded) {
         if (mStateAnimation != null) {
             mStateAnimation.cancel();
             mStateAnimation = null;
@@ -2212,6 +2346,7 @@
         final int duration = res.getInteger(R.integer.config_appsCustomizeZoomInTime);
         final int fadeDuration = res.getInteger(R.integer.config_appsCustomizeFadeInTime);
         final float scale = (float) res.getInteger(R.integer.config_appsCustomizeZoomScaleFactor);
+        final View fromView = mWorkspace;
         final View toView = mAppsCustomizeTabHost;
         final int startDelay =
                 res.getInteger(R.integer.config_workspaceAppsCustomizeAnimationStagger);
@@ -2219,32 +2354,40 @@
         setPivotsForZoom(toView, scale);
 
         // Shrink workspaces away if going to AppsCustomize from workspace
-        mWorkspace.changeState(Workspace.State.SMALL, animated);
+        Animator workspaceAnim =
+                mWorkspace.getChangeStateAnimation(Workspace.State.SMALL, animated);
 
         if (animated) {
-            final ValueAnimator scaleAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
-            scaleAnim.setInterpolator(new Workspace.ZoomOutInterpolator());
-            scaleAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
-                public void onAnimationUpdate(float a, float b) {
-                    toView.setScaleX(a * scale + b * 1f);
-                    toView.setScaleY(a * scale + b * 1f);
-                }
-            });
+            toView.setScaleX(scale);
+            toView.setScaleY(scale);
+            final LauncherViewPropertyAnimator scaleAnim = new LauncherViewPropertyAnimator(toView);
+            scaleAnim.
+                scaleX(1f).scaleY(1f).
+                setDuration(duration).
+                setInterpolator(new Workspace.ZoomOutInterpolator());
 
             toView.setVisibility(View.VISIBLE);
             toView.setAlpha(0f);
-            ValueAnimator alphaAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(fadeDuration);
+            final ObjectAnimator alphaAnim = ObjectAnimator
+                .ofFloat(toView, "alpha", 0f, 1f)
+                .setDuration(fadeDuration);
             alphaAnim.setInterpolator(new DecelerateInterpolator(1.5f));
-            alphaAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
-                public void onAnimationUpdate(float a, float b) {
-                    // don't need to invalidate because we do so above
-                    toView.setAlpha(a * 0f + b * 1f);
+            alphaAnim.addUpdateListener(new AnimatorUpdateListener() {
+                @Override
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    float t = (Float) animation.getAnimatedValue();
+                    dispatchOnLauncherTransitionStep(fromView, t);
+                    dispatchOnLauncherTransitionStep(toView, t);
                 }
             });
-            alphaAnim.setStartDelay(startDelay);
-            alphaAnim.start();
 
-            scaleAnim.addListener(new AnimatorListenerAdapter() {
+            // toView should appear right at the end of the workspace shrink
+            // animation
+            mStateAnimation = new AnimatorSet();
+            mStateAnimation.play(scaleAnim).after(startDelay);
+            mStateAnimation.play(alphaAnim).after(startDelay);
+
+            mStateAnimation.addListener(new AnimatorListenerAdapter() {
                 boolean animationCancelled = false;
 
                 @Override
@@ -2258,15 +2401,8 @@
                 }
                 @Override
                 public void onAnimationEnd(Animator animation) {
-                    // If we don't set the final scale values here, if this animation is cancelled
-                    // it will have the wrong scale value and subsequent cameraPan animations will
-                    // not fix that
-                    toView.setScaleX(1.0f);
-                    toView.setScaleY(1.0f);
-                    if (toView instanceof LauncherTransitionable) {
-                        ((LauncherTransitionable) toView).onLauncherTransitionEnd(instance,
-                                scaleAnim, false);
-                    }
+                    dispatchOnLauncherTransitionEnd(fromView, animated, false);
+                    dispatchOnLauncherTransitionEnd(toView, animated, false);
 
                     if (!springLoaded && !LauncherApplication.isScreenLarge()) {
                         // Hide the workspace scrollbar
@@ -2284,19 +2420,48 @@
                 }
             });
 
-            // toView should appear right at the end of the workspace shrink animation
-            mStateAnimation = new AnimatorSet();
-            mStateAnimation.play(scaleAnim).after(startDelay);
+            if (workspaceAnim != null) {
+                mStateAnimation.play(workspaceAnim);
+            }
 
             boolean delayAnim = false;
-            if (toView instanceof LauncherTransitionable) {
-                LauncherTransitionable lt = (LauncherTransitionable) toView;
-                delayAnim = lt.onLauncherTransitionStart(instance, mStateAnimation, false);
+            final ViewTreeObserver observer;
+
+            dispatchOnLauncherTransitionStart(fromView, animated, false);
+            dispatchOnLauncherTransitionStart(toView, animated, false);
+
+            // If any of the objects being animated haven't been measured/laid out
+            // yet, delay the animation until we get a layout pass
+            if ((((LauncherTransitionable) toView).getContent().getMeasuredWidth() == 0) ||
+                    (mWorkspace.getMeasuredWidth() == 0) ||
+                    (toView.getMeasuredWidth() == 0)) {
+                observer = mWorkspace.getViewTreeObserver();
+                delayAnim = true;
+            } else {
+                observer = null;
             }
-            // if the anim is delayed, the LauncherTransitionable is responsible for starting it
-            if (!delayAnim) {
-                // TODO: q-- what if this anim is cancelled before being started? or started after
-                // being cancelled?
+
+            if (delayAnim) {
+                final AnimatorSet stateAnimation = mStateAnimation;
+                final OnGlobalLayoutListener delayedStart = new OnGlobalLayoutListener() {
+                    public void onGlobalLayout() {
+                        mWorkspace.post(new Runnable() {
+                            public void run() {
+                                // Check that mStateAnimation hasn't changed while
+                                // we waited for a layout pass
+                                if (mStateAnimation == stateAnimation) {
+                                    // Need to update pivots for zoom if layout changed
+                                    setPivotsForZoom(toView, scale);
+                                    mStateAnimation.start();
+                                }
+                            }
+                        });
+                        observer.removeGlobalOnLayoutListener(this);
+                    }
+                };
+                observer.addOnGlobalLayoutListener(delayedStart);
+            } else {
+                setPivotsForZoom(toView, scale);
                 mStateAnimation.start();
             }
         } else {
@@ -2306,16 +2471,16 @@
             toView.setScaleY(1.0f);
             toView.setVisibility(View.VISIBLE);
             toView.bringToFront();
-            if (toView instanceof LauncherTransitionable) {
-                ((LauncherTransitionable) toView).onLauncherTransitionStart(instance, null, false);
-                ((LauncherTransitionable) toView).onLauncherTransitionEnd(instance, null, false);
 
-                if (!springLoaded && !LauncherApplication.isScreenLarge()) {
-                    // Hide the workspace scrollbar
-                    mWorkspace.hideScrollingIndicator(true);
-                    hideDockDivider();
-                }
+            if (!springLoaded && !LauncherApplication.isScreenLarge()) {
+                // Hide the workspace scrollbar
+                mWorkspace.hideScrollingIndicator(true);
+                hideDockDivider();
             }
+            dispatchOnLauncherTransitionStart(fromView, animated, false);
+            dispatchOnLauncherTransitionEnd(fromView, animated, false);
+            dispatchOnLauncherTransitionStart(toView, animated, false);
+            dispatchOnLauncherTransitionEnd(toView, animated, false);
             updateWallpaperVisibility(false);
         }
     }
@@ -2325,18 +2490,32 @@
      * This is the opposite of showAppsCustomizeHelper.
      * @param animated If true, the transition will be animated.
      */
-    private void hideAppsCustomizeHelper(boolean animated, final boolean springLoaded) {
+    private void hideAppsCustomizeHelper(State toState, final boolean animated,
+            final boolean springLoaded, final Runnable onCompleteRunnable) {
+
         if (mStateAnimation != null) {
             mStateAnimation.cancel();
             mStateAnimation = null;
         }
         Resources res = getResources();
-        final Launcher instance = this;
 
         final int duration = res.getInteger(R.integer.config_appsCustomizeZoomOutTime);
+        final int fadeOutDuration =
+                res.getInteger(R.integer.config_appsCustomizeFadeOutTime);
         final float scaleFactor = (float)
                 res.getInteger(R.integer.config_appsCustomizeZoomScaleFactor);
         final View fromView = mAppsCustomizeTabHost;
+        final View toView = mWorkspace;
+        Animator workspaceAnim = null;
+
+        if (toState == State.WORKSPACE) {
+            int stagger = res.getInteger(R.integer.config_appsCustomizeWorkspaceAnimationStagger);
+            workspaceAnim = mWorkspace.getChangeStateAnimation(
+                    Workspace.State.NORMAL, animated, stagger);
+        } else if (toState == State.APPS_CUSTOMIZE_SPRING_LOADED) {
+            workspaceAnim = mWorkspace.getChangeStateAnimation(
+                    Workspace.State.SPRING_LOADED, animated);
+        }
 
         setPivotsForZoom(fromView, scaleFactor);
         updateWallpaperVisibility(true);
@@ -2345,48 +2524,56 @@
             final float oldScaleX = fromView.getScaleX();
             final float oldScaleY = fromView.getScaleY();
 
-            ValueAnimator scaleAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
-            scaleAnim.setInterpolator(new Workspace.ZoomInInterpolator());
-            scaleAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
-                public void onAnimationUpdate(float a, float b) {
-                    fromView.setScaleX(a * oldScaleX + b * scaleFactor);
-                    fromView.setScaleY(a * oldScaleY + b * scaleFactor);
-                }
-            });
-            final ValueAnimator alphaAnim = ValueAnimator.ofFloat(0f, 1f);
-            alphaAnim.setDuration(res.getInteger(R.integer.config_appsCustomizeFadeOutTime));
+            final LauncherViewPropertyAnimator scaleAnim =
+                    new LauncherViewPropertyAnimator(fromView);
+            scaleAnim.
+                scaleX(scaleFactor).scaleY(scaleFactor).
+                setDuration(duration).
+                setInterpolator(new Workspace.ZoomInInterpolator());
+
+            final ObjectAnimator alphaAnim = ObjectAnimator
+                .ofFloat(fromView, "alpha", 1f, 0f)
+                .setDuration(fadeOutDuration);
             alphaAnim.setInterpolator(new AccelerateDecelerateInterpolator());
-            alphaAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
-                public void onAnimationUpdate(float a, float b) {
-                    fromView.setAlpha(a * 1f + b * 0f);
-                }
-            });
-            if (fromView instanceof LauncherTransitionable) {
-                ((LauncherTransitionable) fromView).onLauncherTransitionStart(instance, alphaAnim,
-                        true);
-            }
-            alphaAnim.addListener(new AnimatorListenerAdapter() {
+            alphaAnim.addUpdateListener(new AnimatorUpdateListener() {
                 @Override
-                public void onAnimationEnd(Animator animation) {
-                    updateWallpaperVisibility(true);
-                    fromView.setVisibility(View.GONE);
-                    if (fromView instanceof LauncherTransitionable) {
-                        ((LauncherTransitionable) fromView).onLauncherTransitionEnd(instance,
-                                alphaAnim, true);
-                    }
-                    mWorkspace.hideScrollingIndicator(false);
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    float t = 1f - (Float) animation.getAnimatedValue();
+                    dispatchOnLauncherTransitionStep(fromView, t);
+                    dispatchOnLauncherTransitionStep(toView, t);
                 }
             });
 
             mStateAnimation = new AnimatorSet();
+
+            dispatchOnLauncherTransitionStart(fromView, animated, true);
+            dispatchOnLauncherTransitionStart(toView, animated, true);
+
+            mStateAnimation.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    updateWallpaperVisibility(true);
+                    fromView.setVisibility(View.GONE);
+                    dispatchOnLauncherTransitionEnd(fromView, animated, true);
+                    dispatchOnLauncherTransitionEnd(toView, animated, true);
+                    mWorkspace.hideScrollingIndicator(false);
+                    if (onCompleteRunnable != null) {
+                        onCompleteRunnable.run();
+                    }
+                }
+            });
+
             mStateAnimation.playTogether(scaleAnim, alphaAnim);
+            if (workspaceAnim != null) {
+                mStateAnimation.play(workspaceAnim);
+            }
             mStateAnimation.start();
         } else {
             fromView.setVisibility(View.GONE);
-            if (fromView instanceof LauncherTransitionable) {
-                ((LauncherTransitionable) fromView).onLauncherTransitionStart(instance, null, true);
-                ((LauncherTransitionable) fromView).onLauncherTransitionEnd(instance, null, true);
-            }
+            dispatchOnLauncherTransitionStart(fromView, animated, true);
+            dispatchOnLauncherTransitionEnd(fromView, animated, true);
+            dispatchOnLauncherTransitionStart(toView, animated, true);
+            dispatchOnLauncherTransitionEnd(toView, animated, true);
             mWorkspace.hideScrollingIndicator(false);
         }
     }
@@ -2394,19 +2581,19 @@
     @Override
     public void onTrimMemory(int level) {
         super.onTrimMemory(level);
-        if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
+        if (level >= ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
             mAppsCustomizeTabHost.onTrimMemory();
         }
     }
 
     void showWorkspace(boolean animated) {
-        Resources res = getResources();
-        int stagger = res.getInteger(R.integer.config_appsCustomizeWorkspaceAnimationStagger);
+        showWorkspace(animated, null);
+    }
 
-        mWorkspace.changeState(Workspace.State.NORMAL, animated, stagger);
+    void showWorkspace(boolean animated, Runnable onCompleteRunnable) {
         if (mState != State.WORKSPACE) {
             mWorkspace.setVisibility(View.VISIBLE);
-            hideAppsCustomizeHelper(animated, false);
+            hideAppsCustomizeHelper(State.WORKSPACE, animated, false, onCompleteRunnable);
 
             // Show the search bar and hotseat
             mSearchDropTargetBar.showSearchBar(animated);
@@ -2455,14 +2642,14 @@
 
     void enterSpringLoadedDragMode() {
         if (mState == State.APPS_CUSTOMIZE) {
-            mWorkspace.changeState(Workspace.State.SPRING_LOADED);
-            hideAppsCustomizeHelper(true, true);
+            hideAppsCustomizeHelper(State.APPS_CUSTOMIZE_SPRING_LOADED, true, true, null);
             hideDockDivider();
             mState = State.APPS_CUSTOMIZE_SPRING_LOADED;
         }
     }
 
-    void exitSpringLoadedDragModeDelayed(final boolean successfulDrop, boolean extendedDelay) {
+    void exitSpringLoadedDragModeDelayed(final boolean successfulDrop, boolean extendedDelay,
+            final Runnable onCompleteRunnable) {
         if (mState != State.APPS_CUSTOMIZE_SPRING_LOADED) return;
 
         mHandler.postDelayed(new Runnable() {
@@ -2474,7 +2661,7 @@
                     // clean up our state transition functions
                     mAppsCustomizeTabHost.setVisibility(View.GONE);
                     mSearchDropTargetBar.showSearchBar(true);
-                    showWorkspace(true);
+                    showWorkspace(true, onCompleteRunnable);
                 } else {
                     exitSpringLoadedDragMode();
                 }
@@ -2539,8 +2726,10 @@
     void showHotseat(boolean animated) {
         if (!LauncherApplication.isScreenLarge()) {
             if (animated) {
-                int duration = mSearchDropTargetBar.getTransitionInDuration();
-                mHotseat.animate().alpha(1f).setDuration(duration);
+                if (mHotseat.getAlpha() != 1f) {
+                    int duration = mSearchDropTargetBar.getTransitionInDuration();
+                    mHotseat.animate().alpha(1f).setDuration(duration);
+                }
             } else {
                 mHotseat.setAlpha(1f);
             }
@@ -2553,8 +2742,10 @@
     void hideHotseat(boolean animated) {
         if (!LauncherApplication.isScreenLarge()) {
             if (animated) {
-                int duration = mSearchDropTargetBar.getTransitionOutDuration();
-                mHotseat.animate().alpha(0f).setDuration(duration);
+                if (mHotseat.getAlpha() != 0f) {
+                    int duration = mSearchDropTargetBar.getTransitionOutDuration();
+                    mHotseat.animate().alpha(0f).setDuration(duration);
+                }
             } else {
                 mHotseat.setAlpha(0f);
             }
@@ -2567,7 +2758,7 @@
      */
     void addExternalItemToScreen(ItemInfo itemInfo, final CellLayout layout) {
         if (!mWorkspace.addExternalItemToScreen(itemInfo, layout)) {
-            showOutOfSpaceMessage();
+            showOutOfSpaceMessage(isHotseatLayout(layout));
         }
     }
 
@@ -2905,7 +3096,6 @@
         }
     }
 
-
     /**
      * Refreshes the shortcuts shown on the workspace.
      *
@@ -2914,6 +3104,8 @@
     public void startBinding() {
         final Workspace workspace = mWorkspace;
 
+        mNewShortcutAnimatePage = -1;
+        mNewShortcutAnimateViews.clear();
         mWorkspace.clearDropTargets();
         int count = workspace.getChildCount();
         for (int i = 0; i < count; i++) {
@@ -2935,8 +3127,12 @@
     public void bindItems(ArrayList<ItemInfo> shortcuts, int start, int end) {
         setLoadOnResume();
 
-        final Workspace workspace = mWorkspace;
-        for (int i=start; i<end; i++) {
+        // Get the list of added shortcuts and intersect them with the set of shortcuts here
+        Set<String> newApps = new HashSet<String>();
+        newApps = mSharedPrefs.getStringSet(InstallShortcutReceiver.NEW_APPS_LIST_KEY, newApps);
+
+        Workspace workspace = mWorkspace;
+        for (int i = start; i < end; i++) {
             final ItemInfo item = shortcuts.get(i);
 
             // Short circuit if we are loading dock items for a configuration which has no dock
@@ -2948,9 +3144,23 @@
             switch (item.itemType) {
                 case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
                 case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
-                    View shortcut = createShortcut((ShortcutInfo)item);
+                    ShortcutInfo info = (ShortcutInfo) item;
+                    String uri = info.intent.toUri(0).toString();
+                    View shortcut = createShortcut(info);
                     workspace.addInScreen(shortcut, item.container, item.screen, item.cellX,
                             item.cellY, 1, 1, false);
+                    if (newApps.contains(uri)) {
+                        newApps.remove(uri);
+
+                        // Prepare the view to be animated up
+                        shortcut.setAlpha(0f);
+                        shortcut.setScaleX(0f);
+                        shortcut.setScaleY(0f);
+                        mNewShortcutAnimatePage = item.screen;
+                        if (!mNewShortcutAnimateViews.contains(shortcut)) {
+                            mNewShortcutAnimateViews.add(shortcut);
+                        }
+                    }
                     break;
                 case LauncherSettings.Favorites.ITEM_TYPE_FOLDER:
                     FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this,
@@ -2961,6 +3171,7 @@
                     break;
             }
         }
+
         workspace.requestLayout();
     }
 
@@ -3031,8 +3242,6 @@
             mSavedInstanceState = null;
         }
 
-        mWorkspaceLoading = false;
-
         // If we received the result of any pending adds while the loader was running (e.g. the
         // widget configuration forced an orientation change), process them now.
         for (int i = 0; i < sPendingAddList.size(); i++) {
@@ -3044,7 +3253,72 @@
         // package changes in bindSearchablesChanged()
         updateAppMarketIcon();
 
-        mWorkspace.post(mBuildLayersRunnable);
+        // Animate up any icons as necessary
+        if (mVisible || mWorkspaceLoading) {
+            Runnable newAppsRunnable = new Runnable() {
+                @Override
+                public void run() {
+                    runNewAppsAnimation();
+                }
+            };
+            if (mNewShortcutAnimatePage > -1 &&
+                    mNewShortcutAnimatePage != mWorkspace.getCurrentPage()) {
+                mWorkspace.snapToPage(mNewShortcutAnimatePage, newAppsRunnable);
+            } else {
+                newAppsRunnable.run();
+            }
+        }
+
+        mWorkspaceLoading = false;
+    }
+
+    /**
+     * Runs a new animation that scales up icons that were added while Launcher was in the
+     * background.
+     */
+    private void runNewAppsAnimation() {
+        AnimatorSet anim = new AnimatorSet();
+        Collection<Animator> bounceAnims = new ArrayList<Animator>();
+        Collections.sort(mNewShortcutAnimateViews, new Comparator<View>() {
+            @Override
+            public int compare(View a, View b) {
+                CellLayout.LayoutParams alp = (CellLayout.LayoutParams) a.getLayoutParams();
+                CellLayout.LayoutParams blp = (CellLayout.LayoutParams) b.getLayoutParams();
+                int cellCountX = LauncherModel.getCellCountX();
+                return (alp.cellY * cellCountX + alp.cellX) - (blp.cellY * cellCountX + blp.cellX);
+            }
+        });
+        for (int i = 0; i < mNewShortcutAnimateViews.size(); ++i) {
+            View v = mNewShortcutAnimateViews.get(i);
+            ValueAnimator bounceAnim = ObjectAnimator.ofPropertyValuesHolder(v,
+                    PropertyValuesHolder.ofFloat("alpha", 1f),
+                    PropertyValuesHolder.ofFloat("scaleX", 1f),
+                    PropertyValuesHolder.ofFloat("scaleY", 1f));
+            bounceAnim.setDuration(InstallShortcutReceiver.NEW_SHORTCUT_BOUNCE_DURATION);
+            bounceAnim.setStartDelay(i * InstallShortcutReceiver.NEW_SHORTCUT_STAGGER_DELAY);
+            bounceAnim.setInterpolator(new SmoothPagedView.OvershootInterpolator());
+            bounceAnims.add(bounceAnim);
+        }
+        anim.playTogether(bounceAnims);
+        anim.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mWorkspace.postDelayed(mBuildLayersRunnable, 500);
+            }
+        });
+        anim.start();
+
+        // Clean up
+        mNewShortcutAnimatePage = -1;
+        mNewShortcutAnimateViews.clear();
+        new Thread("clearNewAppsThread") {
+            public void run() {
+                mSharedPrefs.edit()
+                            .putInt(InstallShortcutReceiver.NEW_APPS_PAGE_KEY, -1)
+                            .putStringSet(InstallShortcutReceiver.NEW_APPS_LIST_KEY, null)
+                            .commit();
+            }
+        }.start();
     }
 
     @Override
@@ -3187,7 +3461,6 @@
     }
 
     /* Cling related */
-    private static final String PREFS_KEY = "com.android.launcher2.prefs";
     private boolean isClingsEnabled() {
         // disable clings when running in a test harness
         if(ActivityManager.isRunningInTestHarness()) return false;
@@ -3223,11 +3496,14 @@
                 public void onAnimationEnd(Animator animation) {
                     cling.setVisibility(View.GONE);
                     cling.cleanup();
-                    SharedPreferences prefs =
-                        getSharedPreferences("com.android.launcher2.prefs", Context.MODE_PRIVATE);
-                    SharedPreferences.Editor editor = prefs.edit();
-                    editor.putBoolean(flag, true);
-                    editor.commit();
+                    // We should update the shared preferences on a background thread
+                    new Thread("dismissClingThread") {
+                        public void run() {
+                            SharedPreferences.Editor editor = mSharedPrefs.edit();
+                            editor.putBoolean(flag, true);
+                            editor.commit();
+                        }
+                    }.start();
                 };
             });
             anim.start();
@@ -3247,9 +3523,8 @@
     }
     public void showFirstRunWorkspaceCling() {
         // Enable the clings only if they have not been dismissed before
-        SharedPreferences prefs =
-            getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE);
-        if (isClingsEnabled() && !prefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false)) {
+        if (isClingsEnabled() &&
+                !mSharedPrefs.getBoolean(Cling.WORKSPACE_CLING_DISMISSED_KEY, false)) {
             initCling(R.id.workspace_cling, null, false, 0);
         } else {
             removeCling(R.id.workspace_cling);
@@ -3257,9 +3532,8 @@
     }
     public void showFirstRunAllAppsCling(int[] position) {
         // Enable the clings only if they have not been dismissed before
-        SharedPreferences prefs =
-            getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE);
-        if (isClingsEnabled() && !prefs.getBoolean(Cling.ALLAPPS_CLING_DISMISSED_KEY, false)) {
+        if (isClingsEnabled() &&
+                !mSharedPrefs.getBoolean(Cling.ALLAPPS_CLING_DISMISSED_KEY, false)) {
             initCling(R.id.all_apps_cling, position, true, 0);
         } else {
             removeCling(R.id.all_apps_cling);
@@ -3267,15 +3541,13 @@
     }
     public Cling showFirstRunFoldersCling() {
         // Enable the clings only if they have not been dismissed before
-        SharedPreferences prefs =
-            getSharedPreferences(PREFS_KEY, Context.MODE_PRIVATE);
-        Cling cling = null;
-        if (isClingsEnabled() && !prefs.getBoolean(Cling.FOLDER_CLING_DISMISSED_KEY, false)) {
-            cling = initCling(R.id.folder_cling, null, true, 0);
+        if (isClingsEnabled() &&
+                !mSharedPrefs.getBoolean(Cling.FOLDER_CLING_DISMISSED_KEY, false)) {
+            return initCling(R.id.folder_cling, null, true, 0);
         } else {
             removeCling(R.id.folder_cling);
+            return null;
         }
-        return cling;
     }
     public boolean isFolderClingVisible() {
         Cling cling = (Cling) findViewById(R.id.folder_cling);
@@ -3328,7 +3600,8 @@
 }
 
 interface LauncherTransitionable {
-    // return true if the callee will take care of start the animation by itself
-    boolean onLauncherTransitionStart(Launcher l, Animator animation, boolean toWorkspace);
-    void onLauncherTransitionEnd(Launcher l, Animator animation, boolean toWorkspace);
+    View getContent();
+    void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace);
+    void onLauncherTransitionStep(Launcher l, float t);
+    void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace);
 }
diff --git a/src/com/android/launcher2/LauncherAppWidgetHostView.java b/src/com/android/launcher2/LauncherAppWidgetHostView.java
index 0c3bdca..d73dd30 100644
--- a/src/com/android/launcher2/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher2/LauncherAppWidgetHostView.java
@@ -30,12 +30,12 @@
  * {@inheritDoc}
  */
 public class LauncherAppWidgetHostView extends AppWidgetHostView {
-    private boolean mHasPerformedLongPress;
-    private CheckForLongPress mPendingCheckForLongPress;
+    private CheckLongPressHelper mLongPressHelper;
     private LayoutInflater mInflater;
 
     public LauncherAppWidgetHostView(Context context) {
         super(context);
+        mLongPressHelper = new CheckLongPressHelper(this);
         mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     }
 
@@ -46,8 +46,8 @@
 
     public boolean onInterceptTouchEvent(MotionEvent ev) {
         // Consume any touch events for ourselves after longpress is triggered
-        if (mHasPerformedLongPress) {
-            mHasPerformedLongPress = false;
+        if (mLongPressHelper.hasPerformedLongPress()) {
+            mLongPressHelper.cancelLongPress();
             return true;
         }
 
@@ -55,16 +55,13 @@
         // users can always pick up this widget
         switch (ev.getAction()) {
             case MotionEvent.ACTION_DOWN: {
-                postCheckForLongClick();
+                mLongPressHelper.postCheckForLongPress();
                 break;
             }
 
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
-                mHasPerformedLongPress = false;
-                if (mPendingCheckForLongPress != null) {
-                    removeCallbacks(mPendingCheckForLongPress);
-                }
+                mLongPressHelper.cancelLongPress();
                 break;
         }
 
@@ -72,42 +69,11 @@
         return false;
     }
 
-    class CheckForLongPress implements Runnable {
-        private int mOriginalWindowAttachCount;
-
-        public void run() {
-            if ((mParent != null) && hasWindowFocus()
-                    && mOriginalWindowAttachCount == getWindowAttachCount()
-                    && !mHasPerformedLongPress) {
-                if (performLongClick()) {
-                    mHasPerformedLongPress = true;
-                }
-            }
-        }
-
-        public void rememberWindowAttachCount() {
-            mOriginalWindowAttachCount = getWindowAttachCount();
-        }
-    }
-
-    private void postCheckForLongClick() {
-        mHasPerformedLongPress = false;
-
-        if (mPendingCheckForLongPress == null) {
-            mPendingCheckForLongPress = new CheckForLongPress();
-        }
-        mPendingCheckForLongPress.rememberWindowAttachCount();
-        postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout());
-    }
-
     @Override
     public void cancelLongPress() {
         super.cancelLongPress();
 
-        mHasPerformedLongPress = false;
-        if (mPendingCheckForLongPress != null) {
-            removeCallbacks(mPendingCheckForLongPress);
-        }
+        mLongPressHelper.cancelLongPress();
     }
 
     @Override
diff --git a/src/com/android/launcher2/LauncherApplication.java b/src/com/android/launcher2/LauncherApplication.java
index 9936ca6..ef1eb5f 100644
--- a/src/com/android/launcher2/LauncherApplication.java
+++ b/src/com/android/launcher2/LauncherApplication.java
@@ -25,6 +25,9 @@
 import android.content.res.Configuration;
 import android.database.ContentObserver;
 import android.os.Handler;
+import android.view.MotionEvent;
+
+import com.android.launcher.R;
 
 import java.lang.ref.WeakReference;
 
@@ -33,6 +36,8 @@
     public IconCache mIconCache;
     private static boolean sIsScreenLarge;
     private static float sScreenDensity;
+    private static int sLongPressTimeout = 300;
+    private static final String sSharedPreferencesKey = "com.android.launcher2.prefs";
     WeakReference<LauncherProvider> mLauncherProvider;
 
     @Override
@@ -40,10 +45,7 @@
         super.onCreate();
 
         // set sIsScreenXLarge and sScreenDensity *before* creating icon cache
-        final int screenSize = getResources().getConfiguration().screenLayout &
-                Configuration.SCREENLAYOUT_SIZE_MASK;
-        sIsScreenLarge = screenSize == Configuration.SCREENLAYOUT_SIZE_LARGE ||
-            screenSize == Configuration.SCREENLAYOUT_SIZE_XLARGE;
+        sIsScreenLarge = getResources().getBoolean(R.bool.is_large_screen);
         sScreenDensity = getResources().getDisplayMetrics().density;
 
         mIconCache = new IconCache(this);
@@ -93,7 +95,10 @@
     private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) {
         @Override
         public void onChange(boolean selfChange) {
-            mModel.startLoader(LauncherApplication.this, false);
+            // If the database has ever changed, then we really need to force a reload of the
+            // workspace on the next load
+            mModel.resetLoadedState(false, true);
+            mModel.startLoaderFromBackground();
         }
     };
 
@@ -118,6 +123,10 @@
         return mLauncherProvider.get();
     }
 
+    public static String getSharedPreferencesKey() {
+        return sSharedPreferencesKey;
+    }
+
     public static boolean isScreenLarge() {
         return sIsScreenLarge;
     }
@@ -130,4 +139,8 @@
     public static float getScreenDensity() {
         return sScreenDensity;
     }
+
+    public static int getLongPressTimeout() {
+        return sLongPressTimeout;
+    }
 }
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 7da55db..32c77c7 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -138,6 +138,7 @@
         public void bindAppsRemoved(ArrayList<ApplicationInfo> apps, boolean permanent);
         public void bindPackagesUpdated();
         public boolean isAllAppsVisible();
+        public boolean isAllAppsButtonRank(int rank);
         public void bindSearchablesChanged();
     }
 
@@ -648,19 +649,24 @@
     }
 
     private void forceReload() {
-        synchronized (mLock) {
-            // Stop any existing loaders first, so they don't set mAllAppsLoaded or
-            // mWorkspaceLoaded to true later
-            stopLoaderLocked();
-            mAllAppsLoaded = false;
-            mWorkspaceLoaded = false;
-        }
+        resetLoadedState(true, true);
+
         // Do this here because if the launcher activity is running it will be restarted.
         // If it's not running startLoaderFromBackground will merely tell it that it needs
         // to reload.
         startLoaderFromBackground();
     }
 
+    public void resetLoadedState(boolean resetAllAppsLoaded, boolean resetWorkspaceLoaded) {
+        synchronized (mLock) {
+            // Stop any existing loaders first, so they don't set mAllAppsLoaded or
+            // mWorkspaceLoaded to true later
+            stopLoaderLocked();
+            if (resetAllAppsLoaded) mAllAppsLoaded = false;
+            if (resetWorkspaceLoaded) mWorkspaceLoaded = false;
+        }
+    }
+
     /**
      * When the launcher is in the background, it's possible for it to miss paired
      * configuration changes.  So whenever we trigger the loader from the background
@@ -679,7 +685,7 @@
             }
         }
         if (runLoader) {
-            startLoader(mApp, false);
+            startLoader(false);
         }
     }
 
@@ -697,7 +703,7 @@
         return isLaunching;
     }
 
-    public void startLoader(Context context, boolean isLaunching) {
+    public void startLoader(boolean isLaunching) {
         synchronized (mLock) {
             if (DEBUG_LOADERS) {
                 Log.d(TAG, "startLoader isLaunching=" + isLaunching);
@@ -708,7 +714,7 @@
                 // If there is already one running, tell it to stop.
                 // also, don't downgrade isLaunching if we're already running
                 isLaunching = isLaunching || stopLoaderLocked();
-                mLoaderTask = new LoaderTask(context, isLaunching);
+                mLoaderTask = new LoaderTask(mApp, isLaunching);
                 sWorkerThread.setPriority(Thread.NORM_PRIORITY);
                 sWorker.post(mLoaderTask);
             }
@@ -920,7 +926,7 @@
             int containerIndex = item.screen;
             if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
                 // Return early if we detect that an item is under the hotseat button
-                if (Hotseat.isAllAppsButtonRank(item.screen)) {
+                if (mCallbacks == null || mCallbacks.get().isAllAppsButtonRank(item.screen)) {
                     return false;
                 }
 
@@ -1348,6 +1354,7 @@
             }
 
             // shallow copy
+            @SuppressWarnings("unchecked")
             final ArrayList<ApplicationInfo> list
                     = (ArrayList<ApplicationInfo>) mAllAppsList.data.clone();
             mHandler.post(new Runnable() {
@@ -1651,7 +1658,26 @@
         // but don't worry about that.  All we're doing with usingFallbackIcon is
         // to avoid saving lots of copies of that in the database, and most apps
         // have icons anyway.
-        final ResolveInfo resolveInfo = manager.resolveActivity(intent, 0);
+
+        // Attempt to use queryIntentActivities to get the ResolveInfo (with IntentFilter info) and
+        // if that fails, or is ambiguious, fallback to the standard way of getting the resolve info
+        // via resolveActivity().
+        ResolveInfo resolveInfo = null;
+        ComponentName oldComponent = intent.getComponent();
+        Intent newIntent = new Intent(intent.getAction(), null);
+        newIntent.addCategory(Intent.CATEGORY_LAUNCHER);
+        newIntent.setPackage(oldComponent.getPackageName());
+        List<ResolveInfo> infos = manager.queryIntentActivities(newIntent, 0);
+        for (ResolveInfo i : infos) {
+            ComponentName cn = new ComponentName(i.activityInfo.packageName,
+                    i.activityInfo.name);
+            if (cn.equals(oldComponent)) {
+                resolveInfo = i;
+            }
+        }
+        if (resolveInfo == null) {
+            resolveInfo = manager.resolveActivity(intent, 0);
+        }
         if (resolveInfo != null) {
             icon = mIconCache.getIcon(componentName, resolveInfo, labelCache);
         }
diff --git a/src/com/android/launcher2/LauncherProvider.java b/src/com/android/launcher2/LauncherProvider.java
index a01cc47..de9a9b2 100644
--- a/src/com/android/launcher2/LauncherProvider.java
+++ b/src/com/android/launcher2/LauncherProvider.java
@@ -706,6 +706,8 @@
             ContentValues values = new ContentValues();
 
             PackageManager packageManager = mContext.getPackageManager();
+            int allAppsButtonRank =
+                    mContext.getResources().getInteger(R.integer.hotseat_all_apps_index);
             int i = 0;
             try {
                 XmlResourceParser parser = mContext.getResources().getXml(workspaceResourceId);
@@ -739,8 +741,8 @@
                     // If we are adding to the hotseat, the screen is used as the position in the
                     // hotseat. This screen can't be at position 0 because AllApps is in the
                     // zeroth position.
-                    if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT &&
-                            Hotseat.isAllAppsButtonRank(Integer.valueOf(screen))) {
+                    if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT
+                            && Integer.valueOf(screen) == allAppsButtonRank) {
                         throw new RuntimeException("Invalid screen position for hotseat item");
                     }
 
diff --git a/src/com/android/launcher2/LauncherViewPropertyAnimator.java b/src/com/android/launcher2/LauncherViewPropertyAnimator.java
new file mode 100644
index 0000000..88b4cb4
--- /dev/null
+++ b/src/com/android/launcher2/LauncherViewPropertyAnimator.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher2;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.TimeInterpolator;
+import android.view.ViewPropertyAnimator;
+import android.view.View;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+
+public class LauncherViewPropertyAnimator extends Animator implements AnimatorListener {
+    enum Properties {
+            TRANSLATION_X,
+            TRANSLATION_Y,
+            SCALE_X,
+            SCALE_Y,
+            ROTATION_Y,
+            ALPHA,
+            START_DELAY,
+            DURATION,
+            INTERPOLATOR
+    }
+    EnumSet<Properties> mPropertiesToSet = EnumSet.noneOf(Properties.class);
+    ViewPropertyAnimator mViewPropertyAnimator;
+    View mTarget;
+
+    float mTranslationX;
+    float mTranslationY;
+    float mScaleX;
+    float mScaleY;
+    float mRotationY;
+    float mAlpha;
+    long mStartDelay;
+    long mDuration;
+    TimeInterpolator mInterpolator;
+    ArrayList<Animator.AnimatorListener> mListeners;
+    boolean mRunning = false;
+
+    public LauncherViewPropertyAnimator(View target) {
+        mTarget = target;
+        mListeners = new ArrayList<Animator.AnimatorListener>();
+    }
+
+    @Override
+    public void addListener(Animator.AnimatorListener listener) {
+        mListeners.add(listener);
+    }
+
+    @Override
+    public void cancel() {
+        if (mViewPropertyAnimator != null) {
+            mViewPropertyAnimator.cancel();
+        }
+    }
+
+    @Override
+    public Animator clone() {
+        throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void end() {
+        throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public long getDuration() {
+        return mDuration;
+    }
+
+    @Override
+    public ArrayList<Animator.AnimatorListener> getListeners() {
+        return mListeners;
+    }
+
+    @Override
+    public long getStartDelay() {
+        return mStartDelay;
+    }
+
+    @Override
+    public void onAnimationCancel(Animator animation) {
+        for (int i = 0; i < mListeners.size(); i++) {
+            Animator.AnimatorListener listener = mListeners.get(i);
+            listener.onAnimationCancel(this);
+        }
+        mRunning = false;
+    }
+
+    @Override
+    public void onAnimationEnd(Animator animation) {
+        for (int i = 0; i < mListeners.size(); i++) {
+            Animator.AnimatorListener listener = mListeners.get(i);
+            listener.onAnimationEnd(this);
+        }
+        mRunning = false;
+    }
+
+    @Override
+    public void onAnimationRepeat(Animator animation) {
+        for (int i = 0; i < mListeners.size(); i++) {
+            Animator.AnimatorListener listener = mListeners.get(i);
+            listener.onAnimationRepeat(this);
+        }
+    }
+
+    @Override
+    public void onAnimationStart(Animator animation) {
+        for (int i = 0; i < mListeners.size(); i++) {
+            Animator.AnimatorListener listener = mListeners.get(i);
+            listener.onAnimationStart(this);
+        }
+        mRunning = true;
+    }
+
+    @Override
+    public boolean isRunning() {
+        return mRunning;
+    }
+
+    @Override
+    public boolean isStarted() {
+        return mViewPropertyAnimator != null;
+    }
+
+    @Override
+    public void removeAllListeners() {
+        mListeners.clear();
+    }
+
+    @Override
+    public void removeListener(Animator.AnimatorListener listener) {
+        mListeners.remove(listener);
+    }
+
+    @Override
+    public Animator setDuration(long duration) {
+        mPropertiesToSet.add(Properties.DURATION);
+        mDuration = duration;
+        return this;
+    }
+
+    @Override
+    public void setInterpolator(TimeInterpolator value) {
+        mPropertiesToSet.add(Properties.INTERPOLATOR);
+        mInterpolator = value;
+    }
+
+    @Override
+    public void setStartDelay(long startDelay) {
+        mPropertiesToSet.add(Properties.START_DELAY);
+        mStartDelay = startDelay;
+    }
+
+    @Override
+    public void setTarget(Object target) {
+        throw new RuntimeException("Not implemented");
+    }
+
+    @Override
+    public void setupEndValues() {
+
+    }
+
+    @Override
+    public void setupStartValues() {
+    }
+
+    @Override
+    public void start() {
+        mViewPropertyAnimator = mTarget.animate();
+        if (mPropertiesToSet.contains(Properties.TRANSLATION_X)) {
+            mViewPropertyAnimator.translationX(mTranslationX);
+        }
+        if (mPropertiesToSet.contains(Properties.TRANSLATION_Y)) {
+            mViewPropertyAnimator.translationY(mTranslationY);
+        }
+        if (mPropertiesToSet.contains(Properties.SCALE_X)) {
+            mViewPropertyAnimator.scaleX(mScaleX);
+        }
+        if (mPropertiesToSet.contains(Properties.ROTATION_Y)) {
+            mViewPropertyAnimator.rotationY(mRotationY);
+        }
+        if (mPropertiesToSet.contains(Properties.SCALE_Y)) {
+            mViewPropertyAnimator.scaleY(mScaleY);
+        }
+        if (mPropertiesToSet.contains(Properties.ALPHA)) {
+            mViewPropertyAnimator.alpha(mAlpha);
+        }
+        if (mPropertiesToSet.contains(Properties.START_DELAY)) {
+            mViewPropertyAnimator.setStartDelay(mStartDelay);
+        }
+        if (mPropertiesToSet.contains(Properties.DURATION)) {
+            mViewPropertyAnimator.setDuration(mDuration);
+        }
+        if (mPropertiesToSet.contains(Properties.INTERPOLATOR)) {
+            mViewPropertyAnimator.setInterpolator(mInterpolator);
+        }
+        mViewPropertyAnimator.setListener(this);
+        mViewPropertyAnimator.start();
+    }
+
+    public LauncherViewPropertyAnimator translationX(float value) {
+        mPropertiesToSet.add(Properties.TRANSLATION_X);
+        mTranslationX = value;
+        return this;
+    }
+
+    public LauncherViewPropertyAnimator translationY(float value) {
+        mPropertiesToSet.add(Properties.TRANSLATION_Y);
+        mTranslationY = value;
+        return this;
+    }
+
+    public LauncherViewPropertyAnimator scaleX(float value) {
+        mPropertiesToSet.add(Properties.SCALE_X);
+        mScaleX = value;
+        return this;
+    }
+
+    public LauncherViewPropertyAnimator scaleY(float value) {
+        mPropertiesToSet.add(Properties.SCALE_Y);
+        mScaleY = value;
+        return this;
+    }
+
+    public LauncherViewPropertyAnimator rotationY(float value) {
+        mPropertiesToSet.add(Properties.ROTATION_Y);
+        mRotationY = value;
+        return this;
+    }
+
+    public LauncherViewPropertyAnimator alpha(float value) {
+        mPropertiesToSet.add(Properties.ALPHA);
+        mAlpha = value;
+        return this;
+    }
+}
diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java
index 3f5652e..8a2a5a0 100644
--- a/src/com/android/launcher2/PagedView.java
+++ b/src/com/android/launcher2/PagedView.java
@@ -62,19 +62,26 @@
     // the min drag distance for a fling to register, to prevent random page shifts
     private static final int MIN_LENGTH_FOR_FLING = 25;
 
-    private static final int PAGE_SNAP_ANIMATION_DURATION = 550;
+    protected static final int PAGE_SNAP_ANIMATION_DURATION = 550;
+    protected static final int SLOW_PAGE_SNAP_ANIMATION_DURATION = 950;
     protected static final float NANOTIME_DIV = 1000000000.0f;
 
     private static final float OVERSCROLL_ACCELERATE_FACTOR = 2;
     private static final float OVERSCROLL_DAMP_FACTOR = 0.14f;
-    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 page is moved more than halfway, automatically move to the next page on touch up.
     private static final float SIGNIFICANT_MOVE_THRESHOLD = 0.4f;
 
-    // the velocity at which a fling gesture will cause us to snap to the next page
-    protected int mSnapVelocity = 500;
+    // The following constants need to be scaled based on density. The scaled versions will be
+    // assigned to the corresponding member variables below.
+    private static final int FLING_THRESHOLD_VELOCITY = 500;
+    private static final int MIN_SNAP_VELOCITY = 1500;
+    private static final int MIN_FLING_VELOCITY = 250;
+
+    protected int mFlingThresholdVelocity;
+    protected int mMinFlingVelocity;
+    protected int mMinSnapVelocity;
 
     protected float mDensity;
     protected float mSmoothingTime;
@@ -145,15 +152,6 @@
 
     protected ArrayList<Boolean> mDirtyPageContent;
 
-    // choice modes
-    protected static final int CHOICE_MODE_NONE = 0;
-    protected static final int CHOICE_MODE_SINGLE = 1;
-    // Multiple selection mode is not supported by all Launcher actions atm
-    protected static final int CHOICE_MODE_MULTIPLE = 2;
-
-    protected int mChoiceMode;
-    private ActionMode mActionMode;
-
     // If true, syncPages and syncPageItems will be called to refresh pages
     protected boolean mContentIsRefreshable = true;
 
@@ -175,10 +173,12 @@
 
     // Scrolling indicator
     private ValueAnimator mScrollIndicatorAnimator;
-    private ImageView mScrollIndicator;
+    private View mScrollIndicator;
     private int mScrollIndicatorPaddingLeft;
     private int mScrollIndicatorPaddingRight;
     private boolean mHasScrollIndicator = true;
+    private boolean mShouldShowScrollIndicator = false;
+    private boolean mShouldShowScrollIndicatorImmediately = false;
     protected static final int sScrollIndicatorFadeInDuration = 150;
     protected static final int sScrollIndicatorFadeOutDuration = 650;
     protected static final int sScrollIndicatorFlashDuration = 650;
@@ -200,7 +200,6 @@
 
     public PagedView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
-        mChoiceMode = CHOICE_MODE_NONE;
 
         TypedArray a = context.obtainStyledAttributes(attrs,
                 R.styleable.PagedView, defStyle, 0);
@@ -242,6 +241,10 @@
         mPagingTouchSlop = configuration.getScaledPagingTouchSlop();
         mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
         mDensity = getResources().getDisplayMetrics().density;
+
+        mFlingThresholdVelocity = (int) (FLING_THRESHOLD_VELOCITY * mDensity);
+        mMinFlingVelocity = (int) (MIN_FLING_VELOCITY * mDensity);
+        mMinSnapVelocity = (int) (MIN_SNAP_VELOCITY * mDensity);
     }
 
     public void setPageSwitchListener(PageSwitchListener pageSwitchListener) {
@@ -292,6 +295,7 @@
         int newX = getChildOffset(mCurrentPage) - getRelativeChildOffset(mCurrentPage);
         scrollTo(newX, 0);
         mScroller.setFinalX(newX);
+        mScroller.forceFinished(true);
     }
 
     /**
@@ -340,12 +344,10 @@
 
     // a method that subclasses can override to add behavior
     protected void onPageBeginMoving() {
-        showScrollingIndicator(false);
     }
 
     // a method that subclasses can override to add behavior
     protected void onPageEndMoving() {
-        hideScrollingIndicator(false);
     }
 
     /**
@@ -579,7 +581,14 @@
 
             // Calculate the variable page spacing if necessary
             if (mPageSpacing < 0) {
-                setPageSpacing(((right - left) - getChildAt(0).getMeasuredWidth()) / 2);
+                // The gap between pages in the PagedView should be equal to the gap from the page
+                // to the edge of the screen (so it is not visible in the current screen).  To
+                // account for unequal padding on each side of the paged view, we take the maximum
+                // of the left/right gap and use that as the gap between each page.
+                int offset = getRelativeChildOffset(0);
+                int spacing = Math.max(offset, (right - left) - offset -
+                        getChildAt(0).getMeasuredWidth());
+                setPageSpacing(spacing);
             }
         }
 
@@ -602,9 +611,7 @@
 
         if (mFirstLayout && mCurrentPage >= 0 && mCurrentPage < getChildCount()) {
             setHorizontalScrollBarEnabled(false);
-            int newX = getChildOffset(mCurrentPage) - getRelativeChildOffset(mCurrentPage);
-            scrollTo(newX, 0);
-            mScroller.setFinalX(newX);
+            updateCurrentPageScroll();
             setHorizontalScrollBarEnabled(true);
             mFirstLayout = false;
         }
@@ -624,8 +631,7 @@
                 if (child != null) {
                     float scrollProgress = getScrollProgress(screenCenter, child, i);
                     float alpha = 1 - Math.abs(scrollProgress);
-                    child.setFastAlpha(alpha);
-                    child.fastInvalidate();
+                    child.setAlpha(alpha);
                 }
             }
             invalidate();
@@ -715,20 +721,23 @@
 
     protected void getVisiblePages(int[] range) {
         final int pageCount = getChildCount();
+
         if (pageCount > 0) {
-            final int pageWidth = getScaledMeasuredWidth(getPageAt(0));
             final int screenWidth = getMeasuredWidth();
-            int x = getScaledRelativeChildOffset(0) + pageWidth;
             int leftScreen = 0;
             int rightScreen = 0;
-            while (x <= mScrollX && leftScreen < pageCount - 1) {
+            View currPage = getPageAt(leftScreen);
+            while (leftScreen < pageCount - 1 &&
+                    currPage.getX() + currPage.getWidth() - currPage.getPaddingRight() < mScrollX) {
                 leftScreen++;
-                x += getScaledMeasuredWidth(getPageAt(leftScreen)) + mPageSpacing;
+                currPage = getPageAt(leftScreen);
             }
             rightScreen = leftScreen;
-            while (x < mScrollX + screenWidth && rightScreen < pageCount - 1) {
+            currPage = getPageAt(rightScreen + 1);
+            while (rightScreen < pageCount - 1 &&
+                    currPage.getX() - currPage.getPaddingLeft() < mScrollX + screenWidth) {
                 rightScreen++;
-                x += getScaledMeasuredWidth(getPageAt(rightScreen)) + mPageSpacing;
+                currPage = getPageAt(rightScreen + 1);
             }
             range[0] = leftScreen;
             range[1] = rightScreen;
@@ -764,8 +773,22 @@
                 canvas.clipRect(mScrollX, mScrollY, mScrollX + mRight - mLeft,
                         mScrollY + mBottom - mTop);
 
-                for (int i = rightScreen; i >= leftScreen; i--) {
-                    drawChild(canvas, getPageAt(i), drawingTime);
+                // On certain graphics drivers, if you draw to a off-screen buffer that's not
+                // used, it can lead to poor performance. We were running into this when
+                // setChildrenLayersEnabled was called on a CellLayout; that triggered a re-draw
+                // of that CellLayout's hardware layer, even if that CellLayout wasn't visible.
+                // As a fix, below we set pages that aren't going to be rendered are to be
+                // View.INVISIBLE, preventing re-drawing of their hardware layer
+                for (int i = getChildCount() - 1; i >= 0; i--) {
+                    final View v = getPageAt(i);
+
+                    if (leftScreen <= i && i <= rightScreen &&
+                            v.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD) {
+                        v.setVisibility(VISIBLE);
+                        drawChild(canvas, v, drawingTime);
+                    } else {
+                        v.setVisibility(INVISIBLE);
+                    }
                 }
                 canvas.restore();
             }
@@ -986,19 +1009,6 @@
         return mTouchState != TOUCH_STATE_REST;
     }
 
-    protected void animateClickFeedback(View v, final Runnable r) {
-        // animate the view slightly to show click feedback running some logic after it is "pressed"
-        ObjectAnimator anim = (ObjectAnimator) AnimatorInflater.
-                loadAnimator(mContext, R.anim.paged_view_click_feedback);
-        anim.setTarget(v);
-        anim.addListener(new AnimatorListenerAdapter() {
-            public void onAnimationRepeat(Animator animation) {
-                r.run();
-            }
-        });
-        anim.start();
-    }
-
     protected void determineScrollingStart(MotionEvent ev) {
         determineScrollingStart(ev, 1.0f);
     }
@@ -1208,12 +1218,11 @@
                 final int pageWidth = getScaledMeasuredWidth(getPageAt(mCurrentPage));
                 boolean isSignificantMove = Math.abs(deltaX) > pageWidth *
                         SIGNIFICANT_MOVE_THRESHOLD;
-                final int snapVelocity = mSnapVelocity;
 
                 mTotalMotionX += Math.abs(mLastMotionX + mLastMotionXRemainder - x);
 
                 boolean isFling = mTotalMotionX > MIN_LENGTH_FOR_FLING &&
-                        Math.abs(velocityX) > snapVelocity;
+                        Math.abs(velocityX) > mFlingThresholdVelocity;
 
                 // 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
@@ -1434,7 +1443,7 @@
         int delta = newX - mUnboundedScrollX;
         int duration = 0;
 
-        if (Math.abs(velocity) < MIN_FLING_VELOCITY) {
+        if (Math.abs(velocity) < mMinFlingVelocity) {
             // If the velocity is low enough, then treat this more as an automatic page advance
             // as opposed to an apparent physical response to flinging
             snapToPage(whichPage, PAGE_SNAP_ANIMATION_DURATION);
@@ -1450,7 +1459,7 @@
                 distanceInfluenceForSnapDuration(distanceRatio);
 
         velocity = Math.abs(velocity);
-        velocity = Math.max(MINIMUM_SNAP_VELOCITY, velocity);
+        velocity = Math.max(mMinSnapVelocity, velocity);
 
         // we want the page's snap velocity to approximately match the velocity at which the
         // user flings, so we scale the duration by a value near to the derivative of the scroll
@@ -1591,22 +1600,26 @@
                 int upperPageBound = getAssociatedUpperPageBound(page);
                 if (DEBUG) Log.d(TAG, "loadAssociatedPages: " + lowerPageBound + "/"
                         + upperPageBound);
+                // First, clear any pages that should no longer be loaded
+                for (int i = 0; i < count; ++i) {
+                    Page layout = (Page) getPageAt(i);
+                    if ((i < lowerPageBound) || (i > upperPageBound)) {
+                        if (layout.getPageChildCount() > 0) {
+                            layout.removeAllViewsOnPage();
+                        }
+                        mDirtyPageContent.set(i, true);
+                    }
+                }
+                // Next, load any new pages
                 for (int i = 0; i < count; ++i) {
                     if ((i != page) && immediateAndOnly) {
                         continue;
                     }
-                    Page layout = (Page) getPageAt(i);
-                    final int childCount = layout.getPageChildCount();
                     if (lowerPageBound <= i && i <= upperPageBound) {
                         if (mDirtyPageContent.get(i)) {
                             syncPageItems(i, (i == page) && immediateAndOnly);
                             mDirtyPageContent.set(i, false);
                         }
-                    } else {
-                        if (childCount > 0) {
-                            layout.removeAllViewsOnPage();
-                        }
-                        mDirtyPageContent.set(i, true);
                     }
                 }
             }
@@ -1621,72 +1634,6 @@
         return Math.min(page + 1, count - 1);
     }
 
-    protected void startChoiceMode(int mode, ActionMode.Callback callback) {
-        if (isChoiceMode(CHOICE_MODE_NONE)) {
-            mChoiceMode = mode;
-            mActionMode = startActionMode(callback);
-        }
-    }
-
-    public void endChoiceMode() {
-        if (!isChoiceMode(CHOICE_MODE_NONE)) {
-            mChoiceMode = CHOICE_MODE_NONE;
-            resetCheckedGrandchildren();
-            if (mActionMode != null) mActionMode.finish();
-            mActionMode = null;
-        }
-    }
-
-    protected boolean isChoiceMode(int mode) {
-        return mChoiceMode == mode;
-    }
-
-    protected ArrayList<Checkable> getCheckedGrandchildren() {
-        ArrayList<Checkable> checked = new ArrayList<Checkable>();
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; ++i) {
-            Page layout = (Page) getPageAt(i);
-            final int grandChildCount = layout.getPageChildCount();
-            for (int j = 0; j < grandChildCount; ++j) {
-                final View v = layout.getChildOnPageAt(j);
-                if (v instanceof Checkable && ((Checkable) v).isChecked()) {
-                    checked.add((Checkable) v);
-                }
-            }
-        }
-        return checked;
-    }
-
-    /**
-     * If in CHOICE_MODE_SINGLE and an item is checked, returns that item.
-     * Otherwise, returns null.
-     */
-    protected Checkable getSingleCheckedGrandchild() {
-        if (mChoiceMode != CHOICE_MODE_MULTIPLE) {
-            final int childCount = getChildCount();
-            for (int i = 0; i < childCount; ++i) {
-                Page layout = (Page) getPageAt(i);
-                final int grandChildCount = layout.getPageChildCount();
-                for (int j = 0; j < grandChildCount; ++j) {
-                    final View v = layout.getChildOnPageAt(j);
-                    if (v instanceof Checkable && ((Checkable) v).isChecked()) {
-                        return (Checkable) v;
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    protected void resetCheckedGrandchildren() {
-        // loop through children, and set all of their children to _not_ be checked
-        final ArrayList<Checkable> checked = getCheckedGrandchildren();
-        for (int i = 0; i < checked.size(); ++i) {
-            final Checkable c = checked.get(i);
-            c.setChecked(false);
-        }
-    }
-
     /**
      * This method is called ONLY to synchronize the number of pages that the paged view has.
      * To actually fill the pages with information, implement syncPageItems() below.  It is
@@ -1743,12 +1690,12 @@
         }
     }
 
-    protected ImageView getScrollingIndicator() {
+    protected View getScrollingIndicator() {
         // We use mHasScrollIndicator to prevent future lookups if there is no sibling indicator
         // found
         if (mHasScrollIndicator && mScrollIndicator == null) {
             ViewGroup parent = (ViewGroup) getParent();
-            mScrollIndicator = (ImageView) (parent.findViewById(R.id.paged_view_indicator));
+            mScrollIndicator = (View) (parent.findViewById(R.id.paged_view_indicator));
             mHasScrollIndicator = mScrollIndicator != null;
             if (mHasScrollIndicator) {
                 mScrollIndicator.setVisibility(View.VISIBLE);
@@ -1774,9 +1721,12 @@
     }
 
     protected void showScrollingIndicator(boolean immediately) {
+        mShouldShowScrollIndicator = true;
+        mShouldShowScrollIndicatorImmediately = true;
         if (getChildCount() <= 1) return;
         if (!isScrollingIndicatorEnabled()) return;
 
+        mShouldShowScrollIndicator = false;
         getScrollingIndicator();
         if (mScrollIndicator != null) {
             // Fade the indicator in
@@ -1848,6 +1798,9 @@
         if (mScrollIndicator != null) {
             updateScrollingIndicatorPosition();
         }
+        if (mShouldShowScrollIndicator) {
+            showScrollingIndicator(mShouldShowScrollIndicatorImmediately);
+        }
     }
 
     private void updateScrollingIndicatorPosition() {
@@ -1874,7 +1827,6 @@
             indicatorPos += indicatorCenterOffset;
         }
         mScrollIndicator.setTranslationX(indicatorPos);
-        mScrollIndicator.invalidate();
     }
 
     public void showScrollIndicatorTrack() {
diff --git a/src/com/android/launcher2/PagedViewGridLayout.java b/src/com/android/launcher2/PagedViewGridLayout.java
index b1b6215..90bfe88 100644
--- a/src/com/android/launcher2/PagedViewGridLayout.java
+++ b/src/com/android/launcher2/PagedViewGridLayout.java
@@ -109,6 +109,7 @@
     @Override
     public void removeAllViewsOnPage() {
         removeAllViews();
+        mOnLayoutListener = null;
         destroyHardwareLayer();
     }
 
diff --git a/src/com/android/launcher2/PagedViewIcon.java b/src/com/android/launcher2/PagedViewIcon.java
index af10f18..4149ab6 100644
--- a/src/com/android/launcher2/PagedViewIcon.java
+++ b/src/com/android/launcher2/PagedViewIcon.java
@@ -16,44 +16,29 @@
 
 package com.android.launcher2;
 
-import android.animation.ObjectAnimator;
 import android.content.Context;
-import android.content.res.Resources;
 import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
 import android.util.AttributeSet;
-import android.widget.Checkable;
 import android.widget.TextView;
 
-import com.android.launcher.R;
-
-
 /**
  * An icon on a PagedView, specifically for items in the launcher's paged view (with compound
  * drawables on the top).
  */
-public class PagedViewIcon extends TextView implements Checkable {
+public class PagedViewIcon extends TextView {
+    /** A simple callback interface to allow a PagedViewIcon to notify when it has been pressed */
+    public static interface PressedCallback {
+        void iconPressed(PagedViewIcon icon);
+    }
+
     private static final String TAG = "PagedViewIcon";
+    private static final float PRESS_ALPHA = 0.4f;
 
-    // holographic outline
-    private final Paint mPaint = new Paint();
-    private Bitmap mCheckedOutline;
-    private Bitmap mHolographicOutline;
+    private PagedViewIcon.PressedCallback mPressedCallback;
+    private boolean mLockDrawableState = false;
+
     private Bitmap mIcon;
 
-    private int mAlpha = 255;
-    private int mHolographicAlpha;
-
-    private boolean mIsChecked;
-    private ObjectAnimator mCheckedAlphaAnimator;
-    private float mCheckedAlpha = 1.0f;
-    private int mCheckedFadeInDuration;
-    private int mCheckedFadeOutDuration;
-
-    HolographicPagedViewIcon mHolographicOutlineView;
-    private HolographicOutlineHelper mHolographicOutlineHelper;
-
     public PagedViewIcon(Context context) {
         this(context, null);
     }
@@ -64,131 +49,43 @@
 
     public PagedViewIcon(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
-
-        // Set up fade in/out constants
-        final Resources r = context.getResources();
-        final int alpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha);
-        if (alpha > 0) {
-            mCheckedAlpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha) / 256.0f;
-            mCheckedFadeInDuration =
-                r.getInteger(R.integer.config_dragAppsCustomizeIconFadeInDuration);
-            mCheckedFadeOutDuration =
-                r.getInteger(R.integer.config_dragAppsCustomizeIconFadeOutDuration);
-        }
-
-        mHolographicOutlineView = new HolographicPagedViewIcon(context, this);
-    }
-
-    protected HolographicPagedViewIcon getHolographicOutlineView() {
-        return mHolographicOutlineView;
-    }
-
-    protected Bitmap getHolographicOutline() {
-        return mHolographicOutline;
     }
 
     public void applyFromApplicationInfo(ApplicationInfo info, boolean scaleUp,
-            HolographicOutlineHelper holoOutlineHelper) {
-        mHolographicOutlineHelper = holoOutlineHelper;
+            PagedViewIcon.PressedCallback cb) {
         mIcon = info.iconBitmap;
+        mPressedCallback = cb;
         setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(mIcon), null, null);
         setText(info.title);
         setTag(info);
     }
 
-    public void setHolographicOutline(Bitmap holoOutline) {
-        mHolographicOutline = holoOutline;
-        getHolographicOutlineView().invalidate();
+    public void lockDrawableState() {
+        mLockDrawableState = true;
     }
 
-    @Override
-    public void setAlpha(float alpha) {
-        final float viewAlpha = HolographicOutlineHelper.viewAlphaInterpolator(alpha);
-        final float holographicAlpha = HolographicOutlineHelper.highlightAlphaInterpolator(alpha);
-        int newViewAlpha = (int) (viewAlpha * 255);
-        int newHolographicAlpha = (int) (holographicAlpha * 255);
-        if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) {
-            mAlpha = newViewAlpha;
-            mHolographicAlpha = newHolographicAlpha;
-            super.setAlpha(viewAlpha);
-        }
-    }
-
-    public void invalidateCheckedImage() {
-        if (mCheckedOutline != null) {
-            mCheckedOutline.recycle();
-            mCheckedOutline = null;
-        }
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        if (mAlpha > 0) {
-            super.onDraw(canvas);
-        }
-
-        Bitmap overlay = null;
-
-        // draw any blended overlays
-        if (mCheckedOutline != null) {
-            mPaint.setAlpha(255);
-            overlay = mCheckedOutline;
-        }
-
-        if (overlay != null) {
-            final int offset = getScrollX();
-            final int compoundPaddingLeft = getCompoundPaddingLeft();
-            final int compoundPaddingRight = getCompoundPaddingRight();
-            int hspace = getWidth() - compoundPaddingRight - compoundPaddingLeft;
-            canvas.drawBitmap(overlay,
-                    offset + compoundPaddingLeft + (hspace - overlay.getWidth()) / 2,
-                    mPaddingTop,
-                    mPaint);
-        }
-    }
-
-    @Override
-    public boolean isChecked() {
-        return mIsChecked;
-    }
-
-    void setChecked(boolean checked, boolean animate) {
-        if (mIsChecked != checked) {
-            mIsChecked = checked;
-
-            float alpha;
-            int duration;
-            if (mIsChecked) {
-                alpha = mCheckedAlpha;
-                duration = mCheckedFadeInDuration;
-            } else {
-                alpha = 1.0f;
-                duration = mCheckedFadeOutDuration;
+    public void resetDrawableState() {
+        mLockDrawableState = false;
+        post(new Runnable() {
+            @Override
+            public void run() {
+                refreshDrawableState();
             }
+        });
+    }
 
-            // Initialize the animator
-            if (mCheckedAlphaAnimator != null) {
-                mCheckedAlphaAnimator.cancel();
-            }
-            if (animate) {
-                mCheckedAlphaAnimator = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), alpha);
-                mCheckedAlphaAnimator.setDuration(duration);
-                mCheckedAlphaAnimator.start();
-            } else {
-                setAlpha(alpha);
-            }
+    protected void drawableStateChanged() {
+        super.drawableStateChanged();
 
-            invalidate();
+        // We keep in the pressed state until resetDrawableState() is called to reset the press
+        // feedback
+        if (isPressed()) {
+            setAlpha(PRESS_ALPHA);
+            if (mPressedCallback != null) {
+                mPressedCallback.iconPressed(this);
+            }
+        } else if (!mLockDrawableState) {
+            setAlpha(1f);
         }
     }
-
-    @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 8fcfa8f..670717e 100644
--- a/src/com/android/launcher2/PagedViewWidget.java
+++ b/src/com/android/launcher2/PagedViewWidget.java
@@ -16,20 +16,14 @@
 
 package com.android.launcher2;
 
-import android.animation.ObjectAnimator;
 import android.appwidget.AppWidgetProviderInfo;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
 import android.util.AttributeSet;
-import android.view.KeyEvent;
 import android.view.MotionEvent;
-import android.widget.Checkable;
+import android.view.View;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -39,27 +33,15 @@
 /**
  * The linear layout used strictly for the widget/wallpaper tab of the customization tray
  */
-public class PagedViewWidget extends LinearLayout implements Checkable {
+public class PagedViewWidget extends LinearLayout {
     static final String TAG = "PagedViewWidgetLayout";
 
     private static boolean sDeletePreviewsWhenDetachedFromWindow = true;
 
-    private final Paint mPaint = new Paint();
-    private Bitmap mHolographicOutline;
-    private HolographicOutlineHelper mHolographicOutlineHelper;
-    private ImageView mPreviewImageView;
-    private final RectF mTmpScaleRect = new RectF();
-
     private String mDimensionsFormatString;
-
-    private int mAlpha = 255;
-    private int mHolographicAlpha;
-
-    private boolean mIsChecked;
-    private ObjectAnimator mCheckedAlphaAnimator;
-    private float mCheckedAlpha = 1.0f;
-    private int mCheckedFadeInDuration;
-    private int mCheckedFadeOutDuration;
+    CheckForShortPress mPendingCheckForShortPress = null;
+    ShortPressListener mShortPressListener = null;
+    boolean mShortPressTriggered = false;
 
     public PagedViewWidget(Context context) {
         this(context, null);
@@ -72,16 +54,7 @@
     public PagedViewWidget(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
 
-        // Set up fade in/out constants
         final Resources r = context.getResources();
-        final int alpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha);
-        if (alpha > 0) {
-            mCheckedAlpha = r.getInteger(R.integer.config_dragAppsCustomizeIconFadeAlpha) / 256.0f;
-            mCheckedFadeInDuration =
-                r.getInteger(R.integer.config_dragAppsCustomizeIconFadeInDuration);
-            mCheckedFadeOutDuration =
-                r.getInteger(R.integer.config_dragAppsCustomizeIconFadeOutDuration);
-        }
         mDimensionsFormatString = r.getString(R.string.widget_dims_format);
 
         setWillNotDraw(false);
@@ -109,14 +82,12 @@
     }
 
     public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info,
-            int maxWidth, int[] cellSpan, HolographicOutlineHelper holoOutlineHelper) {
-        mHolographicOutlineHelper = holoOutlineHelper;
+            int maxWidth, int[] cellSpan) {
         final ImageView image = (ImageView) findViewById(R.id.widget_preview);
         if (maxWidth > -1) {
             image.setMaxWidth(maxWidth);
         }
         image.setContentDescription(info.label);
-        mPreviewImageView = image;
         final TextView name = (TextView) findViewById(R.id.widget_name);
         name.setText(info.label);
         final TextView dims = (TextView) findViewById(R.id.widget_dims);
@@ -125,13 +96,10 @@
         }
     }
 
-    public void applyFromResolveInfo(PackageManager pm, ResolveInfo info,
-            HolographicOutlineHelper holoOutlineHelper) {
-        mHolographicOutlineHelper = holoOutlineHelper;
+    public void applyFromResolveInfo(PackageManager pm, ResolveInfo info) {
         CharSequence label = info.loadLabel(pm);
         final ImageView image = (ImageView) findViewById(R.id.widget_preview);
         image.setContentDescription(label);
-        mPreviewImageView = image;
         final TextView name = (TextView) findViewById(R.id.widget_name);
         name.setText(label);
         final TextView dims = (TextView) findViewById(R.id.widget_dims);
@@ -159,13 +127,67 @@
         }
     }
 
-    public void setHolographicOutline(Bitmap holoOutline) {
-        mHolographicOutline = holoOutline;
-        invalidate();
+    void setShortPressListener(ShortPressListener listener) {
+        mShortPressListener = listener;
+    }
+
+    interface ShortPressListener {
+        void onShortPress(View v);
+        void cleanUpShortPress(View v);
+    }
+
+    class CheckForShortPress implements Runnable {
+        public void run() {
+            if (mShortPressListener != null) {
+                mShortPressListener.onShortPress(PagedViewWidget.this);
+            }
+            mShortPressTriggered = true;
+        }
+    }
+
+    private void checkForShortPress() {
+        if (mPendingCheckForShortPress == null) {
+            mPendingCheckForShortPress = new CheckForShortPress();
+        }
+        postDelayed(mPendingCheckForShortPress, 120);
+    }
+
+    /**
+     * Remove the longpress detection timer.
+     */
+    private void removeShortPressCallback() {
+        if (mPendingCheckForShortPress != null) {
+          removeCallbacks(mPendingCheckForShortPress);
+        }
+    }
+
+    private void cleanUpShortPress() {
+        removeShortPressCallback();
+        if (mShortPressTriggered) {
+            if (mShortPressListener != null) {
+                mShortPressListener.cleanUpShortPress(PagedViewWidget.this);
+            }
+            mShortPressTriggered = false;
+        }
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
+        super.onTouchEvent(event);
+
+        switch (event.getAction()) {
+            case MotionEvent.ACTION_UP:
+                cleanUpShortPress();
+                break;
+            case MotionEvent.ACTION_DOWN:
+                checkForShortPress();
+                break;
+            case MotionEvent.ACTION_CANCEL:
+                cleanUpShortPress();
+                break;
+            case MotionEvent.ACTION_MOVE:
+                break;
+        }
         // We eat up the touch events here, since the PagedView (which uses the same swiping
         // touch code as Workspace previously) uses onInterceptTouchEvent() to determine when
         // the user is scrolling between pages.  This means that if the pages themselves don't
@@ -173,97 +195,6 @@
         // onTouchEvent() handling will prevent further intercept touch events from being called
         // (it's the same view in that case).  This is not ideal, but to prevent more changes,
         // we just always mark the touch event as handled.
-        return super.onTouchEvent(event) || true;
-    }
-
-    @Override
-    protected void onDraw(Canvas canvas) {
-        if (mAlpha > 0) {
-            super.onDraw(canvas);
-        }
-
-        // draw any blended overlays
-        if (mHolographicOutline != null && mHolographicAlpha > 0) {
-            // Calculate how much to scale the holographic preview
-            mTmpScaleRect.set(0,0,1,1);
-            mPreviewImageView.getImageMatrix().mapRect(mTmpScaleRect);
-
-            mPaint.setAlpha(mHolographicAlpha);
-            canvas.save();
-            canvas.scale(mTmpScaleRect.right, mTmpScaleRect.bottom);
-            canvas.drawBitmap(mHolographicOutline, mPreviewImageView.getLeft(),
-                    mPreviewImageView.getTop(), mPaint);
-            canvas.restore();
-        }
-    }
-
-    @Override
-    protected boolean onSetAlpha(int alpha) {
         return true;
     }
-
-    private void setChildrenAlpha(float alpha) {
-        final int childCount = getChildCount();
-        for (int i = 0; i < childCount; i++) {
-            getChildAt(i).setAlpha(alpha);
-        }
-    }
-    @Override
-    public void setAlpha(float alpha) {
-        final float viewAlpha = mHolographicOutlineHelper.viewAlphaInterpolator(alpha);
-        final float holographicAlpha = mHolographicOutlineHelper.highlightAlphaInterpolator(alpha);
-        int newViewAlpha = (int) (viewAlpha * 255);
-        int newHolographicAlpha = (int) (holographicAlpha * 255);
-        if ((mAlpha != newViewAlpha) || (mHolographicAlpha != newHolographicAlpha)) {
-            mAlpha = newViewAlpha;
-            mHolographicAlpha = newHolographicAlpha;
-            setChildrenAlpha(viewAlpha);
-            super.setAlpha(viewAlpha);
-        }
-    }
-
-    void setChecked(boolean checked, boolean animate) {
-        if (mIsChecked != checked) {
-            mIsChecked = checked;
-
-            float alpha;
-            int duration;
-            if (mIsChecked) {
-                alpha = mCheckedAlpha;
-                duration = mCheckedFadeInDuration;
-            } else {
-                alpha = 1.0f;
-                duration = mCheckedFadeOutDuration;
-            }
-
-            // Initialize the animator
-            if (mCheckedAlphaAnimator != null) {
-                mCheckedAlphaAnimator.cancel();
-            }
-            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;
-    }
-
-    @Override
-    public void toggle() {
-        setChecked(!mIsChecked);
-    }
 }
diff --git a/src/com/android/launcher2/PagedViewWithDraggableItems.java b/src/com/android/launcher2/PagedViewWithDraggableItems.java
index 287a065..a047970 100644
--- a/src/com/android/launcher2/PagedViewWithDraggableItems.java
+++ b/src/com/android/launcher2/PagedViewWithDraggableItems.java
@@ -165,4 +165,12 @@
         cancelDragging();
         super.onDetachedFromWindow();
     }
+
+    /** Show the scrolling indicators when we move the page */
+    protected void onPageBeginMoving() {
+        showScrollingIndicator(false);
+    }
+    protected void onPageEndMoving() {
+        hideScrollingIndicator(false);
+    }
 }
diff --git a/src/com/android/launcher2/PendingAddItemInfo.java b/src/com/android/launcher2/PendingAddItemInfo.java
index 9c52ecf..d36e217 100644
--- a/src/com/android/launcher2/PendingAddItemInfo.java
+++ b/src/com/android/launcher2/PendingAddItemInfo.java
@@ -16,6 +16,7 @@
 
 package com.android.launcher2;
 
+import android.appwidget.AppWidgetHostView;
 import android.appwidget.AppWidgetProviderInfo;
 import android.content.ComponentName;
 import android.os.Parcelable;
@@ -33,8 +34,12 @@
 class PendingAddWidgetInfo extends PendingAddItemInfo {
     int minWidth;
     int minHeight;
+    int minResizeWidth;
+    int minResizeHeight;
     int previewImage;
     int icon;
+    AppWidgetProviderInfo info;
+    AppWidgetHostView boundWidget;
 
     // Any configuration data that we want to pass to a configuration activity when
     // starting up a widget
@@ -43,9 +48,12 @@
 
     public PendingAddWidgetInfo(AppWidgetProviderInfo i, String dataMimeType, Parcelable data) {
         itemType = LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET;
+        this.info = i;
         componentName = i.provider;
         minWidth = i.minWidth;
         minHeight = i.minHeight;
+        minResizeWidth = i.minResizeWidth;
+        minResizeHeight = i.minResizeHeight;
         previewImage = i.previewImage;
         icon = i.icon;
         if (dataMimeType != null && data != null) {
@@ -53,4 +61,20 @@
             configurationData = data;
         }
     }
-}
\ No newline at end of file
+
+    // Copy constructor
+    public PendingAddWidgetInfo(PendingAddWidgetInfo copy) {
+        minWidth = copy.minWidth;
+        minHeight = copy.minHeight;
+        minResizeWidth = copy.minResizeWidth;
+        minResizeHeight = copy.minResizeHeight;
+        previewImage = copy.previewImage;
+        icon = copy.icon;
+        info = copy.info;
+        boundWidget = copy.boundWidget;
+        mimeType = copy.mimeType;
+        configurationData = copy.configurationData;
+        componentName = copy.componentName;
+        itemType = copy.itemType;
+    }
+}
diff --git a/src/com/android/launcher2/RocketLauncher.java b/src/com/android/launcher2/RocketLauncher.java
index 1255374..505ac4c 100644
--- a/src/com/android/launcher2/RocketLauncher.java
+++ b/src/com/android/launcher2/RocketLauncher.java
@@ -23,7 +23,6 @@
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.animation.TimeAnimator;
-import android.app.Activity;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -31,6 +30,7 @@
 import android.graphics.Point;
 import android.graphics.Rect;
 import android.os.Handler;
+import android.support.v13.dreams.BasicDream;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.view.MotionEvent;
@@ -44,7 +44,7 @@
 import java.util.HashMap;
 import java.util.Random;
 
-public class RocketLauncher extends Activity {
+public class RocketLauncher extends BasicDream {
     public static final boolean ROCKET_LAUNCHER = true;
 
     public static class Board extends FrameLayout
diff --git a/src/com/android/launcher2/SearchDropTargetBar.java b/src/com/android/launcher2/SearchDropTargetBar.java
index 3a7f24b..76d7076 100644
--- a/src/com/android/launcher2/SearchDropTargetBar.java
+++ b/src/com/android/launcher2/SearchDropTargetBar.java
@@ -69,6 +69,7 @@
         dragController.addDragListener(mDeleteDropTarget);
         dragController.addDropTarget(mInfoDropTarget);
         dragController.addDropTarget(mDeleteDropTarget);
+        dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
         mInfoDropTarget.setLauncher(launcher);
         mDeleteDropTarget.setLauncher(launcher);
     }
@@ -129,18 +130,37 @@
             @Override
             public void onAnimationStart(Animator animation) {
                 mQSBSearchBar.setVisibility(View.VISIBLE);
+                mQSBSearchBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                mQSBSearchBar.setLayerType(View.LAYER_TYPE_NONE, null);
             }
         });
         mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 0f);
         mQSBSearchBarFadeOutAnim.setDuration(sTransitionOutDuration);
         mQSBSearchBarFadeOutAnim.addListener(new AnimatorListenerAdapter() {
             @Override
+            public void onAnimationStart(Animator animation) {
+                mQSBSearchBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+            }
+
+            @Override
             public void onAnimationEnd(Animator animation) {
                 mQSBSearchBar.setVisibility(View.INVISIBLE);
+                mQSBSearchBar.setLayerType(View.LAYER_TYPE_NONE, null);
             }
         });
     }
 
+    public void finishAnimations() {
+        mDropTargetBarFadeInAnim.end();
+        mDropTargetBarFadeOutAnim.end();
+        mQSBSearchBarFadeInAnim.end();
+        mQSBSearchBarFadeOutAnim.end();
+    }
+
     private void cancelAnimations() {
         mDropTargetBarFadeInAnim.cancel();
         mDropTargetBarFadeOutAnim.cancel();
diff --git a/src/com/android/launcher2/CellLayoutChildren.java b/src/com/android/launcher2/ShortcutAndWidgetContainer.java
similarity index 87%
rename from src/com/android/launcher2/CellLayoutChildren.java
rename to src/com/android/launcher2/ShortcutAndWidgetContainer.java
index 35f5af1..7e5e940 100644
--- a/src/com/android/launcher2/CellLayoutChildren.java
+++ b/src/com/android/launcher2/ShortcutAndWidgetContainer.java
@@ -18,11 +18,15 @@
 
 import android.app.WallpaperManager;
 import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
 import android.graphics.Rect;
 import android.view.View;
 import android.view.ViewGroup;
 
-public class CellLayoutChildren extends ViewGroup {
+import com.android.launcher2.CellLayout.LayoutParams;
+
+public class ShortcutAndWidgetContainer extends ViewGroup {
     static final String TAG = "CellLayoutChildren";
 
     // These are temporary variables to prevent having to allocate a new object just to
@@ -37,7 +41,7 @@
     private int mWidthGap;
     private int mHeightGap;
 
-    public CellLayoutChildren(Context context) {
+    public ShortcutAndWidgetContainer(Context context) {
         super(context);
         mWallpaperManager = WallpaperManager.getInstance(context);
     }
@@ -68,6 +72,22 @@
     }
 
     @Override
+    protected void dispatchDraw(Canvas canvas) {
+        // Debug drawing for hit space
+        if (false) {
+            Paint p = new Paint();
+            p.setColor(0x6600FF00);
+            for (int i = getChildCount() - 1; i >= 0; i--) {
+                final View child = getChildAt(i);
+                final CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
+
+                canvas.drawRect(lp.x, lp.y, lp.x + lp.width, lp.y + lp.height, p);
+            }
+        }
+        super.dispatchDraw(canvas);
+    }
+
+    @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         int count = getChildCount();
         for (int i = 0; i < count; i++) {
diff --git a/src/com/android/launcher2/ShortcutInfo.java b/src/com/android/launcher2/ShortcutInfo.java
index c0f80ae..ff3028b 100644
--- a/src/com/android/launcher2/ShortcutInfo.java
+++ b/src/com/android/launcher2/ShortcutInfo.java
@@ -93,12 +93,16 @@
 
     public Bitmap getIcon(IconCache iconCache) {
         if (mIcon == null) {
-            mIcon = iconCache.getIcon(this.intent);
-            this.usingFallbackIcon = iconCache.isDefaultIcon(mIcon);
+            updateIcon(iconCache);
         }
         return mIcon;
     }
 
+    public void updateIcon(IconCache iconCache) {
+        mIcon = iconCache.getIcon(intent);
+        usingFallbackIcon = iconCache.isDefaultIcon(mIcon);
+    }
+
     /**
      * Creates the application intent based on a component name and various launch flags.
      * Sets {@link #itemType} to {@link LauncherSettings.BaseLauncherColumns#ITEM_TYPE_APPLICATION}.
diff --git a/src/com/android/launcher2/SmoothPagedView.java b/src/com/android/launcher2/SmoothPagedView.java
index fe763f5..e6414d9 100644
--- a/src/com/android/launcher2/SmoothPagedView.java
+++ b/src/com/android/launcher2/SmoothPagedView.java
@@ -35,11 +35,11 @@
 
     private Interpolator mScrollInterpolator;
 
-    private static class WorkspaceOvershootInterpolator implements Interpolator {
+    public static class OvershootInterpolator implements Interpolator {
         private static final float DEFAULT_TENSION = 1.3f;
         private float mTension;
 
-        public WorkspaceOvershootInterpolator() {
+        public OvershootInterpolator() {
             mTension = DEFAULT_TENSION;
         }
 
@@ -101,7 +101,7 @@
         if (mScrollMode == DEFAULT_MODE) {
             mBaseLineFlingVelocity = 2500.0f;
             mFlingVelocityInfluence = 0.4f;
-            mScrollInterpolator = new WorkspaceOvershootInterpolator();
+            mScrollInterpolator = new OvershootInterpolator();
             mScroller = new Scroller(getContext(), mScrollInterpolator);
         }
     }
@@ -139,9 +139,9 @@
         }
 
         if (settle) {
-            ((WorkspaceOvershootInterpolator) mScrollInterpolator).setDistance(screenDelta);
+            ((OvershootInterpolator) mScrollInterpolator).setDistance(screenDelta);
         } else {
-            ((WorkspaceOvershootInterpolator) mScrollInterpolator).disableSettle();
+            ((OvershootInterpolator) mScrollInterpolator).disableSettle();
         }
 
         velocity = Math.abs(velocity);
diff --git a/src/com/android/launcher2/SpringLoadedDragController.java b/src/com/android/launcher2/SpringLoadedDragController.java
index 358362c..d96aab7 100644
--- a/src/com/android/launcher2/SpringLoadedDragController.java
+++ b/src/com/android/launcher2/SpringLoadedDragController.java
@@ -18,7 +18,7 @@
 
 public class SpringLoadedDragController implements OnAlarmListener {
     // how long the user must hover over a mini-screen before it unshrinks
-    final long ENTER_SPRING_LOAD_HOVER_TIME = 550;
+    final long ENTER_SPRING_LOAD_HOVER_TIME = 500;
     final long ENTER_SPRING_LOAD_CANCEL_HOVER_TIME = 950;
     final long EXIT_SPRING_LOAD_HOVER_TIME = 200;
 
diff --git a/src/com/android/launcher2/Utilities.java b/src/com/android/launcher2/Utilities.java
index d7562a9..0387011 100644
--- a/src/com/android/launcher2/Utilities.java
+++ b/src/com/android/launcher2/Utilities.java
@@ -113,7 +113,6 @@
             }
             int sourceWidth = icon.getIntrinsicWidth();
             int sourceHeight = icon.getIntrinsicHeight();
-
             if (sourceWidth > 0 && sourceHeight > 0) {
                 // There are intrinsic sizes.
                 if (width < sourceWidth || height < sourceHeight) {
diff --git a/src/com/android/launcher2/WallpaperChooserDialogFragment.java b/src/com/android/launcher2/WallpaperChooserDialogFragment.java
index 7c4ac2e..eec699e 100644
--- a/src/com/android/launcher2/WallpaperChooserDialogFragment.java
+++ b/src/com/android/launcher2/WallpaperChooserDialogFragment.java
@@ -82,10 +82,7 @@
         outState.putBoolean(EMBEDDED_KEY, mEmbedded);
     }
 
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-
+    private void cancelLoader() {
         if (mLoader != null && mLoader.getStatus() != WallpaperLoader.Status.FINISHED) {
             mLoader.cancel(true);
             mLoader = null;
@@ -93,6 +90,20 @@
     }
 
     @Override
+    public void onDetach() {
+        super.onDetach();
+
+        cancelLoader();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+
+        cancelLoader();
+    }
+
+    @Override
     public void onDismiss(DialogInterface dialog) {
         super.onDismiss(dialog);
         /* On orientation changes, the dialog is effectively "dismissed" so this is called
@@ -112,26 +123,6 @@
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         findWallpapers();
 
-        // TODO: The following code is not exercised right now and may be removed
-        // if the dialog version is not needed.
-        /*
-        final View v = getActivity().getLayoutInflater().inflate(
-                R.layout.wallpaper_chooser, null, false);
-
-        GridView gridView = (GridView) v.findViewById(R.id.gallery);
-        gridView.setOnItemClickListener(this);
-        gridView.setAdapter(new ImageAdapter(getActivity()));
-
-        final int viewInset =
-                getResources().getDimensionPixelSize(R.dimen.alert_dialog_content_inset);
-        
-        FrameLayout wallPaperList = (FrameLayout) v.findViewById(R.id.wallpaper_list);
-        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-        builder.setNegativeButton(R.string.wallpaper_cancel, null);
-        builder.setTitle(R.string.wallpaper_dialog_title);
-        builder.setView(wallPaperList,
-        viewInset, viewInset, viewInset, viewInset); return builder.create();
-        */
         return null;
     }
 
@@ -366,4 +357,4 @@
             // Ignore
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 41e8a46..ba8b56f 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -17,19 +17,15 @@
 package com.android.launcher2;
 
 import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.AnimatorListenerAdapter;
 import android.animation.AnimatorSet;
 import android.animation.ObjectAnimator;
 import android.animation.TimeInterpolator;
 import android.animation.ValueAnimator;
 import android.animation.ValueAnimator.AnimatorUpdateListener;
-import android.app.AlertDialog;
 import android.app.WallpaperManager;
 import android.appwidget.AppWidgetHostView;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProviderInfo;
-import android.content.ClipData;
 import android.content.ClipDescription;
 import android.content.ComponentName;
 import android.content.Context;
@@ -42,9 +38,8 @@
 import android.graphics.Matrix;
 import android.graphics.Paint;
 import android.graphics.Point;
-import android.graphics.PorterDuff;
+import android.graphics.PointF;
 import android.graphics.Rect;
-import android.graphics.RectF;
 import android.graphics.Region.Op;
 import android.graphics.drawable.Drawable;
 import android.os.IBinder;
@@ -57,16 +52,17 @@
 import android.view.DragEvent;
 import android.view.MotionEvent;
 import android.view.View;
-import android.view.ViewConfiguration;
 import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
 import android.widget.ImageView;
 import android.widget.TextView;
-import android.widget.Toast;
 
 import com.android.launcher.R;
+import com.android.launcher2.DropTarget.DragObject;
 import com.android.launcher2.FolderIcon.FolderRingAnimator;
 import com.android.launcher2.InstallWidgetReceiver.WidgetMimeTypeHandlerData;
+import com.android.launcher2.LauncherSettings.Favorites;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -79,7 +75,7 @@
  */
 public class Workspace extends SmoothPagedView
         implements DropTarget, DragSource, DragScroller, View.OnTouchListener,
-        DragController.DragListener {
+        DragController.DragListener, LauncherTransitionable {
     @SuppressWarnings({"UnusedDeclaration"})
     private static final String TAG = "Launcher.Workspace";
 
@@ -94,6 +90,9 @@
 
     private static final int BACKGROUND_FADE_OUT_DURATION = 350;
     private static final int ADJACENT_SCREEN_DROP_DURATION = 300;
+    private static final int FLING_THRESHOLD_VELOCITY = 500;
+
+    private float mMaxDistanceForFolderCreation = 50.0f;
 
     // These animators are used to fade the children's outlines
     private ObjectAnimator mChildrenOutlineFadeInAnimation;
@@ -131,6 +130,7 @@
      * The CellLayout that is currently being dragged over
      */
     private CellLayout mDragTargetLayout = null;
+    private boolean mDragHasEnteredWorkspace = false;
 
     private Launcher mLauncher;
     private IconCache mIconCache;
@@ -158,11 +158,6 @@
     enum State { NORMAL, SPRING_LOADED, SMALL };
     private State mState = State.NORMAL;
     private boolean mIsSwitchingState = false;
-    private boolean mSwitchStateAfterFirstLayout = false;
-    private State mStateAfterFirstLayout;
-
-    private AnimatorSet mAnimator;
-    private AnimatorListener mChangeStateAnimationListener;
 
     boolean mAnimatingViewIntoPlace = false;
     boolean mIsDragOccuring = false;
@@ -175,11 +170,8 @@
     private Bitmap mDragOutline = null;
     private final Rect mTempRect = new Rect();
     private final int[] mTempXY = new int[2];
-    private int mDragViewMultiplyColor;
     private float mOverscrollFade = 0;
-
-    // Paint used to draw external drop outline
-    private final Paint mExternalDragOutlinePaint = new Paint();
+    public static final int DRAG_BITMAP_PADDING = 0;
 
     // Camera and Matrix used to determine the final position of a neighboring CellLayout
     private final Matrix mMatrix = new Matrix();
@@ -192,16 +184,21 @@
     WallpaperOffsetInterpolator mWallpaperOffset;
     boolean mUpdateWallpaperOffsetImmediately = false;
     private Runnable mDelayedResizeRunnable;
+    private Runnable mDelayedSnapToPageRunnable;
     private int mDisplayWidth;
     private int mDisplayHeight;
+    private boolean mIsStaticWallpaper;
     private int mWallpaperTravelWidth;
 
     // Variables relating to the creation of user folders by hovering shortcuts over shortcuts
-    private static final int FOLDER_CREATION_TIMEOUT = 250;
+    private static final int FOLDER_CREATION_TIMEOUT = 0;
+    private static final int REORDER_TIMEOUT = 250;
     private final Alarm mFolderCreationAlarm = new Alarm();
+    private final Alarm mReorderAlarm = new Alarm();
     private FolderRingAnimator mDragFolderRingAnimator = null;
     private View mLastDragOverView = null;
     private boolean mCreateUserFolderOnDrop = false;
+    private boolean mWillAddToExistingFolder = false;
 
     // Variables relating to touch disambiguation (scrolling workspace vs. scrolling a widget)
     private float mXDown;
@@ -210,6 +207,26 @@
     final static float MAX_SWIPE_ANGLE = (float) Math.PI / 3;
     final static float TOUCH_SLOP_DAMPING_FACTOR = 4;
 
+    // Relating to the animation of items being dropped externally
+    public static final int ANIMATE_INTO_POSITION_AND_DISAPPEAR = 0;
+    public static final int ANIMATE_INTO_POSITION_AND_REMAIN = 1;
+    public static final int ANIMATE_INTO_POSITION_AND_RESIZE = 2;
+    public static final int COMPLETE_TWO_STAGE_WIDGET_DROP_ANIMATION = 3;
+    public static final int CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION = 4;
+
+    // Related to dragging, folder creation and reordering
+    private static final int DRAG_MODE_NONE = 0;
+    private static final int DRAG_MODE_CREATE_FOLDER = 1;
+    private static final int DRAG_MODE_ADD_TO_FOLDER = 2;
+    private static final int DRAG_MODE_REORDER = 3;
+    private int mDragMode = DRAG_MODE_NONE;
+    private int mLastReorderX = -1;
+    private int mLastReorderY = -1;
+
+    // Relating to workspace drag fade out
+    private float mDragFadeOutAlpha;
+    private int mDragFadeOutDuration;
+
     // These variables are used for storing the initial and final values during workspace animations
     private int mSavedScrollX;
     private float mSavedRotationY;
@@ -261,8 +278,10 @@
         // With workspace, data is available straight from the get-go
         setDataIsReady();
 
-        mFadeInAdjacentScreens =
-            getResources().getBoolean(R.bool.config_workspaceFadeAdjacentScreens);
+        final Resources res = getResources();
+        mFadeInAdjacentScreens = res.getBoolean(R.bool.config_workspaceFadeAdjacentScreens);
+        mDragFadeOutAlpha = res.getInteger(R.integer.config_dragFadeOutAlpha) / 100f;
+        mDragFadeOutDuration = res.getInteger(R.integer.config_dragFadeOutDuration);
         mWallpaperManager = WallpaperManager.getInstance(context);
 
         int cellCountX = DEFAULT_CELL_COUNT_X;
@@ -271,7 +290,6 @@
         TypedArray a = context.obtainStyledAttributes(attrs,
                 R.styleable.Workspace, defStyle, 0);
 
-        final Resources res = context.getResources();
         if (LauncherApplication.isScreenLarge()) {
             // Determine number of rows/columns dynamically
             // TODO: This code currently fails on tablets with an aspect ratio < 1.3.
@@ -279,9 +297,11 @@
             // landscape
             TypedArray actionBarSizeTypedArray =
                 context.obtainStyledAttributes(new int[] { android.R.attr.actionBarSize });
+            DisplayMetrics displayMetrics = res.getDisplayMetrics();
             final float actionBarHeight = actionBarSizeTypedArray.getDimension(0, 0f);
             final float systemBarHeight = res.getDimension(R.dimen.status_bar_height);
-            final float smallestScreenDim = res.getConfiguration().smallestScreenWidthDp;
+            final float smallestScreenDim = res.getConfiguration().smallestScreenWidthDp *
+                    displayMetrics.density;
 
             cellCountX = 1;
             while (CellLayout.widthInPortrait(res, cellCountX + 1) <= smallestScreenDim) {
@@ -297,7 +317,6 @@
 
         mSpringLoadedShrinkFactor =
             res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f;
-        mDragViewMultiplyColor = res.getColor(R.color.drag_view_multiply_color);
 
         // if the value is manually specified, use that instead
         cellCountX = a.getInt(R.styleable.Workspace_cellCountX, cellCountX);
@@ -318,13 +337,13 @@
     // estimate the size of a widget with spans hSpan, vSpan. return MAX_VALUE for each
     // dimension if unsuccessful
     public int[] estimateItemSize(int hSpan, int vSpan,
-            PendingAddItemInfo pendingItemInfo, boolean springLoaded) {
+            ItemInfo itemInfo, boolean springLoaded) {
         int[] size = new int[2];
         if (getChildCount() > 0) {
             CellLayout cl = (CellLayout) mLauncher.getWorkspace().getChildAt(0);
-            RectF r = estimateItemPosition(cl, pendingItemInfo, 0, 0, hSpan, vSpan);
-            size[0] = (int) r.width();
-            size[1] = (int) r.height();
+            Rect r = estimateItemPosition(cl, itemInfo, 0, 0, hSpan, vSpan);
+            size[0] = r.width();
+            size[1] = r.height();
             if (springLoaded) {
                 size[0] *= mSpringLoadedShrinkFactor;
                 size[1] *= mSpringLoadedShrinkFactor;
@@ -336,19 +355,10 @@
             return size;
         }
     }
-    public RectF estimateItemPosition(CellLayout cl, ItemInfo pendingInfo,
+    public Rect estimateItemPosition(CellLayout cl, ItemInfo pendingInfo,
             int hCell, int vCell, int hSpan, int vSpan) {
-        RectF r = new RectF();
+        Rect r = new Rect();
         cl.cellToRect(hCell, vCell, hSpan, vSpan, r);
-        if (pendingInfo instanceof PendingAddWidgetInfo) {
-            PendingAddWidgetInfo widgetInfo = (PendingAddWidgetInfo) pendingInfo;
-            Rect p = AppWidgetHostView.getDefaultPaddingForWidget(mContext,
-                    widgetInfo.componentName, null);
-            r.top += p.top;
-            r.left += p.left;
-            r.right -= p.right;
-            r.bottom -= p.bottom;
-        }
         return r;
     }
 
@@ -357,7 +367,7 @@
             final int childCount = getChildCount();
             for (int i = 0; i < childCount; i++) {
                 CellLayout cl = (CellLayout) getChildAt(i);
-                cl.buildChildrenLayer();
+                cl.getShortcutsAndWidgets().buildLayer();
             }
         }
     }
@@ -383,39 +393,25 @@
         Launcher.setScreen(mCurrentPage);
         LauncherApplication app = (LauncherApplication)context.getApplicationContext();
         mIconCache = app.getIconCache();
-        mExternalDragOutlinePaint.setAntiAlias(true);
         setWillNotDraw(false);
         setChildrenDrawnWithCacheEnabled(true);
 
+        final Resources res = getResources();
         try {
-            final Resources res = getResources();
             mBackground = res.getDrawable(R.drawable.apps_customize_bg);
         } catch (Resources.NotFoundException e) {
             // In this case, we will skip drawing background protection
         }
 
-        mChangeStateAnimationListener = new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationStart(Animator animation) {
-                mIsSwitchingState = true;
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                mIsSwitchingState = false;
-                mWallpaperOffset.setOverrideHorizontalCatchupConstant(false);
-                mAnimator = null;
-                updateChildrenLayersEnabled();
-            }
-        };
-
-        mSnapVelocity = 600;
         mWallpaperOffset = new WallpaperOffsetInterpolator();
         Display display = mLauncher.getWindowManager().getDefaultDisplay();
         mDisplayWidth = display.getWidth();
         mDisplayHeight = display.getHeight();
         mWallpaperTravelWidth = (int) (mDisplayWidth *
                 wallpaperTravelToScreenWidthRatio(mDisplayWidth, mDisplayHeight));
+
+        mMaxDistanceForFolderCreation = (0.5f * res.getDimensionPixelSize(R.dimen.app_icon_size));
+        mFlingThresholdVelocity = (int) (FLING_THRESHOLD_VELOCITY * mDensity);
     }
 
     @Override
@@ -521,10 +517,12 @@
             child.setOnKeyListener(new IconKeyEventListener());
         }
 
-        CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
-        if (lp == null) {
+        LayoutParams genericLp = child.getLayoutParams();
+        CellLayout.LayoutParams lp;
+        if (genericLp == null || !(genericLp instanceof CellLayout.LayoutParams)) {
             lp = new CellLayout.LayoutParams(x, y, spanX, spanY);
         } else {
+            lp = (CellLayout.LayoutParams) genericLp;
             lp.cellX = x;
             lp.cellY = y;
             lp.cellHSpan = spanX;
@@ -597,20 +595,26 @@
      */
     @Override
     public boolean onTouch(View v, MotionEvent event) {
-        return (isSmall() || mIsSwitchingState);
+        return (isSmall() || !isFinishedSwitchingState());
     }
 
     public boolean isSwitchingState() {
         return mIsSwitchingState;
     }
 
+    /** This differs from isSwitchingState in that we take into account how far the transition
+     *  has completed. */
+    public boolean isFinishedSwitchingState() {
+        return !mIsSwitchingState || (mTransitionProgress > 0.5f);
+    }
+
     protected void onWindowVisibilityChanged (int visibility) {
         mLauncher.onWindowVisibilityChanged(visibility);
     }
 
     @Override
     public boolean dispatchUnhandledMove(View focused, int direction) {
-        if (isSmall() || mIsSwitchingState) {
+        if (isSmall() || !isFinishedSwitchingState()) {
             // when the home screens are shrunken, shouldn't allow side-scrolling
             return false;
         }
@@ -638,41 +642,42 @@
 
     @Override
     protected void determineScrollingStart(MotionEvent ev) {
-        if (!isSmall() && !mIsSwitchingState) {
-            float deltaX = Math.abs(ev.getX() - mXDown);
-            float deltaY = Math.abs(ev.getY() - mYDown);
+        if (isSmall()) return;
+        if (!isFinishedSwitchingState()) return;
 
-            if (Float.compare(deltaX, 0f) == 0) return;
+        float deltaX = Math.abs(ev.getX() - mXDown);
+        float deltaY = Math.abs(ev.getY() - mYDown);
 
-            float slope = deltaY / deltaX;
-            float theta = (float) Math.atan(slope);
+        if (Float.compare(deltaX, 0f) == 0) return;
 
-            if (deltaX > mTouchSlop || deltaY > mTouchSlop) {
-                cancelCurrentPageLongPress();
-            }
+        float slope = deltaY / deltaX;
+        float theta = (float) Math.atan(slope);
 
-            if (theta > MAX_SWIPE_ANGLE) {
-                // Above MAX_SWIPE_ANGLE, we don't want to ever start scrolling the workspace
-                return;
-            } else if (theta > START_DAMPING_TOUCH_SLOP_ANGLE) {
-                // Above START_DAMPING_TOUCH_SLOP_ANGLE and below MAX_SWIPE_ANGLE, we want to
-                // increase the touch slop to make it harder to begin scrolling the workspace. This 
-                // results in vertically scrolling widgets to more easily. The higher the angle, the
-                // more we increase touch slop.
-                theta -= START_DAMPING_TOUCH_SLOP_ANGLE;
-                float extraRatio = (float)
-                        Math.sqrt((theta / (MAX_SWIPE_ANGLE - START_DAMPING_TOUCH_SLOP_ANGLE)));
-                super.determineScrollingStart(ev, 1 + TOUCH_SLOP_DAMPING_FACTOR * extraRatio);
-            } else {
-                // Below START_DAMPING_TOUCH_SLOP_ANGLE, we don't do anything special
-                super.determineScrollingStart(ev);
-            }
+        if (deltaX > mTouchSlop || deltaY > mTouchSlop) {
+            cancelCurrentPageLongPress();
+        }
+
+        if (theta > MAX_SWIPE_ANGLE) {
+            // Above MAX_SWIPE_ANGLE, we don't want to ever start scrolling the workspace
+            return;
+        } else if (theta > START_DAMPING_TOUCH_SLOP_ANGLE) {
+            // Above START_DAMPING_TOUCH_SLOP_ANGLE and below MAX_SWIPE_ANGLE, we want to
+            // increase the touch slop to make it harder to begin scrolling the workspace. This
+            // results in vertically scrolling widgets to more easily. The higher the angle, the
+            // more we increase touch slop.
+            theta -= START_DAMPING_TOUCH_SLOP_ANGLE;
+            float extraRatio = (float)
+                    Math.sqrt((theta / (MAX_SWIPE_ANGLE - START_DAMPING_TOUCH_SLOP_ANGLE)));
+            super.determineScrollingStart(ev, 1 + TOUCH_SLOP_DAMPING_FACTOR * extraRatio);
+        } else {
+            // Below START_DAMPING_TOUCH_SLOP_ANGLE, we don't do anything special
+            super.determineScrollingStart(ev);
         }
     }
 
     @Override
     protected boolean isScrollingIndicatorEnabled() {
-        return mState != State.SPRING_LOADED;
+        return super.isScrollingIndicatorEnabled() && (mState != State.SPRING_LOADED);
     }
 
     protected void onPageBeginMoving() {
@@ -694,7 +699,19 @@
         // Only show page outlines as we pan if we are on large screen
         if (LauncherApplication.isScreenLarge()) {
             showOutlines();
+            mIsStaticWallpaper = mWallpaperManager.getWallpaperInfo() == null;
         }
+
+        // If we are not fading in adjacent screens, we still need to restore the alpha in case the
+        // user scrolls while we are transitioning (should not affect dispatchDraw optimizations)
+        if (!mFadeInAdjacentScreens) {
+            for (int i = 0; i < getChildCount(); ++i) {
+                ((CellLayout) getPageAt(i)).setShortcutAndWidgetAlpha(1f);
+            }
+        }
+
+        // Show the scroll indicator as you pan the page
+        showScrollingIndicator(false);
     }
 
     protected void onPageEndMoving() {
@@ -706,12 +723,23 @@
             clearChildrenCache();
         }
 
-        // Hide the outlines, as long as we're not dragging
-        if (!mDragController.dragging()) {
-            // Only hide page outlines as we pan if we are on large screen
+
+        if (mDragController.isDragging()) {
+            if (isSmall()) {
+                // If we are in springloaded mode, then force an event to check if the current touch
+                // is under a new page (to scroll to)
+                mDragController.forceMoveEvent();
+            }
+        } else {
+            // If we are not mid-dragging, hide the page outlines if we are on a large screen
             if (LauncherApplication.isScreenLarge()) {
                 hideOutlines();
             }
+
+            // Hide the scroll indicator as you pan the page
+            if (!mDragController.isDragging()) {
+                hideScrollingIndicator(false);
+            }
         }
         mOverScrollMaxBackgroundAlpha = 0.0f;
         mOverScrollPageIndex = -1;
@@ -720,6 +748,11 @@
             mDelayedResizeRunnable.run();
             mDelayedResizeRunnable = null;
         }
+
+        if (mDelayedSnapToPageRunnable != null) {
+            mDelayedSnapToPageRunnable.run();
+            mDelayedSnapToPageRunnable = null;
+        }
     }
 
     @Override
@@ -782,28 +815,7 @@
         }.start();
     }
 
-    public void setVerticalWallpaperOffset(float offset) {
-        mWallpaperOffset.setFinalY(offset);
-    }
-    public float getVerticalWallpaperOffset() {
-        return mWallpaperOffset.getCurrY();
-    }
-    public void setHorizontalWallpaperOffset(float offset) {
-        mWallpaperOffset.setFinalX(offset);
-    }
-    public float getHorizontalWallpaperOffset() {
-        return mWallpaperOffset.getCurrX();
-    }
-
     private float wallpaperOffsetForCurrentScroll() {
-        // The wallpaper travel width is how far, from left to right, the wallpaper will move
-        // at this orientation. On tablets in portrait mode we don't move all the way to the
-        // edges of the wallpaper, or otherwise the parallax effect would be too strong.
-        int wallpaperTravelWidth = mWallpaperWidth;
-        if (LauncherApplication.isScreenLarge()) {
-            wallpaperTravelWidth = mWallpaperTravelWidth;
-        }
-
         // Set wallpaper offset steps (1 / (number of screens - 1))
         mWallpaperManager.setWallpaperOffsetSteps(1.0f / (getChildCount() - 1), 1.0f);
 
@@ -821,11 +833,22 @@
 
         float scrollProgress =
             adjustedScrollX / (float) scrollRange;
-        float offsetInDips = wallpaperTravelWidth * scrollProgress +
-            (mWallpaperWidth - wallpaperTravelWidth) / 2; // center it
-        float offset = offsetInDips / (float) mWallpaperWidth;
-        return offset;
+
+        if (LauncherApplication.isScreenLarge() && mIsStaticWallpaper) {
+            // The wallpaper travel width is how far, from left to right, the wallpaper will move
+            // at this orientation. On tablets in portrait mode we don't move all the way to the
+            // edges of the wallpaper, or otherwise the parallax effect would be too strong.
+            int wallpaperTravelWidth = Math.min(mWallpaperTravelWidth, mWallpaperWidth);
+
+            float offsetInDips = wallpaperTravelWidth * scrollProgress +
+                (mWallpaperWidth - wallpaperTravelWidth) / 2; // center it
+            float offset = offsetInDips / (float) mWallpaperWidth;
+            return offset;
+        } else {
+            return scrollProgress;
+        }
     }
+
     private void syncWallpaperOffsetWithScroll() {
         final boolean enableWallpaperEffects = isHardwareAccelerated();
         if (enableWallpaperEffects) {
@@ -855,7 +878,7 @@
             }
         }
         if (keepUpdating) {
-            fastInvalidate();
+            invalidate();
         }
     }
 
@@ -871,6 +894,20 @@
         computeWallpaperScrollRatio(whichPage);
     }
 
+    @Override
+    protected void snapToPage(int whichPage, int duration) {
+        super.snapToPage(whichPage, duration);
+        computeWallpaperScrollRatio(whichPage);
+    }
+
+    protected void snapToPage(int whichPage, Runnable r) {
+        if (mDelayedSnapToPageRunnable != null) {
+            mDelayedSnapToPageRunnable.run();
+        }
+        mDelayedSnapToPageRunnable = r;
+        snapToPage(whichPage, SLOW_PAGE_SNAP_ANIMATION_DURATION);
+    }
+
     private void computeWallpaperScrollRatio(int page) {
         // Here, we determine what the desired scroll would be with and without a layout scale,
         // and compute a ratio between the two. This allows us to adjust the wallpaper offset
@@ -1167,13 +1204,12 @@
                                 backgroundAlphaInterpolator(Math.abs(scrollProgress)));
                     }
                 }
-                cl.setFastTranslationX(translationX);
-                cl.setFastRotationY(rotation);
+                cl.setTranslationX(translationX);
+                cl.setRotationY(rotation);
                 if (mFadeInAdjacentScreens && !isSmall()) {
                     float alpha = 1 - Math.abs(scrollProgress);
-                    cl.setFastAlpha(alpha);
+                    cl.setShortcutAndWidgetAlpha(alpha);
                 }
-                cl.fastInvalidate();
             }
         }
         if (!isSwitchingState() && !isInOverscroll) {
@@ -1246,19 +1282,6 @@
             mUpdateWallpaperOffsetImmediately = true;
         }
         super.onLayout(changed, left, top, right, bottom);
-
-        // if shrinkToBottom() is called on initialization, it has to be deferred
-        // until after the first call to onLayout so that it has the correct width
-        if (mSwitchStateAfterFirstLayout) {
-            mSwitchStateAfterFirstLayout = false;
-            // shrink can trigger a synchronous onLayout call, so we
-            // post this to avoid a stack overflow / tangled onLayout calls
-            post(new Runnable() {
-                public void run() {
-                    changeState(mStateAfterFirstLayout, false);
-                }
-            });
-        }
     }
 
     @Override
@@ -1281,32 +1304,6 @@
         return (mBackground != null && mBackgroundAlpha > 0.0f && mDrawBackground);
     }
 
-    public void scrollTo (int x, int y) {
-        super.scrollTo(x, y);
-        syncChildrenLayersEnabledOnVisiblePages();
-    }
-
-    // This method just applies the value mChildrenLayersEnabled to all the pages that
-    // will be rendered on the next frame.
-    // We do this because calling setChildrenLayersEnabled on a view that's not
-    // visible/rendered causes slowdowns on some graphics cards
-    private void syncChildrenLayersEnabledOnVisiblePages() {
-        if (mChildrenLayersEnabled) {
-            getVisiblePages(mTempVisiblePagesRange);
-            final int leftScreen = mTempVisiblePagesRange[0];
-            final int rightScreen = mTempVisiblePagesRange[1];
-            if (leftScreen != -1 && rightScreen != -1) {
-                for (int i = leftScreen; i <= rightScreen; i++) {
-                    ViewGroup page = (ViewGroup) getPageAt(i);
-                    if (page.getVisibility() == VISIBLE &&
-                            page.getAlpha() > ViewConfiguration.ALPHA_THRESHOLD) {
-                        ((ViewGroup)getPageAt(i)).setChildrenLayersEnabled(true);
-                    }
-                }
-            }
-        }
-    }
-
     @Override
     protected void dispatchDraw(Canvas canvas) {
         super.dispatchDraw(canvas);
@@ -1321,8 +1318,9 @@
             final int paddingTop = mPaddingTop + offset;
             final int paddingBottom = mPaddingBottom + offset;
 
-            final CellLayout leftPage = (CellLayout) getChildAt(mCurrentPage - 1);
-            final CellLayout rightPage = (CellLayout) getChildAt(mCurrentPage + 1);
+            final int page = (mNextPage != INVALID_PAGE ? mNextPage : mCurrentPage);
+            final CellLayout leftPage = (CellLayout) getChildAt(page - 1);
+            final CellLayout rightPage = (CellLayout) getChildAt(page + 1);
 
             if (leftPage != null && leftPage.getIsDragOverlapping()) {
                 final Drawable d = getResources().getDrawable(R.drawable.page_hover_left_holo);
@@ -1407,19 +1405,13 @@
     }
 
     private void updateChildrenLayersEnabled() {
-        boolean small = isSmall() || mIsSwitchingState;
-        boolean dragging = mAnimatingViewIntoPlace || mIsDragOccuring;
-        boolean enableChildrenLayers = small || dragging || isPageMoving();
+        boolean small = mState == State.SMALL || mIsSwitchingState;
+        boolean enableChildrenLayers = small || mAnimatingViewIntoPlace || isPageMoving();
 
         if (enableChildrenLayers != mChildrenLayersEnabled) {
             mChildrenLayersEnabled = enableChildrenLayers;
-            // calling setChildrenLayersEnabled on a view that's not visible/rendered
-            // causes slowdowns on some graphics cards, so we only disable it here and leave
-            // the enabling to dispatchDraw
-            if (!enableChildrenLayers) {
-                for (int i = 0; i < getPageCount(); i++) {
-                    ((ViewGroup)getChildAt(i)).setChildrenLayersEnabled(false);
-                }
+            for (int i = 0; i < getPageCount(); i++) {
+                ((ViewGroup)getChildAt(i)).setChildrenLayersEnabled(mChildrenLayersEnabled);
             }
         }
     }
@@ -1442,7 +1434,7 @@
      * This interpolator emulates the rate at which the perceived scale of an object changes
      * as its distance from a camera increases. When this interpolator is applied to a scale
      * animation on a view, it evokes the sense that the object is shrinking due to moving away
-     * from the camera. 
+     * from the camera.
      */
     static class ZInterpolator implements TimeInterpolator {
         private float focalLength;
@@ -1508,23 +1500,18 @@
     public void onDragStartedWithItem(View v) {
         final Canvas canvas = new Canvas();
 
-        // We need to add extra padding to the bitmap to make room for the glow effect
-        final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
-
         // The outline is used to visualize where the item will land if dropped
-        mDragOutline = createDragOutline(v, canvas, bitmapPadding);
+        mDragOutline = createDragOutline(v, canvas, DRAG_BITMAP_PADDING);
     }
 
     public void onDragStartedWithItem(PendingAddItemInfo info, Bitmap b, Paint alphaClipPaint) {
         final Canvas canvas = new Canvas();
 
-        // We need to add extra padding to the bitmap to make room for the glow effect
-        final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
-
         int[] size = estimateItemSize(info.spanX, info.spanY, info, false);
 
         // The outline is used to visualize where the item will land if dropped
-        mDragOutline = createDragOutline(b, canvas, bitmapPadding, size[0], size[1], alphaClipPaint);
+        mDragOutline = createDragOutline(b, canvas, DRAG_BITMAP_PADDING, size[0],
+                size[1], alphaClipPaint);
     }
 
     // we call this method whenever a drag and drop in Launcher finishes, even if Workspace was
@@ -1562,38 +1549,26 @@
         mNewRotationYs = new float[childCount];
     }
 
-    public void changeState(State shrinkState) {
-        changeState(shrinkState, true);
+    Animator getChangeStateAnimation(final State state, boolean animated) {
+        return getChangeStateAnimation(state, animated, 0);
     }
 
-    void changeState(final State state, boolean animated) {
-        changeState(state, animated, 0);
-    }
-
-    void changeState(final State state, boolean animated, int delay) {
+    Animator getChangeStateAnimation(final State state, boolean animated, int delay) {
         if (mState == state) {
-            return;
-        }
-        if (mFirstLayout) {
-            // (mFirstLayout == "first layout has not happened yet")
-            // cancel any pending shrinks that were set earlier
-            mSwitchStateAfterFirstLayout = false;
-            mStateAfterFirstLayout = state;
-            return;
+            return null;
         }
 
         // Initialize animation arrays for the first time if necessary
         initAnimationArrays();
 
-        // Cancel any running transition animations
-        if (mAnimator != null) mAnimator.cancel();
-        mAnimator = new AnimatorSet();
+        AnimatorSet anim = animated ? new AnimatorSet() : null;
 
         // Stop any scrolling, move to the current page right away
         setCurrentPage((mNextPage != INVALID_PAGE) ? mNextPage : mCurrentPage);
 
         final State oldState = mState;
         final boolean oldStateIsNormal = (oldState == State.NORMAL);
+        final boolean oldStateIsSpringLoaded = (oldState == State.SPRING_LOADED);
         final boolean oldStateIsSmall = (oldState == State.SMALL);
         mState = state;
         final boolean stateIsNormal = (state == State.NORMAL);
@@ -1619,7 +1594,7 @@
             setLayoutScale(1.0f);
         }
 
-        final int duration = zoomIn ? 
+        final int duration = zoomIn ?
                 getResources().getInteger(R.integer.config_workspaceUnshrinkTime) :
                 getResources().getInteger(R.integer.config_appsCustomizeWorkspaceShrinkTime);
         for (int i = 0; i < getChildCount(); i++) {
@@ -1634,8 +1609,9 @@
             if ((oldStateIsSmall && stateIsNormal) ||
                 (oldStateIsNormal && stateIsSmall)) {
                 // To/from workspace - only show the current page unless the transition is not
-                //                     animated and the animation end callback below doesn't run
-                if (i == mCurrentPage || !animated) {
+                //                     animated and the animation end callback below doesn't run;
+                //                     or, if we're in spring-loaded mode
+                if (i == mCurrentPage || !animated || oldStateIsSpringLoaded) {
                     finalAlpha = 1f;
                     finalAlphaMultiplierValue = 0f;
                 } else {
@@ -1685,83 +1661,73 @@
                 cl.setScaleY(finalScaleFactor);
                 cl.setBackgroundAlpha(finalBackgroundAlpha);
                 cl.setBackgroundAlphaMultiplier(finalAlphaMultiplierValue);
-                cl.setAlpha(finalAlpha);
+                cl.setShortcutAndWidgetAlpha(finalAlpha);
                 cl.setRotationY(rotation);
-                mChangeStateAnimationListener.onAnimationEnd(null);
             }
         }
 
         if (animated) {
-            ValueAnimator animWithInterpolator =
-                ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
+            for (int index = 0; index < getChildCount(); index++) {
+                final int i = index;
+                final CellLayout cl = (CellLayout) getChildAt(i);
+                if (mOldAlphas[i] == 0 && mNewAlphas[i] == 0) {
+                    cl.setTranslationX(mNewTranslationXs[i]);
+                    cl.setTranslationY(mNewTranslationYs[i]);
+                    cl.setScaleX(mNewScaleXs[i]);
+                    cl.setScaleY(mNewScaleYs[i]);
+                    cl.setBackgroundAlpha(mNewBackgroundAlphas[i]);
+                    cl.setBackgroundAlphaMultiplier(mNewBackgroundAlphaMultipliers[i]);
+                    cl.setShortcutAndWidgetAlpha(mNewAlphas[i]);
+                    cl.setRotationY(mNewRotationYs[i]);
+                } else {
+                    LauncherViewPropertyAnimator a = new LauncherViewPropertyAnimator(cl);
+                    a.translationX(mNewTranslationXs[i])
+                        .translationY(mNewTranslationYs[i])
+                        .scaleX(mNewScaleXs[i])
+                        .scaleY(mNewScaleYs[i])
+                        .setDuration(duration)
+                        .setInterpolator(mZoomInInterpolator);
+                    anim.play(a);
 
-            if (zoomIn) {
-                animWithInterpolator.setInterpolator(mZoomInInterpolator);
+                    if (mOldAlphas[i] != mNewAlphas[i]) {
+                        LauncherViewPropertyAnimator alphaAnim =
+                            new LauncherViewPropertyAnimator(cl.getShortcutsAndWidgets());
+                        alphaAnim.alpha(mNewAlphas[i])
+                            .setDuration(duration)
+                            .setInterpolator(mZoomInInterpolator);
+                        anim.play(alphaAnim);
+                    }
+                    if (mOldRotationYs[i] != 0 || mNewRotationYs[i] != 0) {
+                        ValueAnimator rotate = ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
+                        rotate.setInterpolator(new DecelerateInterpolator(2.0f));
+                        rotate.addUpdateListener(new LauncherAnimatorUpdateListener() {
+                                public void onAnimationUpdate(float a, float b) {
+                                    cl.setRotationY(a * mOldRotationYs[i] + b * mNewRotationYs[i]);
+                                }
+                            });
+                        anim.play(rotate);
+                    }
+                    if (mOldBackgroundAlphas[i] != 0 ||
+                        mNewBackgroundAlphas[i] != 0 ||
+                        mOldBackgroundAlphaMultipliers[i] != 0 ||
+                        mNewBackgroundAlphaMultipliers[i] != 0) {
+                        ValueAnimator bgAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
+                        bgAnim.setInterpolator(mZoomInInterpolator);
+                        bgAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
+                                public void onAnimationUpdate(float a, float b) {
+                                    cl.setBackgroundAlpha(
+                                            a * mOldBackgroundAlphas[i] +
+                                            b * mNewBackgroundAlphas[i]);
+                                    cl.setBackgroundAlphaMultiplier(
+                                            a * mOldBackgroundAlphaMultipliers[i] +
+                                            b * mNewBackgroundAlphaMultipliers[i]);
+                                }
+                            });
+                        anim.play(bgAnim);
+                    }
+                }
             }
-
-            animWithInterpolator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(android.animation.Animator animation) {
-                    // The above code to determine initialAlpha and finalAlpha will ensure that only
-                    // the current page is visible during (and subsequently, after) the transition
-                    // animation.  If fade adjacent pages is disabled, then re-enable the page
-                    // visibility after the transition animation.
-                    if (!mFadeInAdjacentScreens && stateIsNormal && oldStateIsSmall) {
-                        for (int i = 0; i < getChildCount(); i++) {
-                            final CellLayout cl = (CellLayout) getChildAt(i);
-                            cl.setAlpha(1f);
-                        }
-                    }
-                }
-            });
-            animWithInterpolator.addUpdateListener(new LauncherAnimatorUpdateListener() {
-                public void onAnimationUpdate(float a, float b) {
-                    mTransitionProgress = b;
-                    if (b == 0f) {
-                        // an optimization, but not required
-                        return;
-                    }
-                    invalidate();
-                    for (int i = 0; i < getChildCount(); i++) {
-                        final CellLayout cl = (CellLayout) getChildAt(i);
-                        cl.invalidate();
-                        cl.setFastTranslationX(a * mOldTranslationXs[i] + b * mNewTranslationXs[i]);
-                        cl.setFastTranslationY(a * mOldTranslationYs[i] + b * mNewTranslationYs[i]);
-                        cl.setFastScaleX(a * mOldScaleXs[i] + b * mNewScaleXs[i]);
-                        cl.setFastScaleY(a * mOldScaleYs[i] + b * mNewScaleYs[i]);
-                        cl.setFastBackgroundAlpha(
-                                a * mOldBackgroundAlphas[i] + b * mNewBackgroundAlphas[i]);
-                        cl.setBackgroundAlphaMultiplier(a * mOldBackgroundAlphaMultipliers[i] +
-                                b * mNewBackgroundAlphaMultipliers[i]);
-                        cl.setFastAlpha(a * mOldAlphas[i] + b * mNewAlphas[i]);
-                        cl.invalidate();
-                    }
-                    syncChildrenLayersEnabledOnVisiblePages();
-                }
-            });
-
-            ValueAnimator rotationAnim =
-                ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
-            rotationAnim.setInterpolator(new DecelerateInterpolator(2.0f));
-            rotationAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
-                public void onAnimationUpdate(float a, float b) {
-                    if (b == 0f) {
-                        // an optimization, but not required
-                        return;
-                    }
-                    for (int i = 0; i < getChildCount(); i++) {
-                        final CellLayout cl = (CellLayout) getChildAt(i);
-                        cl.setFastRotationY(a * mOldRotationYs[i] + b * mNewRotationYs[i]);
-                    }
-                }
-            });
-
-            mAnimator.playTogether(animWithInterpolator, rotationAnim);
-            mAnimator.setStartDelay(delay);
-            // If we call this when we're not animated, onAnimationEnd is never called on
-            // the listener; make sure we only use the listener when we're actually animating
-            mAnimator.addListener(mChangeStateAnimationListener);
-            mAnimator.start();
+            anim.setStartDelay(delay);
         }
 
         if (stateIsSpringLoaded) {
@@ -1774,7 +1740,40 @@
             // Fade the background gradient away
             animateBackgroundGradient(0f, true);
         }
-        syncChildrenLayersEnabledOnVisiblePages();
+        return anim;
+    }
+
+    @Override
+    public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) {
+        mIsSwitchingState = true;
+        cancelScrollingIndicatorAnimations();
+    }
+
+    @Override
+    public void onLauncherTransitionStep(Launcher l, float t) {
+        mTransitionProgress = t;
+    }
+
+    @Override
+    public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) {
+        mIsSwitchingState = false;
+        mWallpaperOffset.setOverrideHorizontalCatchupConstant(false);
+        updateChildrenLayersEnabled();
+        // The code in getChangeStateAnimation to determine initialAlpha and finalAlpha will ensure
+        // ensure that only the current page is visible during (and subsequently, after) the
+        // transition animation.  If fade adjacent pages is disabled, then re-enable the page
+        // visibility after the transition animation.
+        if (!mFadeInAdjacentScreens) {
+            for (int i = 0; i < getChildCount(); i++) {
+                final CellLayout cl = (CellLayout) getChildAt(i);
+                cl.setShortcutAndWidgetAlpha(1f);
+            }
+        }
+    }
+
+    @Override
+    public View getContent() {
+        return this;
     }
 
     /**
@@ -1844,8 +1843,6 @@
 
         canvas.setBitmap(b);
         drawDragView(v, canvas, padding, true);
-        mOutlineHelper.applyOuterBlur(b, canvas, outlineColor);
-        canvas.drawColor(mDragViewMultiplyColor, PorterDuff.Mode.MULTIPLY);
         canvas.setBitmap(null);
 
         return b;
@@ -1895,29 +1892,6 @@
         return b;
     }
 
-    /**
-     * Creates a drag outline to represent a drop (that we don't have the actual information for
-     * yet).  May be changed in the future to alter the drop outline slightly depending on the
-     * clip description mime data.
-     */
-    private Bitmap createExternalDragOutline(Canvas canvas, int padding) {
-        Resources r = getResources();
-        final int outlineColor = r.getColor(android.R.color.holo_blue_light);
-        final int iconWidth = r.getDimensionPixelSize(R.dimen.workspace_cell_width);
-        final int iconHeight = r.getDimensionPixelSize(R.dimen.workspace_cell_height);
-        final int rectRadius = r.getDimensionPixelSize(R.dimen.external_drop_icon_rect_radius);
-        final int inset = (int) (Math.min(iconWidth, iconHeight) * 0.2f);
-        final Bitmap b = Bitmap.createBitmap(
-                iconWidth + padding, iconHeight + padding, Bitmap.Config.ARGB_8888);
-
-        canvas.setBitmap(b);
-        canvas.drawRoundRect(new RectF(inset, inset, iconWidth - inset, iconHeight - inset),
-                rectRadius, rectRadius, mExternalDragOutlinePaint);
-        mOutlineHelper.applyMediumExpensiveOutlineWithBlur(b, canvas, outlineColor, outlineColor);
-        canvas.setBitmap(null);
-        return b;
-    }
-
     void startDrag(CellLayout.CellInfo cellInfo) {
         View child = cellInfo.cell;
 
@@ -1927,35 +1901,35 @@
         }
 
         mDragInfo = cellInfo;
-        child.setVisibility(GONE);
+        child.setVisibility(INVISIBLE);
+        CellLayout layout = (CellLayout) child.getParent().getParent();
+        layout.prepareChildForDrag(child);
 
         child.clearFocus();
         child.setPressed(false);
 
         final Canvas canvas = new Canvas();
 
-        // We need to add extra padding to the bitmap to make room for the glow effect
-        final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
-
         // The outline is used to visualize where the item will land if dropped
-        mDragOutline = createDragOutline(child, canvas, bitmapPadding);
+        mDragOutline = createDragOutline(child, canvas, DRAG_BITMAP_PADDING);
         beginDragShared(child, this);
     }
 
     public void beginDragShared(View child, DragSource source) {
         Resources r = getResources();
 
-        // We need to add extra padding to the bitmap to make room for the glow effect
-        final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
-
         // The drag bitmap follows the touch point around on the screen
-        final Bitmap b = createDragBitmap(child, new Canvas(), bitmapPadding);
+        final Bitmap b = createDragBitmap(child, new Canvas(), DRAG_BITMAP_PADDING);
 
         final int bmpWidth = b.getWidth();
+        final int bmpHeight = b.getHeight();
 
         mLauncher.getDragLayer().getLocationInDragLayer(child, mTempXY);
-        final int dragLayerX = (int) mTempXY[0] + (child.getWidth() - bmpWidth) / 2;
-        int dragLayerY = mTempXY[1] - bitmapPadding / 2;
+        int dragLayerX =
+                Math.round(mTempXY[0] - (bmpWidth - child.getScaleX() * child.getWidth()) / 2);
+        int dragLayerY =
+                Math.round(mTempXY[1] - (bmpHeight - child.getScaleY() * bmpHeight) / 2
+                        - DRAG_BITMAP_PADDING / 2);
 
         Point dragVisualizeOffset = null;
         Rect dragRect = null;
@@ -1969,7 +1943,8 @@
             dragLayerY += top;
             // Note: The drag region is used to calculate drag layer offsets, but the
             // dragVisualizeOffset in addition to the dragRect (the size) to position the outline.
-            dragVisualizeOffset = new Point(-bitmapPadding / 2, iconPaddingTop - bitmapPadding / 2);
+            dragVisualizeOffset = new Point(-DRAG_BITMAP_PADDING / 2,
+                    iconPaddingTop - DRAG_BITMAP_PADDING / 2);
             dragRect = new Rect(left, top, right, bottom);
         } else if (child instanceof FolderIcon) {
             int previewSize = r.getDimensionPixelSize(R.dimen.folder_preview_size);
@@ -1983,8 +1958,11 @@
         }
 
         mDragController.startDrag(b, dragLayerX, dragLayerY, source, child.getTag(),
-                DragController.DRAG_ACTION_MOVE, dragVisualizeOffset, dragRect);
+                DragController.DRAG_ACTION_MOVE, dragVisualizeOffset, dragRect, child.getScaleX());
         b.recycle();
+
+        // Show the scrolling indicator when you pick up an item
+        showScrollingIndicator(false);
     }
 
     void addApplicationShortcut(ShortcutInfo info, CellLayout target, long container, int screen,
@@ -1999,7 +1977,7 @@
     }
 
     public boolean transitionStateShouldAllowDrop() {
-        return (!isSwitchingState() || mTransitionProgress > 0.5f);
+        return ((!isSwitchingState() || mTransitionProgress > 0.5f) && mState != State.SMALL);
     }
 
     /**
@@ -2026,56 +2004,78 @@
 
             int spanX = 1;
             int spanY = 1;
-            View ignoreView = null;
             if (mDragInfo != null) {
                 final CellLayout.CellInfo dragCellInfo = mDragInfo;
                 spanX = dragCellInfo.spanX;
                 spanY = dragCellInfo.spanY;
-                ignoreView = dragCellInfo.cell;
             } else {
                 final ItemInfo dragInfo = (ItemInfo) d.dragInfo;
                 spanX = dragInfo.spanX;
                 spanY = dragInfo.spanY;
             }
 
+            int minSpanX = spanX;
+            int minSpanY = spanY;
+            if (d.dragInfo instanceof PendingAddWidgetInfo) {
+                minSpanX = ((PendingAddWidgetInfo) d.dragInfo).minSpanX;
+                minSpanY = ((PendingAddWidgetInfo) d.dragInfo).minSpanY;
+            }
+
             mTargetCell = findNearestArea((int) mDragViewVisualCenter[0],
-                    (int) mDragViewVisualCenter[1], spanX, spanY, mDragTargetLayout, mTargetCell);
-            if (willCreateUserFolder((ItemInfo) d.dragInfo, mDragTargetLayout, mTargetCell, true)) {
+                    (int) mDragViewVisualCenter[1], minSpanX, minSpanY, mDragTargetLayout,
+                    mTargetCell);
+            float distance = mDragTargetLayout.getDistanceFromCell(mDragViewVisualCenter[0],
+                    mDragViewVisualCenter[1], mTargetCell);
+            if (willCreateUserFolder((ItemInfo) d.dragInfo, mDragTargetLayout,
+                    mTargetCell, distance, true)) {
                 return true;
             }
             if (willAddToExistingUserFolder((ItemInfo) d.dragInfo, mDragTargetLayout,
-                    mTargetCell)) {
+                    mTargetCell, distance)) {
                 return true;
             }
 
+            int[] resultSpan = new int[2];
+            mTargetCell = mDragTargetLayout.createArea((int) mDragViewVisualCenter[0],
+                    (int) mDragViewVisualCenter[1], minSpanX, minSpanY, spanX, spanY,
+                    null, mTargetCell, resultSpan, CellLayout.MODE_ACCEPT_DROP);
+            boolean foundCell = mTargetCell[0] >= 0 && mTargetCell[1] >= 0;
+
             // Don't accept the drop if there's no room for the item
-            if (!mDragTargetLayout.findCellForSpanIgnoring(null, spanX, spanY, ignoreView)) {
+            if (!foundCell) {
                 // Don't show the message if we are dropping on the AllApps button and the hotseat
                 // is full
-                if (mTargetCell != null && mLauncher.isHotseatLayout(mDragTargetLayout)) {
+                boolean isHotseat = mLauncher.isHotseatLayout(mDragTargetLayout);
+                if (mTargetCell != null && isHotseat) {
                     Hotseat hotseat = mLauncher.getHotseat();
-                    if (Hotseat.isAllAppsButtonRank(
+                    if (hotseat.isAllAppsButtonRank(
                             hotseat.getOrderInHotseat(mTargetCell[0], mTargetCell[1]))) {
                         return false;
                     }
                 }
 
-                mLauncher.showOutOfSpaceMessage();
+                mLauncher.showOutOfSpaceMessage(isHotseat);
                 return false;
             }
         }
         return true;
     }
 
-    boolean willCreateUserFolder(ItemInfo info, CellLayout target, int[] targetCell,
-            boolean considerTimeout) {
+    boolean willCreateUserFolder(ItemInfo info, CellLayout target, int[] targetCell, float
+            distance, boolean considerTimeout) {
+        if (distance > mMaxDistanceForFolderCreation) return false;
         View dropOverView = target.getChildAt(targetCell[0], targetCell[1]);
 
+        if (dropOverView != null) {
+            CellLayout.LayoutParams lp = (CellLayout.LayoutParams) dropOverView.getLayoutParams();
+            if (lp.useTmpCoords && (lp.tmpCellX != lp.cellX || lp.tmpCellY != lp.tmpCellY)) {
+                return false;
+            }
+        }
+
         boolean hasntMoved = false;
         if (mDragInfo != null) {
-            CellLayout cellParent = getParentCellLayoutForView(mDragInfo.cell);
-            hasntMoved = (mDragInfo.cellX == targetCell[0] &&
-                    mDragInfo.cellY == targetCell[1]) && (cellParent == target);
+            hasntMoved = dropOverView == mDragInfo.cell;
         }
 
         if (dropOverView == null || hasntMoved || (considerTimeout && !mCreateUserFolderOnDrop)) {
@@ -2090,8 +2090,18 @@
         return (aboveShortcut && willBecomeShortcut);
     }
 
-    boolean willAddToExistingUserFolder(Object dragInfo, CellLayout target, int[] targetCell) {
+    boolean willAddToExistingUserFolder(Object dragInfo, CellLayout target, int[] targetCell,
+            float distance) {
+        if (distance > mMaxDistanceForFolderCreation) return false;
         View dropOverView = target.getChildAt(targetCell[0], targetCell[1]);
+
+        if (dropOverView != null) {
+            CellLayout.LayoutParams lp = (CellLayout.LayoutParams) dropOverView.getLayoutParams();
+            if (lp.useTmpCoords && (lp.tmpCellX != lp.cellX || lp.tmpCellY != lp.tmpCellY)) {
+                return false;
+            }
+        }
+
         if (dropOverView instanceof FolderIcon) {
             FolderIcon fi = (FolderIcon) dropOverView;
             if (fi.acceptDrop(dragInfo)) {
@@ -2102,8 +2112,11 @@
     }
 
     boolean createUserFolderIfNecessary(View newView, long container, CellLayout target,
-            int[] targetCell, boolean external, DragView dragView, Runnable postAnimationRunnable) {
+            int[] targetCell, float distance, boolean external, DragView dragView,
+            Runnable postAnimationRunnable) {
+        if (distance > mMaxDistanceForFolderCreation) return false;
         View v = target.getChildAt(targetCell[0], targetCell[1]);
+
         boolean hasntMoved = false;
         if (mDragInfo != null) {
             CellLayout cellParent = getParentCellLayoutForView(mDragInfo.cell);
@@ -2152,8 +2165,13 @@
     }
 
     boolean addToExistingFolderIfNecessary(View newView, CellLayout target, int[] targetCell,
-            DragObject d, boolean external) {
+            float distance, DragObject d, boolean external) {
+        if (distance > mMaxDistanceForFolderCreation) return false;
+
         View dropOverView = target.getChildAt(targetCell[0], targetCell[1]);
+        if (!mWillAddToExistingFolder) return false;
+        mWillAddToExistingFolder = false;
+
         if (dropOverView instanceof FolderIcon) {
             FolderIcon fi = (FolderIcon) dropOverView;
             if (fi.acceptDrop(d.dragInfo)) {
@@ -2169,7 +2187,7 @@
         return false;
     }
 
-    public void onDrop(DragObject d) {
+    public void onDrop(final DragObject d) {
         mDragViewVisualCenter = getDragViewVisualCenter(d.x, d.y, d.xOffset, d.yOffset, d.dragView,
                 mDragViewVisualCenter);
 
@@ -2185,6 +2203,7 @@
         CellLayout dropTargetLayout = mDragTargetLayout;
 
         int snapScreen = -1;
+        boolean resizeOnDrop = false;
         if (d.dragSource != this) {
             final int[] touchXY = new int[] { (int) mDragViewVisualCenter[0],
                     (int) mDragViewVisualCenter[1] };
@@ -2192,6 +2211,7 @@
         } else if (mDragInfo != null) {
             final View cell = mDragInfo.cell;
 
+            Runnable resizeRunnable = null;
             if (dropTargetLayout != null) {
                 // Move internally
                 boolean hasMovedLayouts = (getParentCellLayoutForView(cell) != dropTargetLayout);
@@ -2205,44 +2225,67 @@
                 int spanY = mDragInfo != null ? mDragInfo.spanY : 1;
                 // First we find the cell nearest to point at which the item is
                 // dropped, without any consideration to whether there is an item there.
+
                 mTargetCell = findNearestArea((int) mDragViewVisualCenter[0], (int)
                         mDragViewVisualCenter[1], spanX, spanY, dropTargetLayout, mTargetCell);
+                float distance = dropTargetLayout.getDistanceFromCell(mDragViewVisualCenter[0],
+                        mDragViewVisualCenter[1], mTargetCell);
+
                 // If the item being dropped is a shortcut and the nearest drop
                 // cell also contains a shortcut, then create a folder with the two shortcuts.
                 if (!mInScrollArea && createUserFolderIfNecessary(cell, container,
-                        dropTargetLayout, mTargetCell, false, d.dragView, null)) {
+                        dropTargetLayout, mTargetCell, distance, false, d.dragView, null)) {
                     return;
                 }
 
-                if (addToExistingFolderIfNecessary(cell, dropTargetLayout, mTargetCell, d, false)) {
+                if (addToExistingFolderIfNecessary(cell, dropTargetLayout, mTargetCell,
+                        distance, d, false)) {
                     return;
                 }
 
                 // Aside from the special case where we're dropping a shortcut onto a shortcut,
                 // we need to find the nearest cell location that is vacant
-                mTargetCell = findNearestVacantArea((int) mDragViewVisualCenter[0],
-                        (int) mDragViewVisualCenter[1], mDragInfo.spanX, mDragInfo.spanY, cell,
-                        dropTargetLayout, mTargetCell);
+                ItemInfo item = (ItemInfo) d.dragInfo;
+                int minSpanX = item.spanX;
+                int minSpanY = item.spanY;
+                if (item.minSpanX > 0 && item.minSpanY > 0) {
+                    minSpanX = item.minSpanX;
+                    minSpanY = item.minSpanY;
+                }
+
+                int[] resultSpan = new int[2];
+                mTargetCell = mDragTargetLayout.createArea((int) mDragViewVisualCenter[0],
+                        (int) mDragViewVisualCenter[1], minSpanX, minSpanY, spanX, spanY, cell,
+                        mTargetCell, resultSpan, CellLayout.MODE_ON_DROP);
+
+                boolean foundCell = mTargetCell[0] >= 0 && mTargetCell[1] >= 0;
+                if (foundCell && (resultSpan[0] != item.spanX || resultSpan[1] != item.spanY)) {
+                    resizeOnDrop = true;
+                    item.spanX = resultSpan[0];
+                    item.spanY = resultSpan[1];
+                }
 
                 if (mCurrentPage != screen && !hasMovedIntoHotseat) {
                     snapScreen = screen;
                     snapToPage(screen);
                 }
 
-                if (mTargetCell[0] >= 0 && mTargetCell[1] >= 0) {
+                if (foundCell) {
+                    final ItemInfo info = (ItemInfo) cell.getTag();
                     if (hasMovedLayouts) {
                         // Reparent the view
                         getParentCellLayoutForView(cell).removeView(cell);
                         addInScreen(cell, container, screen, mTargetCell[0], mTargetCell[1],
-                                mDragInfo.spanX, mDragInfo.spanY);
+                                info.spanX, info.spanY);
                     }
 
                     // update the item's position after drop
-                    final ItemInfo info = (ItemInfo) cell.getTag();
                     CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams();
-                    dropTargetLayout.onMove(cell, mTargetCell[0], mTargetCell[1]);
-                    lp.cellX = mTargetCell[0];
-                    lp.cellY = mTargetCell[1];
+                    lp.cellX = lp.tmpCellX = mTargetCell[0];
+                    lp.cellY = lp.tmpCellY = mTargetCell[1];
+                    lp.cellHSpan = item.spanX;
+                    lp.cellVSpan = item.spanY;
+                    lp.isLockedToGrid = true;
                     cell.setId(LauncherModel.getCellLayoutChildId(container, mDragInfo.screen,
                             mTargetCell[0], mTargetCell[1], mDragInfo.spanX, mDragInfo.spanY));
 
@@ -2254,19 +2297,20 @@
 
                         final LauncherAppWidgetHostView hostView = (LauncherAppWidgetHostView) cell;
                         AppWidgetProviderInfo pinfo = hostView.getAppWidgetInfo();
-                        if (pinfo.resizeMode != AppWidgetProviderInfo.RESIZE_NONE) {
-                            final Runnable resizeRunnable = new Runnable() {
+                        if (pinfo != null &&
+                                pinfo.resizeMode != AppWidgetProviderInfo.RESIZE_NONE) {
+                            final Runnable addResizeFrame = new Runnable() {
                                 public void run() {
                                     DragLayer dragLayer = mLauncher.getDragLayer();
                                     dragLayer.addResizeFrame(info, hostView, cellLayout);
                                 }
                             };
-                            post(new Runnable() {
+                            resizeRunnable = (new Runnable() {
                                 public void run() {
                                     if (!isPageMoving()) {
-                                        resizeRunnable.run();
+                                        addResizeFrame.run();
                                     } else {
-                                        mDelayedResizeRunnable = resizeRunnable;
+                                        mDelayedResizeRunnable = addResizeFrame;
                                     }
                                 }
                             });
@@ -2275,28 +2319,43 @@
 
                     LauncherModel.moveItemInDatabase(mLauncher, info, container, screen, lp.cellX,
                             lp.cellY);
+                } else {
+                    // If we can't find a drop location, we return the item to its original position
+                    CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams();
+                    mTargetCell[0] = lp.cellX;
+                    mTargetCell[1] = lp.cellY;
                 }
             }
 
             final CellLayout parent = (CellLayout) cell.getParent().getParent();
-
+            final Runnable finalResizeRunnable = resizeRunnable;
             // Prepare it to be animated into its new position
             // This must be called after the view has been re-parented
-            final Runnable disableHardwareLayersRunnable = new Runnable() {
+            final Runnable onCompleteRunnable = new Runnable() {
                 @Override
                 public void run() {
                     mAnimatingViewIntoPlace = false;
                     updateChildrenLayersEnabled();
+                    if (finalResizeRunnable != null) {
+                        finalResizeRunnable.run();
+                    }
                 }
             };
             mAnimatingViewIntoPlace = true;
             if (d.dragView.hasDrawn()) {
-                int duration = snapScreen < 0 ? -1 : ADJACENT_SCREEN_DROP_DURATION;
-                setFinalScrollForPageChange(snapScreen);
-                mLauncher.getDragLayer().animateViewIntoPosition(d.dragView, cell, duration,
-                        disableHardwareLayersRunnable);
-                resetFinalScrollForPageChange(snapScreen);
+                final ItemInfo info = (ItemInfo) cell.getTag();
+                if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET) {
+                    int animationType = resizeOnDrop ? ANIMATE_INTO_POSITION_AND_RESIZE :
+                            ANIMATE_INTO_POSITION_AND_DISAPPEAR;
+                    animateWidgetDrop(info, parent, d.dragView,
+                            onCompleteRunnable, animationType, cell, false);
+                } else {
+                    int duration = snapScreen < 0 ? -1 : ADJACENT_SCREEN_DROP_DURATION;
+                    mLauncher.getDragLayer().animateViewIntoPosition(d.dragView, cell, duration,
+                            onCompleteRunnable, this);
+                }
             } else {
+                d.deferDragViewCleanupPostAnimation = false;
                 cell.setVisibility(VISIBLE);
             }
             parent.onDropChild(cell);
@@ -2339,6 +2398,7 @@
     }
 
     public void onDragEnter(DragObject d) {
+        mDragHasEnteredWorkspace = true;
         if (mDragTargetLayout != null) {
             mDragTargetLayout.setIsDragOverlapping(false);
             mDragTargetLayout.onDragExit();
@@ -2358,6 +2418,13 @@
         // Clean up folders
         cleanupFolderCreation(d);
 
+        // Clean up reorder
+        if (mReorderAlarm != null) {
+            mReorderAlarm.cancelAlarm();
+            mLastReorderX = -1;
+            mLastReorderY = -1;
+        }
+
         // Reset the scroll area and previous drag target
         onResetScrollArea();
 
@@ -2366,6 +2433,7 @@
             mDragTargetLayout.onDragExit();
         }
         mLastDragOverView = null;
+        mDragMode = DRAG_MODE_NONE;
         mSpringLoadedDragController.cancel();
 
         if (!mIsPageMoving) {
@@ -2374,6 +2442,7 @@
     }
 
     public void onDragExit(DragObject d) {
+        mDragHasEnteredWorkspace = false;
         doDragExit(d);
     }
 
@@ -2405,116 +2474,6 @@
         return null;
     }
 
-    /**
-     * Global drag and drop handler
-     */
-    @Override
-    public boolean onDragEvent(DragEvent event) {
-        final ClipDescription desc = event.getClipDescription();
-        final CellLayout layout = (CellLayout) getChildAt(mCurrentPage);
-        final int[] pos = new int[2];
-        layout.getLocationOnScreen(pos);
-        // We need to offset the drag coordinates to layout coordinate space
-        final int x = (int) event.getX() - pos[0];
-        final int y = (int) event.getY() - pos[1];
-
-        switch (event.getAction()) {
-        case DragEvent.ACTION_DRAG_STARTED: {
-            // Validate this drag
-            Pair<Integer, List<WidgetMimeTypeHandlerData>> test = validateDrag(event);
-            if (test != null) {
-                boolean isShortcut = (test.second == null);
-                if (isShortcut) {
-                    // Check if we have enough space on this screen to add a new shortcut
-                    if (!layout.findCellForSpan(pos, 1, 1)) {
-                        mLauncher.showOutOfSpaceMessage();
-                        return false;
-                    }
-                }
-            } else {
-                // Show error message if we couldn't accept any of the items
-                Toast.makeText(mContext, mContext.getString(R.string.external_drop_widget_error),
-                        Toast.LENGTH_SHORT).show();
-                return false;
-            }
-
-            // Create the drag outline
-            // We need to add extra padding to the bitmap to make room for the glow effect
-            final Canvas canvas = new Canvas();
-            final int bitmapPadding = HolographicOutlineHelper.MAX_OUTER_BLUR_RADIUS;
-            mDragOutline = createExternalDragOutline(canvas, bitmapPadding);
-
-            // Show the current page outlines to indicate that we can accept this drop
-            showOutlines();
-            layout.onDragEnter();
-            layout.visualizeDropLocation(null, mDragOutline, x, y, 1, 1, null, null);
-
-            return true;
-        }
-        case DragEvent.ACTION_DRAG_LOCATION:
-            // Visualize the drop location
-            layout.visualizeDropLocation(null, mDragOutline, x, y, 1, 1, null, null);
-            return true;
-        case DragEvent.ACTION_DROP: {
-            // Try and add any shortcuts
-            final LauncherModel model = mLauncher.getModel();
-            final ClipData data = event.getClipData();
-
-            // We assume that the mime types are ordered in descending importance of
-            // representation. So we enumerate the list of mime types and alert the
-            // user if any widgets can handle the drop.  Only the most preferred
-            // representation will be handled.
-            pos[0] = x;
-            pos[1] = y;
-            Pair<Integer, List<WidgetMimeTypeHandlerData>> test = validateDrag(event);
-            if (test != null) {
-                final int index = test.first;
-                final List<WidgetMimeTypeHandlerData> widgets = test.second;
-                final boolean isShortcut = (widgets == null);
-                final String mimeType = desc.getMimeType(index);
-                if (isShortcut) {
-                    final Intent intent = data.getItemAt(index).getIntent();
-                    Object info = model.infoFromShortcutIntent(mContext, intent, data.getIcon());
-                    if (info != null) {
-                        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
-                        // that widget
-                        final AppWidgetProviderInfo widgetInfo = widgets.get(0).widgetInfo;
-                        final PendingAddWidgetInfo createInfo =
-                                new PendingAddWidgetInfo(widgetInfo, mimeType, data);
-                        mLauncher.addAppWidgetFromDrop(createInfo,
-                            LauncherSettings.Favorites.CONTAINER_DESKTOP, mCurrentPage, null, pos);
-                    } else {
-                        // Show the widget picker dialog if there is more than one widget
-                        // that can handle this data type
-                        final InstallWidgetReceiver.WidgetListAdapter adapter =
-                            new InstallWidgetReceiver.WidgetListAdapter(mLauncher, mimeType,
-                                    data, widgets, layout, mCurrentPage, pos);
-                        final AlertDialog.Builder builder =
-                            new AlertDialog.Builder(mContext);
-                        builder.setAdapter(adapter, adapter);
-                        builder.setCancelable(true);
-                        builder.setTitle(mContext.getString(
-                                R.string.external_drop_widget_pick_title));
-                        builder.setIcon(R.drawable.ic_no_applications);
-                        builder.show();
-                    }
-                }
-            }
-            return true;
-        }
-        case DragEvent.ACTION_DRAG_ENDED:
-            // Hide the page outlines after the drop
-            layout.onDragExit();
-            hideOutlines();
-            return true;
-        }
-        return super.onDragEvent(event);
-    }
-
     /*
     *
     * Convert the 2D coordinate xy from the parent View's coordinate space to this CellLayout's
@@ -2540,7 +2499,11 @@
            v.getMatrix().invert(mTempInverseMatrix);
            cachedInverseMatrix = mTempInverseMatrix;
        }
-       xy[0] = xy[0] + mScrollX - v.getLeft();
+       int scrollX = mScrollX;
+       if (mNextPage != INVALID_PAGE) {
+           scrollX = mScroller.getFinalX();
+       }
+       xy[0] = xy[0] + scrollX - v.getLeft();
        xy[1] = xy[1] + mScrollY - v.getTop();
        cachedInverseMatrix.mapPoints(xy);
    }
@@ -2562,7 +2525,11 @@
     */
    void mapPointFromChildToSelf(View v, float[] xy) {
        v.getMatrix().mapPoints(xy);
-       xy[0] -= (mScrollX - v.getLeft());
+       int scrollX = mScrollX;
+       if (mNextPage != INVALID_PAGE) {
+           scrollX = mScroller.getFinalX();
+       }
+       xy[0] -= (scrollX - v.getLeft());
        xy[1] -= (mScrollY - v.getTop());
    }
 
@@ -2707,8 +2674,7 @@
 
     public void onDragOver(DragObject d) {
         // Skip drag over events while we are dragging over side pages
-        if (mInScrollArea) return;
-        if (mIsSwitchingState) return;
+        if (mInScrollArea || mIsSwitchingState || mState == State.SMALL) return;
 
         Rect r = new Rect();
         CellLayout layout = null;
@@ -2719,6 +2685,7 @@
         mDragViewVisualCenter = getDragViewVisualCenter(d.x, d.y, d.xOffset, d.yOffset,
             d.dragView, mDragViewVisualCenter);
 
+        final View child = (mDragInfo == null) ? null : mDragInfo.cell;
         // Identify whether we have dragged over a side page
         if (isSmall()) {
             if (mLauncher.getHotseat() != null && !isExternalDragWidget(d)) {
@@ -2744,6 +2711,7 @@
                     mDragTargetLayout.onDragEnter();
                 } else {
                     mLastDragOverView = null;
+                    mDragMode = DRAG_MODE_NONE;
                 }
 
                 boolean isInSpringLoadedMode = (mState == State.SPRING_LOADED);
@@ -2779,8 +2747,6 @@
 
         // Handle the drag over
         if (mDragTargetLayout != null) {
-            final View child = (mDragInfo == null) ? null : mDragInfo.cell;
-
             // We want the point to be mapped to the dragTarget.
             if (mLauncher.isHotseatLayout(mDragTargetLayout)) {
                 mapPointFromSelfToSibling(mLauncher.getHotseat(), mDragViewVisualCenter);
@@ -2791,42 +2757,108 @@
 
             mTargetCell = findNearestArea((int) mDragViewVisualCenter[0],
                     (int) mDragViewVisualCenter[1], 1, 1, mDragTargetLayout, mTargetCell);
+            float targetCellDistance = mDragTargetLayout.getDistanceFromCell(
+                    mDragViewVisualCenter[0], mDragViewVisualCenter[1], mTargetCell);
+
             final View dragOverView = mDragTargetLayout.getChildAt(mTargetCell[0],
                     mTargetCell[1]);
 
-            boolean userFolderPending = willCreateUserFolder(info, mDragTargetLayout,
-                    mTargetCell, false);
-            boolean isOverFolder = dragOverView instanceof FolderIcon;
-            if (dragOverView != mLastDragOverView) {
-                cancelFolderCreation();
-                if (mLastDragOverView != null && mLastDragOverView instanceof FolderIcon) {
-                    ((FolderIcon) mLastDragOverView).onDragExit(d.dragInfo);
+            final View lastDragOverView = mLastDragOverView;
+            if (mLastDragOverView != dragOverView) {
+                mDragMode = DRAG_MODE_NONE;
+                mLastDragOverView = dragOverView;
+                if (mReorderAlarm != null) {
+                    mReorderAlarm.cancelAlarm();
                 }
             }
 
-            if (userFolderPending && dragOverView != mLastDragOverView) {
-                mFolderCreationAlarm.setOnAlarmListener(new
-                        FolderCreationAlarmListener(mDragTargetLayout, mTargetCell[0], mTargetCell[1]));
-                mFolderCreationAlarm.setAlarm(FOLDER_CREATION_TIMEOUT);
+            boolean folder = willCreateOrAddToFolder(info, mDragTargetLayout, mTargetCell,
+                    targetCellDistance, dragOverView, lastDragOverView);
+
+            int minSpanX = item.spanX;
+            int minSpanY = item.spanY;
+            if (item.minSpanX > 0 && item.minSpanY > 0) {
+                minSpanX = item.minSpanX;
+                minSpanY = item.minSpanY;
             }
 
-            if (dragOverView != mLastDragOverView && isOverFolder) {
-                ((FolderIcon) dragOverView).onDragEnter(d.dragInfo);
-                if (mDragTargetLayout != null) {
-                    mDragTargetLayout.clearDragOutlines();
+            int[] reorderPosition = new int[2];
+            reorderPosition = findNearestArea((int) mDragViewVisualCenter[0],
+                    (int) mDragViewVisualCenter[1], item.spanX, item.spanY, mDragTargetLayout,
+                    reorderPosition);
+
+            if (!mDragTargetLayout.isNearestDropLocationOccupied((int) mDragViewVisualCenter[0],
+                    (int) mDragViewVisualCenter[1], item.spanX, item.spanY, child, mTargetCell)) {
+                // If the current hover area isn't occupied (permanently) by any items, then we
+                // reset all the reordering.
+                mDragTargetLayout.revertTempState();
+                mDragMode = DRAG_MODE_NONE;
+                mLastDragOverView = dragOverView;
+                if (mReorderAlarm != null) {
+                    mReorderAlarm.cancelAlarm();
                 }
-            }
-            mLastDragOverView = dragOverView;
-
-            if (!mCreateUserFolderOnDrop && !isOverFolder) {
+                mLastReorderX = -1;
+                mLastReorderY = -1;
                 mDragTargetLayout.visualizeDropLocation(child, mDragOutline,
                         (int) mDragViewVisualCenter[0], (int) mDragViewVisualCenter[1],
-                        item.spanX, item.spanY, d.dragView.getDragVisualizeOffset(),
-                        d.dragView.getDragRegion());
+                        mTargetCell[0], mTargetCell[1], item.spanX, item.spanY, false,
+                        d.dragView.getDragVisualizeOffset(), d.dragView.getDragRegion());
+            } else if (!folder && !mReorderAlarm.alarmPending() &&
+                    (mLastReorderX != reorderPosition[0] || mLastReorderY != reorderPosition[1])) {
+                // Otherwise, if we aren't adding to or creating a folder and there's no pending
+                // reorder, then we schedule a reorder
+                cancelFolderCreation();
+                ReorderAlarmListener listener = new ReorderAlarmListener(mDragViewVisualCenter,
+                        minSpanX, minSpanY, item.spanX, item.spanY, d.dragView, child);
+                mReorderAlarm.setOnAlarmListener(listener);
+                mReorderAlarm.setAlarm(REORDER_TIMEOUT);
+            } else if (folder) {
+                if (mReorderAlarm != null) {
+                    mReorderAlarm.cancelAlarm();
+                }
+                mDragTargetLayout.revertTempState();
+                mLastReorderX = -1;
+                mLastReorderY = -1;
             }
         }
     }
 
+    private boolean willCreateOrAddToFolder(ItemInfo info, CellLayout targetLayout,
+            int[] targetCell, float distance, View dragOverView, View lastDragOverView) {
+        boolean userFolderPending = willCreateUserFolder(info, targetLayout, targetCell, distance,
+                false);
+
+        if (userFolderPending && mDragMode == DRAG_MODE_NONE) {
+            mFolderCreationAlarm.setOnAlarmListener(new
+                    FolderCreationAlarmListener(targetLayout, targetCell[0], targetCell[1]));
+            mFolderCreationAlarm.setAlarm(FOLDER_CREATION_TIMEOUT);
+        }
+
+        boolean willAddToFolder =
+                willAddToExistingUserFolder(info, targetLayout, targetCell, distance);
+
+        if (willAddToFolder && mDragMode == DRAG_MODE_NONE) {
+            FolderIcon fi = ((FolderIcon) dragOverView);
+            mDragMode = DRAG_MODE_ADD_TO_FOLDER;
+            mWillAddToExistingFolder = true;
+            fi.onDragEnter(info);
+            if (targetLayout != null) {
+                targetLayout.clearDragOutlines();
+            }
+        }
+
+        if (dragOverView != lastDragOverView || (mCreateUserFolderOnDrop && !userFolderPending)
+                || (!willAddToFolder && mDragMode == DRAG_MODE_ADD_TO_FOLDER)) {
+            cancelFolderCreation();
+            mWillAddToExistingFolder = false;
+            if (lastDragOverView != null && lastDragOverView instanceof FolderIcon) {
+                ((FolderIcon) lastDragOverView).onDragExit(info);
+            }
+        }
+
+        return (willAddToFolder || userFolderPending) && mDragMode != DRAG_MODE_REORDER;
+    }
+
     private void cleanupFolderCreation(DragObject d) {
         if (mDragFolderRingAnimator != null && mCreateUserFolderOnDrop) {
             mDragFolderRingAnimator.animateToNaturalState();
@@ -2868,6 +2900,51 @@
             layout.showFolderAccept(mDragFolderRingAnimator);
             layout.clearDragOutlines();
             mCreateUserFolderOnDrop = true;
+            mDragMode = DRAG_MODE_CREATE_FOLDER;
+        }
+    }
+
+    class ReorderAlarmListener implements OnAlarmListener {
+        float[] dragViewCenter;
+        int minSpanX, minSpanY, spanX, spanY;
+        DragView dragView;
+        View child;
+
+        public ReorderAlarmListener(float[] dragViewCenter, int minSpanX, int minSpanY, int spanX,
+                int spanY, DragView dragView, View child) {
+            this.dragViewCenter = dragViewCenter;
+            this.minSpanX = minSpanX;
+            this.minSpanY = minSpanY;
+            this.spanX = spanX;
+            this.spanY = spanY;
+            this.child = child;
+            this.dragView = dragView;
+        }
+
+        public void onAlarm(Alarm alarm) {
+            int[] resultSpan = new int[2];
+            mTargetCell = findNearestArea((int) mDragViewVisualCenter[0],
+                    (int) mDragViewVisualCenter[1], spanX, spanY, mDragTargetLayout, mTargetCell);
+            mLastReorderX = mTargetCell[0];
+            mLastReorderY = mTargetCell[1];
+
+            mTargetCell = mDragTargetLayout.createArea((int) mDragViewVisualCenter[0],
+                (int) mDragViewVisualCenter[1], minSpanX, minSpanY, spanX, spanY,
+                child, mTargetCell, resultSpan, CellLayout.MODE_DRAG_OVER);
+
+            if (mTargetCell[0] < 0 || mTargetCell[1] < 0) {
+                mDragTargetLayout.revertTempState();
+            }
+
+            if (mDragMode == DRAG_MODE_ADD_TO_FOLDER) {
+            }
+            mDragMode = DRAG_MODE_REORDER;
+
+            boolean resize = resultSpan[0] != spanX || resultSpan[1] != spanY;
+            mDragTargetLayout.visualizeDropLocation(child, mDragOutline,
+                (int) mDragViewVisualCenter[0], (int) mDragViewVisualCenter[1],
+                mTargetCell[0], mTargetCell[1], resultSpan[0], resultSpan[1], resize,
+                dragView.getDragVisualizeOffset(), dragView.getDragRegion());
         }
     }
 
@@ -2887,7 +2964,7 @@
             onDropExternal(dragInfo.dropPos, (ItemInfo) dragInfo, (CellLayout) layout, false);
             return true;
         }
-        mLauncher.showOutOfSpaceMessage();
+        mLauncher.showOutOfSpaceMessage(mLauncher.isHotseatLayout(layout));
         return false;
     }
 
@@ -2909,7 +2986,7 @@
         final Runnable exitSpringLoadedRunnable = new Runnable() {
             @Override
             public void run() {
-                mLauncher.exitSpringLoadedDragModeDelayed(true, false);
+                mLauncher.exitSpringLoadedDragModeDelayed(true, false, null);
             }
         };
 
@@ -2937,15 +3014,29 @@
             if (pendingInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) {
                 mTargetCell = findNearestArea((int) touchXY[0], (int) touchXY[1], spanX, spanY,
                         cellLayout, mTargetCell);
+                float distance = cellLayout.getDistanceFromCell(mDragViewVisualCenter[0],
+                        mDragViewVisualCenter[1], mTargetCell);
                 if (willCreateUserFolder((ItemInfo) d.dragInfo, mDragTargetLayout, mTargetCell,
-                        true) || willAddToExistingUserFolder((ItemInfo) d.dragInfo,
-                                mDragTargetLayout, mTargetCell)) {
+                        distance, true) || willAddToExistingUserFolder((ItemInfo) d.dragInfo,
+                                mDragTargetLayout, mTargetCell, distance)) {
                     findNearestVacantCell = false;
                 }
             }
+
+            final ItemInfo item = (ItemInfo) d.dragInfo;
             if (findNearestVacantCell) {
-                    mTargetCell = findNearestVacantArea(touchXY[0], touchXY[1], spanX, spanY, null,
-                        cellLayout, mTargetCell);
+                int minSpanX = item.spanX;
+                int minSpanY = item.spanY;
+                if (item.minSpanX > 0 && item.minSpanY > 0) {
+                    minSpanX = item.minSpanX;
+                    minSpanY = item.minSpanY;
+                }
+                int[] resultSpan = new int[2];
+                mTargetCell = mDragTargetLayout.createArea((int) mDragViewVisualCenter[0],
+                        (int) mDragViewVisualCenter[1], minSpanX, minSpanY, info.spanX, info.spanY,
+                        null, mTargetCell, resultSpan, CellLayout.MODE_ON_DROP_EXTERNAL);
+                item.spanX = resultSpan[0];
+                item.spanY = resultSpan[1];
             }
 
             Runnable onAnimationCompleteRunnable = new Runnable() {
@@ -2955,8 +3046,11 @@
                     // widgets/shortcuts/folders in a slightly different way
                     switch (pendingInfo.itemType) {
                     case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET:
+                        int span[] = new int[2];
+                        span[0] = item.spanX;
+                        span[1] = item.spanY;
                         mLauncher.addAppWidgetFromDrop((PendingAddWidgetInfo) pendingInfo,
-                                container, screen, mTargetCell, null);
+                                container, screen, mTargetCell, span, null);
                         break;
                     case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
                         mLauncher.processShortcutFromDrop(pendingInfo.componentName,
@@ -2969,28 +3063,15 @@
                     cellLayout.onDragExit();
                 }
             };
-
-            // Now we animate the dragView, (ie. the widget or shortcut preview) into its final
-            // location and size on the home screen.
-            RectF r = estimateItemPosition(cellLayout, pendingInfo,
-                    mTargetCell[0], mTargetCell[1], spanX, spanY);
-            int loc[] = new int[2];
-            loc[0] = (int) r.left;
-            loc[1] = (int) r.top;
-            setFinalTransitionTransform(cellLayout);
-            float cellLayoutScale =
-                    mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(cellLayout, loc);
-            resetTransitionTransform(cellLayout);
-
-            float dragViewScale =  Math.min(r.width() / d.dragView.getMeasuredWidth(),
-                    r.height() / d.dragView.getMeasuredHeight());
-            // The animation will scale the dragView about its center, so we need to center about
-            // the final location.
-            loc[0] -= (d.dragView.getMeasuredWidth() - cellLayoutScale * r.width()) / 2;
-            loc[1] -= (d.dragView.getMeasuredHeight() - cellLayoutScale * r.height()) / 2;
-
-            mLauncher.getDragLayer().animateViewIntoPosition(d.dragView, loc,
-                    dragViewScale * cellLayoutScale, onAnimationCompleteRunnable);
+            View finalView = pendingInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET
+                    ? ((PendingAddWidgetInfo) pendingInfo).boundWidget : null;
+            int animationStyle = ANIMATE_INTO_POSITION_AND_DISAPPEAR;
+            if (pendingInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET &&
+                    ((PendingAddWidgetInfo) pendingInfo).info.configure != null) {
+                animationStyle = ANIMATE_INTO_POSITION_AND_REMAIN;
+            }
+            animateWidgetDrop(info, cellLayout, d.dragView, onAnimationCompleteRunnable,
+                    animationStyle, finalView, true);
         } else {
             // This is for other drag/drop cases, like dragging from All Apps
             View view = null;
@@ -3018,20 +3099,24 @@
             if (touchXY != null) {
                 mTargetCell = findNearestArea((int) touchXY[0], (int) touchXY[1], spanX, spanY,
                         cellLayout, mTargetCell);
+                float distance = cellLayout.getDistanceFromCell(mDragViewVisualCenter[0],
+                        mDragViewVisualCenter[1], mTargetCell);
                 d.postAnimationRunnable = exitSpringLoadedRunnable;
-                if (createUserFolderIfNecessary(view, container, cellLayout, mTargetCell, true,
-                        d.dragView, d.postAnimationRunnable)) {
+                if (createUserFolderIfNecessary(view, container, cellLayout, mTargetCell, distance,
+                        true, d.dragView, d.postAnimationRunnable)) {
                     return;
                 }
-                if (addToExistingFolderIfNecessary(view, cellLayout, mTargetCell, d, true)) {
+                if (addToExistingFolderIfNecessary(view, cellLayout, mTargetCell, distance, d,
+                        true)) {
                     return;
                 }
             }
 
             if (touchXY != null) {
                 // when dragging and dropping, just find the closest free spot
-                mTargetCell = findNearestVacantArea(touchXY[0], touchXY[1], 1, 1, null,
-                        cellLayout, mTargetCell);
+                mTargetCell = mDragTargetLayout.createArea((int) mDragViewVisualCenter[0],
+                        (int) mDragViewVisualCenter[1], 1, 1, 1, 1,
+                        null, mTargetCell, null, CellLayout.MODE_ON_DROP_EXTERNAL);
             } else {
                 cellLayout.findCellForSpan(mTargetCell, 1, 1);
             }
@@ -3039,7 +3124,8 @@
                     info.spanY, insertAtFirst);
             cellLayout.onDropChild(view);
             CellLayout.LayoutParams lp = (CellLayout.LayoutParams) view.getLayoutParams();
-            cellLayout.getChildrenLayout().measureChild(view);
+            cellLayout.getShortcutsAndWidgets().measureChild(view);
+
 
             LauncherModel.addOrMoveItemInDatabase(mLauncher, info, container, screen,
                     lp.cellX, lp.cellY);
@@ -3056,6 +3142,109 @@
         }
     }
 
+    public Bitmap createWidgetBitmap(ItemInfo widgetInfo, View layout) {
+        int[] unScaledSize = mLauncher.getWorkspace().estimateItemSize(widgetInfo.spanX,
+                widgetInfo.spanY, widgetInfo, false);
+        int visibility = layout.getVisibility();
+        layout.setVisibility(VISIBLE);
+
+        int width = MeasureSpec.makeMeasureSpec(unScaledSize[0], MeasureSpec.EXACTLY);
+        int height = MeasureSpec.makeMeasureSpec(unScaledSize[1], MeasureSpec.EXACTLY);
+        Bitmap b = Bitmap.createBitmap(unScaledSize[0], unScaledSize[1],
+                Bitmap.Config.ARGB_8888);
+        Canvas c = new Canvas(b);
+
+        layout.measure(width, height);
+        layout.layout(0, 0, unScaledSize[0], unScaledSize[1]);
+        layout.draw(c);
+        c.setBitmap(null);
+        layout.setVisibility(visibility);
+        return b;
+    }
+
+    private void getFinalPositionForDropAnimation(int[] loc, float[] scaleXY,
+            DragView dragView, CellLayout layout, ItemInfo info, int[] targetCell, View finalView,
+            boolean external) {
+        // Now we animate the dragView, (ie. the widget or shortcut preview) into its final
+        // location and size on the home screen.
+        int spanX = info.spanX;
+        int spanY = info.spanY;
+
+        Rect r = estimateItemPosition(layout, info, targetCell[0], targetCell[1], spanX, spanY);
+        loc[0] = r.left;
+        loc[1] = r.top;
+
+        setFinalTransitionTransform(layout);
+        float cellLayoutScale =
+                mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(layout, loc);
+        resetTransitionTransform(layout);
+        float dragViewScaleX = (1.0f * r.width()) / dragView.getMeasuredWidth();
+        float dragViewScaleY = (1.0f * r.height()) / dragView.getMeasuredHeight();
+
+        // The animation will scale the dragView about its center, so we need to center about
+        // the final location.
+        loc[0] -= (dragView.getMeasuredWidth() - cellLayoutScale * r.width()) / 2;
+        loc[1] -= (dragView.getMeasuredHeight() - cellLayoutScale * r.height()) / 2;
+
+        scaleXY[0] = dragViewScaleX * cellLayoutScale;
+        scaleXY[1] = dragViewScaleY * cellLayoutScale;
+    }
+
+    public void animateWidgetDrop(ItemInfo info, CellLayout cellLayout, DragView dragView,
+            final Runnable onCompleteRunnable, int animationType, final View finalView,
+            boolean external) {
+        Rect from = new Rect();
+        mLauncher.getDragLayer().getViewRectRelativeToSelf(dragView, from);
+
+        int[] finalPos = new int[2];
+        float scaleXY[] = new float[2];
+        getFinalPositionForDropAnimation(finalPos, scaleXY, dragView, cellLayout, info, mTargetCell,
+                finalView, external);
+
+        Resources res = mLauncher.getResources();
+        int duration = res.getInteger(R.integer.config_dropAnimMaxDuration) - 200;
+
+        // In the case where we've prebound the widget, we remove it from the DragLayer
+        if (finalView instanceof AppWidgetHostView && external) {
+            mLauncher.getDragLayer().removeView(finalView);
+        }
+        if ((animationType == ANIMATE_INTO_POSITION_AND_RESIZE || external) && finalView != null) {
+            Bitmap crossFadeBitmap = createWidgetBitmap(info, finalView);
+            dragView.setCrossFadeBitmap(crossFadeBitmap);
+            dragView.crossFade((int) (duration * 0.8f));
+        } else if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET && external) {
+            scaleXY[0] = scaleXY[1] = Math.min(scaleXY[0],  scaleXY[1]);
+        }
+
+        DragLayer dragLayer = mLauncher.getDragLayer();
+        if (animationType == CANCEL_TWO_STAGE_WIDGET_DROP_ANIMATION) {
+            mLauncher.getDragLayer().animateViewIntoPosition(dragView, finalPos, 0f, 0.1f, 0.1f,
+                    DragLayer.ANIMATION_END_DISAPPEAR, onCompleteRunnable, duration);
+        } else {
+            int endStyle;
+            if (animationType == ANIMATE_INTO_POSITION_AND_REMAIN) {
+                endStyle = DragLayer.ANIMATION_END_REMAIN_VISIBLE;
+            } else {
+                endStyle = DragLayer.ANIMATION_END_DISAPPEAR;;
+            }
+
+            Runnable onComplete = new Runnable() {
+                @Override
+                public void run() {
+                    if (finalView != null) {
+                        finalView.setVisibility(VISIBLE);
+                    }
+                    if (onCompleteRunnable != null) {
+                        onCompleteRunnable.run();
+                    }
+                }
+            };
+            dragLayer.animateViewIntoPosition(dragView, from.left, from.top, finalPos[0],
+                    finalPos[1], 1, 1, 1, scaleXY[0], scaleXY[1], onComplete, endStyle,
+                    duration, this);
+        }
+    }
+
     public void setFinalTransitionTransform(CellLayout layout) {
         if (isSwitchingState()) {
             int index = indexOfChild(layout);
@@ -3109,17 +3298,6 @@
      *
      * pixelX and pixelY should be in the coordinate system of layout
      */
-    private int[] findNearestVacantArea(int pixelX, int pixelY,
-            int spanX, int spanY, View ignoreView, CellLayout layout, int[] recycle) {
-        return layout.findNearestVacantArea(
-                pixelX, pixelY, spanX, spanY, ignoreView, recycle);
-    }
-
-    /**
-     * Calculate the nearest cell where the given object would be dropped.
-     *
-     * pixelX and pixelY should be in the coordinate system of layout
-     */
     private int[] findNearestArea(int pixelX, int pixelY,
             int spanX, int spanY, CellLayout layout, int[] recycle) {
         return layout.findNearestArea(
@@ -3139,7 +3317,8 @@
     /**
      * Called at the end of a drag which originated on the workspace.
      */
-    public void onDropCompleted(View target, DragObject d, boolean success) {
+    public void onDropCompleted(View target, DragObject d, boolean isFlingToDelete,
+            boolean success) {
         if (success) {
             if (target != this) {
                 if (mDragInfo != null) {
@@ -3167,6 +3346,46 @@
         }
         mDragOutline = null;
         mDragInfo = null;
+
+        // Hide the scrolling indicator after you pick up an item
+        hideScrollingIndicator(false);
+    }
+
+    void updateItemLocationsInDatabase(CellLayout cl) {
+        int count = cl.getShortcutsAndWidgets().getChildCount();
+
+        int screen = indexOfChild(cl);
+        int container = Favorites.CONTAINER_DESKTOP;
+
+        if (mLauncher.isHotseatLayout(cl)) {
+            screen = -1;
+            container = Favorites.CONTAINER_HOTSEAT;
+        }
+
+        for (int i = 0; i < count; i++) {
+            View v = cl.getShortcutsAndWidgets().getChildAt(i);
+            ItemInfo info = (ItemInfo) v.getTag();
+            // Null check required as the AllApps button doesn't have an item info
+            if (info != null) {
+                LauncherModel.moveItemInDatabase(mLauncher, info, container, screen, info.cellX,
+                        info.cellY);
+            }
+        }
+    }
+
+    @Override
+    public boolean supportsFlingToDelete() {
+        return true;
+    }
+
+    @Override
+    public void onFlingToDelete(DragObject d, int x, int y, PointF vec) {
+        // Do nothing
+    }
+
+    @Override
+    public void onFlingToDeleteCompleted() {
+        // Do nothing
     }
 
     public boolean isDropEnabled() {
@@ -3204,7 +3423,8 @@
     @Override
     public boolean onEnterScrollArea(int x, int y, int direction) {
         // Ignore the scroll area if we are dragging over the hot seat
-        if (mLauncher.getHotseat() != null) {
+        boolean isPortrait = !LauncherApplication.isScreenLandscape(getContext());
+        if (mLauncher.getHotseat() != null && isPortrait) {
             Rect r = new Rect();
             mLauncher.getHotseat().getHitRect(r);
             if (r.contains(x, y)) {
@@ -3216,11 +3436,12 @@
         if (!isSmall() && !mIsSwitchingState) {
             mInScrollArea = true;
 
-            final int page = mCurrentPage + (direction == DragController.SCROLL_LEFT ? -1 : 1);
-            final CellLayout layout = (CellLayout) getChildAt(page);
+            final int page = (mNextPage != INVALID_PAGE ? mNextPage : mCurrentPage) +
+                       (direction == DragController.SCROLL_LEFT ? -1 : 1);
             cancelFolderCreation();
 
-            if (layout != null) {
+            if (0 <= page && page < getChildCount()) {
+                CellLayout layout = (CellLayout) getChildAt(page);
                 // Exit the current layout and mark the overlapping layout
                 if (mDragTargetLayout != null) {
                     mDragTargetLayout.setIsDragOverlapping(false);
@@ -3243,16 +3464,17 @@
         boolean result = false;
         if (mInScrollArea) {
             if (mDragTargetLayout != null) {
-                // Unmark the overlapping layout and re-enter the current layout
                 mDragTargetLayout.setIsDragOverlapping(false);
-                mDragTargetLayout = getCurrentDropLayout();
-                mDragTargetLayout.onDragEnter();
-
                 // Workspace is responsible for drawing the edge glow on adjacent pages,
                 // so we need to redraw the workspace when this may have changed.
                 invalidate();
-                result = true;
             }
+            if (mDragTargetLayout != null && mDragHasEnteredWorkspace) {
+                // Unmark the overlapping layout and re-enter the current layout
+                mDragTargetLayout = getCurrentDropLayout();
+                mDragTargetLayout.onDragEnter();
+            }
+            result = true;
             mInScrollArea = false;
         }
         return result;
@@ -3276,7 +3498,7 @@
     CellLayout getParentCellLayoutForView(View v) {
         ArrayList<CellLayout> layouts = getWorkspaceAndHotseatCellLayouts();
         for (CellLayout layout : layouts) {
-            if (layout.getChildrenLayout().indexOfChild(v) > -1) {
+            if (layout.getShortcutsAndWidgets().indexOfChild(v) > -1) {
                 return layout;
             }
         }
@@ -3300,23 +3522,26 @@
 
     /**
      * We should only use this to search for specific children.  Do not use this method to modify
-     * CellLayoutChildren directly.
+     * ShortcutsAndWidgetsContainer directly. Includes ShortcutAndWidgetContainers from
+     * the hotseat and workspace pages
      */
-    ArrayList<CellLayoutChildren> getWorkspaceAndHotseatCellLayoutChildren() {
-        ArrayList<CellLayoutChildren> childrenLayouts = new ArrayList<CellLayoutChildren>();
+    ArrayList<ShortcutAndWidgetContainer> getAllShortcutAndWidgetContainers() {
+        ArrayList<ShortcutAndWidgetContainer> childrenLayouts =
+                new ArrayList<ShortcutAndWidgetContainer>();
         int screenCount = getChildCount();
         for (int screen = 0; screen < screenCount; screen++) {
-            childrenLayouts.add(((CellLayout) getChildAt(screen)).getChildrenLayout());
+            childrenLayouts.add(((CellLayout) getChildAt(screen)).getShortcutsAndWidgets());
         }
         if (mLauncher.getHotseat() != null) {
-            childrenLayouts.add(mLauncher.getHotseat().getLayout().getChildrenLayout());
+            childrenLayouts.add(mLauncher.getHotseat().getLayout().getShortcutsAndWidgets());
         }
         return childrenLayouts;
     }
 
     public Folder getFolderForTag(Object tag) {
-        ArrayList<CellLayoutChildren> childrenLayouts = getWorkspaceAndHotseatCellLayoutChildren();
-        for (CellLayoutChildren layout: childrenLayouts) {
+        ArrayList<ShortcutAndWidgetContainer> childrenLayouts =
+                getAllShortcutAndWidgetContainers();
+        for (ShortcutAndWidgetContainer layout: childrenLayouts) {
             int count = layout.getChildCount();
             for (int i = 0; i < count; i++) {
                 View child = layout.getChildAt(i);
@@ -3332,8 +3557,9 @@
     }
 
     public View getViewForTag(Object tag) {
-        ArrayList<CellLayoutChildren> childrenLayouts = getWorkspaceAndHotseatCellLayoutChildren();
-        for (CellLayoutChildren layout: childrenLayouts) {
+        ArrayList<ShortcutAndWidgetContainer> childrenLayouts =
+                getAllShortcutAndWidgetContainers();
+        for (ShortcutAndWidgetContainer layout: childrenLayouts) {
             int count = layout.getChildCount();
             for (int i = 0; i < count; i++) {
                 View child = layout.getChildAt(i);
@@ -3346,8 +3572,9 @@
     }
 
     void clearDropTargets() {
-        ArrayList<CellLayoutChildren> childrenLayouts = getWorkspaceAndHotseatCellLayoutChildren();
-        for (CellLayoutChildren layout: childrenLayouts) {
+        ArrayList<ShortcutAndWidgetContainer> childrenLayouts =
+                getAllShortcutAndWidgetContainers();
+        for (ShortcutAndWidgetContainer layout: childrenLayouts) {
             int childCount = layout.getChildCount();
             for (int j = 0; j < childCount; j++) {
                 View v = layout.getChildAt(j);
@@ -3369,7 +3596,7 @@
 
         ArrayList<CellLayout> cellLayouts = getWorkspaceAndHotseatCellLayouts();
         for (final CellLayout layoutParent: cellLayouts) {
-            final ViewGroup layout = layoutParent.getChildrenLayout();
+            final ViewGroup layout = layoutParent.getShortcutsAndWidgets();
 
             // Avoid ANRs by treating each screen separately
             post(new Runnable() {
@@ -3455,14 +3682,14 @@
     }
 
     void updateShortcuts(ArrayList<ApplicationInfo> apps) {
-        ArrayList<CellLayoutChildren> childrenLayouts = getWorkspaceAndHotseatCellLayoutChildren();
-        for (CellLayoutChildren layout: childrenLayouts) {
+        ArrayList<ShortcutAndWidgetContainer> childrenLayouts = getAllShortcutAndWidgetContainers();
+        for (ShortcutAndWidgetContainer layout: childrenLayouts) {
             int childCount = layout.getChildCount();
             for (int j = 0; j < childCount; j++) {
                 final View view = layout.getChildAt(j);
                 Object tag = view.getTag();
                 if (tag instanceof ShortcutInfo) {
-                    ShortcutInfo info = (ShortcutInfo)tag;
+                    ShortcutInfo info = (ShortcutInfo) tag;
                     // We need to check for ACTION_MAIN otherwise getComponent() might
                     // return null for some shortcuts (for instance, for shortcuts to
                     // web pages.)
@@ -3474,11 +3701,11 @@
                         for (int k = 0; k < appCount; k++) {
                             ApplicationInfo app = apps.get(k);
                             if (app.componentName.equals(name)) {
-                                info.setIcon(mIconCache.getIcon(info.intent));
-                                ((TextView)view).setCompoundDrawablesWithIntrinsicBounds(null,
-                                        new FastBitmapDrawable(info.getIcon(mIconCache)),
-                                        null, null);
-                                }
+                                BubbleTextView shortcut = (BubbleTextView) view;
+                                info.updateIcon(mIconCache);
+                                info.title = app.title.toString();
+                                shortcut.applyFromShortcutInfo(info, mIconCache);
+                            }
                         }
                     }
                 }
@@ -3524,7 +3751,7 @@
         final ViewGroup parent = (ViewGroup) getParent();
         final ImageView qsbDivider = (ImageView) (parent.findViewById(R.id.qsb_divider));
         final ImageView dockDivider = (ImageView) (parent.findViewById(R.id.dock_divider));
-        final ImageView scrollIndicator = getScrollingIndicator();
+        final View scrollIndicator = getScrollingIndicator();
 
         cancelScrollingIndicatorAnimations();
         if (qsbDivider != null) qsbDivider.setAlpha(reducedFade);