diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index d1284d8..57e0cbf 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -50,6 +50,7 @@
 import android.database.ContentObserver;
 import android.graphics.Bitmap;
 import android.graphics.Canvas;
+import android.graphics.Color;
 import android.graphics.PorterDuff;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
@@ -68,16 +69,31 @@
 import android.text.TextUtils;
 import android.text.method.TextKeyListener;
 import android.util.Log;
-import android.util.Pair;
-import android.view.*;
+import android.view.Display;
+import android.view.Gravity;
+import android.view.HapticFeedbackConstants;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.Surface;
+import android.view.View;
 import android.view.View.OnLongClickListener;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
+import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.animation.AccelerateDecelerateInterpolator;
 import android.view.animation.AccelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
 import android.view.inputmethod.InputMethodManager;
-import android.widget.*;
+import android.widget.Advanceable;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
 
 import com.android.launcher3.DropTarget.DragObject;
 
@@ -93,7 +109,6 @@
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index 275195b..dc04cee 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -44,6 +44,7 @@
 import android.view.ViewConfiguration;
 import android.view.ViewGroup;
 import android.view.ViewParent;
+import android.view.ViewGroup.LayoutParams;
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
 import android.view.accessibility.AccessibilityNodeInfo;
@@ -51,6 +52,7 @@
 import android.view.animation.DecelerateInterpolator;
 import android.view.animation.Interpolator;
 import android.view.animation.LinearInterpolator;
+import android.widget.FrameLayout;
 import android.widget.Scroller;
 
 import java.util.ArrayList;
@@ -121,7 +123,6 @@
     private int mLastScreenCenter = -1;
     private int[] mChildOffsets;
     private int[] mChildRelativeOffsets;
-    private int[] mChildOffsetsWithLayoutScale;
 
     protected final static int TOUCH_STATE_REST = 0;
     protected final static int TOUCH_STATE_SCROLLING = 1;
@@ -139,7 +140,6 @@
     protected int mTouchSlop;
     private int mPagingTouchSlop;
     private int mMaximumVelocity;
-    private int mMinimumWidth;
     protected int mPageSpacing;
     protected int mPageLayoutPaddingTop;
     protected int mPageLayoutPaddingBottom;
@@ -160,9 +160,6 @@
     // the screens from continuing to translate beyond the normal bounds.
     protected int mOverScrollX;
 
-    // parameter that adjusts the layout to be optimized for pages with that scale factor
-    protected float mLayoutScale = 1.0f;
-
     protected static final int INVALID_POINTER = -1;
 
     protected int mActivePointerId = INVALID_POINTER;
@@ -643,6 +640,31 @@
         return mTopAlignPageWhenShrinkingForBouncer;
     }
 
