diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 7f63f7b..5dac3b3 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -88,6 +88,7 @@
 import android.view.Window;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityEvent;
+import android.view.animation.OvershootInterpolator;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.Advanceable;
 import android.widget.FrameLayout;
@@ -160,14 +161,14 @@
     private static final int WORKSPACE_BACKGROUND_TRANSPARENT = 1;
     private static final int WORKSPACE_BACKGROUND_BLACK = 2;
 
+    private static final float BOUNCE_ANIMATION_TENSION = 1.3f;
+
     /**
      * IntentStarter uses request codes starting with this. This must be greater than all activity
      * request codes used internally.
      */
     protected static final int REQUEST_LAST = 100;
 
-    static final String EXTRA_SHORTCUT_DUPLICATE = "duplicate";
-
     static final int SCREEN_COUNT = 5;
 
     // To turn on these properties, type
@@ -552,6 +553,35 @@
                 }
             }
         });
+        mLauncherCallbacks.setLauncherSearchCallback(new Launcher.LauncherSearchCallbacks() {
+            private boolean mImportanceStored = false;
+            private int mWorkspaceImportanceForAccessibility =
+                View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
+            private int mHotseatImportanceForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_AUTO;
+
+            @Override
+            public void onSearchOverlayOpened() {
+                if (mImportanceStored) {
+                    return;
+                }
+                // The underlying workspace and hotseat are temporarily suppressed by the search
+                // overlay. So they sholudn't be accessible.
+                mWorkspaceImportanceForAccessibility = mWorkspace.getImportantForAccessibility();
+                mHotseatImportanceForAccessibility = mHotseat.getImportantForAccessibility();
+                mWorkspace.setImportantForAccessibility(
+                    View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+                mHotseat.setImportantForAccessibility(
+                    View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS);
+                mImportanceStored = true;
+            }
+
+            @Override
+            public void onSearchOverlayClosed() {
+                mWorkspace.setImportantForAccessibility(mWorkspaceImportanceForAccessibility);
+                mHotseat.setImportantForAccessibility(mHotseatImportanceForAccessibility);
+                mImportanceStored = false;
+            }
+        });
         return true;
     }
 
@@ -947,8 +977,8 @@
         }
 
         // Background was set to gradient in onPause(), restore to transparent if in all apps.
-        setWorkspaceBackground(mState == State.WORKSPACE ? WORKSPACE_BACKGROUND_TRANSPARENT
-                : WORKSPACE_BACKGROUND_GRADIENT);
+        setWorkspaceBackground(mState == State.WORKSPACE ? WORKSPACE_BACKGROUND_GRADIENT
+                : WORKSPACE_BACKGROUND_TRANSPARENT);
 
         mPaused = false;
         if (mRestoring || mOnResumeNeedsLoad) {
@@ -1099,6 +1129,18 @@
         public void dismissAllApps();
     }
 
+    public interface LauncherSearchCallbacks {
+        /**
+         * Called when the search overlay is shown.
+         */
+        public void onSearchOverlayOpened();
+
+        /**
+         * Called when the search overlay is dismissed.
+         */
+        public void onSearchOverlayClosed();
+    }
+
     public interface LauncherOverlayCallbacks {
         /**
          * This method indicates whether a call to {@link #enterFullImmersion()} will succeed,
@@ -4086,7 +4128,7 @@
                 PropertyValuesHolder.ofFloat("scaleY", 1f));
         bounceAnim.setDuration(InstallShortcutReceiver.NEW_SHORTCUT_BOUNCE_DURATION);
         bounceAnim.setStartDelay(i * InstallShortcutReceiver.NEW_SHORTCUT_STAGGER_DELAY);
-        bounceAnim.setInterpolator(new SmoothPagedView.OvershootInterpolator());
+        bounceAnim.setInterpolator(new OvershootInterpolator(BOUNCE_ANIMATION_TENSION));
         return bounceAnim;
     }
 
diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java
index 6ff7666..6a248a3 100644
--- a/src/com/android/launcher3/LauncherAnimUtils.java
+++ b/src/com/android/launcher3/LauncherAnimUtils.java
@@ -26,6 +26,9 @@
 import android.view.View;
 import android.view.ViewAnimationUtils;
 import android.view.ViewTreeObserver;
+
+import com.android.launcher3.util.UiThreadCircularReveal;
+
 import java.util.HashSet;
 import java.util.WeakHashMap;
 
@@ -130,13 +133,11 @@
     }
 
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
-    public static Animator createCircularReveal(View view, int centerX,
+    public static ValueAnimator createCircularReveal(View view, int centerX,
             int centerY, float startRadius, float endRadius) {
-        Animator anim = ViewAnimationUtils.createCircularReveal(view, centerX,
+        ValueAnimator anim = UiThreadCircularReveal.createCircularReveal(view, centerX,
                 centerY, startRadius, endRadius);
-        if (anim instanceof ValueAnimator) {
-            new FirstFrameAnimatorHelper((ValueAnimator) anim, view);
-        }
+        new FirstFrameAnimatorHelper(anim, view);
         return anim;
     }
 }
diff --git a/src/com/android/launcher3/LauncherCallbacks.java b/src/com/android/launcher3/LauncherCallbacks.java
index 0124d1f..a5f36ba 100644
--- a/src/com/android/launcher3/LauncherCallbacks.java
+++ b/src/com/android/launcher3/LauncherCallbacks.java
@@ -119,4 +119,11 @@
      */
     public void setLauncherAppsCallback(Object callbacks);
 
+    /**
+     * Sets the callbacks to allow reacting the actions of search overlays of the launcher.
+     *
+     * @param callbacks A set of callbacks to the Launcher, is actually a LauncherSearchCallback,
+     *                  but for implementation purposes is passed around as an object.
+     */
+    public void setLauncherSearchCallback(Object callbacks);
 }
