diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 8d321e6..224ebbf 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -139,6 +139,8 @@
 
     // < only access in worker thread >
     AllAppsList mBgAllAppsList;
+    // Entire list of widgets.
+    WidgetsModel mBgWidgetsModel;
 
     // The lock that must be acquired before referencing any static bg data structures.  Unlike
     // other locks, this one can generally be held long-term because we never expect any of these
@@ -2768,12 +2770,14 @@
             @SuppressWarnings("unchecked")
             final ArrayList<AppInfo> list
                     = (ArrayList<AppInfo>) mBgAllAppsList.data.clone();
+            final WidgetsModel widgetList = mBgWidgetsModel.clone();
             Runnable r = new Runnable() {
                 public void run() {
                     final long t = SystemClock.uptimeMillis();
                     final Callbacks callbacks = tryGetCallbacks(oldCallbacks);
                     if (callbacks != null) {
                         callbacks.bindAllApplications(list);
+                        callbacks.bindAllPackages(widgetList);
                     }
                     if (DEBUG_LOADERS) {
                         Log.d(TAG, "bound all " + list.size() + " apps from cache in "
@@ -2787,8 +2791,6 @@
             } else {
                 mHandler.post(r);
             }
-            loadAndBindWidgetsAndShortcuts(mApp.getContext(), tryGetCallbacks(oldCallbacks),
-                    false /* refresh */);
         }
 
         private void loadAllApps() {
@@ -3321,6 +3323,7 @@
 
     public void loadAndBindWidgetsAndShortcuts(final Context context, final Callbacks callbacks,
             final boolean refresh) {
+
         runOnWorkerThread(new Runnable(){
             @Override
             public void run() {
@@ -3334,6 +3337,7 @@
                         }
                     }
                 });
+                mBgWidgetsModel = model;
                 // update the Widget entries inside DB on the worker thread.
                 LauncherAppState.getInstance().getWidgetCache().removeObsoletePreviews(
                         model.getRawList());
@@ -3342,9 +3346,9 @@
     }
 
     /**
-     *  Returns a list of ResolveInfos/AppWidgetInfos.
+     * Returns a list of ResolveInfos/AppWidgetInfos.
      *
-     *  @see #loadAndBindWidgetsAndShortcuts
+     * @see #loadAndBindWidgetsAndShortcuts
      */
     private WidgetsModel createWidgetsModel(Context context, boolean refresh) {
         PackageManager packageManager = context.getPackageManager();
diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java
index b72b981..fdb9795 100644
--- a/src/com/android/launcher3/model/WidgetsModel.java
+++ b/src/com/android/launcher3/model/WidgetsModel.java
@@ -3,15 +3,12 @@
 
 import android.content.Context;
 import android.content.pm.ResolveInfo;
-import android.os.Handler;
-import android.os.Process;
 import android.util.Log;
 
 import com.android.launcher3.IconCache;
 import com.android.launcher3.LauncherAppState;
 import com.android.launcher3.LauncherAppWidgetProviderInfo;
 
-import com.android.launcher3.LauncherModel;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.compat.UserHandleCompat;
 
@@ -20,7 +17,6 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * Widgets data model that is used by the adapters of the widget views and controllers.
@@ -33,24 +29,30 @@
     private static final boolean DEBUG = false;
 
     /* List of packages that is tracked by this model. */
-    private List<PackageItemInfo> mPackageItemInfos = new ArrayList<>();
+    private ArrayList<PackageItemInfo> mPackageItemInfos = new ArrayList<>();
 
     /* Map of widgets and shortcuts that are tracked per package. */
-    private Map<PackageItemInfo, ArrayList<Object>> mWidgetsList = new HashMap<>();
+    private HashMap<PackageItemInfo, ArrayList<Object>> mWidgetsList = new HashMap<>();
 
     private ArrayList<Object> mRawList;
 
     private final Comparator mWidgetAndShortcutNameComparator;
     private final Comparator mAppNameComparator;
-
     private final IconCache mIconCache;
-    private final Handler mWorkerHandler;
 
     public WidgetsModel(Context context) {
         mWidgetAndShortcutNameComparator = new WidgetsAndShortcutNameComparator(context);
         mAppNameComparator = (new AppNameComparator(context)).getAppInfoComparator();
         mIconCache = LauncherAppState.getInstance().getIconCache();
-        mWorkerHandler = new Handler(LauncherModel.getWorkerLooper());
+    }
+
+    private WidgetsModel(WidgetsModel model) {
+        mPackageItemInfos = (ArrayList<PackageItemInfo>) model.mPackageItemInfos.clone();
+        mWidgetsList = (HashMap<PackageItemInfo, ArrayList<Object>>) model.mWidgetsList.clone();
+        // mRawList is not copied as should not be needed.
+        mWidgetAndShortcutNameComparator = model.mWidgetAndShortcutNameComparator;
+        mAppNameComparator = model.mAppNameComparator;
+        mIconCache = model.mIconCache;
     }
 
     // Access methods that may be deleted if the private fields are made package-private.
@@ -122,4 +124,14 @@
             Collections.sort(mWidgetsList.get(p), mWidgetAndShortcutNameComparator);
         }
     }
+
+    /**
+     * Create a snapshot of the widgets model.
+     * <p>
+     * Usage case: view binding without being modified from package updates.
+     */
+    @Override
+    public WidgetsModel clone(){
+        return new WidgetsModel(this);
+    }
 }
\ No newline at end of file
