diff --git a/src/com/android/launcher3/model/WidgetsModel.java b/src/com/android/launcher3/model/WidgetsModel.java
index 5051e62..99a53ff 100644
--- a/src/com/android/launcher3/model/WidgetsModel.java
+++ b/src/com/android/launcher3/model/WidgetsModel.java
@@ -3,7 +3,6 @@
 
 import android.content.ComponentName;
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.util.Log;
 
@@ -17,7 +16,6 @@
 import com.android.launcher3.compat.AlphabeticIndexCompat;
 import com.android.launcher3.compat.AppWidgetManagerCompat;
 import com.android.launcher3.compat.UserHandleCompat;
-import com.android.launcher3.util.ComponentKey;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -41,11 +39,7 @@
     /* Map of widgets and shortcuts that are tracked per package. */
     private final HashMap<PackageItemInfo, ArrayList<Object>> mWidgetsList;
 
-    /* Labels of widgets */
-    private final HashMap<ComponentKey, CharSequence> mLabels;
-
     private final AppWidgetManagerCompat mAppWidgetMgr;
-    private final PackageManager mPackageMgr;
     private final WidgetsAndShortcutNameComparator mWidgetAndShortcutNameComparator;
     private final Comparator<ItemInfo> mAppNameComparator;
     private final IconCache mIconCache;
@@ -56,7 +50,6 @@
 
     public WidgetsModel(Context context,  IconCache iconCache, AppFilter appFilter) {
         mAppWidgetMgr = AppWidgetManagerCompat.getInstance(context);
-        mPackageMgr = context.getPackageManager();
         mWidgetAndShortcutNameComparator = new WidgetsAndShortcutNameComparator(context);
         mAppNameComparator = (new AppNameComparator(context)).getAppInfoComparator();
         mIconCache = iconCache;
@@ -64,14 +57,13 @@
         mIndexer = new AlphabeticIndexCompat(context);
         mPackageItemInfos = new ArrayList<>();
         mWidgetsList = new HashMap<>();
+
         mRawList = new ArrayList<>();
-        mLabels = new HashMap<>();
     }
 
     @SuppressWarnings("unchecked")
     private WidgetsModel(WidgetsModel model) {
         mAppWidgetMgr = model.mAppWidgetMgr;
-        mPackageMgr = model.mPackageMgr;
         mPackageItemInfos = (ArrayList<PackageItemInfo>) model.mPackageItemInfos.clone();
         mWidgetsList = (HashMap<PackageItemInfo, ArrayList<Object>>) model.mWidgetsList.clone();
         mWidgetAndShortcutNameComparator = model.mWidgetAndShortcutNameComparator;
@@ -80,7 +72,6 @@
         mAppFilter = model.mAppFilter;
         mIndexer = model.mIndexer;
         mRawList = (ArrayList<Object>) model.mRawList.clone();
-        mLabels = (HashMap<ComponentKey, CharSequence>) model.mLabels.clone();
     }
 
     // Access methods that may be deleted if the private fields are made package-private.
@@ -96,22 +87,6 @@
         return mPackageItemInfos.get(pos);
     }
 
-    public CharSequence getLabel(Object info) {
-        ComponentKey key;
-        if (info instanceof LauncherAppWidgetProviderInfo) {
-            key = new ComponentKey(((LauncherAppWidgetProviderInfo) info).provider,
-                    mAppWidgetMgr.getUser(((LauncherAppWidgetProviderInfo) info)));
-            return mLabels.get(key);
-        } else if (info instanceof ResolveInfo) {
-            ResolveInfo ri = (ResolveInfo) info;
-            ComponentName componentName = new ComponentName(ri.activityInfo.packageName,
-                    ri.activityInfo.name);
-            key = new ComponentKey(componentName, UserHandleCompat.myUserHandle());
-            return mLabels.get(key);
-        }
-        return null;
-    }
-
     public List<Object> getSortedWidgets(int pos) {
         return mWidgetsList.get(mPackageItemInfos.get(pos));
     }
@@ -134,7 +109,6 @@
         // clear the lists.
         mWidgetsList.clear();
         mPackageItemInfos.clear();
-        mLabels.clear();
         mWidgetAndShortcutNameComparator.reset();
 
         InvariantDeviceProfile idp = LauncherAppState.getInstance().getInvariantDeviceProfile();
@@ -144,7 +118,6 @@
             String packageName = "";
             UserHandleCompat userHandle = null;
             ComponentName componentName = null;
-            ComponentKey key = null;
             if (o instanceof LauncherAppWidgetProviderInfo) {
                 LauncherAppWidgetProviderInfo widgetInfo = (LauncherAppWidgetProviderInfo) o;
 
@@ -164,16 +137,12 @@
                     }
                     continue;
                 }
-                key = new ComponentKey(componentName, userHandle);
-                mLabels.put(key, mAppWidgetMgr.loadLabel(widgetInfo));
             } else if (o instanceof ResolveInfo) {
                 ResolveInfo resolveInfo = (ResolveInfo) o;
                 componentName = new ComponentName(resolveInfo.activityInfo.packageName,
                         resolveInfo.activityInfo.name);
                 packageName = resolveInfo.activityInfo.packageName;
                 userHandle = UserHandleCompat.myUserHandle();
-                key = new ComponentKey(componentName, userHandle);
-                mLabels.put(key, resolveInfo.loadLabel(mPackageMgr));
             }
 
             if (componentName == null || userHandle == null) {
diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java
index 75c84c3..94bbd92 100644
--- a/src/com/android/launcher3/widget/WidgetCell.java
+++ b/src/com/android/launcher3/widget/WidgetCell.java
@@ -136,23 +136,32 @@
     }
 
     /**
-     * Apply the widget provider info or the resolve info to the view.
+     * Apply the widget provider info to the view.
      */
