am e28cc02e: Fixing issue where package updates were not getting propagated properly

* commit 'e28cc02e81613ee543c31b8aa25809227c4184a2':
  Fixing issue where package updates were not getting propagated properly
diff --git a/Android.mk b/Android.mk
index dbce33f..6e8365f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -36,7 +36,8 @@
 LOCAL_PROTOC_OPTIMIZE_TYPE := nano
 LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/protos/
 
-LOCAL_SDK_VERSION := 19
+# STOPSHIP(kennyguy): change to 21 once the L SDK is baked.
+LOCAL_SDK_VERSION := current
 
 LOCAL_PACKAGE_NAME := Launcher3
 #LOCAL_CERTIFICATE := shared
diff --git a/res/drawable-hdpi/ic_allapps.png b/res/drawable-hdpi/ic_allapps.png
index e7677d5..4fe3bf0 100644
--- a/res/drawable-hdpi/ic_allapps.png
+++ b/res/drawable-hdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_allapps_l.png b/res/drawable-hdpi/ic_allapps_l.png
deleted file mode 100644
index 4fe3bf0..0000000
--- a/res/drawable-hdpi/ic_allapps_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_allapps_pressed.png b/res/drawable-hdpi/ic_allapps_pressed.png
index 863eeba..af49dbb 100644
--- a/res/drawable-hdpi/ic_allapps_pressed.png
+++ b/res/drawable-hdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_allapps_pressed_l.png b/res/drawable-hdpi/ic_allapps_pressed_l.png
deleted file mode 100644
index af49dbb..0000000
--- a/res/drawable-hdpi/ic_allapps_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_setting.png b/res/drawable-hdpi/ic_setting.png
index 3f5bc43..1c12a5b 100644
--- a/res/drawable-hdpi/ic_setting.png
+++ b/res/drawable-hdpi/ic_setting.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_setting_l.png b/res/drawable-hdpi/ic_setting_l.png
deleted file mode 100644
index 1c12a5b..0000000
--- a/res/drawable-hdpi/ic_setting_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_setting_pressed.png b/res/drawable-hdpi/ic_setting_pressed.png
index 9201064..d5b5ca2 100644
--- a/res/drawable-hdpi/ic_setting_pressed.png
+++ b/res/drawable-hdpi/ic_setting_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_setting_pressed_l.png b/res/drawable-hdpi/ic_setting_pressed_l.png
deleted file mode 100644
index d5b5ca2..0000000
--- a/res/drawable-hdpi/ic_setting_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_wallpaper.png b/res/drawable-hdpi/ic_wallpaper.png
index 5e5d118..34d5943 100644
--- a/res/drawable-hdpi/ic_wallpaper.png
+++ b/res/drawable-hdpi/ic_wallpaper.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_wallpaper_l.png b/res/drawable-hdpi/ic_wallpaper_l.png
deleted file mode 100644
index 34d5943..0000000
--- a/res/drawable-hdpi/ic_wallpaper_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_wallpaper_pressed.png b/res/drawable-hdpi/ic_wallpaper_pressed.png
index d104e57..1588ce7 100644
--- a/res/drawable-hdpi/ic_wallpaper_pressed.png
+++ b/res/drawable-hdpi/ic_wallpaper_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_wallpaper_pressed_l.png b/res/drawable-hdpi/ic_wallpaper_pressed_l.png
deleted file mode 100644
index 1588ce7..0000000
--- a/res/drawable-hdpi/ic_wallpaper_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_widget.png b/res/drawable-hdpi/ic_widget.png
index 8c57af0..ed7e1ca 100644
--- a/res/drawable-hdpi/ic_widget.png
+++ b/res/drawable-hdpi/ic_widget.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_widget_l.png b/res/drawable-hdpi/ic_widget_l.png
deleted file mode 100644
index ed7e1ca..0000000
--- a/res/drawable-hdpi/ic_widget_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_widget_pressed.png b/res/drawable-hdpi/ic_widget_pressed.png
index 081f9f9..19d6fed 100644
--- a/res/drawable-hdpi/ic_widget_pressed.png
+++ b/res/drawable-hdpi/ic_widget_pressed.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_widget_pressed_l.png b/res/drawable-hdpi/ic_widget_pressed_l.png
deleted file mode 100644
index 19d6fed..0000000
--- a/res/drawable-hdpi/ic_widget_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/quantum_panel.9.png b/res/drawable-hdpi/quantum_panel.9.png
new file mode 100644
index 0000000..ae625be
--- /dev/null
+++ b/res/drawable-hdpi/quantum_panel.9.png
Binary files differ
diff --git a/res/drawable-hdpi/screenpanel.9.png b/res/drawable-hdpi/screenpanel.9.png
index 36e7dfd..eed0f2c 100644
--- a/res/drawable-hdpi/screenpanel.9.png
+++ b/res/drawable-hdpi/screenpanel.9.png
Binary files differ
diff --git a/res/drawable-hdpi/screenpanel_hover.9.png b/res/drawable-hdpi/screenpanel_hover.9.png
index 0fed7c9..2cea8a4 100644
--- a/res/drawable-hdpi/screenpanel_hover.9.png
+++ b/res/drawable-hdpi/screenpanel_hover.9.png
Binary files differ
diff --git a/res/drawable-hdpi/screenpanel_hover_l.9.png b/res/drawable-hdpi/screenpanel_hover_l.9.png
deleted file mode 100644
index 2cea8a4..0000000
--- a/res/drawable-hdpi/screenpanel_hover_l.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/screenpanel_l.9.png b/res/drawable-hdpi/screenpanel_l.9.png
deleted file mode 100644
index eed0f2c..0000000
--- a/res/drawable-hdpi/screenpanel_l.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps.png b/res/drawable-mdpi/ic_allapps.png
index e0fd9c0..09cd82a 100644
--- a/res/drawable-mdpi/ic_allapps.png
+++ b/res/drawable-mdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps_l.png b/res/drawable-mdpi/ic_allapps_l.png
deleted file mode 100644
index 09cd82a..0000000
--- a/res/drawable-mdpi/ic_allapps_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps_pressed.png b/res/drawable-mdpi/ic_allapps_pressed.png
index 3bd87b1..d7ea96f 100644
--- a/res/drawable-mdpi/ic_allapps_pressed.png
+++ b/res/drawable-mdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_allapps_pressed_l.png b/res/drawable-mdpi/ic_allapps_pressed_l.png
deleted file mode 100644
index d7ea96f..0000000
--- a/res/drawable-mdpi/ic_allapps_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_setting.png b/res/drawable-mdpi/ic_setting.png
index 1e76459..c614e91 100644
--- a/res/drawable-mdpi/ic_setting.png
+++ b/res/drawable-mdpi/ic_setting.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_setting_l.png b/res/drawable-mdpi/ic_setting_l.png
deleted file mode 100644
index c614e91..0000000
--- a/res/drawable-mdpi/ic_setting_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_setting_pressed.png b/res/drawable-mdpi/ic_setting_pressed.png
index d7aca18..61e574a 100644
--- a/res/drawable-mdpi/ic_setting_pressed.png
+++ b/res/drawable-mdpi/ic_setting_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_setting_pressed_l.png b/res/drawable-mdpi/ic_setting_pressed_l.png
deleted file mode 100644
index 61e574a..0000000
--- a/res/drawable-mdpi/ic_setting_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_wallpaper.png b/res/drawable-mdpi/ic_wallpaper.png
index 333a206..8f2a00a 100644
--- a/res/drawable-mdpi/ic_wallpaper.png
+++ b/res/drawable-mdpi/ic_wallpaper.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_wallpaper_l.png b/res/drawable-mdpi/ic_wallpaper_l.png
deleted file mode 100644
index 8f2a00a..0000000
--- a/res/drawable-mdpi/ic_wallpaper_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_wallpaper_pressed.png b/res/drawable-mdpi/ic_wallpaper_pressed.png
index 273c48b..aa598c3 100644
--- a/res/drawable-mdpi/ic_wallpaper_pressed.png
+++ b/res/drawable-mdpi/ic_wallpaper_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_wallpaper_pressed_l.png b/res/drawable-mdpi/ic_wallpaper_pressed_l.png
deleted file mode 100644
index aa598c3..0000000
--- a/res/drawable-mdpi/ic_wallpaper_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_widget.png b/res/drawable-mdpi/ic_widget.png
index 5f974c2..1bd3935 100644
--- a/res/drawable-mdpi/ic_widget.png
+++ b/res/drawable-mdpi/ic_widget.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_widget_l.png b/res/drawable-mdpi/ic_widget_l.png
deleted file mode 100644
index 1bd3935..0000000
--- a/res/drawable-mdpi/ic_widget_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_widget_pressed.png b/res/drawable-mdpi/ic_widget_pressed.png
index 0a3e883..9b690d9 100644
--- a/res/drawable-mdpi/ic_widget_pressed.png
+++ b/res/drawable-mdpi/ic_widget_pressed.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_widget_pressed_l.png b/res/drawable-mdpi/ic_widget_pressed_l.png
deleted file mode 100644
index 9b690d9..0000000
--- a/res/drawable-mdpi/ic_widget_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/quantum_panel.9.png b/res/drawable-mdpi/quantum_panel.9.png
new file mode 100644
index 0000000..1f9cd1a
--- /dev/null
+++ b/res/drawable-mdpi/quantum_panel.9.png
Binary files differ
diff --git a/res/drawable-mdpi/screenpanel.9.png b/res/drawable-mdpi/screenpanel.9.png
index 4de3017..6f8b7e6 100644
--- a/res/drawable-mdpi/screenpanel.9.png
+++ b/res/drawable-mdpi/screenpanel.9.png
Binary files differ
diff --git a/res/drawable-mdpi/screenpanel_hover.9.png b/res/drawable-mdpi/screenpanel_hover.9.png
index 7dd8858..8a94984 100644
--- a/res/drawable-mdpi/screenpanel_hover.9.png
+++ b/res/drawable-mdpi/screenpanel_hover.9.png
Binary files differ
diff --git a/res/drawable-mdpi/screenpanel_hover_l.9.png b/res/drawable-mdpi/screenpanel_hover_l.9.png
deleted file mode 100644
index 8a94984..0000000
--- a/res/drawable-mdpi/screenpanel_hover_l.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/screenpanel_l.9.png b/res/drawable-mdpi/screenpanel_l.9.png
deleted file mode 100644
index 6f8b7e6..0000000
--- a/res/drawable-mdpi/screenpanel_l.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps.png b/res/drawable-xhdpi/ic_allapps.png
index f71964c..eff3bea 100644
--- a/res/drawable-xhdpi/ic_allapps.png
+++ b/res/drawable-xhdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps_l.png b/res/drawable-xhdpi/ic_allapps_l.png
deleted file mode 100644
index eff3bea..0000000
--- a/res/drawable-xhdpi/ic_allapps_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps_pressed.png b/res/drawable-xhdpi/ic_allapps_pressed.png
index d678f02..15a8aa9 100644
--- a/res/drawable-xhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_allapps_pressed_l.png b/res/drawable-xhdpi/ic_allapps_pressed_l.png
deleted file mode 100644
index 15a8aa9..0000000
--- a/res/drawable-xhdpi/ic_allapps_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_setting.png b/res/drawable-xhdpi/ic_setting.png
index 6f06bcf..3a7310b 100644
--- a/res/drawable-xhdpi/ic_setting.png
+++ b/res/drawable-xhdpi/ic_setting.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_setting_l.png b/res/drawable-xhdpi/ic_setting_l.png
deleted file mode 100644
index 3a7310b..0000000
--- a/res/drawable-xhdpi/ic_setting_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_setting_pressed.png b/res/drawable-xhdpi/ic_setting_pressed.png
index bca8ccd..005d49c 100644
--- a/res/drawable-xhdpi/ic_setting_pressed.png
+++ b/res/drawable-xhdpi/ic_setting_pressed.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_setting_pressed_l.png b/res/drawable-xhdpi/ic_setting_pressed_l.png
deleted file mode 100644
index 005d49c..0000000
--- a/res/drawable-xhdpi/ic_setting_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_wallpaper.png b/res/drawable-xhdpi/ic_wallpaper.png
index 41dc000..d2bf246 100644
--- a/res/drawable-xhdpi/ic_wallpaper.png
+++ b/res/drawable-xhdpi/ic_wallpaper.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_wallpaper_l.png b/res/drawable-xhdpi/ic_wallpaper_l.png
deleted file mode 100644
index d2bf246..0000000
--- a/res/drawable-xhdpi/ic_wallpaper_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_wallpaper_pressed.png b/res/drawable-xhdpi/ic_wallpaper_pressed.png
index ffff053..5a9b84d 100644
--- a/res/drawable-xhdpi/ic_wallpaper_pressed.png
+++ b/res/drawable-xhdpi/ic_wallpaper_pressed.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_wallpaper_pressed_l.png b/res/drawable-xhdpi/ic_wallpaper_pressed_l.png
deleted file mode 100644
index 5a9b84d..0000000
--- a/res/drawable-xhdpi/ic_wallpaper_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_widget.png b/res/drawable-xhdpi/ic_widget.png
index 47dcdd1..cf6be81 100644
--- a/res/drawable-xhdpi/ic_widget.png
+++ b/res/drawable-xhdpi/ic_widget.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_widget_l.png b/res/drawable-xhdpi/ic_widget_l.png
deleted file mode 100644
index cf6be81..0000000
--- a/res/drawable-xhdpi/ic_widget_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_widget_pressed.png b/res/drawable-xhdpi/ic_widget_pressed.png
index 8bb387b..633c9c6 100644
--- a/res/drawable-xhdpi/ic_widget_pressed.png
+++ b/res/drawable-xhdpi/ic_widget_pressed.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_widget_pressed_l.png b/res/drawable-xhdpi/ic_widget_pressed_l.png
deleted file mode 100644
index 633c9c6..0000000
--- a/res/drawable-xhdpi/ic_widget_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/quantum_panel.9.png b/res/drawable-xhdpi/quantum_panel.9.png
new file mode 100644
index 0000000..562d758
--- /dev/null
+++ b/res/drawable-xhdpi/quantum_panel.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/screenpanel.9.png b/res/drawable-xhdpi/screenpanel.9.png
index b4b828d..2d70d7a 100644
--- a/res/drawable-xhdpi/screenpanel.9.png
+++ b/res/drawable-xhdpi/screenpanel.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/screenpanel_hover.9.png b/res/drawable-xhdpi/screenpanel_hover.9.png
index 251bf20..0032fff 100644
--- a/res/drawable-xhdpi/screenpanel_hover.9.png
+++ b/res/drawable-xhdpi/screenpanel_hover.9.png
Binary files differ
diff --git a/res/drawable-xhdpi/screenpanel_hover_l.9.png b/res/drawable-xhdpi/screenpanel_hover_l.9.png
deleted file mode 100644
index 0032fff..0000000
--- a/res/drawable-xhdpi/screenpanel_hover_l.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/screenpanel_l.9.png b/res/drawable-xhdpi/screenpanel_l.9.png
deleted file mode 100644
index 2d70d7a..0000000
--- a/res/drawable-xhdpi/screenpanel_l.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps.png b/res/drawable-xxhdpi/ic_allapps.png
index 624e0ef..2461984 100644
--- a/res/drawable-xxhdpi/ic_allapps.png
+++ b/res/drawable-xxhdpi/ic_allapps.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps_l.png b/res/drawable-xxhdpi/ic_allapps_l.png
deleted file mode 100644
index 2461984..0000000
--- a/res/drawable-xxhdpi/ic_allapps_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps_pressed.png b/res/drawable-xxhdpi/ic_allapps_pressed.png
index 77b45ae..929a0e6 100644
--- a/res/drawable-xxhdpi/ic_allapps_pressed.png
+++ b/res/drawable-xxhdpi/ic_allapps_pressed.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_allapps_pressed_l.png b/res/drawable-xxhdpi/ic_allapps_pressed_l.png
deleted file mode 100644
index 929a0e6..0000000
--- a/res/drawable-xxhdpi/ic_allapps_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pageindicator_add.png b/res/drawable-xxhdpi/ic_pageindicator_add.png
index fd8a662..d78c95a 100644
--- a/res/drawable-xxhdpi/ic_pageindicator_add.png
+++ b/res/drawable-xxhdpi/ic_pageindicator_add.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pageindicator_current.png b/res/drawable-xxhdpi/ic_pageindicator_current.png
index 08615f3..2a5eff6 100644
--- a/res/drawable-xxhdpi/ic_pageindicator_current.png
+++ b/res/drawable-xxhdpi/ic_pageindicator_current.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_pageindicator_default.png b/res/drawable-xxhdpi/ic_pageindicator_default.png
index 9d4fbf8..969ae8c 100644
--- a/res/drawable-xxhdpi/ic_pageindicator_default.png
+++ b/res/drawable-xxhdpi/ic_pageindicator_default.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_setting.png b/res/drawable-xxhdpi/ic_setting.png
index b3729d3..01bdcd5 100644
--- a/res/drawable-xxhdpi/ic_setting.png
+++ b/res/drawable-xxhdpi/ic_setting.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_setting_l.png b/res/drawable-xxhdpi/ic_setting_l.png
deleted file mode 100644
index 01bdcd5..0000000
--- a/res/drawable-xxhdpi/ic_setting_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_setting_pressed.png b/res/drawable-xxhdpi/ic_setting_pressed.png
index 5c9c1be..d0cad5e 100644
--- a/res/drawable-xxhdpi/ic_setting_pressed.png
+++ b/res/drawable-xxhdpi/ic_setting_pressed.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_setting_pressed_l.png b/res/drawable-xxhdpi/ic_setting_pressed_l.png
deleted file mode 100644
index d0cad5e..0000000
--- a/res/drawable-xxhdpi/ic_setting_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_wallpaper.png b/res/drawable-xxhdpi/ic_wallpaper.png
index c718444..490c45a 100644
--- a/res/drawable-xxhdpi/ic_wallpaper.png
+++ b/res/drawable-xxhdpi/ic_wallpaper.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_wallpaper_l.png b/res/drawable-xxhdpi/ic_wallpaper_l.png
deleted file mode 100644
index 490c45a..0000000
--- a/res/drawable-xxhdpi/ic_wallpaper_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_wallpaper_pressed.png b/res/drawable-xxhdpi/ic_wallpaper_pressed.png
index 03324aa..e5d200b 100644
--- a/res/drawable-xxhdpi/ic_wallpaper_pressed.png
+++ b/res/drawable-xxhdpi/ic_wallpaper_pressed.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_wallpaper_pressed_l.png b/res/drawable-xxhdpi/ic_wallpaper_pressed_l.png
deleted file mode 100644
index e5d200b..0000000
--- a/res/drawable-xxhdpi/ic_wallpaper_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_widget.png b/res/drawable-xxhdpi/ic_widget.png
index fddfeca..d4b8324 100644
--- a/res/drawable-xxhdpi/ic_widget.png
+++ b/res/drawable-xxhdpi/ic_widget.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_widget_l.png b/res/drawable-xxhdpi/ic_widget_l.png
deleted file mode 100644
index d4b8324..0000000
--- a/res/drawable-xxhdpi/ic_widget_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_widget_pressed.png b/res/drawable-xxhdpi/ic_widget_pressed.png
index 3d3670e..b8dd35d 100644
--- a/res/drawable-xxhdpi/ic_widget_pressed.png
+++ b/res/drawable-xxhdpi/ic_widget_pressed.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_widget_pressed_l.png b/res/drawable-xxhdpi/ic_widget_pressed_l.png
deleted file mode 100644
index b8dd35d..0000000
--- a/res/drawable-xxhdpi/ic_widget_pressed_l.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/quantum_panel.9.png b/res/drawable-xxhdpi/quantum_panel.9.png
new file mode 100644
index 0000000..bc818b1
--- /dev/null
+++ b/res/drawable-xxhdpi/quantum_panel.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/screenpanel.9.png b/res/drawable-xxhdpi/screenpanel.9.png
index c44f3b8..7ed058e 100644
--- a/res/drawable-xxhdpi/screenpanel.9.png
+++ b/res/drawable-xxhdpi/screenpanel.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/screenpanel_hover.9.png b/res/drawable-xxhdpi/screenpanel_hover.9.png
index e8b36d8..24d2266 100644
--- a/res/drawable-xxhdpi/screenpanel_hover.9.png
+++ b/res/drawable-xxhdpi/screenpanel_hover.9.png
Binary files differ
diff --git a/res/drawable-xxhdpi/screenpanel_hover_l.9.png b/res/drawable-xxhdpi/screenpanel_hover_l.9.png
deleted file mode 100644
index 24d2266..0000000
--- a/res/drawable-xxhdpi/screenpanel_hover_l.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/screenpanel_l.9.png b/res/drawable-xxhdpi/screenpanel_l.9.png
deleted file mode 100644
index 7ed058e..0000000
--- a/res/drawable-xxhdpi/screenpanel_l.9.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxxhdpi/quantum_panel.9.png b/res/drawable-xxxhdpi/quantum_panel.9.png
new file mode 100644
index 0000000..a15aab4
--- /dev/null
+++ b/res/drawable-xxxhdpi/quantum_panel.9.png
Binary files differ
diff --git a/res/drawable/setting_button_l.xml b/res/drawable/setting_button_l.xml
deleted file mode 100644
index 01661db..0000000
--- a/res/drawable/setting_button_l.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_focused="true" android:drawable="@drawable/ic_setting_pressed_l" />
-    <item android:state_pressed="true" android:drawable="@drawable/ic_setting_pressed_l" />
-    <item android:drawable="@drawable/ic_setting_l" />
-</selector>
diff --git a/res/drawable/wallpaper_button_l.xml b/res/drawable/wallpaper_button_l.xml
deleted file mode 100644
index c539b61..0000000
--- a/res/drawable/wallpaper_button_l.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_focused="true" android:drawable="@drawable/ic_wallpaper_pressed_l" />
-    <item android:state_pressed="true" android:drawable="@drawable/ic_wallpaper_pressed_l" />
-    <item android:drawable="@drawable/ic_wallpaper_l" />
-</selector>
diff --git a/res/drawable/widget_button_l.xml b/res/drawable/widget_button_l.xml
deleted file mode 100644
index 92521b9..0000000
--- a/res/drawable/widget_button_l.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/ic_widget_pressed_l" />
-    <item android:state_pressed="true" android:drawable="@drawable/ic_widget_pressed_l" />
-    <item android:drawable="@drawable/ic_widget_l" />
-</selector>
diff --git a/res/layout/apps_customize_application.xml b/res/layout/apps_customize_application.xml
index 3b0fa6f..b48b9b7 100644
--- a/res/layout/apps_customize_application.xml
+++ b/res/layout/apps_customize_application.xml
@@ -19,10 +19,6 @@
     xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3"
 
     style="@style/WorkspaceIcon.AppsCustomize"
