         }
 
         [Test]
+        public function getItemIndex_finds_item_in_complex_multi_field_sorted_non_filtered_list():void
+        {
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //index / address.street: 0/Street0, 1/Street1, 2/Street2, 3/Street3, 4/Street4
+
+            const sortByStreetAndIndex:Sort = new Sort();
+            sortByStreetAndIndex.fields = [new ComplexSortField("address.street", false, true, false), new SortField("index", false, true)];
+            _sut.sort = sortByStreetAndIndex;
+            _sut.refresh(); //index / address.street: 4/Street4, 3/Street3, 2/Street2, 1/Street1, 0/Street0
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            item0.address.street = "Street4"; //index / address.street: 0/Street4, 4/Street4, 3/Street3, 2/Street2, 1/Street1
+
+            var item1:FLEX_34884_VO = from0To4.getItemAt(1) as FLEX_34884_VO;
+            item1.address.street = "Street4"; //index / address.street: 0/Street4, 1/Street4, 4/Street4, 3/Street3, 2/Street2
+            item1.index = 9; //index / address.street: 0/Street4, 4/Street4, 9/Street4, 3/Street3, 2/Street2
+
+            //then
+            assertEquals(0, _sut.getItemIndex(item0));
+            assertEquals(2, _sut.getItemIndex(item1));
+        }
+
+        [Test]
+        public function getItemIndex_finds_item_in_complex_multi_field_sorted_filtered_list():void
+        {
+            function excludeIndexesAbove4(item:Object):Boolean
+            {
+                return FLEX_34884_VO(item).index <= 4;
+            }
+
+            //given
+            var from0To4:IList = generateVOs(5);
+            _sut.addAll(from0To4); //index / address.street: 0/Street0, 1/Street1, 2/Street2, 3/Street3, 4/Street4
+
+            const sortByStreetAndIndex:Sort = new Sort();
+            sortByStreetAndIndex.fields = [new ComplexSortField("address.street", false, true, false), new SortField("index", false, true)];
+            _sut.sort = sortByStreetAndIndex;
+
+            _sut.refresh(); //index / address.street: 4/Street4, 3/Street3, 2/Street2, 1/Street1, 0/Street0
+
+            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();
+
+            //when
+            var item0:FLEX_34884_VO = from0To4.getItemAt(0) as FLEX_34884_VO;
+            item0.address.street = "Street4"; //index / address.street: 0/Street4, 4/Street4, 3/Street3, 2/Street2, 1/Street1
+
+            var item1:FLEX_34884_VO = from0To4.getItemAt(1) as FLEX_34884_VO;
+            item1.address.street = "Street4"; //index / address.street: 0/Street4, 1/Street4, 4/Street4, 3/Street3, 2/Street2
+            item1.index = 9; //index / address.street: 0/Street4, 4/Street4, 9/Street4, 3/Street3, 2/Street2
+
+            _sut.filterFunction = excludeIndexesAbove4;
+            _sut.refresh(); //index / address.street: 0/Street4, 4/Street4, 3/Street3, 2/Street2
+
+            //then
+            assertEquals(0, _sut.getItemIndex(item0));
+            assertEquals(-1, _sut.getItemIndex(item1));
+            var item3:FLEX_34884_VO = from0To4.getItemAt(3) as FLEX_34884_VO;
+            assertEquals(2, _sut.getItemIndex(item3));
+        }
+
+        [Test]
         public function getItemIndex_finds_item_in_complex_descending_sorted_list_after_its_repositioned_due_to_its_sort_field_changing():void
         {
             //given

            var from0To4:IList = generateVOs(5);
            _sut.addAll(from0To4); //values[address.street]: Street0, Street1, Street2, Street3, Street4

            const sortByIndexDescending:Sort = new Sort();
            sortByIndexDescending.fields = [new ComplexSortField("address.street", false, true, false)];
            _sut.sort = sortByIndexDescending;
            _sut.refresh(); //values[address.street]: Street4, Street3, Street2, Street1, Street0

            _sut.complexFieldWatcher = new ComplexFieldChangeWatcher();

        }

        [Test]
        public function getItemIndex_finds_item_in_descending_two_sort_fields_sorted_list_after_changing_one_field():void
        {
            //given
            var from0To4:IList = generateVOs(5);
            _sut.addAll(from0To4); //index/name: 0/Object0, 1/Object1, 2/Object2, 3/Object3, 4/Object4

            const sortByIndexDescending:Sort = new Sort();
            sortByIndexDescending.fields = [new SortField("index", true, true), new SortField("name", false, false)];
            _sut.sort = sortByIndexDescending;
            _sut.refresh(); //index/name: 4/Object4, 3/Object3, 2/Object2, 1/Object1, 0/Object0

            //when
            var item1:FLEX_34884_VO = from0To4.getItemAt(1) as FLEX_34884_VO;
            item1.index = 0; //index/name: 4/Object4, 3/Object3, 2/Object2, 0/Object0, 0/Object1

            var item2:FLEX_34884_VO = from0To4.getItemAt(2) as FLEX_34884_VO;
            item2.index = 0; //index/name: 4/Object4, 3/Object3, 0/Object0, 0/Object1, 0/Object2

            //then
            assertEquals(_sut.length - 1, _sut.getItemIndex(item2));
            assertEquals(_sut.length - 2, _sut.getItemIndex(item1));
        }

        [Test]
        public function getItemIndex_finds_second_to_last_item_in_simple_no_fields_non_unique_sorted_list():void
        {
            //given
