                 || kind == GridSelectionEventKind.SET_ROWS)
                     eventID = AccConst.EVENT_OBJECT_SELECTIONWITHIN;
 
-                Accessibility.sendEvent(dgAccInfo.dataGrid, childID, eventID);
+                Accessibility.sendEvent(dgAccInfo.dataGrid.focusOwner, childID, eventID);
                 break;
             }
+            case FocusEvent.FOCUS_IN:
+            {
+                // do not fire focus changes for list when a child editor is focused 
+                // as this causes an extra event being fired
+                if (event.target == DataGrid(master).focusOwner)
+                    Accessibility.sendEvent(DataGrid(master).focusOwner, 0, AccConst.EVENT_OBJECT_FOCUS);
+                break;
+            }
+            case GridItemEditorEvent.GRID_ITEM_EDITOR_SESSION_START:
+            {
+                dgAccInfo.setup(master, 0);
+                
+                childID = dgAccInfo.childIDFromRowAndColumn(
+                    GridItemEditorEvent(event).rowIndex,
+                    GridItemEditorEvent(event).columnIndex
+                );
+                var editor:Object = event.currentTarget.itemEditorInstance;
+                var defaultGridItemEditorClass:Class = Class(getDefinition("spark.components.gridClasses.DefaultGridItemEditor", master.moduleFactory));
+                if (editor is defaultGridItemEditorClass)
+                {
+                    // The specific part with focus.
+                    try
+                    {
+                        editor = Object(editor).textArea;
+                    }
+                    catch(e:Error)
+                    {
+                    }
+                }
+                else
+                {
+                    // Try to find the specific part with focus,
+                    // falling back to the itemEditorInstance if we don't know it.
+                    var realEditor:UIComponent = null;
+                    try
+                    {
+                        realEditor = UIComponent(editor.stage.focus);
+                    }
+                    catch(e:Error)
+                    {
+                    }
+                    if (Boolean(realEditor) && editor != realEditor)
+                    {
+                        editor = realEditor;
+                    }
+                }
+                // Name the editor with this cell's name.
+                // This applies the same rules for row identification for both edit and non-edit cells.
+                if (!editor.accessibilityName)
+                {
+                    var edName:String = "";
+                    if (dgAccInfo.headerCount > 0)
+                    {
+                        var columns:IList = dgAccInfo.dataGrid.columns;
+                        var columnIndex:int = GridItemEditorEvent(event).columnIndex;
+                        edName += columns.getItemAt(columnIndex).headerText;
+                    }
+                    // For the row string, we need to indicate which cell to use.
+                    dgAccInfo.setup(master, childID);
+                    var rowString:String = makeRowString(dgAccInfo);
+                    if (rowString)
+                        edName += " " +rowString;
+                    editor.accessibilityName = edName;
+                    Accessibility.updateProperties();
+                }
+                Accessibility.sendEvent(UIComponent(editor), 0, AccConst.EVENT_OBJECT_FOCUS);
+                break;
+            }
+            case GridItemEditorEvent.GRID_ITEM_EDITOR_SESSION_SAVE, GridItemEditorEvent.GRID_ITEM_EDITOR_SESSION_CANCEL:
+            {
+                dgAccInfo.setup(master, 0);
+                
+                childID = dgAccInfo.childIDFromRowAndColumn(
+                GridItemEditorEvent(event).rowIndex, GridItemEditorEvent(event).columnIndex);
+
+                Accessibility.sendEvent(DataGrid(master).focusOwner, childID, AccConst.EVENT_OBJECT_FOCUS);
+            }
         }
     }
 

        // We now have only rows and data cells to consider.

        // String representation of row position.
        var rowString:String = "";
        if ((dgAccInfo.isCellMode && dgAccInfo.reachableColumnIndex == 0) || !dgAccInfo.isCellMode)
        {
            resourceManager = ResourceManager.getInstance();
            rowString = resourceManager.getString("components", "rowMofN");
            rowString = rowString.replace("%1", dgAccInfo.reachableRowIndex + 1).replace("%2", dgAccInfo.reachableRowCount);
        }

        // Construct the name to return.
        var name:String = "";

    override public function get_accState(childID:uint):uint
    {
        var accState:uint = getState(childID);
        if (childID == 0
        && DataGrid(master).focusOwner == UIComponent(master).getFocus())
            accState |= AccConst.STATE_SYSTEM_FOCUSED;
        if (int(childID) <= 0)
            return accState;