diff --git a/src/com/android/launcher3/LauncherExtension.java b/src/com/android/launcher3/LauncherExtension.java
index 14ad601..09a105b 100644
--- a/src/com/android/launcher3/LauncherExtension.java
+++ b/src/com/android/launcher3/LauncherExtension.java
@@ -289,6 +289,11 @@
             // Do nothing
         }
 
+        @Override
+        public void setLauncherSearchCallback(Object callbacks) {
+            // Do nothing
+        }
+
         class LauncherExtensionOverlay implements LauncherOverlay {
             LauncherOverlayCallbacks mLauncherOverlayCallbacks;
             ViewGroup mOverlayView;
diff --git a/src/com/android/launcher3/LauncherStateTransitionAnimation.java b/src/com/android/launcher3/LauncherStateTransitionAnimation.java
index f373fde..a006d14 100644
--- a/src/com/android/launcher3/LauncherStateTransitionAnimation.java
+++ b/src/com/android/launcher3/LauncherStateTransitionAnimation.java
@@ -26,12 +26,14 @@
 import android.content.res.Resources;
 import android.util.Log;
 import android.view.View;
-import android.view.ViewAnimationUtils;
 import android.view.animation.AccelerateInterpolator;
 import android.view.animation.DecelerateInterpolator;
+
 import com.android.launcher3.allapps.AllAppsContainerView;
+import com.android.launcher3.util.UiThreadCircularReveal;
 import com.android.launcher3.util.Thunk;
 import com.android.launcher3.widget.WidgetsContainerView;
+
 import java.util.HashMap;
 
 /**
@@ -320,7 +322,7 @@
                 float startRadius = pCb.getMaterialRevealViewStartFinalRadius();
                 AnimatorListenerAdapter listener = pCb.getMaterialRevealViewAnimatorListener(
                         revealView, allAppsButtonView);
-                Animator reveal = ViewAnimationUtils.createCircularReveal(revealView, width / 2,
+                Animator reveal = UiThreadCircularReveal.createCircularReveal(revealView, width / 2,
                         height / 2, startRadius, revealRadius);
                 reveal.setDuration(revealDuration);
                 reveal.setInterpolator(new LogDecelerateInterpolator(100, 0));
@@ -587,14 +589,14 @@
                 TimeInterpolator decelerateInterpolator = material ?
                         new LogDecelerateInterpolator(100, 0) :
                         new DecelerateInterpolator(1f);
-                ObjectAnimator panelDriftY = LauncherAnimUtils.ofFloat(revealView, "translationY",
+                ObjectAnimator panelDriftY = ObjectAnimator.ofFloat(revealView, "translationY",
                         0, revealViewToYDrift);
                 panelDriftY.setDuration(revealDuration - SINGLE_FRAME_DELAY);
                 panelDriftY.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY);
                 panelDriftY.setInterpolator(decelerateInterpolator);
                 mStateAnimation.play(panelDriftY);
 
-                ObjectAnimator panelDriftX = LauncherAnimUtils.ofFloat(revealView, "translationX",
+                ObjectAnimator panelDriftX = ObjectAnimator.ofFloat(revealView, "translationX",
                         0, revealViewToXDrift);
                 panelDriftX.setDuration(revealDuration - SINGLE_FRAME_DELAY);
                 panelDriftX.setStartDelay(itemsAlphaStagger + SINGLE_FRAME_DELAY);
@@ -605,7 +607,7 @@
                 final float revealViewToAlpha = !material ? 0f :
                         pCb.getMaterialRevealViewFinalAlpha(revealView);
                 if (revealViewToAlpha != 1f) {
-                    ObjectAnimator panelAlpha = LauncherAnimUtils.ofFloat(revealView, "alpha",
+                    ObjectAnimator panelAlpha = ObjectAnimator.ofFloat(revealView, "alpha",
                             1f, revealViewToAlpha);
                     panelAlpha.setDuration(material ? revealDuration : 150);
                     panelAlpha.setStartDelay(material ? 0 : itemsAlphaStagger + SINGLE_FRAME_DELAY);
@@ -617,7 +619,7 @@
                 layerViews.put(contentView, BUILD_AND_SET_LAYER);
 
                 // Create the individual animators
-                ObjectAnimator pageDrift = LauncherAnimUtils.ofFloat(contentView, "translationY",
+                ObjectAnimator pageDrift = ObjectAnimator.ofFloat(contentView, "translationY",
                         0, revealViewToYDrift);
                 contentView.setTranslationY(0);
                 pageDrift.setDuration(revealDuration - SINGLE_FRAME_DELAY);
@@ -626,7 +628,7 @@
                 mStateAnimation.play(pageDrift);
 
                 contentView.setAlpha(1f);
-                ObjectAnimator itemsAlpha = LauncherAnimUtils.ofFloat(contentView, "alpha", 1f, 0f);
+                ObjectAnimator itemsAlpha = ObjectAnimator.ofFloat(contentView, "alpha", 1f, 0f);
                 itemsAlpha.setDuration(100);
                 itemsAlpha.setInterpolator(decelerateInterpolator);
                 mStateAnimation.play(itemsAlpha);
@@ -636,9 +638,8 @@
                     float finalRadius = pCb.getMaterialRevealViewStartFinalRadius();
                     AnimatorListenerAdapter listener =
                             pCb.getMaterialRevealViewAnimatorListener(revealView, allAppsButtonView);
-                    Animator reveal =
-                            LauncherAnimUtils.createCircularReveal(revealView, width / 2,
-                                    height / 2, revealRadius, finalRadius);
+                    Animator reveal = UiThreadCircularReveal.createCircularReveal(revealView, width / 2,
+                            height / 2, revealRadius, finalRadius);
                     reveal.setInterpolator(new LogDecelerateInterpolator(100, 0));
                     reveal.setDuration(revealDuration);
                     reveal.setStartDelay(itemsAlphaStagger);
@@ -782,4 +783,4 @@
             mStateAnimation = null;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java
index dda9a16..f099044 100644
--- a/src/com/android/launcher3/PagedView.java
+++ b/src/com/android/launcher3/PagedView.java
@@ -146,7 +146,6 @@
     protected OnLongClickListener mLongClickListener;
 
     protected int mTouchSlop;
-    private int mPagingTouchSlop;
     private int mMaximumVelocity;
     protected int mPageLayoutWidthGap;
     protected int mPageLayoutHeightGap;
@@ -172,14 +171,6 @@
     // If true, modify alpha of neighboring pages as user scrolls left/right
     protected boolean mFadeInAdjacentScreens = false;
 
-    // It true, use a different slop parameter (pagingTouchSlop = 2 * touchSlop) for deciding
-    // to switch to a new page
-    protected boolean mUsePagingTouchSlop = true;
-
-    // If true, the subclass should directly update scrollX itself in its computeScroll method
-    // (SmoothPagedView does this)
-    protected boolean mDeferScrollUpdate = false;
-
     protected boolean mIsPageMoving = false;
 
     private boolean mWasInOverscroll = false;
@@ -264,7 +255,6 @@
 
         final ViewConfiguration configuration = ViewConfiguration.get(getContext());
         mTouchSlop = configuration.getScaledPagingTouchSlop();
-        mPagingTouchSlop = configuration.getScaledPagingTouchSlop();
         mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
         mDensity = getResources().getDisplayMetrics().density;
 
@@ -1434,25 +1424,20 @@
         if (!isTouchPointInViewportWithBuffer((int) x, (int) y)) return;
 
         final int xDiff = (int) Math.abs(x - mLastMotionX);
-        final int yDiff = (int) Math.abs(y - mLastMotionY);
 
         final int touchSlop = Math.round(touchSlopScale * mTouchSlop);
-        boolean xPaged = xDiff > mPagingTouchSlop;
         boolean xMoved = xDiff > touchSlop;
-        boolean yMoved = yDiff > touchSlop;
 
-        if (xMoved || xPaged || yMoved) {
-            if (mUsePagingTouchSlop ? xPaged : xMoved) {
-                // Scroll if the user moved far enough along the X axis
-                mTouchState = TOUCH_STATE_SCROLLING;
-                mTotalMotionX += Math.abs(mLastMotionX - x);
-                mLastMotionX = x;
-                mLastMotionXRemainder = 0;
-                mTouchX = getViewportOffsetX() + getScrollX();
-                mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
-                onScrollInteractionBegin();
-                pageBeginMoving();
-            }
+        if (xMoved) {
+            // Scroll if the user moved far enough along the X axis
+            mTouchState = TOUCH_STATE_SCROLLING;
+            mTotalMotionX += Math.abs(mLastMotionX - x);
+            mLastMotionX = x;
+            mLastMotionXRemainder = 0;
+            mTouchX = getViewportOffsetX() + getScrollX();
+            mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
+            onScrollInteractionBegin();
+            pageBeginMoving();
         }
     }
 
@@ -1697,12 +1682,7 @@
                 if (Math.abs(deltaX) >= 1.0f) {
                     mTouchX += deltaX;
                     mSmoothingTime = System.nanoTime() / NANOTIME_DIV;
-                    if (!mDeferScrollUpdate) {
-                        scrollBy((int) deltaX, 0);
-                        if (DEBUG) Log.d(TAG, "onTouchEvent().Scrolling: " + deltaX);
-                    } else {
-                        invalidate();
-                    }
+                    scrollBy((int) deltaX, 0);
                     mLastMotionX = x;
                     mLastMotionXRemainder = deltaX - (int) deltaX;
                 } else {
@@ -2098,7 +2078,7 @@
         snapToPage(whichPage, delta, duration);
     }
 
-    protected void snapToPage(int whichPage) {
+    public void snapToPage(int whichPage) {
         snapToPage(whichPage, getPageSnapDuration());
     }
 
diff --git a/src/com/android/launcher3/SmoothPagedView.java b/src/com/android/launcher3/SmoothPagedView.java
deleted file mode 100644
index 0f9b23c..0000000
--- a/src/com/android/launcher3/SmoothPagedView.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.animation.Interpolator;
-
-public abstract class SmoothPagedView extends PagedView {
-    private static final float SMOOTHING_SPEED = 0.75f;
-    private static final float SMOOTHING_CONSTANT = (float) (0.016 / Math.log(SMOOTHING_SPEED));
-
-    private float mBaseLineFlingVelocity;
-    private float mFlingVelocityInfluence;
-
-    static final int DEFAULT_MODE = 0;
-    static final int X_LARGE_MODE = 1;
-
-    int mScrollMode;
-
-    private Interpolator mScrollInterpolator;
-
-    public static class OvershootInterpolator implements Interpolator {
-        private static final float DEFAULT_TENSION = 1.3f;
-        private float mTension;
-
-        public OvershootInterpolator() {
-            mTension = DEFAULT_TENSION;
-        }
-
-        public void setDistance(int distance) {
-            mTension = distance > 0 ? DEFAULT_TENSION / distance : DEFAULT_TENSION;
-        }
-
-        public void disableSettle() {
-            mTension = 0.f;
-        }
-
-        public float getInterpolation(float t) {
-            t -= 1.0f;
-            return t * t * ((mTension + 1) * t + mTension) + 1.0f;
-        }
-    }
-
-    /**
-     * Used to inflate the Workspace from XML.
-     *
-     * @param context The application's context.
-     * @param attrs The attributes set containing the Workspace's customization values.
-     */
-    public SmoothPagedView(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    /**
-     * Used to inflate the Workspace from XML.
-     *
-     * @param context The application's context.
-     * @param attrs The attributes set containing the Workspace's customization values.
-     * @param defStyle Unused.
-     */
-    public SmoothPagedView(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-
-        mUsePagingTouchSlop = false;
-
-        // This means that we'll take care of updating the scroll parameter ourselves (we do it
-        // in computeScroll), we only do this in the OVERSHOOT_MODE, ie. on phones
-        mDeferScrollUpdate = mScrollMode != X_LARGE_MODE;
-    }
-
-    protected int getScrollMode() {
-        return X_LARGE_MODE;
-    }
-
-    /**
-     * Initializes various states for this workspace.
-     */
-    @Override
-    protected void init() {
-        super.init();
-
-        mScrollMode = getScrollMode();
-        if (mScrollMode == DEFAULT_MODE) {
-            mBaseLineFlingVelocity = 2500.0f;
-            mFlingVelocityInfluence = 0.4f;
-            mScrollInterpolator = new OvershootInterpolator();
-            setDefaultInterpolator(mScrollInterpolator);
-        }
-    }
-
-    @Override
-    protected void snapToDestination() {
-        if (mScrollMode == X_LARGE_MODE) {
-            super.snapToDestination();
-        } else {
-            snapToPageWithVelocity(getPageNearestToCenterOfScreen(), 0);
-        }
-    }
-
-    @Override
-    protected void snapToPageWithVelocity(int whichPage, int velocity) {
-        if (mScrollMode == X_LARGE_MODE) {
-            super.snapToPageWithVelocity(whichPage, velocity);
-        } else {
-            snapToPageWithVelocity(whichPage, 0, true);
-        }
-    }
-
-    private void snapToPageWithVelocity(int whichPage, int velocity, boolean settle) {
-            // if (!mScroller.isFinished()) return;
-
-        whichPage = Math.max(0, Math.min(whichPage, getChildCount() - 1));
-
-        final int screenDelta = Math.max(1, Math.abs(whichPage - mCurrentPage));
-        final int newX = getScrollForPage(whichPage);
-        final int delta = newX - mUnboundedScrollX;
-        int duration = (screenDelta + 1) * 100;
-
-        if (!mScroller.isFinished()) {
-            mScroller.abortAnimation();
-        }
-
-        if (settle) {
-            ((OvershootInterpolator) mScrollInterpolator).setDistance(screenDelta);
-        } else {
-            ((OvershootInterpolator) mScrollInterpolator).disableSettle();
-        }
-
-        velocity = Math.abs(velocity);
-        if (velocity > 0) {
-            duration += (duration / (velocity / mBaseLineFlingVelocity)) * mFlingVelocityInfluence;
-        } else {
-            duration += 100;
-        }
-
-        snapToPage(whichPage, delta, duration);
-    }
-
-    @Override
-    public void snapToPage(int whichPage) {
-       if (mScrollMode == X_LARGE_MODE) {
-           super.snapToPage(whichPage);
-       } else {
-           snapToPageWithVelocity(whichPage, 0, false);
-       }
-    }
-
-    @Override
-    public void computeScroll() {
-        if (mScrollMode == X_LARGE_MODE) {
-            super.computeScroll();
-        } else {
-            boolean scrollComputed = computeScrollHelper();
-
-            if (!scrollComputed && mTouchState == TOUCH_STATE_SCROLLING) {
-                final float now = System.nanoTime() / NANOTIME_DIV;
-                final float e = (float) Math.exp((now - mSmoothingTime) / SMOOTHING_CONSTANT);
-
-                final float dx = mTouchX - mUnboundedScrollX;
-                scrollTo(Math.round(mUnboundedScrollX + dx * e), getScrollY());
-                mSmoothingTime = now;
-
-                // Keep generating points as long as we're more than 1px away from the target
-                if (dx > 1.f || dx < -1.f) {
-                    invalidate();
-                }
-            }
-        }
-    }
-}
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 6c4b720..256eba0 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -127,6 +127,11 @@
         return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
     }
 
