diff --git a/src/com/android/launcher/HandleView.java b/src/com/android/launcher/HandleView.java
index 437d559..9afe41c 100644
--- a/src/com/android/launcher/HandleView.java
+++ b/src/com/android/launcher/HandleView.java
@@ -49,7 +49,7 @@
     @Override
     public View focusSearch(int direction) {
         View newFocus = super.focusSearch(direction);
-        if (newFocus == null) {
+        if (newFocus == null && mLauncher.isDrawerDown()) {
             final Workspace workspace = mLauncher.getWorkspace();
             workspace.dispatchUnhandledMove(null, direction);
             return (mOrientation == ORIENTATION_HORIZONTAL && direction == FOCUS_DOWN) ?
diff --git a/src/com/android/launcher/Launcher.java b/src/com/android/launcher/Launcher.java
index 928f4ca..01001c0 100644
--- a/src/com/android/launcher/Launcher.java
+++ b/src/com/android/launcher/Launcher.java
@@ -45,6 +45,7 @@
 import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.os.Message;
 import android.provider.*;
 import android.telephony.PhoneNumberUtils;
 import android.text.Selection;
@@ -260,7 +261,7 @@
 
     private void startLoaders() {
         sModel.loadApplications(true, this, mLocaleChanged);
-        sModel.loadUserItems(!mLocaleChanged, this, mLocaleChanged);
+        sModel.loadUserItems(!mLocaleChanged, this, mLocaleChanged, true);
         mRestoring = false;
     }
 
@@ -812,13 +813,13 @@
                 .setIcon(android.R.drawable.ic_menu_add)
                 .setAlphabeticShortcut('A');
         menu.add(0, MENU_WALLPAPER_SETTINGS, 0, R.string.menu_wallpaper)
-                 .setIcon(R.drawable.ic_menu_gallery)
+                 .setIcon(android.R.drawable.ic_menu_gallery)
                  .setAlphabeticShortcut('W');
         menu.add(0, MENU_SEARCH, 0, R.string.menu_search)
                 .setIcon(android.R.drawable.ic_search_category_default)
                 .setAlphabeticShortcut(SearchManager.MENU_KEY);
         menu.add(0, MENU_NOTIFICATIONS, 0, R.string.menu_notifications)
-                .setIcon(R.drawable.ic_menu_notifications)
+                .setIcon(android.R.drawable.ic_menu_notifications)
                 .setAlphabeticShortcut('N');
 
         final Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
@@ -826,7 +827,7 @@
                 | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
 
         menu.add(0, MENU_SETTINGS, 0, R.string.menu_settings)
-                .setIcon(R.drawable.ic_menu_preferences).setAlphabeticShortcut('P')
+                .setIcon(android.R.drawable.ic_menu_preferences).setAlphabeticShortcut('P')
                 .setIntent(settings);
 
         return true;
@@ -1111,7 +1112,7 @@
     private void onFavoritesChanged() {
         mDesktopLocked = true;
         mDrawer.lock();
-        sModel.loadUserItems(false, this, false);
+        sModel.loadUserItems(false, this, false, false);
     }
 
     void onDesktopItemsLoaded() {
@@ -1119,7 +1120,80 @@
 
         bindDesktopItems();
         mAllAppsGrid.setAdapter(Launcher.getModel().getApplicationsAdapter());
+    }
 
+    /**
+     * Refreshes the shortcuts shown on the workspace.
+     */
+    private void bindDesktopItems() {
+        final ArrayList<ItemInfo> shortcuts = sModel.getDesktopItems();
+        if (shortcuts == null) {
+            return;
+        }
+
+        final Workspace workspace = mWorkspace;
+        int count = workspace.getChildCount();
+        for (int i = 0; i < count; i++) {
+            ((ViewGroup) workspace.getChildAt(i)).removeAllViewsInLayout();
+        }
+
+        count = shortcuts.size();
+
+        final DesktopItemsBinder binder = new DesktopItemsBinder(this, shortcuts);
+        binder.obtainMessage(DesktopItemsBinder.MESSAGE_BIND_ITEMS, 0, count).sendToTarget();
+    }
+
+    private void bindItems(Launcher.DesktopItemsBinder binder,
+            ArrayList<ItemInfo> shortcuts, int start, int count) {
+
+        final Workspace workspace = mWorkspace;
+        final boolean desktopLocked = mDesktopLocked;
+
+        final int end = Math.min(start + DesktopItemsBinder.ITEMS_COUNT, count);
+        int i = start;
+
+        for ( ; i < end; i++) {
+            final ItemInfo item = shortcuts.get(i);
+            switch (item.itemType) {
+                case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
+                case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
+                    final View shortcut = createShortcut((ApplicationInfo) item);
+                    workspace.addInScreen(shortcut, item.screen, item.cellX, item.cellY, 1, 1,
+                            !desktopLocked);
+                    break;
+                case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
+                    final FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this,
+                            (ViewGroup) workspace.getChildAt(workspace.getCurrentScreen()),
+                            (UserFolderInfo) item);
+                    workspace.addInScreen(newFolder, item.screen, item.cellX, item.cellY, 1, 1,
+                            !desktopLocked);
+                    break;
+                case LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER:
+                    final FolderIcon newLiveFolder = LiveFolderIcon.fromXml(
+                            R.layout.live_folder_icon, this,
+                            (ViewGroup) workspace.getChildAt(workspace.getCurrentScreen()),
+                            (LiveFolderInfo) item);
+                    workspace.addInScreen(newLiveFolder, item.screen, item.cellX, item.cellY, 1, 1,
+                            !desktopLocked);
+                    break;
+                default:
+                    final Widget widget = (Widget) item;
+                    final View view = createWidget(mInflater, widget);
+                    view.setTag(widget);
+                    workspace.addWidget(view, widget, !desktopLocked);
+            }
+        }
+
+        workspace.requestLayout();
+
+        if (end >= count) {
+            finishBindDesktopItems();
+        } else {
+            binder.obtainMessage(DesktopItemsBinder.MESSAGE_BIND_ITEMS, i, count).sendToTarget();
+        }
+    }
+
+    private void finishBindDesktopItems() {
         if (mSavedState != null) {
             mWorkspace.getChildAt(mWorkspace.getCurrentScreen()).requestFocus();
 
@@ -1152,57 +1226,6 @@
         mDrawer.unlock();
     }
 
-    /**
-     * Refreshes the shortcuts shown on the workspace.
-     */
-    private void bindDesktopItems() {
-        final ArrayList<ItemInfo> shortcuts = sModel.getDesktopItems();
-        if (shortcuts == null) {
-            return;
-        }
-
-        final Workspace workspace = mWorkspace;
-        int count = workspace.getChildCount();
-        for (int i = 0; i < count; i++) {
-            ((ViewGroup) workspace.getChildAt(i)).removeAllViewsInLayout();
-        }
-
-        count = shortcuts.size();
-        for (int i = 0; i < count; i++) {
-            final ItemInfo item = shortcuts.get(i);
-            switch (item.itemType) {
-            case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION:
-            case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT:
-                final View shortcut = createShortcut((ApplicationInfo) item);
-                workspace.addInScreen(shortcut, item.screen, item.cellX, item.cellY, 1, 1,
-                        !mDesktopLocked);
-                break;
-            case LauncherSettings.Favorites.ITEM_TYPE_USER_FOLDER:
-                final FolderIcon newFolder = FolderIcon.fromXml(R.layout.folder_icon, this,
-                        (ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentScreen()),
-                        ((UserFolderInfo) item));
-                workspace.addInScreen(newFolder, item.screen, item.cellX, item.cellY, 1, 1,
-                        !mDesktopLocked);
-                break;
-            case LauncherSettings.Favorites.ITEM_TYPE_LIVE_FOLDER:
-                final FolderIcon newLiveFolder = LiveFolderIcon.fromXml(
-                        R.layout.live_folder_icon, this,
-                        (ViewGroup) mWorkspace.getChildAt(mWorkspace.getCurrentScreen()),
-                        ((LiveFolderInfo) item));
-                workspace.addInScreen(newLiveFolder, item.screen, item.cellX, item.cellY, 1, 1,
-                        !mDesktopLocked);
-                break;
-            default:
-                final Widget widget = (Widget)item;
-                final View view = createWidget(mInflater, widget);
-                view.setTag(widget);
-                workspace.addWidget(view, widget, !mDesktopLocked);
-            }
-        }
-
-        workspace.requestLayout();
-    }
-
     private View createWidget(LayoutInflater inflater, Widget widget) {
         final Workspace workspace = mWorkspace;
         final int screen = workspace.getCurrentScreen();
@@ -1456,7 +1479,7 @@
 
                 if (mDesktopLocked) {
                     mDrawer.lock();
-                    sModel.loadUserItems(false, Launcher.this, false);
+                    sModel.loadUserItems(false, Launcher.this, false, false);
                 } else {
                     final FolderIcon folderIcon = (FolderIcon)
                             mWorkspace.getViewForTag(mFolderInfo);
@@ -1466,7 +1489,7 @@
                     } else {
                         mDesktopLocked = true;
                         mDrawer.lock();
-                        sModel.loadUserItems(false, Launcher.this, false);
+                        sModel.loadUserItems(false, Launcher.this, false, false);
                     }
                 }
             }
@@ -1635,4 +1658,28 @@
         public void onScrollEnded() {
         }
     }
+
+    private static class DesktopItemsBinder extends Handler {
+        static final int MESSAGE_BIND_ITEMS = 0x1;
+        // Number of items to bind in every pass
+        static final int ITEMS_COUNT = 6;
+
+        private final ArrayList<ItemInfo> mShortcuts;
+        private final WeakReference<Launcher> mLauncher;
+
+        DesktopItemsBinder(Launcher launcher, ArrayList<ItemInfo> shortcuts) {
+            mLauncher = new WeakReference<Launcher>(launcher);
+            mShortcuts = shortcuts;
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MESSAGE_BIND_ITEMS:
+                    Launcher launcher = mLauncher.get();
+                    if (launcher != null) launcher.bindItems(this, mShortcuts, msg.arg1, msg.arg2);
+                    break;
+            }
+        }
+    }
 }
