diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index bd343ea..1f4c120 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -3529,6 +3529,7 @@
     public void bindAddScreens(ArrayList<Long> orderedScreenIds) {
         int count = orderedScreenIds.size();
         for (int i = 0; i < count; i++) {
+            Log.d(TAG, "10249126 - bindAddScreens(" + orderedScreenIds.get(i) + ")");
             mWorkspace.insertNewWorkspaceScreenBeforeEmptyScreen(orderedScreenIds.get(i), false);
         }
     }
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 8f486e7..b085441 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -311,6 +311,7 @@
                                     sBgWorkspaceScreens.size());
                             while (numPagesToAdd > 0) {
                                 long screenId = lp.generateNewScreenId();
+                                Log.d(TAG, "10249126 - addAndBindAddedApps(" + screenId + ")");
                                 // Update the model
                                 sBgWorkspaceScreens.add(screenId);
                                 updateWorkspaceScreenOrder(context, sBgWorkspaceScreens);
@@ -1008,6 +1009,7 @@
                     long screenId = screens.get(i);
                     v.put(LauncherSettings.WorkspaceScreens._ID, screenId);
                     v.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i);
+                    Log.d(TAG, "10249126 - updateWorkspaceScreenOrder(" + screenId + ", " + i + ")");
                     values[i] = v;
                 }
                 cr.bulkInsert(uri, values);
@@ -1585,6 +1587,7 @@
                 sBgItemsIdMap.clear();
                 sBgDbIconCache.clear();
                 sBgWorkspaceScreens.clear();
+                Log.d(TAG, "10249126 - loadWorkspace()");
 
                 final ArrayList<Long> itemsToRemove = new ArrayList<Long>();
                 final Uri contentUri = LauncherSettings.Favorites.CONTENT_URI;
@@ -1830,6 +1833,7 @@
                         long screenId = item.screenId;
                         if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP &&
                                 !sBgWorkspaceScreens.contains(screenId)) {
+                            Log.d(TAG, "10249126 - loadWorkspace-loadedOldDb(" + screenId + ")");
                             sBgWorkspaceScreens.add(screenId);
                             if (screenId > maxScreenId) {
                                 maxScreenId = screenId;
@@ -1878,6 +1882,7 @@
                     }
 
                     // Remove any empty screens
+                    Log.d(TAG, "10249126 - loadWorkspace-!loadedOldDb()");
                     ArrayList<Long> unusedScreens = new ArrayList<Long>();
                     unusedScreens.addAll(sBgWorkspaceScreens);
 
@@ -2043,7 +2048,7 @@
 
         private void bindWorkspaceScreens(final Callbacks oldCallbacks,
                 final ArrayList<Long> orderedScreens) {
-
+            Log.d(TAG, "10249126 - bindWorkspaceScreens()");
             final Runnable r = new Runnable() {
                 @Override
                 public void run() {
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 6989c9a..1d20277 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -514,6 +514,7 @@
     }
 
     public long insertNewWorkspaceScreen(long screenId, int insertIndex, boolean updateDb) {
+        Log.d(TAG, "10249126 - insertNewWorkspaceScreen(" + screenId + ", " + insertIndex + ", " + updateDb + ")");
         CellLayout newScreen = (CellLayout)
                 mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null);
 
@@ -529,6 +530,7 @@
     }
 
     public void createCustomContentPage() {
+        Log.d(TAG, "10249126 - createCustomContentPage()");
         CellLayout customScreen = (CellLayout)
                 mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null);
 
@@ -563,6 +565,7 @@
     }
 
     public long commitExtraEmptyScreen() {
+        Log.d(TAG, "10249126 - commitExtraEmptyScreen()");
         CellLayout cl = mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID);
         mWorkspaceScreens.remove(EXTRA_EMPTY_SCREEN_ID);
         mScreenOrder.remove(EXTRA_EMPTY_SCREEN_ID);
@@ -584,11 +587,13 @@
     }
 
     public CellLayout getScreenWithId(long screenId) {
+        Log.d(TAG, "10249126 - getScreenWithId(" + screenId + ")");
         CellLayout layout = mWorkspaceScreens.get(screenId);
         return layout;
     }
 
     public long getIdForScreen(CellLayout layout) {
+        Log.d(TAG, "10249126 - getIdForScreen()");
         Iterator<Long> iter = mWorkspaceScreens.keySet().iterator();
         while (iter.hasNext()) {
             long id = iter.next();
@@ -600,6 +605,7 @@
     }
 
     public int getPageIndexForScreenId(long screenId) {
+        Log.d(TAG, "10249126 - getPageIndexForScreenId(" + screenId + ")");
         return indexOfChild(mWorkspaceScreens.get(screenId));
     }
 
@@ -617,6 +623,8 @@
             return;
         }
 
+        Log.d(TAG, "10249126 - stripEmptyScreens()");
+
         int currentPage = getNextPage();
         ArrayList<Long> removeScreens = new ArrayList<Long>();
         for (Long id: mWorkspaceScreens.keySet()) {
@@ -686,6 +694,8 @@
         if (container == LauncherSettings.Favorites.CONTAINER_DESKTOP) {
             if (getScreenWithId(screenId) == null) {
                 Log.e(TAG, "Skipping child, screenId " + screenId + " not found");
+                // DEBUGGING - Print out the stack trace to see where we are adding from
+                new Throwable().printStackTrace();
                 return;
             }
         }