-
     android:id="@+id/application_icon"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    
     android:focusable="true"
     android:background="@drawable/focusable_view_bg" />
diff --git a/res/layout/apps_customize_pane.xml b/res/layout/apps_customize_pane.xml
index eae216e..19db373 100644
--- a/res/layout/apps_customize_pane.xml
+++ b/res/layout/apps_customize_pane.xml
@@ -52,28 +52,38 @@
             android:id="@android:id/tabcontent"
             android:layout_width="match_parent"
             android:layout_height="match_parent">
-            <com.android.launcher3.AppsCustomizePagedView
-                android:id="@+id/apps_customize_pane_content"
+
+            <LinearLayout
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
-                launcher:widgetCountX="@integer/apps_customize_widget_cell_count_x"
-                launcher:widgetCountY="@integer/apps_customize_widget_cell_count_y"
-                launcher:clingFocusedX="@integer/apps_customize_cling_focused_x"
-                launcher:clingFocusedY="@integer/apps_customize_cling_focused_y"
-                launcher:maxGap="@dimen/workspace_max_gap"
-                launcher:pageIndicator="@+id/apps_customize_page_indicator" />
+                android:orientation="vertical">
+
+                <com.android.launcher3.AppsCustomizePagedView
+                    android:id="@+id/apps_customize_pane_content"
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_weight="1"
+                    launcher:widgetCountX="@integer/apps_customize_widget_cell_count_x"
+                    launcher:widgetCountY="@integer/apps_customize_widget_cell_count_y"
+                    launcher:clingFocusedX="@integer/apps_customize_cling_focused_x"
+                    launcher:clingFocusedY="@integer/apps_customize_cling_focused_y"
+                    launcher:maxGap="@dimen/workspace_max_gap"
+                    launcher:pageIndicator="@+id/apps_customize_page_indicator" />
+
+                <include
+                    android:id="@+id/apps_customize_page_indicator"
+                    layout="@layout/page_indicator"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_gravity="center" />
+            </LinearLayout>
+
             <FrameLayout
                 android:id="@+id/animation_buffer"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent"
                 android:background="#FF000000"
                 android:visibility="gone" />
-            <include
-                android:id="@+id/apps_customize_page_indicator"
-                layout="@layout/page_indicator"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center_horizontal|bottom" />
         </FrameLayout>
     </LinearLayout>
 </com.android.launcher3.AppsCustomizeTabHost>
diff --git a/res/drawable/all_apps_button_icon_l.xml b/res/layout/folder_application.xml
similarity index 61%
rename from res/drawable/all_apps_button_icon_l.xml
rename to res/layout/folder_application.xml
index 91de1b5..37dd79d 100644
--- a/res/drawable/all_apps_button_icon_l.xml
+++ b/res/layout/folder_application.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 The Android Open Source Project
+<!-- Copyright (C) 2014 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -14,8 +14,7 @@
      limitations under the License.
 -->
 
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:state_focused="true" android:drawable="@drawable/ic_allapps_pressed_l" />
-    <item android:state_pressed="true" android:drawable="@drawable/ic_allapps_pressed_l" />
-    <item android:drawable="@drawable/ic_allapps_l" />
-</selector>
+<com.android.launcher3.BubbleTextView xmlns:android="http://schemas.android.com/apk/res/android"
+   style="@style/WorkspaceIcon.Folder"
+   android:focusable="true"
+   android:background="@drawable/focusable_view_bg" />
diff --git a/res/layout/user_folder.xml b/res/layout/user_folder.xml
index 5d5f33b..4e5303a 100644
--- a/res/layout/user_folder.xml
+++ b/res/layout/user_folder.xml
@@ -20,7 +20,7 @@
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:orientation="vertical"
-    android:background="@drawable/portal_container_holo">
+    android:background="@drawable/quantum_panel">
 
     <ScrollView
         android:id="@+id/scroll_view"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 3d337db..46b8457 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installeer tans…"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Onbekend"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Nie teruggestel nie"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Verwyder almal"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Verwyder"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Soek"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 489164c..9442602 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"በመጫን ላይ"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"የማይታወቅ"</string>
     <string name="package_state_error" msgid="7672093962724223588">"ወደነበረበት አልተመለሰም"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"ሁሉንም አስወግድ"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"አስወግድ"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"ፈልግ"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 90eae74..c77e47e 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"جارٍ التثبيت"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"غير معروفة"</string>
     <string name="package_state_error" msgid="7672093962724223588">"استعادة مخفقة"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"إزالة الكل"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"إزالة"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"بحث"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 198cd18..025408f 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Инсталира се"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Няма информация"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Не е възстановено"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Премахване на всички"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Премахване"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Търсене"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index c187094..f80d5b3 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Instal·lant"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconegut"</string>
     <string name="package_state_error" msgid="7672093962724223588">"No restaurat"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Suprimeix-ho tot"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Suprimeix"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Cerca"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 6870f89..dd8c8a8 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Instalace"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Neznámé"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Nebylo obnoveno"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Odstranit vše"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Odstranit"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Hledat"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 5d8b385..5fbc7cb 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installerer"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Ukendt"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Ikke gendannet"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Slet alle"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Fjern"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Søg"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 6b09789..ef629e1 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installation"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Unbekannt"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Nicht wiederhergestellt"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Alle entfernen"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Entfernen"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Suchen"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 66cea00..0768b88 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Εγκατάσταση"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Άγνωστο"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Δεν ανακτήθηκε"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Κατάργηση όλων"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Κατάργηση"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Αναζήτηση"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index eed1f80..c3e8346 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installing"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Unknown"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Not restored"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Remove All"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Remove"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Search"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"This app is not installed"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"The app for this icon isn\'t installed. You can remove it, or search for the app and install it manually."</string>
 </resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index eed1f80..c3e8346 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installing"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Unknown"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Not restored"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Remove All"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Remove"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Search"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"This app is not installed"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"The app for this icon isn\'t installed. You can remove it, or search for the app and install it manually."</string>
 </resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index b325c35..51b0993 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Instalando"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconocido"</string>
     <string name="package_state_error" msgid="7672093962724223588">"No restaurado"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Eliminar todo"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Eliminar"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Buscar"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 3efdf9b..b3a35e7 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Instalando"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconocido"</string>
     <string name="package_state_error" msgid="7672093962724223588">"No restaurado"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Eliminar todo"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Eliminar"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Buscar"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-et-rEE/strings.xml b/res/values-et-rEE/strings.xml