diff --git a/src/com/android/launcher/LauncherModel.java b/src/com/android/launcher/LauncherModel.java
index 0ef2a80..314a502 100644
--- a/src/com/android/launcher/LauncherModel.java
+++ b/src/com/android/launcher/LauncherModel.java
@@ -28,9 +28,9 @@
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
-import android.graphics.drawable.BitmapDrawable;
 import android.net.Uri;
 import android.util.Log;
+import android.os.Process;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -45,7 +45,6 @@
  * Maintains in-memory state of the Launcher. It is expected that there should be only one
  * LauncherModel object held in a static. Also provide APIs for updating the database state
  * for the Launcher
- *
  */
 public class LauncherModel {
     private static final int UI_NOTIFICATION_RATE = 4;
@@ -104,6 +103,13 @@
         }
 
         mApplicationsLoaded = false;
+
+        if (!isLaunching) {
+            startApplicationsLoader(launcher);
+        }
+    }
+
+    private void startApplicationsLoader(Launcher launcher) {
         mApplicationsLoader = new ApplicationsLoader(launcher);
         mLoader = new Thread(mApplicationsLoader, "Applications Loader");
         mLoader.start();
@@ -130,6 +136,8 @@
         public void run() {
             mRunning = true;
 
+            android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
+
             Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
             mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
 
@@ -221,8 +229,11 @@
      * Loads all of the items on the desktop, in folders, or in the dock.
      * These can be apps, shortcuts or widgets
      */
-    void loadUserItems(boolean isLaunching, Launcher launcher, boolean localeChanged) {
+    void loadUserItems(boolean isLaunching, Launcher launcher, boolean localeChanged,
+            boolean loadApplications) {
+
         if (isLaunching && mDesktopItems != null && mDesktopItemsLoaded) {
+            if (loadApplications) startApplicationsLoader(launcher);
             // We have already loaded our data from the DB
             launcher.onDesktopItemsLoaded();
             return;
@@ -240,7 +251,7 @@
         }
 
         mDesktopItemsLoaded = false;
-        mDesktopItemsLoader = new DesktopItemsLoader(launcher, localeChanged);
+        mDesktopItemsLoader = new DesktopItemsLoader(launcher, localeChanged, loadApplications);
         mDesktopLoader = new Thread(mDesktopItemsLoader, "Desktop Items Loader");
         mDesktopLoader.start();
     }
@@ -317,9 +328,11 @@
         private volatile boolean mRunning;
 
         private final WeakReference<Launcher> mLauncher;
-        private boolean mLocaleChanged;
+        private final boolean mLocaleChanged;
+        private final boolean mLoadApplications;
 
-        DesktopItemsLoader(Launcher launcher, boolean localeChanged) {
+        DesktopItemsLoader(Launcher launcher, boolean localeChanged, boolean loadApplications) {
+            mLoadApplications = loadApplications;
             mLauncher = new WeakReference<Launcher>(launcher);
             mLocaleChanged = localeChanged;
         }
@@ -532,6 +545,7 @@
                         launcher.onDesktopItemsLoaded();
                     }
                 });
+                if (mLoadApplications) startApplicationsLoader(launcher);
             }
 
             if (!mStopped) {
