diff --git a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java
index 252e3ea..4108cd2 100644
--- a/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java
+++ b/quickstep/src/com/android/launcher3/LauncherAppTransitionManagerImpl.java
@@ -57,7 +57,6 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.util.Pair;
-import android.util.Property;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -805,9 +804,25 @@
                 float shiftRange = allAppsController.getShiftRange();
                 float slideStart = shiftRange / (shiftRange - mStartSlideTransY);
                 float oscillateStart = shiftRange / (shiftRange - mEndSlideTransY);
+                // Ensures a clean hand-off between slide and oscillate.
+                float slideEnd = Utilities.mapToRange(0, 0, 1f, oscillateStart, 1, OSCILLATE);
 
-                buildSpringAnimation(workspaceAnimator, allAppsController, ALL_APPS_PROGRESS,
-                        0 /* startDelay */, slideStart, oscillateStart, 1f /* finalPosition */);
+                allAppsController.setProgress(slideStart);
+                Animator slideIn = ObjectAnimator.ofFloat(allAppsController, ALL_APPS_PROGRESS,
+                        slideStart, slideEnd);
+                slideIn.setDuration(SPRING_SLIDE_DURATION);
+                slideIn.setInterpolator(DEACCEL);
+
+                Animator oscillate = ObjectAnimator.ofFloat(allAppsController, ALL_APPS_PROGRESS,
+                        oscillateStart, 1f);
+                oscillate.setDuration(SPRING_OSCILLATE_DURATION);
+                oscillate.setInterpolator(OSCILLATE);
+
+                Animator settle = ObjectAnimator.ofFloat(allAppsController, ALL_APPS_PROGRESS, 1f);
+                settle.setDuration(SPRING_SETTLE_DURATION);
+                settle.setInterpolator(LINEAR);
+
+                workspaceAnimator.playSequentially(slideIn, oscillate, settle);
             }
 
             mDragLayer.getScrim().hideSysUiScrim(true);
@@ -837,13 +852,28 @@
         v.setAlpha(0);
         ObjectAnimator alpha = ObjectAnimator.ofFloat(v, View.ALPHA, 1f);
         alpha.setInterpolator(LINEAR);
-        alpha.setDuration(SPRING_SLIDE_DURATION + SPRING_OSCILLATE_DURATION);
+        alpha.setDuration(SPRING_SLIDE_DURATION);
         alpha.setStartDelay(startDelay);
         outAnimator.play(alpha);
 
-        buildSpringAnimation(outAnimator, v, TRANSLATION_Y, startDelay, mStartSlideTransY,
-                mEndSlideTransY, 0f /* finalPosition */);
+        // Ensures a clean hand-off between slide and oscillate.
+        float slideEnd = Utilities.mapToRange(0, 0, 1f, mEndSlideTransY, 0, OSCILLATE);
+        v.setTranslationY(mStartSlideTransY);
+        ObjectAnimator slideIn = ObjectAnimator.ofFloat(v, TRANSLATION_Y, mStartSlideTransY,
+                slideEnd);
+        slideIn.setInterpolator(DEACCEL);
+        slideIn.setStartDelay(startDelay);
+        slideIn.setDuration(SPRING_SLIDE_DURATION);
 
+        ObjectAnimator oscillate = ObjectAnimator.ofFloat(v, TRANSLATION_Y, mEndSlideTransY, 0);
+        oscillate.setInterpolator(OSCILLATE);
+        oscillate.setDuration(SPRING_OSCILLATE_DURATION);
+
+        ObjectAnimator settle = ObjectAnimator.ofFloat(v, TRANSLATION_Y, 0);
+        settle.setInterpolator(LINEAR);
+        settle.setDuration(SPRING_SETTLE_DURATION);
+
+        outAnimator.playSequentially(slideIn, oscillate, settle);
         outAnimator.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
@@ -853,36 +883,6 @@
         });
     }
 
-    /**
-     * Spring animations consists of three sequential animators: a slide, an oscillation, and
-     * a settle.
-     */
-    private <T> void buildSpringAnimation(AnimatorSet outAnimator, T objectToSpring,
-            Property<T, Float> property, long startDelay, float slideStart, float oscillateStart,
-            float finalPosition) {
-        // Ensures a clean hand-off between slide and oscillate.
-        float slideEnd = Utilities.mapToRange(0, 0, 1f, oscillateStart, finalPosition, OSCILLATE);
-
-        property.set(objectToSpring, slideStart);
-
-        ObjectAnimator slideIn = ObjectAnimator.ofFloat(objectToSpring, property, slideStart,
-                slideEnd);
-        slideIn.setInterpolator(DEACCEL);
-        slideIn.setStartDelay(startDelay);
-        slideIn.setDuration(SPRING_SLIDE_DURATION);
-
-        ObjectAnimator oscillate = ObjectAnimator.ofFloat(objectToSpring, property, oscillateStart,
-                finalPosition);
-        oscillate.setInterpolator(OSCILLATE);
-        oscillate.setDuration(SPRING_OSCILLATE_DURATION);
-
-        ObjectAnimator settle = ObjectAnimator.ofFloat(objectToSpring, property, finalPosition);
-        settle.setInterpolator(LINEAR);
-        settle.setDuration(SPRING_SETTLE_DURATION);
-
-        outAnimator.playSequentially(slideIn, oscillate, settle);
-    }
-
     private void resetContentView() {
         mLauncher.getWorkspace().getPageIndicator().skipAnimationsToEnd();
         mDragLayerAlpha.setValue(1f);