index 73e4779..c24f94b 100644
--- a/res/values-et-rEE/strings.xml
+++ b/res/values-et-rEE/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installimine"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Teadmata"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Ei taastatud"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Eemalda kõik"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Eemalda"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Otsing"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index d5e271b..4b65842 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"در حال نصب"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"نامشخص"</string>
     <string name="package_state_error" msgid="7672093962724223588">"بازیابی نشد"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"حذف همه"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"حذف"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"جستجو"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index c6ffdf6..9f197a5 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Asennetaan"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Tuntematon"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Ei palautettu"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Poista kaikki"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Poista"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Haku"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"Sovellusta ei ole asennettu"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Kuvakkeen sovellusta ei ole asennettu. Voit poistaa kuvakkeen tai etsiä sovelluksen ja asentaa sen manuaalisesti."</string>
 </resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 0c71823..d03525c 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installation…"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Inconnu"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Non restauré"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Tout supprimer"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Supprimer"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Rechercher"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 41ea546..3a32b57 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installation…"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Inconnu"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Non restauré"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Tout supprimer"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Supprimer"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Rechercher"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 9bbb5cb..f6c2ad8 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"इंस्टॉल हो रहा है"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"अज्ञात"</string>
     <string name="package_state_error" msgid="7672093962724223588">"पुन:स्थापित नहीं हुआ"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"सभी निकालें"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"निकालें"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"खोजें"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 8116ba4..3df11dc 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Instaliranje"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Nepoznato"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Nije vraćeno"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Ukloni sve"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Ukloni"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Traži"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 59fc6e1..d4d1fc6 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Települ"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Ismeretlen"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Nincs visszaállítva"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Az összes eltávolítása"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Eltávolítás"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Keresés"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-hy-rAM/strings.xml b/res/values-hy-rAM/strings.xml
index d02d48e..9fcb692 100644
--- a/res/values-hy-rAM/strings.xml
+++ b/res/values-hy-rAM/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Տեղադրվում է"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Անհայտ է"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Չի վերականգնվել"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Հեռացնել բոլորը"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Հեռացնել"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Գտնել"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"Այս ծրագիրը տեղադրված չէ:"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Այս պատկերակի ծրագիրը տեղադրված չէ: Դուք կարող եք հեռացնել այն, կամ կարող եք գտնել ծրագիրը և տեղադրել այն ձեռքով:"</string>
 </resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index ba85886..7994600 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Memasang"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Tidak dikenal"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Tak dipulihkan"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Buang Semua"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Buang"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Telusuri"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 0d3bcc4..d1b5030 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installazione..."</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Sconosciuto"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Non ripristinato"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Rimuovi tutto"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Rimuovi"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Cerca"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index cdfaf04..2ad8f1d 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"מתקין"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"לא ידוע"</string>
     <string name="package_state_error" msgid="7672093962724223588">"לא שוחזרה"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"הסר את הכל"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"הסר"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"חפש"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index e3ec47d..c8b8c0c 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"インストール中"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"不明"</string>
     <string name="package_state_error" msgid="7672093962724223588">"復元失敗"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"すべて削除"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"削除"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"検索"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-ka-rGE/strings.xml b/res/values-ka-rGE/strings.xml
index de701ca..a4450e1 100644
--- a/res/values-ka-rGE/strings.xml
+++ b/res/values-ka-rGE/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"ინსტალაცია..."</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"უცნობი"</string>
     <string name="package_state_error" msgid="7672093962724223588">"არ აღდგა"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"ყველას ამოშლა"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"ამოშლა"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"ძიება"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"ეს აპი დაყენებული არ არის"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ამ ხატულის აპი დაყენებული არ არის. შეგიძლიათ ამოშალოთ, ან მოიძიოთ აპი და ხელით მოახდინოთ მისი ინსტალაცია."</string>
 </resources>
diff --git a/res/values-km-rKH/strings.xml b/res/values-km-rKH/strings.xml
index 7e6b799..16491ef 100644
--- a/res/values-km-rKH/strings.xml
+++ b/res/values-km-rKH/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"ដំឡើង"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"មិន​ស្គាល់"</string>
     <string name="package_state_error" msgid="7672093962724223588">"មិនបាន​​ស្តា​រ"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"លុបចេញ​​​ទាំងអស់"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"លុបចេញ"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"ស្វែងរក"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"មិន​បាន​ដំឡើង​កម្មវិធី​នេះ"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"មិន​បាន​ដំឡើង​កម្មវិធី​សម្រាប់​រូបតំណាង​នេះ។ អ្នក​អាច​លុប​វា ឬ​ស្វែងរក​កម្មវិធី និង​ដំឡើង​វា​ដោយ​ដៃ។"</string>
 </resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index f8a06c7..4b99f57 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"설치 중"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"알 수 없음"</string>
     <string name="package_state_error" msgid="7672093962724223588">"복원되지 않음"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"모두 삭제"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"삭제"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"검색"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-lo-rLA/strings.xml b/res/values-lo-rLA/strings.xml
index a4fc842..159b090 100644
--- a/res/values-lo-rLA/strings.xml
+++ b/res/values-lo-rLA/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"​ກຳ​ລັງ​ຕິດ​ຕັ້ງ"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"​ບໍ່​ຮູ້​ຈັກ"</string>
     <string name="package_state_error" msgid="7672093962724223588">"ບໍ່​ໄດ້​ກູ້​ຂໍ້ມູນ​ມາ​ເທື່ອ"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"ລຶບ​ທັງ​ໝົດ"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"ລຶບ​"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"ຊອກຫາ"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"ແອັບຯ​ນີ້​ຍັງ​ບໍ່​ໄດ້​ຕິດ​ຕັ້ງ​ເທື່ອ"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"​ແອັບຯ​ສຳ​ລັບ​ໄອ​ຄອນ​ນີ້​ຍັງ​ບໍ່ໄດ້​ຕິດ​ຕັ້ງ​ເທື່ອ. ທ່ານ​ສາ​ມາດ​ລຶບ​ມັນ​ອອກ ຫຼື​ຊອກ​ຫາ​ແອັບຯ ແລ້ວ​ຕິດ​ຕັ້ງ​ມັນ​ໄດ້​ດ້ວຍ​ຕົນ​ເອງ."</string>
 </resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 471201d..d485c26 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Diegiama"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Nežinoma"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Neatkurta"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Pašalinti viską"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Pašalinti"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Ieškoti"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 6fb7d60..84e5cc9 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Instalē"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Nezināma"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Nav atjaunota"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Noņemt visas"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Noņemt"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Meklēt"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-mn-rMN/strings.xml b/res/values-mn-rMN/strings.xml
index a8ad568..6904f09 100644
--- a/res/values-mn-rMN/strings.xml
+++ b/res/values-mn-rMN/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Суулгаж байна"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Тодорхойгүй"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Сэргээгээгүй"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Бүгдийг устгах"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Устгах"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Хайх"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"Энэ апп-г суулгаагүй байна"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Энэ дүрсний апп-г суулгаагүй байна. Та үүнийг устгах буюу апп-г хайж суулгах боломжтой."</string>
 </resources>
diff --git a/res/values-ms-rMY/strings.xml b/res/values-ms-rMY/strings.xml
index 4c4b95f..2b5f179 100644
--- a/res/values-ms-rMY/strings.xml
+++ b/res/values-ms-rMY/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Memasang"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Tidak diketahui"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Tak dipulihkan"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Buang Semua"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Alih keluar"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Carian"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"Apl ini tidak dipasang"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Apl untuk ikon ini tidak dipasang. Anda boleh mengalih keluar atau mencari apl dan pasang secara manual."</string>
 </resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 34cc488..b7f67cf 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installerer …"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Ukjent"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Ikke gjenoppr."</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Fjern alle"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Fjern"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Søk"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 7bd3025..e75684a 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installeren"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Onbekend"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Niet hersteld"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Alles verwijderen"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Verwijderen"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Zoeken"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 07d7465..1ff76de 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Instalowanie"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Brak informacji"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Nie przywrócono"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Usuń wszystkie"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Usuń"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Szukaj"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 0717c52..54052ca 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"A instalar"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconhecido"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Não restaurado"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Remover todos"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Remover"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Pesquisar"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index e3f60ae..db2259c 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Instalando"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Desconhecido"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Não restaurado"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Remover tudo"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Remover"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Pesquisar"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"Este aplicativo não está instalado"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"O aplicativo deste ícone não está instalado. Você pode remover o ícone, ou procurar o aplicativo e instalá-lo manualmente."</string>
 </resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 48fa11e..5b65da9 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -112,4 +112,9 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Se instalează"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Necunoscut"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Nerestabilit"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Eliminați-le pe toate"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Eliminați"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Căutați"</string>
+    <string name="abandoned_promises_title" msgid="7096178467971716750">"Aplicația nu este instalată"</string>
+    <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Aplicația pentru această pictogramă nu este instalată. Puteți să ștergeți pictograma sau să căutați aplicația și s-o instalați manual."</string>
 </resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 8303350..5050b12 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Устанавливается"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Неизвестно"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Не восстановлен"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Удалить все"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Удалить"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Найти"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index b274926..6df1bcc 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Inštalácia"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Neznáme"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Nebolo obnovené"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Odstrániť všetky"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Odstrániť"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Vyhľadať"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 62d90bb..3a34422 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Nameščanje"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Neznano"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Ni obnovljen"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Odstrani vse"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Odstrani"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Iskanje"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 9b30913..6d1c5e1 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Инсталира се"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Непознато"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Није враћено"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Уклони све"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Уклони"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Претражи"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 0469a8a..db4ea78 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Installerar"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Okänt"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Inte återställt"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Ta bort alla"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Ta bort"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Sök"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 81126fd..ace8eff 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -114,4 +114,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Inasakinisha"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Yasiyojulikana"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Haijarejeshwa"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Ondoa Zote"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Ondoa"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Tafuta"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 1d69750..835c81f 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"กำลังติดตั้ง"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"ไม่รู้จัก"</string>
     <string name="package_state_error" msgid="7672093962724223588">"ไม่ได้คืนค่า"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"นำออกทั้งหมด"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"นำออก"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"ค้นหา"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index d30fb11..ed60478 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Nag-i-install"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Hindi kilala"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Hindi naibalik"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Alisin Lahat"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Alisin"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Maghanap"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index bdc97df..fe38be4 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Yükleniyor"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Bilinmiyor"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Geri yüklenmedi"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Tümünü Kaldır"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Kaldır"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Ara"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 94df4f3..8914d58 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Встановлення"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Невідомо"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Не відновлено"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Видалити всі"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Видалити"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Шукати"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 434b556..0fc8efe 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Đang cài đặt"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Không xác định"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Không được khôi phục"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Xóa tất cả"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Xóa"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Tìm kiếm"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index a771f47..513c555 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"正在安装"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"未知"</string>
     <string name="package_state_error" msgid="7672093962724223588">"无法还原"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"全部移除"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"移除"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"搜索"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index ed19b44..ab5eba0 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"安裝中"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"不明"</string>
     <string name="package_state_error" msgid="7672093962724223588">"無法還原"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"全部移除"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"移除"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"搜尋"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 2449f60..65147db 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"安裝中"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"不明"</string>
     <string name="package_state_error" msgid="7672093962724223588">"無法還原"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"全部移除"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"移除"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"搜尋"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 209816e..dd5e285 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -112,4 +112,11 @@
     <string name="package_state_installing" msgid="7588193972189849870">"Iyafaka"</string>
     <string name="package_state_unknown" msgid="7592128424511031410">"Akwaziwa"</string>
     <string name="package_state_error" msgid="7672093962724223588">"Ayibuyiselwe"</string>
+    <string name="abandoned_clean_all" msgid="5256770727689657618">"Susa konke"</string>
+    <string name="abandoned_clean_this" msgid="7610119707847920412">"Susa"</string>
+    <string name="abandoned_search" msgid="891119232568284442">"Sesha"</string>
+    <!-- no translation found for abandoned_promises_title (7096178467971716750) -->
+    <skip />
+    <!-- no translation found for abandoned_promise_explanation (3990027586878167529) -->
+    <skip />
 </resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 0006a74..f3bfcec 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -108,6 +108,12 @@
         <attr name="pageIndicator" format="reference" />
     </declare-styleable>
 
+    <declare-styleable name="BubbleTextView">
+        <!-- A spacing override for the icons within a page -->
+        <attr name="customShadows" format="boolean" />
+        <attr name="glowColor" format="color" />
+    </declare-styleable>
+
     <!-- AppsCustomizePagedView specific attributes.  These attributes are used to
          customize an AppsCustomizePagedView in xml files. -->
     <declare-styleable name="AppsCustomizePagedView">
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ffee05f..d1d33a0 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -31,8 +31,8 @@
     <color name="workspace_all_apps_and_delete_zone_text_shadow_color">#A0000000</color>
     <color name="workspace_icon_text_color">#FFF</color>
 