+    public static class LayoutParams extends ViewGroup.LayoutParams {
+        public boolean isFullScreenPage = false;
+
+        /**
+         * {@inheritDoc}
+         */
+        public LayoutParams(int width, int height) {
+            super(width, height);
+        }
+
+        public LayoutParams(ViewGroup.LayoutParams source) {
+            super(source);
+        }
+    }
+
+    protected LayoutParams generateDefaultLayoutParams() {
+        return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+    }
+
+    public void addFullScreenPage(View page, int width, int height) {
+        LayoutParams lp = generateDefaultLayoutParams();
+        lp.isFullScreenPage = true;
+        super.addView(page, 0, lp);
+    }
+
     @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         if (!mIsDataReady || getChildCount() == 0) {
@@ -699,24 +721,38 @@
             final LayoutParams lp = (LayoutParams) child.getLayoutParams();
 
             int childWidthMode;
-            if (lp.width == LayoutParams.WRAP_CONTENT) {
-                childWidthMode = MeasureSpec.AT_MOST;
+            int childHeightMode;
+            int childWidth;
+            int childHeight;
+
+            if (!lp.isFullScreenPage) {
+                if (lp.width == LayoutParams.WRAP_CONTENT) {
+                    childWidthMode = MeasureSpec.AT_MOST;
+                } else {
+                    childWidthMode = MeasureSpec.EXACTLY;
+                }
+
+                if (lp.height == LayoutParams.WRAP_CONTENT) {
+                    childHeightMode = MeasureSpec.AT_MOST;
+                } else {
+                    childHeightMode = MeasureSpec.EXACTLY;
+                }
+
+                childWidth = widthSize - horizontalPadding;
+                childHeight = heightSize - verticalPadding;
+
             } else {
                 childWidthMode = MeasureSpec.EXACTLY;
-            }
-
-            int childHeightMode;
-            if (lp.height == LayoutParams.WRAP_CONTENT) {
-                childHeightMode = MeasureSpec.AT_MOST;
-            } else {
                 childHeightMode = MeasureSpec.EXACTLY;
+
+                childWidth = getViewportWidth();
+                childHeight = getViewportHeight();
             }
 
             final int childWidthMeasureSpec =
-                MeasureSpec.makeMeasureSpec(widthSize - horizontalPadding, childWidthMode);
-            final int childHeightMeasureSpec =
-                MeasureSpec.makeMeasureSpec(heightSize - verticalPadding, childHeightMode);
-
+                    MeasureSpec.makeMeasureSpec(childWidth, childWidthMode);
+                final int childHeightMeasureSpec =
+                    MeasureSpec.makeMeasureSpec(childHeight, childHeightMode);
             child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
         }
         setMeasuredDimension(scaledWidthSize, scaledHeightSize);
@@ -726,12 +762,6 @@
         // ensure that the cache is filled with good values.
         invalidateCachedOffsets();
 
-        if (mScroller.isFinished() && mChildCountOnLastMeasure != getChildCount() &&
-                !mDeferringForDelete) {
-            setCurrentPage(getNextPage());
-        }
-        mChildCountOnLastMeasure = getChildCount();
-
         if (childCount > 0) {
             if (DEBUG) Log.d(TAG, "getRelativeChildOffset(): " + getViewportWidth() + ", "
                     + getChildWidth(0));
@@ -750,6 +780,12 @@
             }
         }
 
+        if (mScroller.isFinished() && mChildCountOnLastMeasure != getChildCount() &&
+                !mDeferringForDelete) {
+            setCurrentPage(getNextPage());
+        }
+        mChildCountOnLastMeasure = getChildCount();
+
         updateScrollingIndicatorPosition();
 
         if (childCount > 0) {
@@ -790,12 +826,20 @@
         int childLeft = offsetX + getRelativeChildOffset(startIndex);
         for (int i = startIndex; i != endIndex; i += delta) {
             final View child = getPageAt(i);
-            int childTop = offsetY + getPaddingTop();
-            if (mCenterPagesVertically) {
-                childTop += ((getViewportHeight() - verticalPadding) - child.getMeasuredHeight()) / 2;
+            LayoutParams lp = (LayoutParams) child.getLayoutParams();
+            int childTop;
+
+            if (lp.isFullScreenPage) {
+                childTop = offsetY;
+            } else {
+                childTop = offsetY + getPaddingTop();
+                if (mCenterPagesVertically) {
+                    childTop += ((getViewportHeight() - verticalPadding) - child.getMeasuredHeight()) / 2;
+                }
             }
+
             if (child.getVisibility() != View.GONE) {
-                final int childWidth = getScaledMeasuredWidth(child);
+                final int childWidth = child.getMeasuredWidth();
                 final int childHeight = child.getMeasuredHeight();
 
                 if (DEBUG) Log.d(TAG, "\tlayout-child" + i + ": " + childLeft + ", " + childTop);
@@ -838,6 +882,7 @@
         // in accordance with any scroll effects.
         mForceScreenScrolled = true;
         mRecomputePageSpacing = true;
+
         invalidate();
         invalidateCachedOffsets();
     }
@@ -854,17 +899,14 @@
         if (count == 0) {
             mChildOffsets = null;
             mChildRelativeOffsets = null;
-            mChildOffsetsWithLayoutScale = null;
             return;
         }
 
         mChildOffsets = new int[count];
         mChildRelativeOffsets = new int[count];
-        mChildOffsetsWithLayoutScale = new int[count];
         for (int i = 0; i < count; i++) {
             mChildOffsets[i] = -1;
             mChildRelativeOffsets[i] = -1;
-            mChildOffsetsWithLayoutScale[i] = -1;
         }
     }
 
@@ -872,8 +914,7 @@
         if (index < 0 || index > getChildCount() - 1) return 0;
 
         final boolean isRtl = isLayoutRtl();
-        int[] childOffsets = Float.compare(mLayoutScale, 1f) == 0 ?
-                mChildOffsets : mChildOffsetsWithLayoutScale;
+        int[] childOffsets = mChildOffsets;
 
         if (childOffsets != null && childOffsets[index] != -1) {
             return childOffsets[index];
@@ -881,20 +922,20 @@
             if (getChildCount() == 0)
                 return 0;
 
-
             final int startIndex = isRtl ? getChildCount() - 1 : 0;
             final int endIndex = isRtl ? index : index;
             final int delta = isRtl ? -1 : 1;
 
             int offset = getRelativeChildOffset(startIndex);
             for (int i = startIndex; i != endIndex; i += delta) {
-                offset += getScaledMeasuredWidth(getPageAt(i)) + mPageSpacing;
+                offset += getPageAt(i).getMeasuredWidth() + mPageSpacing;
             }
             if (childOffsets != null) {
                 childOffsets[index] = offset;
             }
             return offset;
         }
+
     }
 
     protected int getRelativeChildOffset(int index) {
@@ -913,15 +954,6 @@
         }
     }
 
