             delta.x = 0;
         return delta;
     }
+
+    /**
+     *  @private
+     *  Identifies the element which has its "compare point" located closest 
+     *  to the specified position.
+     */
+    override mx_internal function getElementNearestScrollPosition(
+        position:Point,
+        elementComparePoint:String = "center"):int
+    {
+        if (!useVirtualLayout)
+            return super.getElementNearestScrollPosition(position, elementComparePoint);
+
+        var g:GroupBase = GroupBase(target);
+        if (!g || !llv)
+            return -1;
+        
+        // Find the element which overlaps with the position
+        var index:int = llv.indexOf(position.y);
+        
+        // Invalid index indicates that the position is past either end of the 
+        // laid-out elements.   In this case, choose either the first or last one.
+        if (index == -1)
+            index = position.y < 0 ? 0 : g.numElements - 1; 
+
+        var bounds:Rectangle = llv.getBounds(index);
+        var adjacentBounds:Rectangle;
+        
+        // If we're comparing with a bottom-edge point, check both the current element and the element
+        // at index-1 to see which is closest.
+        if ((elementComparePoint == "bottomLeft" || elementComparePoint == "bottomRight") && index > 0)
+        {
+            adjacentBounds = llv.getBounds(index - 1);
+            if (Point.distance(position,adjacentBounds.bottomRight) < Point.distance(position,bounds.bottomRight))
+                index--;
+        }
+        
+        // If we're comparing with a top-edge point, check both the current element and the element
+        // at index+1 to see which is closest.
+        if ((elementComparePoint == "topLeft" || elementComparePoint == "topRight") && index < g.numElements-1) 
+        {
+            adjacentBounds = llv.getBounds(index + 1);             
+            if (Point.distance(position,adjacentBounds.topLeft) < Point.distance(position,bounds.topLeft))
+                index++;
+        }
+        
+        return index;
+    }
+
+
 }
 }
 

        // Make sure that if the content spans partially over a pixel to the right/bottom,
        // the content size includes the whole pixel.
        var paddedContentWidth:Number = Math.ceil(contentWidth + paddingLeft + paddingRight);
        paddedContentHeight = Math.ceil(contentHeight + paddingTop + paddingBottom);
        layoutTarget.setContentSize(paddedContentWidth, paddedContentHeight);
    }
    

        // simply start from minVisibleY - SDK-22497.
        var startIndex:int = llv.indexOf(Math.max(0, minVisibleY + gap));
        if (startIndex == -1)
		{
			// No items are visible.  Just set the content size.
			contentHeight = llv.end(llv.length - 1) - paddingTop;
			paddedContentHeight = Math.ceil(contentHeight + paddingTop + paddingBottom);
			layoutTarget.setContentSize(layoutTarget.contentWidth, paddedContentHeight);
			return;
		}
                        
        var fixedRowHeight:Number = NaN;
        if (!variableRowHeight)