+    public static boolean isLmpMR1OrAbove() {
+        // TODO(adamcohen): update to Build.VERSION_CODES.LOLLIPOP_MR1 once building against 22;
+        return Build.VERSION.SDK_INT >= 22;
+    }
+
     static Bitmap createIconBitmap(Cursor c, int iconIndex, Context context) {
         byte[] data = c.getBlob(iconIndex);
         try {
@@ -588,7 +593,6 @@
     }
 
     public static final Comparator<ItemInfo> RANK_COMPARATOR = new Comparator<ItemInfo>() {
-
         @Override
         public int compare(ItemInfo lhs, ItemInfo rhs) {
             return lhs.rank - rhs.rank;
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index d2c37d2..c0a1cfc 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -83,7 +83,7 @@
  * Each page contains a number of icons, folders or widgets the user can
  * interact with. A workspace is meant to be used with a fixed width only.
  */
-public class Workspace extends SmoothPagedView
+public class Workspace extends PagedView
         implements DropTarget, DragSource, DragScroller, View.OnTouchListener,
         DragController.DragListener, LauncherTransitionable, ViewGroup.OnHierarchyChangeListener,
         Insettable, UninstallSource, AccessibilityDragSource {
@@ -458,11 +458,6 @@
     }
 
     @Override
-    protected int getScrollMode() {
-        return SmoothPagedView.X_LARGE_MODE;
-    }
-
-    @Override
     public void onChildViewAdded(View parent, View child) {
         if (!(child instanceof CellLayout)) {
             throw new IllegalArgumentException("A Workspace can only have CellLayout children.");
diff --git a/src/com/android/launcher3/util/RevealOutlineProvider.java b/src/com/android/launcher3/util/RevealOutlineProvider.java
new file mode 100644
index 0000000..0db3984
--- /dev/null
+++ b/src/com/android/launcher3/util/RevealOutlineProvider.java
@@ -0,0 +1,49 @@
+package com.android.launcher3.util;
+
+import android.annotation.TargetApi;
+import android.graphics.Outline;
+import android.graphics.Rect;
+import android.os.Build;
+import android.view.View;
+import android.view.ViewOutlineProvider;
+
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+public class RevealOutlineProvider extends ViewOutlineProvider {
+
+    private int mCenterX;
+    private int mCenterY;
+    private float mRadius0;
+    private float mRadius1;
+    private int mCurrentRadius;
+
+    private final Rect mOval;
+
+    /**
+     * @param x reveal center x
+     * @param y reveal center y
+     * @param r0 initial radius
+     * @param r1 final radius
+     */
+    public RevealOutlineProvider(int x, int y, float r0, float r1) {
+        mCenterX = x;
+        mCenterY = y;
+        mRadius0 = r0;
+        mRadius1 = r1;
+
+        mOval = new Rect();
+    }
+
+    public void setProgress(float progress) {
+        mCurrentRadius = (int) ((1 - progress) * mRadius0 + progress * mRadius1);
+
+        mOval.left = mCenterX - mCurrentRadius;
+        mOval.top = mCenterY - mCurrentRadius;
+        mOval.right = mCenterX + mCurrentRadius;
+        mOval.bottom = mCenterY + mCurrentRadius;
+    }
+
+    @Override
+    public void getOutline(View v, Outline outline) {
+        outline.setRoundRect(mOval, mCurrentRadius);
+    }
+}
diff --git a/src/com/android/launcher3/util/UiThreadCircularReveal.java b/src/com/android/launcher3/util/UiThreadCircularReveal.java
new file mode 100644
index 0000000..c7324fb
--- /dev/null
+++ b/src/com/android/launcher3/util/UiThreadCircularReveal.java
@@ -0,0 +1,55 @@
+package com.android.launcher3.util;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
+import android.animation.ValueAnimator.AnimatorUpdateListener;
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.view.View;
+import android.view.ViewOutlineProvider;
+
+import com.android.launcher3.Utilities;
+
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+public class UiThreadCircularReveal {
+
+    public static ValueAnimator createCircularReveal(View v, int x, int y, float r0, float r1) {
+        ValueAnimator va = ValueAnimator.ofFloat(0f, 1f);
+
+        final View revealView = v;
+        final RevealOutlineProvider outlineProvider = new RevealOutlineProvider(x, y, r0, r1);
+        final ViewOutlineProvider originalProvider = revealView.getOutlineProvider();
+        final float elevation = v.getElevation();
+
+        va.addListener(new AnimatorListenerAdapter() {
+            public void onAnimationStart(Animator animation) {
+                revealView.setOutlineProvider(outlineProvider);
+                revealView.setClipToOutline(true);
+                revealView.setTranslationZ(-elevation);
+            }
+
+            public void onAnimationEnd(Animator animation) {
+                revealView.setOutlineProvider(originalProvider);
+                revealView.setClipToOutline(false);
+                revealView.setTranslationZ(0);
+            }
+
+        });
+
+        va.addUpdateListener(new AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator arg0) {
+                float progress = arg0.getAnimatedFraction();
+                outlineProvider.setProgress(progress);
+                if (Utilities.isLmpMR1OrAbove()) {
+                    revealView.invalidateOutline();
+                } else {
+                    // On L, a bug requires calling a full view invalidate.
+                    revealView.invalidate();
+                }
+            }
+        });
+        return va;
+    }
+}