-    public void applyFromInfo(Object info, CharSequence label,
-                                               WidgetPreviewLoader loader) {
+    public void applyFromAppWidgetProviderInfo(LauncherAppWidgetProviderInfo info,
+            WidgetPreviewLoader loader) {
+
+        InvariantDeviceProfile profile =
+                LauncherAppState.getInstance().getInvariantDeviceProfile();
         mInfo = info;
-        mWidgetName.setText(label);
+        // TODO(hyunyoungs): setup a cache for these labels.
+        mWidgetName.setText(AppWidgetManagerCompat.getInstance(getContext()).loadLabel(info));
+        int hSpan = Math.min(info.spanX, profile.numColumns);
+        int vSpan = Math.min(info.spanY, profile.numRows);
+        mWidgetDims.setText(String.format(mDimensionsFormatString, hSpan, vSpan));
         mWidgetPreviewLoader = loader;
-        if (info instanceof LauncherAppWidgetProviderInfo) {
-            InvariantDeviceProfile profile =
-                    LauncherAppState.getInstance().getInvariantDeviceProfile();
-            int hSpan = Math.min(((LauncherAppWidgetProviderInfo)info).spanX, profile.numColumns);
-            int vSpan = Math.min(((LauncherAppWidgetProviderInfo)info).spanY, profile.numRows);
-            mWidgetDims.setText(String.format(mDimensionsFormatString, hSpan, vSpan));
-        }
-        if (info instanceof ResolveInfo) {
-            mWidgetDims.setText(String.format(mDimensionsFormatString, 1, 1));
-        }
+    }
+
+    /**
+     * Apply the resolve info to the view.
+     */
+    public void applyFromResolveInfo(
+            PackageManager pm, ResolveInfo info, WidgetPreviewLoader loader) {
+        mInfo = info;
+        CharSequence label = info.loadLabel(pm);
+        mWidgetName.setText(label);
+        mWidgetDims.setText(String.format(mDimensionsFormatString, 1, 1));
+        mWidgetPreviewLoader = loader;
     }
 
     public int[] getPreviewSize() {
diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java
index 0173eb7..03410ed 100644
--- a/src/com/android/launcher3/widget/WidgetsContainerView.java
+++ b/src/com/android/launcher3/widget/WidgetsContainerView.java
@@ -55,9 +55,6 @@
     private static final String TAG = "WidgetsContainerView";
     private static final boolean LOGD = false;
 
-    /* Coefficient multiplied to the screen height for preloading widgets. */
-    private static final int PRELOAD_SCREEN_HEIGHT_MULTIPLE = 1;
-
     /* Global instances that are used inside this container. */
     @Thunk Launcher mLauncher;
     private DragController mDragController;
@@ -97,16 +94,7 @@
         super.onFinishInflate();
         mRecyclerView = (WidgetsRecyclerView) getContentView().findViewById(R.id.widgets_list_view);
         mRecyclerView.setAdapter(mAdapter);
-
-        // This extends the layout space so that preloading happen for the {@link RecyclerView}
-        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()) {
-            @Override
-            protected int getExtraLayoutSpace(State state) {
-                DeviceProfile grid = mLauncher.getDeviceProfile();
-                return super.getExtraLayoutSpace(state)
-                        + grid.availableHeightPx * PRELOAD_SCREEN_HEIGHT_MULTIPLE;
-            }
-        });
+        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
     }
 
     //
diff --git a/src/com/android/launcher3/widget/WidgetsListAdapter.java b/src/com/android/launcher3/widget/WidgetsListAdapter.java
index f2d0027..885d96f 100644
--- a/src/com/android/launcher3/widget/WidgetsListAdapter.java
+++ b/src/com/android/launcher3/widget/WidgetsListAdapter.java
@@ -139,13 +139,17 @@
         }
         for (int i=0; i < infoList.size(); i++) {
             WidgetCell widget = (WidgetCell) row.getChildAt(i);
-            Object info = infoList.get(i);
-            if (info instanceof LauncherAppWidgetProviderInfo) {
-                widget.setTag(new PendingAddWidgetInfo(mLauncher, (LauncherAppWidgetProviderInfo)info, null));
-            } else if (info instanceof ResolveInfo) {
-                widget.setTag(new PendingAddShortcutInfo(((ResolveInfo) info).activityInfo));
+            if (infoList.get(i) instanceof LauncherAppWidgetProviderInfo) {
+                LauncherAppWidgetProviderInfo info = (LauncherAppWidgetProviderInfo) infoList.get(i);
+                PendingAddWidgetInfo pawi = new PendingAddWidgetInfo(mLauncher, info, null);
+                widget.setTag(pawi);
+                widget.applyFromAppWidgetProviderInfo(info, mWidgetPreviewLoader);
+            } else if (infoList.get(i) instanceof ResolveInfo) {
+                ResolveInfo info = (ResolveInfo) infoList.get(i);
+                PendingAddShortcutInfo pasi = new PendingAddShortcutInfo(info.activityInfo);
+                widget.setTag(pasi);
+                widget.applyFromResolveInfo(mLauncher.getPackageManager(), info, mWidgetPreviewLoader);
             }
-            widget.applyFromInfo(info, mWidgetsModel.getLabel(info), mWidgetPreviewLoader);
             widget.ensurePreview();
             widget.setVisibility(View.VISIBLE);
         }
