         if (!g)
             return;     
 
-        var r:Rectangle = g.scrollRect;
-        if (!r)
-        {
-            // TBD: find first/last non-null includeInLayout items
-        }
+        var n:int = g.numLayoutItems - 1;
+        if (n < 0) 
+        {
+            setIndexInView(-1, -1);
+            return;
+        }
+        
+        var scrollR:Rectangle = g.scrollRect;
+        if (!scrollR)
+        {
+            setIndexInView(0, n);
+            return;    
+        }
+        
+        var x0:Number = scrollR.left;
+        var x1:Number = scrollR.right;
+        if (x1 <= x0)
+        {
+            setIndexInView(-1, -1);
+            return;
+        }
+
         // TBD: special case for variableRowHeight false
-        else 
-        {
-            var n:int = Math.max(g.numLayoutItems - 1, 0);
-            var i0:int = findIndexAt(r.x + gap, gap, g, 0, n);
-            var i1:int = findIndexAt(r.right, gap, g, 0, n);
-            setIndexInView(i0, i1);
-        }
-    }
-    
+
+        var i0:int = findIndexAt(x0 + gap, gap, g, 0, n);
+        var i1:int = findIndexAt(x1, gap, g, 0, n);
+
+        // Special case: no item overlaps x0, is index 0 visible?
+        if (i0 == -1)
+        {   
+            var index0:int = findLayoutItemIndex(g, 0, +1);
+            if (index0 != -1)
+            {
+                var item0:ILayoutItem = g.getLayoutItemAt(index0); 
+                var p0:Point = item0.actualPosition;
+                var s0:Point = item0.actualSize;                 
+                if ((p0.x < x1) && ((p0.x + s0.x) > x0))
+                    i0 = index0;
+            }
+        }
+
+        // Special case: no item overlaps y1, is index n visible?
+        if (i1 == -1)
+        {
+            var index1:int = findLayoutItemIndex(g, n, -1);
+            if (index1 != -1)
+            {
+                var item1:ILayoutItem = g.getLayoutItemAt(index1); 
+                var p1:Point = item1.actualPosition;
+                var s1:Point = item1.actualSize;                 
+                if ((p1.x < x1) && ((p1.x + s1.x) > x0))
+                    i1 = index1;
+            }
+        }   
+
+        setIndexInView(i0, i1);
+    }
+
    /**
     *  Returns the actual position/size Rectangle of the first non-null
     *  includeInLayout item, beginning with the item at index i.  

                lastIndex = lastIndexInView;
                if (inView(lastIndex) >= 1)
                   lastIndex = Math.min(maxIndex, lastIndex + 1);
                itemR = itemScan(g, lastIndex, +1);
                break;
            }
        }
                
    
        switch (unit)
        {
            case Keyboard.LEFT:
                return (itemR) ? Math.max(minDelta, itemR.left - scrollR.left) : 0;
                
            case Keyboard.RIGHT:
                return (itemR) ? Math.min(maxDelta, itemR.right - scrollR.right) : 0;
                
            case Keyboard.PAGE_UP:
                return (itemR) ? Math.max(minDelta, itemR.right - scrollR.right) : 0;

            case Keyboard.PAGE_DOWN:
                return (itemR) ? Math.min(maxDelta, itemR.left - scrollR.x) : 0;
                                
            default:
                return super.verticalScrollPositionDelta(unit);
        }       
    }     

    public function variableColumnWidthMeasure(layoutTarget:GroupBase):void

    *  
    *  @private
    */
    private static function findLayoutItemBounds(g:GroupBase, i:int, dir:int):Rectangle
    {
        var n:int = g.numLayoutItems;
        while((i >= 0) && (i < n))