-    <color name="apps_customize_icon_text_color">#FFF</color>
-    <color name="folder_items_text_color">#FF333333</color>
+    <color name="quantum_panel_text_color">#FF666666</color>
+    <color name="quantum_panel_text_shadow_color">#FFC4C4C4</color>
     <color name="folder_items_glow_color">#FFCCCCCC</color>
     <color name="outline_color">#FFFFFFFF</color>
     
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 1eca5b3..8e561cf 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -18,8 +18,8 @@
 <!-- Dynamic Grid -->
     <dimen name="dynamic_grid_edge_margin">6dp</dimen>
     <dimen name="dynamic_grid_search_bar_max_width">500dp</dimen>
-    <dimen name="dynamic_grid_search_bar_height">48dp</dimen>
-    <dimen name="dynamic_grid_page_indicator_height">24dp</dimen>
+    <dimen name="dynamic_grid_search_bar_height">56dp</dimen>
+    <dimen name="dynamic_grid_page_indicator_height">20dp</dimen>
     <dimen name="dynamic_grid_icon_drawable_padding">4dp</dimen>
     <dimen name="dynamic_grid_all_apps_cell_padding">18dp</dimen>
     <dimen name="dynamic_grid_workspace_page_spacing">8dp</dimen>
@@ -62,6 +62,7 @@
     <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>
+    <dimen name="apps_customize_horizontal_padding">4dp</dimen>
 
     <!-- The AppsCustomize page indicator -->
     <dimen name="apps_customize_page_indicator_height">12dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ad3a1c4..3bf6c8d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -277,4 +277,18 @@
     <string name="package_state_unknown">Unknown</string>
     <!-- Label on an icon that references an uninstalled package, for which restore from market has failed. [CHAR_LIMIT=15] -->
     <string name="package_state_error">Not restored</string>
+
+    <!-- Button for abandoned promises dialog, that removes all abandoned promise icons. -->
+    <string name="abandoned_clean_all">Remove All</string>
+    <!-- Button for abandoned promises dialog, to removes this abandoned promise icon. -->
+    <string name="abandoned_clean_this">Remove</string>
+    <!-- Button for abandoned promise dialog, to search in the market for the missing package. -->
+    <string name="abandoned_search">Search</string>
+    <!-- Title for abandoned promise dialog. -->
+    <string name="abandoned_promises_title">This app is not installed</string>
+    <!-- Explanation for abandoned promise dialog. "The first 'it' refers to the shortcut icon.
+    The second "it" refers to the app. -->
+    <string name="abandoned_promise_explanation">The app for this icon isn\'t installed.
+        You can remove it, or search for the app and install it manually.
+    </string>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index c18dccb..462c292 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -86,11 +86,26 @@
 
     <style name="WorkspaceIcon.AppsCustomize">
         <item name="android:background">@null</item>
-        <item name="android:textColor">@color/apps_customize_icon_text_color</item>
+        <item name="android:textColor">@color/quantum_panel_text_color</item>
         <item name="android:drawablePadding">@dimen/dynamic_grid_icon_drawable_padding</item>
-        <item name="android:shadowRadius">4.0</item>
-        <item name="android:shadowColor">#FF000000</item>
+        <item name="android:shadowRadius">2.0</item>
+        <item name="android:shadowDx">0</item>
+        <item name="android:shadowDy">2</item>
+        <item name="android:shadowColor">#FFC4C4C4</item>
     </style>
+
+    <style name="WorkspaceIcon.Folder">
+        <item name="android:background">@null</item>
+        <item name="android:textColor">@color/quantum_panel_text_color</item>
+        <item name="android:shadowColor">@color/quantum_panel_text_shadow_color</item>
+        <item name="android:shadowRadius">2.0</item>
+        <item name="android:shadowDx">0</item>
+        <item name="android:shadowDy">2</item>
+
+        <item name="customShadows">false</item>
+        <item name="glowColor">@color/folder_items_glow_color</item>
+    </style>
+
     <style name="SearchDropTargetBar">
     </style>
     <style name="SearchButton">
diff --git a/src/com/android/launcher3/AppInfo.java b/src/com/android/launcher3/AppInfo.java
index c85626b..bfcad84 100644
--- a/src/com/android/launcher3/AppInfo.java
+++ b/src/com/android/launcher3/AppInfo.java
@@ -94,7 +94,7 @@
     }
 
     private static int initFlags(LauncherActivityInfoCompat info) {
-        int appFlags = info.getApplicationFlags();
+        int appFlags = info.getApplicationInfo().flags;
         int flags = 0;
         if ((appFlags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) {
             flags |= DOWNLOADED_FLAG;
diff --git a/src/com/android/launcher3/AppsCustomizePagedView.java b/src/com/android/launcher3/AppsCustomizePagedView.java
index 04426a8..2520b8a 100644
--- a/src/com/android/launcher3/AppsCustomizePagedView.java
+++ b/src/com/android/launcher3/AppsCustomizePagedView.java
@@ -1007,6 +1007,9 @@
         layout.setPadding(mAllAppsPadding.left, mAllAppsPadding.top, mAllAppsPadding.right,
                 mAllAppsPadding.bottom);
         setVisibilityOnChildren(layout, View.VISIBLE);
+
+        Resources res = getContext().getResources();
+        layout.setBackground(res.getDrawable(R.drawable.quantum_panel));
     }
 
     public void syncAppsPageItems(int page, boolean immediate) {
@@ -1437,6 +1440,11 @@
                     }
                 }
 
+                // TODO: clean this up
+                alpha = 1;
+                translationX = 0;
+                scale = 1;
+
                 v.setTranslationX(translationX);
                 v.setScaleX(scale);
                 v.setScaleY(scale);
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index 95300c1..54d7e50 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -17,7 +17,9 @@
 package com.android.launcher3;
 
 import android.content.Context;
+import android.content.res.ColorStateList;
 import android.content.res.Resources;
+import android.content.res.TypedArray;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Rect;
@@ -64,7 +66,7 @@
     private float mSlop;
 
     private int mTextColor;
-    private boolean mShadowsEnabled = true;
+    private boolean mCustomShadowsEnabled = true;
     private boolean mIsTextVisible;
 
     private boolean mBackgroundSizeChanged;
@@ -72,24 +74,28 @@
 
     private boolean mStayPressed;
     private CheckLongPressHelper mLongPressHelper;
-    private int mInstallState;
-
-    private int mState;
 
     private CharSequence mDefaultText = "";
 
     public BubbleTextView(Context context) {
-        super(context);
-        init();
+        this(context, null, 0);
     }
 
     public BubbleTextView(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        init();
+        this(context, attrs, 0);
     }
 
     public BubbleTextView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
+
+        Resources res = context.getResources();
+        TypedArray a = context.obtainStyledAttributes(attrs,
+                R.styleable.BubbleTextView, defStyle, 0);
+        setGlowColor(a.getColor(R.styleable.BubbleTextView_glowColor,
+                res.getColor(R.color.outline_color)));
+        mCustomShadowsEnabled = a.getBoolean(R.styleable.BubbleTextView_customShadows, true);
+        a.recycle();
+
         init();
     }
 
@@ -100,7 +106,6 @@
         LauncherAppState app = LauncherAppState.getInstance();
         DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
         setTextSize(TypedValue.COMPLEX_UNIT_PX, grid.iconTextSizePx);
-        setTextColor(getResources().getColor(R.color.workspace_icon_text_color));
     }
 
     private void init() {
@@ -108,12 +113,9 @@
         mBackground = getBackground();
 
         mOutlineHelper = HolographicOutlineHelper.obtain(getContext());
-
-        final Resources res = getContext().getResources();
-        mFocusedOutlineColor = mFocusedGlowColor = mPressedOutlineColor = mPressedGlowColor =
-            res.getColor(R.color.outline_color);
-
-        setShadowLayer(SHADOW_LARGE_RADIUS, 0.0f, SHADOW_Y_OFFSET, SHADOW_LARGE_COLOUR);
+        if (mCustomShadowsEnabled) {
+            setShadowLayer(SHADOW_LARGE_RADIUS, 0.0f, SHADOW_Y_OFFSET, SHADOW_LARGE_COLOUR);
+        }
     }
 
     public void applyFromShortcutInfo(ShortcutInfo info, IconCache iconCache) {
@@ -124,10 +126,12 @@
         Drawable iconDrawable = Utilities.createIconDrawable(b);
         setCompoundDrawables(null, iconDrawable, null, null);
         setCompoundDrawablePadding(grid.iconDrawablePaddingPx);
-        setText(info.title);
+        if (info.contentDescription != null) {
+            setContentDescription(info.contentDescription);
+        }
         setTag(info);
         if (info.isPromise()) {
-            setState(ShortcutInfo.PACKAGE_STATE_UNKNOWN); // TODO: persist this state somewhere
+            applyState();
         }
     }
 
@@ -150,6 +154,11 @@
             LauncherModel.checkItemInfo((ItemInfo) tag);
         }
         super.setTag(tag);
+        if (tag instanceof ShortcutInfo) {
+            final ShortcutInfo info = (ShortcutInfo) tag;
+            mDefaultText = info.title;
+            setText(mDefaultText);
+        }
     }
 
     @Override
@@ -317,7 +326,7 @@
 
     @Override
     public void draw(Canvas canvas) {
-        if (!mShadowsEnabled) {
+        if (!mCustomShadowsEnabled) {
             super.draw(canvas);
             return;
         }
@@ -379,10 +388,10 @@
         super.setTextColor(color);
     }
 
-    public void setShadowsEnabled(boolean enabled) {
-        mShadowsEnabled = enabled;
-        getPaint().clearShadowLayer();
-        invalidate();
+    @Override
+    public void setTextColor(ColorStateList colors) {
+        mTextColor = colors.getDefaultColor();
+        super.setTextColor(colors);
     }
 
     public void setTextVisibility(boolean visible) {
@@ -415,19 +424,12 @@
         mLongPressHelper.cancelLongPress();
     }
 
-    public void setState(int state) {
-        if (mState == ShortcutInfo.PACKAGE_STATE_DEFAULT && mState != state) {
-            mDefaultText = getText();
-        }
-        mState = state;
-        applyState();
-    }
-
-    private void applyState() {
+    public void applyState() {
         int alpha = getResources().getInteger(R.integer.promise_icon_alpha);
-        if (DEBUG) Log.d(TAG, "applying icon state: " + mState);
+        final int state = getState();
+        if (DEBUG) Log.d(TAG, "applying icon state: " + state);
 
-        switch(mState) {
+        switch(state) {
             case ShortcutInfo.PACKAGE_STATE_DEFAULT:
                 super.setText(mDefaultText);
                 alpha = 255;
@@ -462,4 +464,13 @@
             }
         }
     }
+
+    private int getState() {
+        if (! (getTag() instanceof ShortcutInfo)) {
+            return ShortcutInfo.PACKAGE_STATE_DEFAULT;
+        } else {
+            ShortcutInfo info = (ShortcutInfo) getTag();
+            return info.getState();
+        }
+    }
 }
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index a0c9c2e..8ca8d91 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -217,11 +217,6 @@
         mNormalBackground = res.getDrawable(R.drawable.screenpanel);
         mActiveGlowBackground = res.getDrawable(R.drawable.screenpanel_hover);
 
-        if (Utilities.isLmp()) {
-            mNormalBackground = res.getDrawable(R.drawable.screenpanel_l);
-            mActiveGlowBackground = res.getDrawable(R.drawable.screenpanel_hover_l);
-        }
-
         mOverScrollLeft = res.getDrawable(R.drawable.overscroll_glow_left);
         mOverScrollRight = res.getDrawable(R.drawable.overscroll_glow_right);
         mForegroundPadding =
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 8470b39..c0f5054 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -767,11 +767,10 @@
                     (allAppsIconSizePx / DynamicGrid.DEFAULT_ICON_SIZE_PX)));
             pageIndicator = host.findViewById(R.id.apps_customize_page_indicator);
             if (pageIndicator != null) {
-                lp = (FrameLayout.LayoutParams) pageIndicator.getLayoutParams();
-                lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
-                lp.width = LayoutParams.WRAP_CONTENT;
-                lp.height = pageIndicatorHeight;
-                pageIndicator.setLayoutParams(lp);
+                LinearLayout.LayoutParams lllp = (LinearLayout.LayoutParams) pageIndicator.getLayoutParams();
+                lllp.width = LayoutParams.WRAP_CONTENT;
+                lllp.height = pageIndicatorHeight;
+                pageIndicator.setLayoutParams(lllp);
             }
 
             AppsCustomizePagedView pagedView = (AppsCustomizePagedView)
@@ -796,6 +795,11 @@
                 padding.bottom = Math.max(0, pageIndicatorHeight - paddingTB);
                 pagedView.setAllAppsPadding(padding);
                 pagedView.setWidgetsPageIndicatorPadding(pageIndicatorHeight);
+
+                // Horizontal padding for the whole paged view
+                int pagedViewPadding =
+                        res.getDimensionPixelSize(R.dimen.apps_customize_horizontal_padding);
+                pagedView.setPadding(pagedViewPadding, 0, pagedViewPadding, 0);
             }
         }
 
diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java
index e900c2b..47c8a4a 100644
--- a/src/com/android/launcher3/Folder.java
+++ b/src/com/android/launcher3/Folder.java
@@ -566,16 +566,15 @@
     }
 
     protected View createAndAddShortcut(ShortcutInfo item) {
-        final BubbleTextView textView =
-            (BubbleTextView) mInflater.inflate(R.layout.application, this, false);
+        final TextView textView =
+            (TextView) mInflater.inflate(R.layout.folder_application, this, false);
         textView.setCompoundDrawables(null,
                 Utilities.createIconDrawable(item.getIcon(mIconCache)), null, null);
         textView.setText(item.title);
+        if (item.contentDescription != null) {
+            textView.setContentDescription(item.contentDescription);
+        }
         textView.setTag(item);
-        textView.setTextColor(getResources().getColor(R.color.folder_items_text_color));
-        textView.setShadowsEnabled(false);
-        textView.setGlowColor(getResources().getColor(R.color.folder_items_glow_color));
-
         textView.setOnClickListener(this);
         textView.setOnLongClickListener(this);
 
diff --git a/src/com/android/launcher3/FolderIcon.java b/src/com/android/launcher3/FolderIcon.java
index be6cf48..ab8976a 100644
--- a/src/com/android/launcher3/FolderIcon.java
+++ b/src/com/android/launcher3/FolderIcon.java
@@ -71,9 +71,7 @@
     private static final float OUTER_RING_GROWTH_FACTOR = 0.3f;
 
     // The amount of vertical spread between items in the stack [0...1]
-    private static final float PERSPECTIVE_SHIFT_FACTOR = 0.24f;
-
-    private static final float PERSPECTIVE_SHIFT_FACTOR_L = 0.18f;
+    private static final float PERSPECTIVE_SHIFT_FACTOR = 0.18f;
 
     // Flag as to whether or not to draw an outer ring. Currently none is designed.
     public static final boolean HAS_OUTER_RING = true;
@@ -503,16 +501,11 @@
             int adjustedAvailableSpace = (int) ((mAvailableSpaceInPreview / 2) * (1 + 0.8f));
 
             int unscaledHeight = (int) (mIntrinsicIconSize * (1 + PERSPECTIVE_SHIFT_FACTOR));
-            if (Utilities.isLmp()) {
-                unscaledHeight = (int) (mIntrinsicIconSize * (1 + PERSPECTIVE_SHIFT_FACTOR_L));
-            }
+
             mBaselineIconScale = (1.0f * adjustedAvailableSpace / unscaledHeight);
 
             mBaselineIconSize = (int) (mIntrinsicIconSize * mBaselineIconScale);
             mMaxPerspectiveShift = mBaselineIconSize * PERSPECTIVE_SHIFT_FACTOR;
-            if (Utilities.isLmp()) {
-                mMaxPerspectiveShift = mBaselineIconSize * PERSPECTIVE_SHIFT_FACTOR_L;
-            }
 
             mPreviewOffsetX = (mTotalWidth - mAvailableSpaceInPreview) / 2;
             mPreviewOffsetY = previewPadding + grid.folderBackgroundOffset;
@@ -563,14 +556,10 @@
         // We want to imagine our coordinates from the bottom left, growing up and to the
         // right. This is natural for the x-axis, but for the y-axis, we have to invert things.
         float transY = mAvailableSpaceInPreview - (offset + scaledSize + scaleOffsetCorrection) + getPaddingTop();
-        float transX = offset + scaleOffsetCorrection;
+        float transX = (mAvailableSpaceInPreview - scaledSize) / 2;
         float totalScale = mBaselineIconScale * scale;
         final int overlayAlpha = (int) (80 * (1 - r));
 
-        if (Utilities.isLmp()) {
-            transX = (mAvailableSpaceInPreview - scaledSize) / 2;
-        }
-
         if (params == null) {
             params = new PreviewItemDrawingParams(transX, transY, totalScale, overlayAlpha);
         } else {
diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java
index 4b25433..2d17123 100644
--- a/src/com/android/launcher3/Hotseat.java
+++ b/src/com/android/launcher3/Hotseat.java
@@ -151,10 +151,6 @@
                     inflater.inflate(R.layout.all_apps_button, mContent, false);
             Drawable d = context.getResources().getDrawable(R.drawable.all_apps_button_icon);
 
-            if (Utilities.isLmp()) {
-                d = context.getResources().getDrawable(R.drawable.all_apps_button_icon_l);
-            }
-
             Utilities.resizeIconDrawable(d);
             allAppsButton.setCompoundDrawables(null, d, null, null);
 
diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java
index be02d35..7d8628d 100644
--- a/src/com/android/launcher3/IconCache.java
+++ b/src/com/android/launcher3/IconCache.java
@@ -65,6 +65,7 @@
     private static class CacheEntry {
         public Bitmap icon;
         public String title;
+        public String contentDescription;
     }
 
     private static class CacheKey {
@@ -240,6 +241,7 @@
 
             application.title = entry.title;
             application.iconBitmap = entry.icon;
+            application.contentDescription = entry.contentDescription;
         }
     }
 
@@ -262,6 +264,7 @@
             CacheEntry entry = cacheLocked(component, launcherActInfo, null, user);
             if (title != null) {
                 entry.title = title;
+                entry.contentDescription = mUserManager.getBadgedLabelForUser(title, user);
             }
             return entry.icon;
         }
@@ -310,6 +313,7 @@
                     }
                 }
 
+                entry.contentDescription = mUserManager.getBadgedLabelForUser(entry.title, user);
                 entry.icon = Utilities.createIconBitmap(
                         info.getBadgedIcon(mIconDpi), mContext);
             } else {
diff --git a/src/com/android/launcher3/ItemInfo.java b/src/com/android/launcher3/ItemInfo.java
index 74f16e3..fe03017 100644
--- a/src/com/android/launcher3/ItemInfo.java
+++ b/src/com/android/launcher3/ItemInfo.java
@@ -108,6 +108,11 @@
     CharSequence title;
 
     /**
+     * Content description of the item.
+     */
+    String contentDescription;
+
+    /**
      * The position of the item in a drag-and-drop operation.
      */
     int[] dropPos = null;
@@ -115,6 +120,7 @@
     UserHandleCompat user;
 
     ItemInfo() {
+        user = UserHandleCompat.myUserHandle();
     }
 
     ItemInfo(ItemInfo info) {
@@ -127,6 +133,7 @@
         itemType = info.itemType;
         container = info.container;
         user = info.user;
+        contentDescription = info.contentDescription;
         // tempdebug:
         LauncherModel.checkItemInfo(this);
     }
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index f8c9f7b..a85b5b1 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -28,6 +28,7 @@
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.ActivityOptions;
+import android.app.AlertDialog;
 import android.app.SearchManager;
 import android.appwidget.AppWidgetHostView;
 import android.appwidget.AppWidgetManager;
@@ -38,6 +39,7 @@
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.SharedPreferences;
@@ -1283,10 +1285,6 @@
             }
         });
         widgetButton.setOnTouchListener(getHapticFeedbackTouchListener());
-        if (Utilities.isLmp()) {
-            ((TextView) widgetButton).setCompoundDrawablesWithIntrinsicBounds(0,
-                    R.drawable.widget_button_l, 0, 0);
-        }
 
         View wallpaperButton = findViewById(R.id.wallpaper_button);
         wallpaperButton.setOnClickListener(new OnClickListener() {
@@ -1299,11 +1297,6 @@
         });
         wallpaperButton.setOnTouchListener(getHapticFeedbackTouchListener());
 
-        if (Utilities.isLmp()) {
-            ((TextView) wallpaperButton).setCompoundDrawablesWithIntrinsicBounds(0,
-                    R.drawable.wallpaper_button_l, 0, 0);
-        }
-
         View settingsButton = findViewById(R.id.settings_button);
         if (hasSettings()) {
             settingsButton.setOnClickListener(new OnClickListener() {
@@ -1315,10 +1308,6 @@
                 }
             });
             settingsButton.setOnTouchListener(getHapticFeedbackTouchListener());
-            if (Utilities.isLmp()) {
-                ((TextView) settingsButton).setCompoundDrawablesWithIntrinsicBounds(0,
-                        R.drawable.setting_button_l, 0, 0);
-            }
         } else {
             settingsButton.setVisibility(View.GONE);
             FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) widgetButton.getLayoutParams();
@@ -2517,7 +2506,7 @@
      *
      * @param v The view that was clicked. Must be a tagged with a {@link ShortcutInfo}.
      */
-    protected void onClickAppShortcut(View v) {
+    protected void onClickAppShortcut(final View v) {
         if (LOGD) Log.d(TAG, "onClickAppShortcut");
         Object tag = v.getTag();
         if (!(tag instanceof ShortcutInfo)) {
@@ -2541,7 +2530,42 @@
             }
         }
 
+        // Check for abandoned promise
+        if (shortcut.isAbandoned() && v instanceof BubbleTextView) {
+            AlertDialog.Builder builder = new AlertDialog.Builder(this);
+            builder.setTitle(R.string.abandoned_promises_title);
+            builder.setMessage(R.string.abandoned_promise_explanation);
+            builder.setPositiveButton(R.string.abandoned_search,
+                    new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int id) {
+                            startAppShortcutActivity(v);
+                        }
+                    }
+            );
+            builder.setNeutralButton(R.string.abandoned_clean_this,
+                    new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int id) {
+                            final BubbleTextView bubble = (BubbleTextView) v;
+                            final UserHandleCompat user = UserHandleCompat.myUserHandle();
+                            mWorkspace.removeAbandonedPromise(bubble, user);
+                        }
+                    });
+            builder.create().show();
+            return;
+        }
+
         // Start activities
