diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index 40244b2..eb6c926 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -78,7 +78,7 @@
     private float mShiftRange;      // changes depending on the orientation
     private float mProgress;        // [0, 1], mShiftRange * mProgress = shiftCurrent
 
-    private float mVelocityForCaret;
+    private float mContainerVelocity;
 
     private static final float DEFAULT_SHIFT_RANGE = 10;
 
@@ -208,7 +208,7 @@
             return false;   // early termination.
         }
 
-        mVelocityForCaret = velocity;
+        mContainerVelocity = velocity;
 
         float shift = Math.min(Math.max(0, mShiftStart + displacement), mShiftRange);
         setProgress(shift / mShiftRange);
@@ -305,9 +305,10 @@
     }
 
     /**
-     * @param progress value between 0 and 1
+     * @param progress       value between 0 and 1, 0 shows all apps and 1 shows workspace
      */
     public void setProgress(float progress) {
+        float shiftPrevious = mProgress * mShiftRange;
         mProgress = progress;
         float shiftCurrent = progress * mShiftRange;
 
@@ -339,6 +340,15 @@
                 interpolation);
         updateCaret(progress);
         updateLightStatusBar(shiftCurrent);
+
+        if (!mDetector.isDraggingState()) {
+            mContainerVelocity = mDetector.computeVelocity(shiftCurrent - shiftPrevious,
+                    System.currentTimeMillis());
+        }
+    }
+
+    public float getContainerVelocity() {
+        return mContainerVelocity;
     }
 
     public float getProgress() {
@@ -361,7 +371,6 @@
             return;
         }
         if (mDetector.isIdleState()) {
-            mVelocityForCaret = -VerticalPullDetector.RELEASE_VELOCITY_PX_MS;
             preparePull(true);
             mAnimationDuration = duration;
             mShiftStart = mAppsView.getTranslationY();
@@ -434,7 +443,6 @@
         }
         Interpolator interpolator;
         if (mDetector.isIdleState()) {
-            mVelocityForCaret = VerticalPullDetector.RELEASE_VELOCITY_PX_MS;
             preparePull(true);
             mAnimationDuration = duration;
             mShiftStart = mAppsView.getTranslationY();
@@ -513,7 +521,7 @@
         if (0f < shift && shift < 1f && !mLauncher.useVerticalBarLayout()) {
             // How fast are we moving as a percentage of the minimum fling velocity?
             final float pctOfFlingVelocity = Math.max(-1, Math.min(
-                    mVelocityForCaret / VerticalPullDetector.RELEASE_VELOCITY_PX_MS, 1));
+                    mContainerVelocity / VerticalPullDetector.RELEASE_VELOCITY_PX_MS, 1));
 
             mCaretDrawable.setCaretProgress(pctOfFlingVelocity);
 
diff --git a/src/com/android/launcher3/allapps/VerticalPullDetector.java b/src/com/android/launcher3/allapps/VerticalPullDetector.java
index 6eab1c0..ab2b6ed 100644
--- a/src/com/android/launcher3/allapps/VerticalPullDetector.java
+++ b/src/com/android/launcher3/allapps/VerticalPullDetector.java
@@ -93,10 +93,9 @@
 
     private float mDownX;
     private float mDownY;
-    private float mDownMillis;
 
     private float mLastY;
-    private float mLastMillis;
+    private long mCurrentMillis;
 
     private float mVelocity;
     private float mLastDisplacement;
@@ -153,7 +152,6 @@
     public boolean onTouchEvent(MotionEvent ev) {
         switch (ev.getAction()) {
             case MotionEvent.ACTION_DOWN:
-                mDownMillis = ev.getDownTime();
                 mDownX = ev.getX();
                 mDownY = ev.getY();
                 mLastDisplacement = 0;
@@ -167,7 +165,7 @@
             case MotionEvent.ACTION_MOVE:
                 mDisplacementX = ev.getX() - mDownX;
                 mDisplacementY = ev.getY() - mDownY;
-                mVelocity = computeVelocity(ev, mVelocity);
+                computeVelocity(ev);
 
                 // handle state and listener calls.
                 if (mState != ScrollState.DRAGGING && shouldScrollStart()) {
@@ -190,10 +188,7 @@
         }
         // Do house keeping.
         mLastDisplacement = mDisplacementY;
-
         mLastY = ev.getY();
-        mLastMillis = ev.getEventTime();
-
         return true;
     }
 
@@ -245,21 +240,23 @@
     /**
      * Computes the damped velocity using the two motion events and the previous velocity.
      */
-    private float computeVelocity(MotionEvent to, float previousVelocity) {
-        float delta = computeDelta(to);
-
-        float deltaTimeMillis = to.getEventTime() - mLastMillis;
-        float velocity = (deltaTimeMillis > 0) ? (delta / deltaTimeMillis) : 0;
-        if (Math.abs(previousVelocity) < 0.001f) {
-            return velocity;
-        }
-
-        float alpha = computeDampeningFactor(deltaTimeMillis);
-        return interpolate(previousVelocity, velocity, alpha);
+    private float computeVelocity(MotionEvent to) {
+        return computeVelocity(to.getY() - mLastY, to.getEventTime());
     }
 
-    private float computeDelta(MotionEvent to) {
-        return to.getY() - mLastY;
+    public float computeVelocity(float delta, long currentMillis) {
+        long previousMillis = mCurrentMillis;
+        mCurrentMillis = currentMillis;
+
+        float deltaTimeMillis = mCurrentMillis - previousMillis;
+        float velocity = (deltaTimeMillis > 0) ? (delta / deltaTimeMillis) : 0;
+        if (Math.abs(mVelocity) < 0.001f) {
+            mVelocity = velocity;
+        } else {
+            float alpha = computeDampeningFactor(deltaTimeMillis);
+            mVelocity = interpolate(mVelocity, velocity, alpha);
+        }
+        return mVelocity;
     }
 
     /**