-    protected int getScaledMeasuredWidth(View child) {
-        // This functions are called enough times that it actually makes a difference in the
-        // profiler -- so just inline the max() here
-        final int measuredWidth = child.getMeasuredWidth();
-        final int minWidth = mMinimumWidth;
-        final int maxWidth = (minWidth > measuredWidth) ? minWidth : measuredWidth;
-        return (int) (maxWidth * mLayoutScale + 0.5f);
-    }
-
     void boundByReorderablePages(boolean isReordering, int[] range) {
         // Do nothing
     }
@@ -1354,7 +1386,7 @@
     protected float getScrollProgress(int screenCenter, View v, int page) {
         final int halfScreenSize = getViewportWidth() / 2;
 
-        int totalDistance = getScaledMeasuredWidth(v) + mPageSpacing;
+        int totalDistance = v.getMeasuredWidth() + mPageSpacing;
         int delta = screenCenter - (getChildOffset(page) -
                 getRelativeChildOffset(page) + halfScreenSize);
 
@@ -1627,7 +1659,7 @@
                 velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
                 int velocityX = (int) velocityTracker.getXVelocity(activePointerId);
                 final int deltaX = (int) (x - mDownMotionX);
-                final int pageWidth = getScaledMeasuredWidth(getPageAt(mCurrentPage));
+                final int pageWidth = getPageAt(mCurrentPage).getMeasuredWidth();
                 boolean isSignificantMove = Math.abs(deltaX) > pageWidth *
                         SIGNIFICANT_MOVE_THRESHOLD;
 
@@ -1820,30 +1852,8 @@
         }
     }
 
