      *  and selectedItems.
      */
     private var lastSelectionData:ListBaseSelectionData;
+	
+    /**
+     *  The first proposed selectedItem.  Because the loop where it is used
+     *  can be called several times becaouse of IPEs, we have to store stuff like
+     *  this outside the loop
+     */
+    private var firstSelectedItem:Object;
+
+    /**
+     *  A map of proposed selectedItems to the original order
+     *  they were proposed.  Because the loop where it is used
+     *  can be called several times becaouse of IPEs, we have to store stuff like
+     *  this outside the loop
+     */
+    private var proposedSelectedItemIndexes:Dictionary;
 
     /**
      *  The renderer that is or was rolled over or under the caret.


    /**
     *  @private
     *  for automation delegate access
     */
    mx_internal function getListVisibleData():Object

            }
        }
        else
        {   
            var compareFunction:Function = selectedItemsCompareFunction;
            if (compareFunction == null)
                compareFunction = strictEqualityCompareFunction;
            while (items.length && !collectionIterator.afterLast)
            {
                var len:int = items.length;
                var data:Object = collectionIterator.current;
                for (var i:int = 0; i < len; i++)
                {
                    item = items[i];
                    if (compareFunction(data, item))
                    {
                        uid = itemToUID(data);
                        
                        selectionDataArray[proposedSelectedItemIndexes[uid]] = new ListBaseSelectionData(data, index, false);

                        items.splice(i, 1);
                        if (item === firstSelectedItem)
                        {
                            _selectedIndex = index;
                            _selectedItem = data;
