diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 8ca580a..1c98522 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -1014,19 +1014,21 @@
                 }
                 cr.bulkInsert(uri, values);
 
-                // Dump the sBgWorkspaceScreens
-                Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens - pre clear", true);
-                for (Long l : sBgWorkspaceScreens) {
-                    Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
-                }
+                synchronized (sBgLock) {
+                    // Dump the sBgWorkspaceScreens
+                    Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens - pre clear", true);
+                    for (Long l : sBgWorkspaceScreens) {
+                        Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
+                    }
 
-                sBgWorkspaceScreens.clear();
-                sBgWorkspaceScreens.addAll(screensCopy);
+                    sBgWorkspaceScreens.clear();
+                    sBgWorkspaceScreens.addAll(screensCopy);
 
-                // Dump the sBgWorkspaceScreens
-                Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens - post clear", true);
-                for (Long l : sBgWorkspaceScreens) {
-                    Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
+                    // Dump the sBgWorkspaceScreens
+                    Launcher.addDumpLog(TAG, "10249126 - updateWorkspaceScreenOrder - sBgWorkspaceScreens - post clear", true);
+                    for (Long l : sBgWorkspaceScreens) {
+                        Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
+                    }
                 }
             }
         };
@@ -1272,7 +1274,7 @@
 
                     orderedScreens.put(rank, screenId);
                 } catch (Exception e) {
-                    Log.w(TAG, "Desktop items loading interrupted - invalid screens: ", e);
+                    Launcher.addDumpLog(TAG, "Desktop items loading interrupted - invalid screens: " + e, true);
                 }
             }
         } finally {
@@ -1337,6 +1339,7 @@
                 isUpgradePath = loadWorkspace();
                 synchronized (LoaderTask.this) {
                     if (mStopped) {
+                        Launcher.addDumpLog(TAG, "10249126 - loadAndBindWorkspace() stopped", true);
                         return isUpgradePath;
                     }
                     mWorkspaceLoaded = true;
@@ -1498,6 +1501,7 @@
 
         public void stopLocked() {
             synchronized (LoaderTask.this) {
+                Launcher.addDumpLog(TAG, "10249126 - STOPPED", true);
                 mStopped = true;
                 this.notify();
             }
@@ -1622,6 +1626,18 @@
             return true;
         }
 
+        /** Clears all the sBg data structures */
+        private void clearSBgDataStructures() {
+            synchronized (sBgLock) {
+                sBgWorkspaceItems.clear();
+                sBgAppWidgets.clear();
+                sBgFolders.clear();
+                sBgItemsIdMap.clear();
+                sBgDbIconCache.clear();
+                sBgWorkspaceScreens.clear();
+            }
+        }
+
         /** Returns whether this is an upgradge path */
         private boolean loadWorkspace() {
             final long t = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0;
@@ -1644,12 +1660,7 @@
             boolean loadedOldDb = LauncherAppState.getLauncherProvider().justLoadedOldDb();
 
             synchronized (sBgLock) {
-                sBgWorkspaceItems.clear();
-                sBgAppWidgets.clear();
-                sBgFolders.clear();
-                sBgItemsIdMap.clear();
-                sBgDbIconCache.clear();
-                sBgWorkspaceScreens.clear();
+                clearSBgDataStructures();
                 Launcher.addDumpLog(TAG, "10249126 - loadWorkspace()", true);
 
                 final ArrayList<Long> itemsToRemove = new ArrayList<Long>();
@@ -1701,6 +1712,7 @@
                     long id;
                     Intent intent;
 
+                    Launcher.addDumpLog(TAG, "10249126 - Num rows: " + c.getCount(), true);
                     while (!mStopped && c.moveToNext()) {
                         try {
                             int itemType = c.getInt(itemTypeIndex);
@@ -1890,7 +1902,7 @@
                                 break;
                             }
                         } catch (Exception e) {
-                            Log.w(TAG, "Desktop items loading interrupted:", e);
+                            Launcher.addDumpLog(TAG, "Desktop items loading interrupted: " + e, true);
                         }
                     }
                 } finally {
@@ -1899,6 +1911,13 @@
                     }
                 }
 
+                // Break early if we've stopped loading
+                if (mStopped) {
+                    Launcher.addDumpLog(TAG, "10249126 - loadWorkspace() - Stopped", true);
+                    clearSBgDataStructures();
+                    return false;
+                }
+
                 if (itemsToRemove.size() > 0) {
                     ContentProviderClient client = contentResolver.acquireContentProviderClient(
                             LauncherSettings.Favorites.CONTENT_URI);
@@ -2150,9 +2169,11 @@
             Launcher.addDumpLog(TAG, "10249126 - bindWorkspaceScreens()", true);
 
             // Dump the orderedScreens
-            Launcher.addDumpLog(TAG, "10249126 - orderedScreens", true);
-            for (Long l : sBgWorkspaceScreens) {
-                Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
+            synchronized (sBgLock) {
+                Launcher.addDumpLog(TAG, "10249126 - orderedScreens", true);
+                for (Long l : sBgWorkspaceScreens) {
+                    Launcher.addDumpLog(TAG, "10249126\t- " + l, true);
+                }
             }
 
             final Runnable r = new Runnable() {
@@ -2238,6 +2259,7 @@
          * Binds all loaded data to actual views on the main thread.
          */
         private void bindWorkspace(int synchronizeBindPage, final boolean isUpgradePath) {
+            Launcher.addDumpLog(TAG, "10249126 - bindWorkspace(" + synchronizeBindPage + ", " + isUpgradePath + ")", true);
             final long t = SystemClock.uptimeMillis();
             Runnable r;
 
@@ -2666,6 +2688,13 @@
         }
 
         try {
+            // Skip if the application is disabled
+            PackageInfo pi = pm.getPackageInfo(cn.getPackageName(), 0);
+            if (!pi.applicationInfo.enabled) {
+                return false;
+            }
+
+            // Check the activity
             return (pm.getActivityInfo(cn, 0) != null);
         } catch (NameNotFoundException e) {
             return false;
