         if (forceNoWrapElements != oldForceNoWrapElements)
             dispatchEvent(new Event(FORCE_NO_WRAP_ELEMENTS_CHANGE));
         
-        var scrollPosition:Number = wrapElements ? 
-            normalizeScrollPosition(verticalScrollPosition) : 
-            verticalScrollPosition;
+        var scrollPosition:Number = verticalScrollPosition;
 		
         var itemIndex:int = Math.floor(scrollPosition / rowHeight);
         var yPos:Number = 0;
+        var yPosMax:Number;
         
         var foundLastVisibleElement:Boolean = false;
         var numVisibleElements:int = 0;
         var numVisitedElements:int = 0;
                 
         // Translate the vsp to the item index
-        if (wrapElements)
-        {
-            // The top item might only be partially visible. 
-            yPos = -(scrollPosition % rowHeight);
-        }
-        else
+        if (!wrapElements)
         {
             if (!useVirtualLayout)
                 itemIndex = 0;
-            
-            // If itemIndex is either the first or last element
-            // then position using -scrollPosition
-            if (itemIndex >= numElements)
-            {
-                itemIndex = numElements - 1;
-                yPos = -scrollPosition;
-            }
-            else if (itemIndex > 0)
-            {
-                yPos = -(scrollPosition % rowHeight);
-            }
-            else // itemIndex == 0
-            {
-                yPos = -scrollPosition;
-            }
-        }			
+            else
+                itemIndex = Math.max(Math.min(itemIndex, numElements - 1), 0);           
+        }		
+        
+        yPos = itemIndex * rowHeight;
+        
+        // Calculate the y position of the bottom of the viewable area
+        yPosMax = yPos + height;
+        
+        // Normalize the itemIndex
+        if (wrapElements)
+            itemIndex = normalizeItemIndex(itemIndex);
         
         // Start at the top index
         var iter:LayoutIterator = new LayoutIterator(target, itemIndex);

		return vsp;
	}
    
    // Helper function to return whether an element is enabled or not
    private function isElementEnabled(element:Object):Boolean
    {

	override mx_internal function getElementNearestScrollPosition(
		position:Point,elementComparePoint:String = "center"):int
	{
		var index:int = Math.floor(position.y / rowHeight); // may be larger than numElements to indicate wrapping
		
		var element:ILayoutElement;