-    protected int getChildIndexForRelativeOffset(int relativeOffset) {
-        final boolean isRtl = isLayoutRtl();
-        final int childCount = getChildCount();
-        int left;
-        int right;
-        final int startIndex = isRtl ? childCount - 1 : 0;
-        final int endIndex = isRtl ? -1 : childCount;
-        final int delta = isRtl ? -1 : 1;
-        for (int i = startIndex; i != endIndex; i += delta) {
-            left = getRelativeChildOffset(i);
-            right = (left + getScaledMeasuredWidth(getPageAt(i)));
-            if (left <= relativeOffset && relativeOffset <= right) {
-                return i;
-            }
-        }
-        return -1;
-    }
-
     protected int getChildWidth(int index) {
-        // This functions are called enough times that it actually makes a difference in the
-        // profiler -- so just inline the max() here
-        final int measuredWidth = getPageAt(index).getMeasuredWidth();
-        final int minWidth = mMinimumWidth;
-        return (minWidth > measuredWidth) ? minWidth : measuredWidth;
+        return getPageAt(index).getMeasuredWidth();
     }
 
     int getPageNearestToPoint(float x) {
@@ -1865,7 +1875,7 @@
         final int childCount = getChildCount();
         for (int i = 0; i < childCount; ++i) {
             View layout = (View) getPageAt(i);
-            int childWidth = getScaledMeasuredWidth(layout);
+            int childWidth = layout.getMeasuredWidth();
             int halfChildWidth = (childWidth / 2);
             int childCenter = getViewportOffsetX() + getChildOffset(i) + halfChildWidth;
             int distanceFromScreenCenter = Math.abs(childCenter - screenCenter);
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index d9582ad..1c86364 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -528,7 +528,6 @@
         mScreenOrder.add(0, CUSTOM_CONTENT_SCREEN_ID);
         addView(customScreen, 0);
 
-
         // Ensure that the current page and default page are maintained.
         mDefaultPage++;
         setCurrentPage(getCurrentPage() + 1);
@@ -691,7 +690,7 @@
             child.setOnKeyListener(new IconKeyEventListener());
         }
 
-        LayoutParams genericLp = child.getLayoutParams();
+        ViewGroup.LayoutParams genericLp = child.getLayoutParams();
         CellLayout.LayoutParams lp;
         if (genericLp == null || !(genericLp instanceof CellLayout.LayoutParams)) {
             lp = new CellLayout.LayoutParams(x, y, spanX, spanY);
@@ -984,17 +983,10 @@
         // Set wallpaper offset steps (1 / (number of screens - 1))
         mWallpaperManager.setWallpaperOffsetSteps(1.0f / (getChildCount() - 1), 1.0f);
 
-        // For the purposes of computing the scrollRange and overScrollOffset, we assume
-        // that mLayoutScale is 1. This means that when we're in spring-loaded mode,
-        // there's no discrepancy between the wallpaper offset for a given page.
-        float layoutScale = mLayoutScale;
-        mLayoutScale = 1f;
         int scrollRange = getScrollRange();
 
-        // Again, we adjust the wallpaper offset to be consistent between values of mLayoutScale
         float adjustedScrollX = Math.max(0, Math.min(getScrollX(), mMaxScrollX));
         adjustedScrollX *= mWallpaperScrollRatio;
-        mLayoutScale = layoutScale;
 
         float scrollProgress =
             adjustedScrollX / (float) scrollRange;
@@ -1048,24 +1040,6 @@
         }
     }
 
-    @Override
-    protected void updateCurrentPageScroll() {
-        super.updateCurrentPageScroll();
-        computeWallpaperScrollRatio(mCurrentPage);
-    }
-
-    @Override
-    protected void snapToPage(int whichPage) {
-        super.snapToPage(whichPage);
-        computeWallpaperScrollRatio(whichPage);
-    }
-
-    @Override
-    protected void snapToPage(int whichPage, int duration) {
-        super.snapToPage(whichPage, duration);
-        computeWallpaperScrollRatio(whichPage);
-    }
-
     protected void snapToPage(int whichPage, Runnable r) {
         if (mDelayedSnapToPageRunnable != null) {
             mDelayedSnapToPageRunnable.run();
@@ -1078,22 +1052,6 @@
         snapToPage(getPageIndexForScreenId(screenId), r);
     }
 
-    private void computeWallpaperScrollRatio(int page) {
-        // Here, we determine what the desired scroll would be with and without a layout scale,
-        // and compute a ratio between the two. This allows us to adjust the wallpaper offset
-        // as though there is no layout scale.
-        float layoutScale = mLayoutScale;
-        int scaled = getChildOffset(page) - getRelativeChildOffset(page);
-        mLayoutScale = 1.0f;
-        float unscaled = getChildOffset(page) - getRelativeChildOffset(page);
-        mLayoutScale = layoutScale;
-        if (scaled > 0) {
-            mWallpaperScrollRatio = (1.0f * unscaled) / scaled;
-        } else {
-            mWallpaperScrollRatio = 1f;
-        }
-    }
-
     class WallpaperOffsetInterpolator {
         float mFinalHorizontalWallpaperOffset = 0.0f;
         float mFinalVerticalWallpaperOffset = 0.5f;