+        startAppShortcutActivity(v);
+    }
+
+    private void startAppShortcutActivity(View v) {
+        Object tag = v.getTag();
+        if (!(tag instanceof ShortcutInfo)) {
+            throw new IllegalArgumentException("Input must be a Shortcut");
+        }
+        final ShortcutInfo shortcut = (ShortcutInfo) tag;
+        final Intent intent = shortcut.intent;
+
         int[] pos = new int[2];
         v.getLocationOnScreen(pos);
         intent.setSourceBounds(new Rect(pos[0], pos[1],
@@ -2744,8 +2768,8 @@
                 // Could be launching some bookkeeping activity
                 startActivity(intent, optsBundle);
             } else {
-                launcherApps.startActivityForProfile(intent.getComponent(),
-                        intent.getSourceBounds(), optsBundle, user);
+                launcherApps.startActivityForProfile(intent.getComponent(), user,
+                        intent.getSourceBounds(), optsBundle);
             }
             return true;
         } catch (SecurityException e) {
@@ -4680,7 +4704,9 @@
 
     public ItemInfo createShortcutDragInfo(Intent shortcutIntent, CharSequence caption,
             Bitmap icon, UserHandleCompat user) {
-        return new ShortcutInfo(shortcutIntent, caption, icon, user);
+        UserManagerCompat userManager = UserManagerCompat.getInstance(this);
+        String contentDescription = userManager.getBadgedLabelForUser(caption.toString(), user);
+        return new ShortcutInfo(shortcutIntent, caption, contentDescription, icon, user);
     }
 
     protected void moveWorkspaceToDefaultScreen() {
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index 79bc084..27bcd81 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -95,7 +95,7 @@
         mBuildInfo = BuildInfo.loadByName(sContext.getString(R.string.build_info_class));
         mModel = new LauncherModel(this, mIconCache, mAppFilter);
         final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(sContext);
-        launcherApps.addOnAppsChangedListener(mModel);
+        launcherApps.addOnAppsChangedCallback(mModel);
 
         // Register intent receivers
         IntentFilter filter = new IntentFilter();
@@ -128,7 +128,7 @@
     public void onTerminate() {
         sContext.unregisterReceiver(mModel);
         final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(sContext);
-        launcherApps.removeOnAppsChangedListener(mModel);
+        launcherApps.removeOnAppsChangedCallback(mModel);
 
         ContentResolver resolver = sContext.getContentResolver();
         resolver.unregisterContentObserver(mFavoritesObserver);
diff --git a/src/com/android/launcher3/LauncherBackupAgentHelper.java b/src/com/android/launcher3/LauncherBackupAgentHelper.java
index de6aedd..7dd8cde 100644
--- a/src/com/android/launcher3/LauncherBackupAgentHelper.java
+++ b/src/com/android/launcher3/LauncherBackupAgentHelper.java
@@ -61,7 +61,7 @@
     @Override
     public void onCreate() {
         boolean restoreEnabled = 0 != Settings.Secure.getInt(
-                getContentResolver(), SETTING_RESTORE_ENABLED, 0);
+                getContentResolver(), SETTING_RESTORE_ENABLED, 1);
         if (VERBOSE) Log.v(TAG, "restore is " + (restoreEnabled ? "enabled" : "disabled"));
 
         addHelper(LauncherBackupHelper.LAUNCHER_PREFS_PREFIX,
diff --git a/src/com/android/launcher3/LauncherClings.java b/src/com/android/launcher3/LauncherClings.java
index 1176aa5..00586bd 100644
--- a/src/com/android/launcher3/LauncherClings.java
+++ b/src/com/android/launcher3/LauncherClings.java
@@ -29,6 +29,7 @@
 import android.graphics.Rect;
 import android.os.Bundle;
 import android.os.UserManager;
+import android.provider.Settings;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -48,6 +49,9 @@
     private static final int SHOW_CLING_DURATION = 250;
     private static final int DISMISS_CLING_DURATION = 200;
 
+    // New Secure Setting in L
+    private static final String SKIP_FIRST_USE_HINTS = "skip_first_use_hints";
+
     private Launcher mLauncher;
     private LayoutInflater mInflater;
     private HideFromAccessibilityHelper mHideFromAccessibilityHelper
@@ -107,6 +111,10 @@
                 return false;
             }
         }
+        if (Settings.Secure.getInt(mLauncher.getContentResolver(), SKIP_FIRST_USE_HINTS, 0)
+                == 1) {
+            return false;
+        }
         return true;
     }
 
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 141368c..29cfbb2 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -73,7 +73,7 @@
  * for the Launcher.
  */
 public class LauncherModel extends BroadcastReceiver
-        implements LauncherAppsCompat.OnAppsChangedListenerCompat {
+        implements LauncherAppsCompat.OnAppsChangedCallbackCompat {
     static final boolean DEBUG_LOADERS = false;
     private static final boolean DEBUG_RECEIVER = true;  // STOPSHIP(cwren) temporary for debugging
 
@@ -842,9 +842,26 @@
      */
     static boolean shortcutExists(Context context, String title, Intent intent) {
         final ContentResolver cr = context.getContentResolver();
+        final Intent intentWithPkg, intentWithoutPkg;
+
+        if (intent.getComponent() != null) {
+            // If component is not null, an intent with null package will produce
+            // the same result and should also be a match.
+            if (intent.getPackage() != null) {
+                intentWithPkg = intent;
+                intentWithoutPkg = new Intent(intent).setPackage(null);
+            } else {
+                intentWithPkg = new Intent(intent).setPackage(
+                        intent.getComponent().getPackageName());
+                intentWithoutPkg = intent;
+            }
+        } else {
+            intentWithPkg = intent;
+            intentWithoutPkg = intent;
+        }
         Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI,
-            new String[] { "title", "intent" }, "title=? and intent=?",
-            new String[] { title, intent.toUri(0) }, null);
+            new String[] { "title", "intent" }, "title=? and (intent=? or intent=?)",
+            new String[] { title, intentWithPkg.toUri(0), intentWithoutPkg.toUri(0) }, null);
         boolean result = false;
         try {
             result = c.moveToFirst();
@@ -1186,28 +1203,28 @@
     }
 
     @Override
-    public void onPackageChanged(UserHandleCompat user, String packageName) {
+    public void onPackageChanged(String packageName, UserHandleCompat user) {
         int op = PackageUpdatedTask.OP_UPDATE;
         enqueuePackageUpdated(new PackageUpdatedTask(op, new String[] { packageName },
                 user));
     }
 
     @Override
-    public void onPackageRemoved(UserHandleCompat user, String packageName) {
+    public void onPackageRemoved(String packageName, UserHandleCompat user) {
         int op = PackageUpdatedTask.OP_REMOVE;
         enqueuePackageUpdated(new PackageUpdatedTask(op, new String[] { packageName },
                 user));
     }
 
     @Override
-    public void onPackageAdded(UserHandleCompat user, String packageName) {
+    public void onPackageAdded(String packageName, UserHandleCompat user) {
         int op = PackageUpdatedTask.OP_ADD;
         enqueuePackageUpdated(new PackageUpdatedTask(op, new String[] { packageName },
                 user));
     }
 
     @Override
-    public void onPackagesAvailable(UserHandleCompat user, String[] packageNames,
+    public void onPackagesAvailable(String[] packageNames, UserHandleCompat user,
             boolean replacing) {
         if (!replacing) {
             enqueuePackageUpdated(new PackageUpdatedTask(PackageUpdatedTask.OP_ADD, packageNames,
@@ -1226,7 +1243,7 @@
     }
 
     @Override
-    public void onPackagesUnavailable(UserHandleCompat user, String[] packageNames,
+    public void onPackagesUnavailable(String[] packageNames, UserHandleCompat user,
             boolean replacing) {
         if (!replacing) {
             enqueuePackageUpdated(new PackageUpdatedTask(
@@ -2820,6 +2837,7 @@
                         if (isShortcutInfoUpdateable(i)) {
                             ShortcutInfo info = (ShortcutInfo) i;
                             info.title = a.title.toString();
+                            info.contentDescription = a.contentDescription;
                             updateItemInDatabase(context, info);
                         }
                     }
@@ -2955,9 +2973,12 @@
             info.title = "";
         }
         info.user = UserHandleCompat.myUserHandle();
+        info.contentDescription = mUserManager.getBadgedLabelForUser(
+                info.title.toString(), info.user);
         info.setIcon(mIconCache.getIcon(intent, info.title.toString(), info.user));
         info.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
         info.restoredIntent = intent;
+        info.setState(ShortcutInfo.PACKAGE_STATE_UNKNOWN);
         return info;
     }
 
@@ -3061,6 +3082,8 @@
         }
         info.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
         info.user = user;
+        info.contentDescription = mUserManager.getBadgedLabelForUser(
+                info.title.toString(), info.user);
         return info;
     }
 
@@ -3071,6 +3094,9 @@
             if (i instanceof ShortcutInfo) {
                 ShortcutInfo info = (ShortcutInfo) i;
                 ComponentName cn = info.intent.getComponent();
+                if (info.restoredIntent != null) {
+                    cn = info.restoredIntent.getComponent();
+                }
                 if (cn != null && f.filterItem(null, info, cn)) {
                     filtered.add(info);
                 }
@@ -3078,6 +3104,9 @@
                 FolderInfo info = (FolderInfo) i;
                 for (ShortcutInfo s : info.contents) {
                     ComponentName cn = s.intent.getComponent();
+                    if (s.restoredIntent != null) {
+                        cn = s.restoredIntent.getComponent();
+                    }
                     if (cn != null && f.filterItem(info, s, cn)) {
                         filtered.add(s);
                     }
@@ -3336,6 +3365,8 @@
         info.setIcon(icon);
 
         info.title = name;
+        info.contentDescription = mUserManager.getBadgedLabelForUser(
+                info.title.toString(), info.user);
         info.intent = intent;
         info.customIcon = customIcon;
         info.iconResource = iconResource;
diff --git a/src/com/android/launcher3/PagedViewIcon.java b/src/com/android/launcher3/PagedViewIcon.java
index f7cb997..e819d5e 100644
--- a/src/com/android/launcher3/PagedViewIcon.java
+++ b/src/com/android/launcher3/PagedViewIcon.java
@@ -77,6 +77,9 @@
         setCompoundDrawables(null, icon, null, null);
         setCompoundDrawablePadding(grid.iconDrawablePaddingPx);
         setText(info.title);
+        if (info.contentDescription != null) {
+            setContentDescription(info.contentDescription);
+        }
         setTag(info);
     }
 
@@ -108,27 +111,4 @@
             setAlpha(1f);
         }
     }
-
-    @Override
-    public void draw(Canvas canvas) {
-        // 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(BubbleTextView.SHADOW_LARGE_RADIUS, 0.0f,
-                BubbleTextView.SHADOW_Y_OFFSET, BubbleTextView.SHADOW_LARGE_COLOUR);
-        super.draw(canvas);
-        canvas.save(Canvas.CLIP_SAVE_FLAG);
-        canvas.clipRect(getScrollX(), getScrollY() + getExtendedPaddingTop(),
-                getScrollX() + getWidth(),
-                getScrollY() + getHeight(), Region.Op.INTERSECT);
-        getPaint().setShadowLayer(BubbleTextView.SHADOW_SMALL_RADIUS, 0.0f, 0.0f,
-                BubbleTextView.SHADOW_SMALL_COLOUR);
-        super.draw(canvas);
-        canvas.restore();
-    }
 }
diff --git a/src/com/android/launcher3/ShortcutInfo.java b/src/com/android/launcher3/ShortcutInfo.java
index f40cf9f..d2573a4 100644
--- a/src/com/android/launcher3/ShortcutInfo.java
+++ b/src/com/android/launcher3/ShortcutInfo.java
@@ -36,22 +36,22 @@
  */
 public class ShortcutInfo extends ItemInfo {
 
-    /** This package is not installed, and there is no other information available. */
+    /** {@link #mState} meaning this package is not installed, and there is no other information. */
     public static final int PACKAGE_STATE_UNKNOWN = -2;
 
-    /** This package is not installed, because installation failed. */
+    /** {@link #mState} meaning this package is not installed, because installation failed. */
     public static final int PACKAGE_STATE_ERROR = -1;
 
-    /** This package is installed.  This is the typical case */
+    /** {@link #mState} meaning this package is installed.  This is the typical case. */
     public static final int PACKAGE_STATE_DEFAULT = 0;
 
-    /** This package is not installed, but some external entity has promised to install it. */
+    /** {@link #mState} meaning some external entity has promised to install this package. */
     public static final int PACKAGE_STATE_ENQUEUED = 1;
 
-    /** This package is not installed, but some external entity is downloading it. */
+    /** {@link #mState} meaning but some external entity is downloading this package. */
     public static final int PACKAGE_STATE_DOWNLOADING = 2;
 
-    /** This package is not installed, but some external entity is installing it. */
+    /** {@link #mState} meaning some external entity is installing this package. */
     public static final int PACKAGE_STATE_INSTALLING = 3;
 
     /**
@@ -82,6 +82,11 @@
      */
     private Bitmap mIcon;
 
+    /**
+     * The installation state of the package that this shortcut represents.
+     */
+    protected int mState;
+
     long firstInstallTime;
     int flags = 0;
 
@@ -110,13 +115,16 @@
         if (restoredIntent != null) {
             intent = restoredIntent;
             restoredIntent = null;
+            mState = PACKAGE_STATE_DEFAULT;
         }
     }
 
-    ShortcutInfo(Intent intent, CharSequence title, Bitmap icon, UserHandleCompat user) {
+    ShortcutInfo(Intent intent, CharSequence title, String contentDescrition,
+            Bitmap icon, UserHandleCompat user) {
         this();
         this.intent = intent;
         this.title = title;
+        this.contentDescription = contentDescription;
         mIcon = icon;
         this.user = user;
     }
@@ -218,5 +226,19 @@
                 && pkgName != null
                 && pkgName.equals(restoredIntent.getComponent().getPackageName());
     }
+
+    public boolean isAbandoned() {
+        return isPromise()
+                && (mState == ShortcutInfo.PACKAGE_STATE_ERROR
+                        || mState == ShortcutInfo.PACKAGE_STATE_UNKNOWN);
+    }
+
+    public int getState() {
+        return mState;
+    }
+
+    public void setState(int state) {
+        mState = state;
+    }
 }
 
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 6afea82..48795af 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -98,8 +98,8 @@
 
     private static final float ALPHA_CUTOFF_THRESHOLD = 0.01f;
 
-    private static final boolean MAP_NO_RECURSE = false;
-    private static final boolean MAP_RECURSE = true;
+    static final boolean MAP_NO_RECURSE = false;
+    static final boolean MAP_RECURSE = true;
 
     // These animators are used to fade the children's outlines
     private ObjectAnimator mChildrenOutlineFadeInAnimation;
@@ -4781,6 +4781,7 @@
                 shortcutInfo.restore();
                 shortcutInfo.updateIcon(mIconCache);
                 shortcutInfo.title = appInfo.title.toString();
+                shortcutInfo.contentDescription = appInfo.contentDescription;
                 shortcut.applyFromShortcutInfo(shortcutInfo, mIconCache);
             }
         }
@@ -4857,6 +4858,18 @@
         });
     }
 
+    public void removeAbandonedPromise(BubbleTextView abandonedIcon, UserHandleCompat user) {
+        if (abandonedIcon.getTag() != null && abandonedIcon.getTag() instanceof ShortcutInfo) {
+            final ShortcutInfo shortcut = (ShortcutInfo) abandonedIcon.getTag();
+            if (shortcut.isAbandoned()) {
+                HashSet<ComponentName> cns = new HashSet<ComponentName>(1);
+                cns.add(shortcut.getRestoredIntent().getComponent());
+                LauncherModel.deleteItemFromDatabase(mLauncher, shortcut);
+                removeItemsByComponentName(cns, user);
+            }
+        }
+    }
+
     public void updatePackageState(final String pkgName, final int state) {
         mapOverShortcuts(MAP_RECURSE, new ShortcutOperator() {
             @Override
@@ -4864,7 +4877,8 @@
                 if (info instanceof ShortcutInfo
                         && ((ShortcutInfo) info).isPromiseFor(pkgName)
                         && v instanceof BubbleTextView) {
-                    ((BubbleTextView)v).setState(state);
+                    ((ShortcutInfo) info).setState(state);
+                    ((BubbleTextView)v).applyState();
                 }
                 // process all the shortcuts
                 return false;
diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java
index 3ba93ea..90a4d1a 100644
--- a/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java
+++ b/src/com/android/launcher3/compat/LauncherActivityInfoCompat.java
@@ -17,6 +17,7 @@
 package com.android.launcher3.compat;
 
 import android.content.ComponentName;
+import android.content.pm.ApplicationInfo;
 import android.graphics.drawable.Drawable;
 
 public abstract class LauncherActivityInfoCompat {
@@ -28,7 +29,7 @@
     public abstract UserHandleCompat getUser();
     public abstract CharSequence getLabel();
     public abstract Drawable getIcon(int density);
-    public abstract int getApplicationFlags();
+    public abstract ApplicationInfo getApplicationInfo();
     public abstract long getFirstInstallTime();
     public abstract Drawable getBadgedIcon(int density);
 }
diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java
index 052d434..1d41a6f 100644
--- a/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java
+++ b/src/com/android/launcher3/compat/LauncherActivityInfoCompatV16.java
@@ -18,6 +18,7 @@
 
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
@@ -75,8 +76,8 @@
         return d;
     }
 
-    public int getApplicationFlags() {
-        return mActivityInfo.applicationInfo.flags;
+    public ApplicationInfo getApplicationInfo() {
+        return mActivityInfo.applicationInfo;
     }
 
     public long getFirstInstallTime() {
diff --git a/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java b/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java
index 76125bd..b52cf1d 100644
--- a/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java
+++ b/src/com/android/launcher3/compat/LauncherActivityInfoCompatVL.java
@@ -17,66 +17,44 @@
 package com.android.launcher3.compat;
 
 import android.content.ComponentName;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.LauncherActivityInfo;
 import android.graphics.drawable.Drawable;
 import android.os.UserHandle;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
 public class LauncherActivityInfoCompatVL extends LauncherActivityInfoCompat {
-    private Object mLauncherActivityInfo;
-    private Class mLauncherActivityInfoClass;
-    private Method mGetComponentName;
-    private Method mGetUser;
-    private Method mGetLabel;
-    private Method mGetIcon;
-    private Method mGetApplicationFlags;
-    private Method mGetFirstInstallTime;
-    private Method mGetBadgedIcon;
+    private LauncherActivityInfo mLauncherActivityInfo;
 
-    LauncherActivityInfoCompatVL(Object launcherActivityInfo) {
+    LauncherActivityInfoCompatVL(LauncherActivityInfo launcherActivityInfo) {
         super();
         mLauncherActivityInfo = launcherActivityInfo;
-        mLauncherActivityInfoClass = ReflectUtils.getClassForName(
-                "android.content.pm.LauncherActivityInfo");
-        mGetComponentName = ReflectUtils.getMethod(mLauncherActivityInfoClass, "getComponentName");
-        mGetUser = ReflectUtils.getMethod(mLauncherActivityInfoClass, "getUser");
-        mGetLabel = ReflectUtils.getMethod(mLauncherActivityInfoClass, "getLabel");
-        mGetIcon = ReflectUtils.getMethod(mLauncherActivityInfoClass, "getIcon", int.class);
-        mGetApplicationFlags = ReflectUtils.getMethod(mLauncherActivityInfoClass,
-                "getApplicationFlags");
-        mGetFirstInstallTime = ReflectUtils.getMethod(mLauncherActivityInfoClass,
-                "getFirstInstallTime");
-        mGetBadgedIcon = ReflectUtils.getMethod(mLauncherActivityInfoClass, "getBadgedIcon",
-                int.class);
     }
 
     public ComponentName getComponentName() {
-        return (ComponentName) ReflectUtils.invokeMethod(mLauncherActivityInfo, mGetComponentName);
+        return mLauncherActivityInfo.getComponentName();
     }
 
     public UserHandleCompat getUser() {
-        return UserHandleCompat.fromUser((UserHandle) ReflectUtils.invokeMethod(
-                        mLauncherActivityInfo, mGetUser));
+        return UserHandleCompat.fromUser(mLauncherActivityInfo.getUser());
     }
 
     public CharSequence getLabel() {
-        return (CharSequence) ReflectUtils.invokeMethod(mLauncherActivityInfo, mGetLabel);
+        return mLauncherActivityInfo.getLabel();
     }
 
     public Drawable getIcon(int density) {
-        return (Drawable) ReflectUtils.invokeMethod(mLauncherActivityInfo, mGetIcon, density);
+        return mLauncherActivityInfo.getIcon(density);
     }
 
-    public int getApplicationFlags() {
-        return (Integer) ReflectUtils.invokeMethod(mLauncherActivityInfo, mGetApplicationFlags);
+    public ApplicationInfo getApplicationInfo() {
+        return mLauncherActivityInfo.getApplicationInfo();
     }
 
     public long getFirstInstallTime() {
-        return (Long) ReflectUtils.invokeMethod(mLauncherActivityInfo, mGetFirstInstallTime);
+        return mLauncherActivityInfo.getFirstInstallTime();
     }
 
     public Drawable getBadgedIcon(int density) {
-        return (Drawable) ReflectUtils.invokeMethod(mLauncherActivityInfo, mGetBadgedIcon, density);
+        return mLauncherActivityInfo.getBadgedIcon(density);
     }
 }
diff --git a/src/com/android/launcher3/compat/LauncherAppsCompat.java b/src/com/android/launcher3/compat/LauncherAppsCompat.java
index 069e3de..8d978d4 100644
--- a/src/com/android/launcher3/compat/LauncherAppsCompat.java
+++ b/src/com/android/launcher3/compat/LauncherAppsCompat.java
@@ -39,40 +39,42 @@
     public static final String ACTION_MANAGED_PROFILE_REMOVED =
             "android.intent.action.MANAGED_PROFILE_REMOVED";
 
-    public interface OnAppsChangedListenerCompat {
-        void onPackageRemoved(UserHandleCompat user, String packageName);
-        void onPackageAdded(UserHandleCompat user, String packageName);
-        void onPackageChanged(UserHandleCompat user, String packageName);
-        void onPackagesAvailable(UserHandleCompat user, String[] packageNames, boolean replacing);
-        void onPackagesUnavailable(UserHandleCompat user, String[] packageNames, boolean replacing);
+    public interface OnAppsChangedCallbackCompat {
+        void onPackageRemoved(String packageName, UserHandleCompat user);
+        void onPackageAdded(String packageName, UserHandleCompat user);
+        void onPackageChanged(String packageName, UserHandleCompat user);
+        void onPackagesAvailable(String[] packageNames, UserHandleCompat user, boolean replacing);
+        void onPackagesUnavailable(String[] packageNames, UserHandleCompat user, boolean replacing);
     }
 
     protected LauncherAppsCompat() {
     }
 
+    private static LauncherAppsCompat sInstance;
+    private static Object sInstanceLock = new Object();
+
     public static LauncherAppsCompat getInstance(Context context) {
-        // TODO change this to use api version once L gets an API number.
-        if ("L".equals(Build.VERSION.CODENAME)) {
-            Object launcherApps = context.getSystemService("launcherapps");
-            if (launcherApps != null) {
-                LauncherAppsCompatVL compat = LauncherAppsCompatVL.build(context, launcherApps);
-                if (compat != null) {
-                    return compat;
+        synchronized (sInstanceLock) {
+            // TODO change this to use api version once L gets an API number.
+            if (sInstance == null) {
+                if ("L".equals(Build.VERSION.CODENAME)) {
+                    sInstance = new LauncherAppsCompatVL(context);
+                } else {
+                    sInstance = new LauncherAppsCompatV16(context);
                 }
             }
+            return sInstance;
         }
-        // Pre L or lunacher apps service not running, or reflection failed to find something.
-        return new LauncherAppsCompatV16(context);
     }
 
     public abstract List<LauncherActivityInfoCompat> getActivityList(String packageName,
             UserHandleCompat user);
     public abstract LauncherActivityInfoCompat resolveActivity(Intent intent,
             UserHandleCompat user);
-    public abstract void startActivityForProfile(ComponentName component, Rect sourceBounds,
-            Bundle opts, UserHandleCompat user);
-    public abstract void addOnAppsChangedListener(OnAppsChangedListenerCompat listener);
-    public abstract void removeOnAppsChangedListener(OnAppsChangedListenerCompat listener);
+    public abstract void startActivityForProfile(ComponentName component, UserHandleCompat user,
+            Rect sourceBounds, Bundle opts);
+    public abstract void addOnAppsChangedCallback(OnAppsChangedCallbackCompat listener);
+    public abstract void removeOnAppsChangedCallback(OnAppsChangedCallbackCompat listener);
     public abstract boolean isPackageEnabledForProfile(String packageName, UserHandleCompat user);
     public abstract boolean isActivityEnabledForProfile(ComponentName component,
             UserHandleCompat user);
diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java b/src/com/android/launcher3/compat/LauncherAppsCompatV16.java
index c739eb9..de9f3a0 100644
--- a/src/com/android/launcher3/compat/LauncherAppsCompatV16.java
+++ b/src/com/android/launcher3/compat/LauncherAppsCompatV16.java
@@ -39,8 +39,8 @@
 
     private PackageManager mPm;
     private Context mContext;
-    private List<OnAppsChangedListenerCompat> mListeners
-            = new ArrayList<OnAppsChangedListenerCompat>();
+    private List<OnAppsChangedCallbackCompat> mCallbacks
+            = new ArrayList<OnAppsChangedCallbackCompat>();
     private PackageMonitor mPackageMonitor;
 
     LauncherAppsCompatV16(Context context) {
@@ -71,8 +71,8 @@
         return null;
     }
 
-    public void startActivityForProfile(ComponentName component, Rect sourceBounds,
-            Bundle opts, UserHandleCompat user) {
+    public void startActivityForProfile(ComponentName component, UserHandleCompat user,
+            Rect sourceBounds, Bundle opts) {
         Intent launchIntent = new Intent(Intent.ACTION_MAIN);
         launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
         launchIntent.setComponent(component);
@@ -81,18 +81,18 @@
         mContext.startActivity(launchIntent, opts);
     }
 
-    public synchronized void addOnAppsChangedListener(OnAppsChangedListenerCompat listener) {
-        if (listener != null && !mListeners.contains(listener)) {
-            mListeners.add(listener);
-            if (mListeners.size() == 1) {
+    public synchronized void addOnAppsChangedCallback(OnAppsChangedCallbackCompat callback) {
+        if (callback != null && !mCallbacks.contains(callback)) {
+            mCallbacks.add(callback);
+            if (mCallbacks.size() == 1) {
                 registerForPackageIntents();
             }
         }
     }
 
-    public synchronized void removeOnAppsChangedListener(OnAppsChangedListenerCompat listener) {
-        mListeners.remove(listener);
-        if (mListeners.size() == 0) {
+    public synchronized void removeOnAppsChangedCallback(OnAppsChangedCallbackCompat callback) {
+        mCallbacks.remove(callback);
+        if (mCallbacks.size() == 0) {
             unregisterForPackageIntents();
         }
     }
@@ -131,8 +131,8 @@
         mContext.registerReceiver(mPackageMonitor, filter);
     }
 
-    private synchronized List<OnAppsChangedListenerCompat> getListeners() {
-        return new ArrayList<OnAppsChangedListenerCompat>(mListeners);
+    private synchronized List<OnAppsChangedCallbackCompat> getCallbacks() {
+        return new ArrayList<OnAppsChangedCallbackCompat>(mCallbacks);
     }
 
     private class PackageMonitor extends BroadcastReceiver {
@@ -151,39 +151,44 @@
                     return;
                 }
                 if (Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
-                    for (OnAppsChangedListenerCompat listener : getListeners()) {
-                        listener.onPackageChanged(user, packageName);
+                    for (OnAppsChangedCallbackCompat callback : getCallbacks()) {
+                        callback.onPackageChanged(packageName, user);
                     }
                 } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
                     if (!replacing) {
-                        for (OnAppsChangedListenerCompat listener : getListeners()) {
-                            listener.onPackageRemoved(user, packageName);
+                        for (OnAppsChangedCallbackCompat callback : getCallbacks()) {
+                            callback.onPackageRemoved(packageName, user);
                         }
                     }
                     // else, we are replacing the package, so a PACKAGE_ADDED will be sent
                     // later, we will update the package at this time
                 } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
                     if (!replacing) {
-                        for (OnAppsChangedListenerCompat listener : getListeners()) {
-                            listener.onPackageAdded(user, packageName);
+                        for (OnAppsChangedCallbackCompat callback : getCallbacks()) {
+                            callback.onPackageAdded(packageName, user);
                         }
                     } else {
-                        for (OnAppsChangedListenerCompat listener : getListeners()) {
-                            listener.onPackageChanged(user, packageName);
+                        for (OnAppsChangedCallbackCompat callback : getCallbacks()) {
+                            callback.onPackageChanged(packageName, user);
                         }
                     }
                 }
             } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {
-                final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
+                // EXTRA_REPLACING is available Kitkat onwards. For lower devices, it is broadcasted
+                // when moving a package or mounting/un-mounting external storage. Assume that
+                // it is a replacing operation.
+                final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING,
+                        Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT);
                 String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
-                for (OnAppsChangedListenerCompat listener : getListeners()) {
-                    listener.onPackagesAvailable(user, packages, replacing);
+                for (OnAppsChangedCallbackCompat callback : getCallbacks()) {
+                    callback.onPackagesAvailable(packages, user, replacing);
                 }
             } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
-                final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
+                final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING,
+                        Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT);
                 String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
-                for (OnAppsChangedListenerCompat listener : getListeners()) {
-                    listener.onPackagesUnavailable(user, packages, replacing);
+                for (OnAppsChangedCallbackCompat callback : getCallbacks()) {
+                    callback.onPackagesUnavailable(packages, user, replacing);
                 }
             }
         }
diff --git a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java
index 21f2659..ca9b671 100644
--- a/src/com/android/launcher3/compat/LauncherAppsCompatVL.java
+++ b/src/com/android/launcher3/compat/LauncherAppsCompatVL.java
@@ -19,99 +19,48 @@
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.LauncherActivityInfo;
+import android.content.pm.LauncherApps;
 import android.graphics.Rect;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.UserHandle;
 
-import java.lang.reflect.InvocationHandler;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import java.lang.reflect.Proxy;
-import java.lang.reflect.Method;
-
 public class LauncherAppsCompatVL extends LauncherAppsCompat {
 
-    private Object mLauncherApps;
-    private Class mLauncherAppsClass;
-    private Class mListenerClass;
-    private Method mGetActivityList;
-    private Method mResolveActivity;
-    private Method mStartActivityForProfile;
-    private Method mAddOnAppsChangedListener;
-    private Method mRemoveOnAppsChangedListener;
-    private Method mIsPackageEnabledForProfile;
-    private Method mIsActivityEnabledForProfile;
+    private LauncherApps mLauncherApps;
 
-    private Map<OnAppsChangedListenerCompat, Object> mListeners
-            = new HashMap<OnAppsChangedListenerCompat, Object>();
+    private Map<OnAppsChangedCallbackCompat, WrappedCallback> mCallbacks
+            = new HashMap<OnAppsChangedCallbackCompat, WrappedCallback>();
 
-    static LauncherAppsCompatVL build(Context context, Object launcherApps) {
-        LauncherAppsCompatVL compat = new LauncherAppsCompatVL(context, launcherApps);
-
-        compat.mListenerClass = ReflectUtils.getClassForName(
-                "android.content.pm.LauncherApps$OnAppsChangedListener");
-        compat.mLauncherAppsClass = ReflectUtils.getClassForName("android.content.pm.LauncherApps");
-
-        compat.mGetActivityList = ReflectUtils.getMethod(compat.mLauncherAppsClass,
-                "getActivityList",
-                String.class, UserHandle.class);
-        compat.mResolveActivity = ReflectUtils.getMethod(compat.mLauncherAppsClass,
-                "resolveActivity",
-                Intent.class, UserHandle.class);
-        compat.mStartActivityForProfile = ReflectUtils.getMethod(compat.mLauncherAppsClass,
-                "startActivityForProfile",
-                ComponentName.class, Rect.class, Bundle.class, UserHandle.class);
-        compat.mAddOnAppsChangedListener = ReflectUtils.getMethod(compat.mLauncherAppsClass,
-                "addOnAppsChangedListener", compat.mListenerClass);
-        compat.mRemoveOnAppsChangedListener = ReflectUtils.getMethod(compat.mLauncherAppsClass,
-                "removeOnAppsChangedListener", compat.mListenerClass);
-        compat.mIsPackageEnabledForProfile = ReflectUtils.getMethod(compat.mLauncherAppsClass,
-                "isPackageEnabledForProfile", String.class, UserHandle.class);
-        compat.mIsActivityEnabledForProfile = ReflectUtils.getMethod(compat.mLauncherAppsClass,
-                "isActivityEnabledForProfile", ComponentName.class, UserHandle.class);
-
-        if (compat.mListenerClass != null
-                && compat.mLauncherAppsClass != null
-                && compat.mGetActivityList != null
-                && compat.mResolveActivity != null
-                && compat.mStartActivityForProfile != null
-                && compat.mAddOnAppsChangedListener != null
-                && compat.mRemoveOnAppsChangedListener != null
-                && compat.mIsPackageEnabledForProfile != null
-                && compat.mIsActivityEnabledForProfile != null) {
-            return compat;
-        }
-        return null;
-    }
-
-    private LauncherAppsCompatVL(Context context, Object launcherApps) {
+    LauncherAppsCompatVL(Context context) {
         super();
-        mLauncherApps = launcherApps;
+        mLauncherApps = (LauncherApps) context.getSystemService("launcherapps");
     }
 
     public List<LauncherActivityInfoCompat> getActivityList(String packageName,
             UserHandleCompat user) {
-        List<Object> list = (List<Object>) ReflectUtils.invokeMethod(mLauncherApps,
-                mGetActivityList, packageName, user.getUser());
+        List<LauncherActivityInfo> list = mLauncherApps.getActivityList(packageName,
+                user.getUser());
         if (list.size() == 0) {
             return Collections.EMPTY_LIST;
         }
         ArrayList<LauncherActivityInfoCompat> compatList =
                 new ArrayList<LauncherActivityInfoCompat>(list.size());
-        for (Object info : list) {
+        for (LauncherActivityInfo info : list) {
             compatList.add(new LauncherActivityInfoCompatVL(info));
         }
         return compatList;
     }
 
     public LauncherActivityInfoCompat resolveActivity(Intent intent, UserHandleCompat user) {
-        Object activity = ReflectUtils.invokeMethod(mLauncherApps, mResolveActivity,
-                        intent, user.getUser());
+        LauncherActivityInfo activity = mLauncherApps.resolveActivity(intent, user.getUser());
         if (activity != null) {
             return new LauncherActivityInfoCompatVL(activity);
         } else {
@@ -119,89 +68,64 @@
         }
     }
 
-    public void startActivityForProfile(ComponentName component, Rect sourceBounds,
-            Bundle opts, UserHandleCompat user) {
-        ReflectUtils.invokeMethod(mLauncherApps, mStartActivityForProfile,
-                component, sourceBounds, opts, user.getUser());
+    public void startActivityForProfile(ComponentName component, UserHandleCompat user,
+            Rect sourceBounds, Bundle opts) {
+        mLauncherApps.startActivityForProfile(component, user.getUser(), sourceBounds, opts);
     }
 
-    public void addOnAppsChangedListener(LauncherAppsCompat.OnAppsChangedListenerCompat listener) {
-        Object wrappedListener = Proxy.newProxyInstance(mListenerClass.getClassLoader(),
-                new Class[]{mListenerClass}, new WrappedListener(listener));
-        synchronized (mListeners) {
-            mListeners.put(listener, wrappedListener);
+    public void addOnAppsChangedCallback(LauncherAppsCompat.OnAppsChangedCallbackCompat callback) {
+        WrappedCallback wrappedCallback = new WrappedCallback(callback);
+        synchronized (mCallbacks) {
+            mCallbacks.put(callback, wrappedCallback);
         }
-        ReflectUtils.invokeMethod(mLauncherApps, mAddOnAppsChangedListener, wrappedListener);
+        mLauncherApps.addOnAppsChangedCallback(wrappedCallback);
     }
 
-    public void removeOnAppsChangedListener(
-            LauncherAppsCompat.OnAppsChangedListenerCompat listener) {
-        Object wrappedListener = null;
-        synchronized (mListeners) {
-            wrappedListener = mListeners.remove(listener);
+    public void removeOnAppsChangedCallback(
+            LauncherAppsCompat.OnAppsChangedCallbackCompat callback) {
+        WrappedCallback wrappedCallback = null;
+        synchronized (mCallbacks) {
+            wrappedCallback = mCallbacks.remove(callback);
         }
-        if (wrappedListener != null) {
-            ReflectUtils.invokeMethod(mLauncherApps, mRemoveOnAppsChangedListener, wrappedListener);
+        if (wrappedCallback != null) {
+            mLauncherApps.removeOnAppsChangedCallback(wrappedCallback);
         }
     }
 
     public boolean isPackageEnabledForProfile(String packageName, UserHandleCompat user) {
-        return (Boolean) ReflectUtils.invokeMethod(mLauncherApps, mIsPackageEnabledForProfile,
-                packageName, user.getUser());
+        return mLauncherApps.isPackageEnabledForProfile(packageName, user.getUser());
     }
 
     public boolean isActivityEnabledForProfile(ComponentName component, UserHandleCompat user) {
-        return (Boolean) ReflectUtils.invokeMethod(mLauncherApps, mIsActivityEnabledForProfile,
-                component, user.getUser());
+        return mLauncherApps.isActivityEnabledForProfile(component, user.getUser());
     }
 
-    private static class WrappedListener implements InvocationHandler {
-        private LauncherAppsCompat.OnAppsChangedListenerCompat mListener;
+    private static class WrappedCallback extends LauncherApps.OnAppsChangedCallback {
+        private LauncherAppsCompat.OnAppsChangedCallbackCompat mCallback;
 
-        public WrappedListener(LauncherAppsCompat.OnAppsChangedListenerCompat listener) {
-            mListener = listener;
+        public WrappedCallback(LauncherAppsCompat.OnAppsChangedCallbackCompat callback) {
+            mCallback = callback;
         }
 
-        public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
-            try {
-                String methodName = m.getName();
-                if ("onPackageRemoved".equals(methodName)) {
-                    onPackageRemoved((UserHandle) args[0], (String) args[1]);
-                } else if ("onPackageAdded".equals(methodName)) {
-                    onPackageAdded((UserHandle) args[0], (String) args[1]);
-                } else if ("onPackageChanged".equals(methodName)) {
-                    onPackageChanged((UserHandle) args[0], (String) args[1]);
-                } else if ("onPackagesAvailable".equals(methodName)) {
-                    onPackagesAvailable((UserHandle) args[0], (String []) args[1],
-                            (Boolean) args[2]);
-                } else if ("onPackagesUnavailable".equals(methodName)) {
-                    onPackagesUnavailable((UserHandle) args[0], (String []) args[1],
-                            (Boolean) args[2]);
-                }
-            } finally {
-                return null;
-            }
+        public void onPackageRemoved(String packageName, UserHandle user) {
+            mCallback.onPackageRemoved(packageName, UserHandleCompat.fromUser(user));
         }
 
-        public void onPackageRemoved(UserHandle user, String packageName) {
-            mListener.onPackageRemoved(UserHandleCompat.fromUser(user), packageName);
+        public void onPackageAdded(String packageName, UserHandle user) {
+            mCallback.onPackageAdded(packageName, UserHandleCompat.fromUser(user));
         }
 
-        public void onPackageAdded(UserHandle user, String packageName) {
-            mListener.onPackageAdded(UserHandleCompat.fromUser(user), packageName);
+        public void onPackageChanged(String packageName, UserHandle user) {
+            mCallback.onPackageChanged(packageName, UserHandleCompat.fromUser(user));
         }
 
-        public void onPackageChanged(UserHandle user, String packageName) {
-            mListener.onPackageChanged(UserHandleCompat.fromUser(user), packageName);
+        public void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing) {
+            mCallback.onPackagesAvailable(packageNames, UserHandleCompat.fromUser(user), replacing);
         }
 
-        public void onPackagesAvailable(UserHandle user, String[] packageNames, boolean replacing) {
-            mListener.onPackagesAvailable(UserHandleCompat.fromUser(user), packageNames, replacing);
-        }
-
-        public void onPackagesUnavailable(UserHandle user, String[] packageNames,
+        public void onPackagesUnavailable(String[] packageNames, UserHandle user,
                 boolean replacing) {
-            mListener.onPackagesUnavailable(UserHandleCompat.fromUser(user), packageNames,
+            mCallback.onPackagesUnavailable(packageNames, UserHandleCompat.fromUser(user),
                     replacing);
         }
     }
diff --git a/src/com/android/launcher3/compat/ReflectUtils.java b/src/com/android/launcher3/compat/ReflectUtils.java
deleted file mode 100644
index e1b8a1f..0000000
--- a/src/com/android/launcher3/compat/ReflectUtils.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3.compat;
-
-import android.util.Log;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-public class ReflectUtils {
-    private static final String TAG = "LauncherReflect";
-
-    public static Class getClassForName(String className) {
-        try {
-            return Class.forName(className);
-        } catch (ClassNotFoundException e) {
-            Log.e(TAG, "Couldn't find class " + className, e);
-            return null;
-        }
-    }
-
-    public static Method getMethod(Class clazz, String method) {
-        try {
-            return clazz.getMethod(method);
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Couldn't find methid " + clazz.getName() + " " + method, e);
-            return null;
-        }
-    }
-
-    public static Method getMethod(Class clazz, String method, Class param1) {
-        try {
-            return clazz.getMethod(method, param1);
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Couldn't find methid " + clazz.getName() + " " + method, e);
-            return null;
-        }
-    }
-
-    public static Method getMethod(Class clazz, String method, Class param1, Class param2) {
-        try {
-            return clazz.getMethod(method, param1, param2);
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Couldn't find methid " + clazz.getName() + " " + method, e);
-            return null;
-        }
-    }
-
-    public static Method getMethod(Class clazz, String method, Class param1, Class param2,
-            Class param3) {
-        try {
-            return clazz.getMethod(method, param1, param2, param3);
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Couldn't find methid " + clazz.getName() + " " + method, e);
-            return null;
-        }
-    }
-
-    public static Method getMethod(Class clazz, String method, Class param1, Class param2,
-            Class param3, Class param4) {
-        try {
-            return clazz.getMethod(method, param1, param2, param3, param4);
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Couldn't find methid " + clazz.getName() + " " + method, e);
-            return null;
-        }
-    }
-
-    public static Object invokeMethod(Object object, Method method) {
-        try {
-            return method.invoke(object);
-        } catch (SecurityException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        }
-        return null;
-    }
-
-    public static Object invokeMethod(Object object, Method method, Object param1) {
-        try {
-            return method.invoke(object, param1);
-        } catch (SecurityException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        }
-        return null;
-    }
-
-    public static Object invokeMethod(Object object, Method method, Object param1, Object param2) {
-        try {
-            return method.invoke(object, param1, param2);
-        } catch (SecurityException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        }
-        return null;
-    }
-
-    public static Object invokeMethod(Object object, Method method, Object param1, Object param2,
-            Object param3) {
-        try {
-            return method.invoke(object, param1, param2, param3);
-        } catch (SecurityException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        }
-        return null;
-    }
-
-    public static Object invokeMethod(Object object, Method method, Object param1, Object param2,
-            Object param3, Object param4) {
-        try {
-            return method.invoke(object, param1, param2, param3, param4);
-        } catch (SecurityException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (IllegalAccessException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        } catch (InvocationTargetException e) {
-            Log.e(TAG, "Couldn't invoke method " + method, e);
-        }
-        return null;
-    }
-}
\ No newline at end of file
diff --git a/src/com/android/launcher3/compat/UserManagerCompat.java b/src/com/android/launcher3/compat/UserManagerCompat.java
index 256e04a..c10a743 100644
--- a/src/com/android/launcher3/compat/UserManagerCompat.java
+++ b/src/com/android/launcher3/compat/UserManagerCompat.java
@@ -41,4 +41,5 @@
     public abstract long getSerialNumberForUser(UserHandleCompat user);
     public abstract UserHandleCompat getUserForSerialNumber(long serialNumber);
     public abstract Drawable getBadgedDrawableForUser(Drawable unbadged, UserHandleCompat user);
+    public abstract String getBadgedLabelForUser(String label, UserHandleCompat user);
 }
diff --git a/src/com/android/launcher3/compat/UserManagerCompatV16.java b/src/com/android/launcher3/compat/UserManagerCompatV16.java
index 2009e4e..03dd097 100644
--- a/src/com/android/launcher3/compat/UserManagerCompatV16.java
+++ b/src/com/android/launcher3/compat/UserManagerCompatV16.java
@@ -44,4 +44,8 @@
     public long getSerialNumberForUser(UserHandleCompat user) {
         return 0;
     }
+
+    public String getBadgedLabelForUser(String label, UserHandleCompat user) {
+        return label;
+    }
 }
diff --git a/src/com/android/launcher3/compat/UserManagerCompatVL.java b/src/com/android/launcher3/compat/UserManagerCompatVL.java
index 8d3ca85..e071a8f 100644
--- a/src/com/android/launcher3/compat/UserManagerCompatVL.java
+++ b/src/com/android/launcher3/compat/UserManagerCompatVL.java
@@ -22,9 +22,8 @@
 import android.os.UserHandle;
 import android.os.UserManager;
 
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 public class UserManagerCompatVL extends UserManagerCompatV17 {
@@ -34,35 +33,27 @@
     }
 
     public List<UserHandleCompat> getUserProfiles() {
-        Method method = ReflectUtils.getMethod(mUserManager.getClass(), "getUserProfiles");
-        if (method != null) {
-            List<UserHandle> users = (List<UserHandle>) ReflectUtils.invokeMethod(
-                    mUserManager, method);
-            if (users != null) {
-                ArrayList<UserHandleCompat> compatUsers = new ArrayList<UserHandleCompat>(
-                        users.size());
-                for (UserHandle user : users) {
-                    compatUsers.add(UserHandleCompat.fromUser(user));
-                }
-                return compatUsers;
-            }
+        List<UserHandle> users = mUserManager.getUserProfiles();
+        if (users == null) {
+            return Collections.EMPTY_LIST;
         }
-        // Fall back to non L version.
-        return super.getUserProfiles();
+        ArrayList<UserHandleCompat> compatUsers = new ArrayList<UserHandleCompat>(
+                users.size());
+        for (UserHandle user : users) {
+            compatUsers.add(UserHandleCompat.fromUser(user));
+        }
+        return compatUsers;
     }
 
     public Drawable getBadgedDrawableForUser(Drawable unbadged, UserHandleCompat user) {
-        Method method = ReflectUtils.getMethod(mUserManager.getClass(), "getBadgedDrawableForUser",
-                Drawable.class, UserHandle.class);
-        if (method != null) {
-            Drawable d = (Drawable) ReflectUtils.invokeMethod(mUserManager, method, unbadged,
-                    user.getUser());
-            if (d != null) {
-                return d;
-            }
+        return mUserManager.getBadgedDrawableForUser(unbadged, user.getUser());
+    }
+
+    public String getBadgedLabelForUser(String label, UserHandleCompat user) {
+        if (user == null) {
+            return label;
         }
-        // Fall back to non L version.
-        return super.getBadgedDrawableForUser(unbadged, user);
+        return mUserManager.getBadgedLabelForUser(label, user.getUser());
     }
 }