diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index b80a03e..0c6ea50 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -66,7 +66,7 @@
     private View mKeyguardStatusView;
     private ObservableScrollView mScrollView;
     private TextView mClockView;
-
+    private View mReserveNotificationSpace;
     private MirrorView mSystemIconsCopy;
 
     private NotificationStackScrollLayout mNotificationStackScroller;
@@ -154,6 +154,7 @@
         mClockView = (TextView) findViewById(R.id.clock_view);
         mScrollView = (ObservableScrollView) findViewById(R.id.scroll_view);
         mScrollView.setListener(this);
+        mReserveNotificationSpace = findViewById(R.id.reserve_notification_space);
         mNotificationStackScroller = (NotificationStackScrollLayout)
                 findViewById(R.id.notification_stack_scroller);
         mNotificationStackScroller.setOnHeightChangedListener(this);
@@ -357,6 +358,13 @@
                 if (shouldQuickSettingsIntercept(mInitialTouchX, mInitialTouchY, 0)) {
                     getParent().requestDisallowInterceptTouchEvent(true);
                 }
+                if (mQsExpansionAnimator != null) {
+                    onQsExpansionStarted();
+                    mInitialHeightOnTouch = mQsExpansionHeight;
+                    mQsTracking = true;
+                    mIntercepting = false;
+                    mNotificationStackScroller.removeLongPressCallback();
+                }
                 break;
             case MotionEvent.ACTION_POINTER_UP:
                 final int upPointer = event.getPointerId(event.getActionIndex());
@@ -434,8 +442,9 @@
 
     private float getQsExpansionFraction() {
         return (mQsExpansionHeight - mQsMinExpansionHeight)
-                / (mQsMaxExpansionHeight - mQsMinExpansionHeight);
+                / (getTempQsMaxExpansion() - mQsMinExpansionHeight);
     }
+
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         if (mBlockTouches) {
@@ -541,6 +550,8 @@
                 if ((fraction != 0f || y >= mInitialTouchY)
                         && (fraction != 1f || y <= mInitialTouchY)) {
                     flingQsWithCurrentVelocity();
+                } else {
+                    mScrollYOverride = -1;
                 }
                 if (mVelocityTracker != null) {
                     mVelocityTracker.recycle();
@@ -593,6 +604,9 @@
 
         // Reset scroll position and apply that position to the expanded height.
         float height = mQsExpansionHeight - mScrollView.getScrollY() - overscrollAmount;
+        if (mScrollView.getScrollY() != 0) {
+            mScrollYOverride = mScrollView.getScrollY();
+        }
         mScrollView.scrollTo(0, 0);
         setQsExpansion(height);
     }
@@ -639,7 +653,7 @@
             setQsExpanded(false);
         }
         mQsExpansionHeight = height;
-        mHeader.setExpansion(height - mQsPeekHeight);
+        mHeader.setExpansion(getQsExpansionFraction());
         setQsTranslation(height);
         requestScrollerTopPaddingUpdate(false /* animate */);
         updateNotificationScrim(height);
@@ -698,6 +712,7 @@
     private void flingSettings(float vel, boolean expand, final Runnable onFinishRunnable) {
         float target = expand ? mQsMaxExpansionHeight : mQsMinExpansionHeight;
         if (target == mQsExpansionHeight) {
+            mScrollYOverride = -1;
             if (onFinishRunnable != null) {
                 onFinishRunnable.run();
             }
@@ -714,6 +729,7 @@
         animator.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
+                mScrollYOverride = -1;
                 mQsExpansionAnimator = null;
                 if (onFinishRunnable != null) {
                     onFinishRunnable.run();
@@ -827,12 +843,9 @@
             float panelHeightQsExpanded = calculatePanelHeightQsExpanded();
             float t = (expandedHeight - panelHeightQsCollapsed)
                     / (panelHeightQsExpanded - panelHeightQsCollapsed);
-            int qsTempMaxExpansion = mQsMaxExpansionHeight;
-            if (mScrollYOverride != -1) {
-                qsTempMaxExpansion -= mScrollYOverride;
-            }
+
             setQsExpansion(mQsMinExpansionHeight
-                    + t * (qsTempMaxExpansion - mQsMinExpansionHeight));
+                    + t * (getTempQsMaxExpansion() - mQsMinExpansionHeight));
         }
         mNotificationStackScroller.setStackHeight(expandedHeight);
         updateHeader();
@@ -840,6 +853,18 @@
         updateNotificationTranslucency();
     }
 
+    /**
+     * @return a temporary override of {@link #mQsMaxExpansionHeight}, which is needed when
+     *         collapsing QS / the panel when QS was scrolled
+     */
+    private int getTempQsMaxExpansion() {
+        int qsTempMaxExpansion = mQsMaxExpansionHeight;
+        if (mScrollYOverride != -1) {
+            qsTempMaxExpansion -= mScrollYOverride;
+        }
+        return qsTempMaxExpansion;
+    }
+
     private float calculatePanelHeightQsExpanded() {
         float notificationHeight = mNotificationStackScroller.getHeight()
                 - mNotificationStackScroller.getEmptyBottomMargin()
@@ -974,7 +999,6 @@
         mIsExpanding = true;
         mQsExpandedWhenExpandingStarted = mQsExpanded;
         if (mQsExpanded) {
-            mScrollYOverride = mScrollView.getScrollY();
             onQsExpansionStarted();
         }
     }
@@ -1196,4 +1220,12 @@
     protected boolean isTrackingBlocked() {
         return mConflictingQsExpansionGesture && mQsExpanded;
     }
+
+    public void notifyVisibleChildrenChanged() {
+        if (mNotificationStackScroller.getNotGoneChildCount() != 0) {
+            mReserveNotificationSpace.setVisibility(View.VISIBLE);
+        } else {
+            mReserveNotificationSpace.setVisibility(View.GONE);
+        }
+    }
 }
