         if (dgAccInfo.isColumnHeader)
         {
             // isColumnHeader implies columnHeaderGroup.visible is true.
-            // The below code remains in case it is ever decided to
-            // make invisible but present headerBars show up with childIDs.
-            /*
             if (dgAccInfo.dataGrid.columnHeaderGroup
-            && !dgAccInfo.dataGrid.columnHeaderGroup.visible)
-                accState |= AccConst.STATE_SYSTEM_INVISIBLE;
-            */
-            if (dgAccInfo.dataGrid.columnHeaderGroup
-            && !dgAccInfo.dataGrid.columnHeaderGroup.getHeaderRendererAt(childID-1).visible)
+            && !dgAccInfo.dataGrid.columnHeaderGroup.getHeaderRendererAt(dgAccInfo.columnIndex).visible)
                 accState |= AccConst.STATE_SYSTEM_OFFSCREEN;
             // There are some states we don't allow for these.
             return accState & ~(

            || mode == GridSelectionMode.MULTIPLE_ROWS
        );
        maxChildID = 0;
        // Account for visible headers.
        maxChildID += visibleHeaderCount;
        // Then for visible cells or rows as appropriate.
        if (isCellMode)
            maxChildID += visibleRowCount * visibleColumnCount;
        else
            maxChildID += visibleRowCount;
        isColumnHeader = false;
        isInvalid = false;
        if (childIDOutOfBounds(childID))
        {
            isInvalid = true;
            visibleColumnIndex = -1;
            visibleRowIndex = -1;
            itemIndex = -1;
        }
        else if (itemIndex < 0)
        {
            // This childID refers to a header, not a data row or cell.
            isColumnHeader = true;
            visibleColumnIndex = itemIndex + visibleColumnCount;
            visibleRowIndex = -1;
            itemIndex = -1;
        }
        else if (isCellMode)
        {
            visibleRowIndex = Math.floor(itemIndex / visibleColumnCount);
            visibleColumnIndex = itemIndex % visibleColumnCount;
        }
        else
        {
            visibleRowIndex = itemIndex;
            // Using 0 here so, for example, getItemRendererAt() calls still work for a row.
            visibleColumnIndex = 0;
        }
        rowIndex = visibleRowIndex;
        columnIndex = visibleColumnIndex;
        if (visibleRowIndex >= 0 && visibleRowIndices != null)
            rowIndex = visibleRowIndices[visibleRowIndex];
        if (visibleColumnIndex >= 0 && visibleColumnIndices != null)
            columnIndex = visibleColumnIndices[visibleColumnIndex];
    }

    // The master component reference for which this AccImpl is instantiated.
    public var master:UIComponent;
    // The childID within that component for which this accInfo is calculated.

    public var columnCount:int;
    public var headerCount:int;
    public var rowCount:int;
    // Number of columns, headers, and rows that are reachable.
    // ("Reachable" means not marked invisible by the developer.)
    public var reachableColumnCount:int;
    public var reachableHeaderCount:int;
    public var reachableRowCount:int;
    // Indices of reachable rows and columns.
    // These are null when nothing is filtered, for performance reasons.
    protected var reachableRowIndices:Vector.<int>;
    protected var reachableColumnIndices:Vector.<int>;
    // The highest valid childID.
    public var maxChildID:int;
    // True if we are in cell navigation mode (single or multiple selection).
