     /**
      *  @private
      */
+    private var scrollRangesChanged:Boolean = false;
+    
+    /**
+     *  @private
+     */
+    private var pageScrollingChanged:Boolean = false;
+    
+    /**
+     *  @private
+     */
+    private var snappingModeChanged:Boolean = false;
+
+    /**
+     *  @private
+     */
     private var _pullEnabled:Boolean = true;
 
     /**

            {
                // Go to the next horizontal page
                // Set the new page scroll position so the throw effect animates the page into place
                currentPageScrollPosition = Math.min(currentPageScrollPosition + viewport.width, viewport.contentWidth - viewport.width);
            }
            else if (velocityX > minVelocityPixels || viewport.horizontalScrollPosition <= currentPageScrollPosition - viewport.width * pageDragDistanceThreshold)
            {
                // Go to the previous horizontal page
                currentPageScrollPosition = Math.max(currentPageScrollPosition - viewport.width, 0);     
            }
            
            // Ensure the new page position is snapped appropriately 

        var layout:LayoutBase = viewportLayout;
        var nearestElementIndex:int;
        var nearestElementBounds:Rectangle;
        
        var viewportWidth:Number = isNaN(viewport.width) ? 0 : viewport.width;
        var viewportHeight:Number = isNaN(viewport.height) ? 0 : viewport.height;

        if (scrollSnappingMode == ScrollSnappingMode.NONE && pageScrollingEnabled)
        {
            // If we're in paging mode and no snapping is enabled, then we must snap
            // the position to the beginning of a page.  i.e. a multiple of the 
            // viewport size.
            var offset:Number;
            if (canScrollHorizontally && propertyName == HORIZONTAL_SCROLL_POSITION && viewportWidth != 0)
            {
                // Get the offset into the current page.  If less than half way, snap
                // to the beginning of the page.  Otherwise, snap to the beginning
                // of the next page
                offset = position % viewportWidth;
                if (offset < viewportWidth / 2)
                    position -= offset;
                else
                    position += viewportWidth - offset;
            }
            else if (canScrollVertically && propertyName == VERTICAL_SCROLL_POSITION && viewportHeight != 0)
            {
                offset = position % viewportHeight;
                if (offset < viewportHeight / 2)
                    position -= offset;
                else
                    position += viewportHeight - offset;
            }
        }
        
        if (layout && layout.target.numElements > 0)
        {
            switch (_scrollSnappingMode)
