Index: gtk/gtkiconview.c
===================================================================
--- gtk/gtkiconview.c	(revision 19516)
+++ gtk/gtkiconview.c	(working copy)
@@ -396,6 +396,8 @@
 									  GtkIconViewItem        *item,
 									  GtkIconViewCellInfo    *cell_info,
 									  GdkEvent               *event);
+static void                 gtk_icon_view_item_selected_changed          (GtkIconView            *icon_view,
+		                                                          GtkIconViewItem        *item);
 static void                 gtk_icon_view_put                            (GtkIconView            *icon_view,
 									  GtkWidget              *widget,
 									  GtkIconViewItem        *item,
@@ -1664,6 +1666,25 @@
 }
 
 static void 
+gtk_icon_view_item_selected_changed (GtkIconView      *icon_view,
+                                     GtkIconViewItem  *item)
+{
+  AtkObject *obj;
+  AtkObject *item_obj;
+
+  obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view));
+  if (obj != NULL)
+    {
+      item_obj = atk_object_ref_accessible_child (obj, item->index);
+      if (item_obj != NULL)
+        {
+          atk_object_notify_state_change (item_obj, ATK_STATE_SELECTED, item->selected);
+          g_object_unref (item_obj);
+        }
+    }
+}
+
+static void 
 gtk_icon_view_put (GtkIconView     *icon_view,
 		   GtkWidget       *widget,
 		   GtkIconViewItem *item,
@@ -2317,6 +2338,7 @@
 	  item->selected = FALSE;
 	  dirty = TRUE;
 	  gtk_icon_view_queue_draw_item (icon_view, item);
+	  gtk_icon_view_item_selected_changed (icon_view, item);
 	}
     }
 
@@ -2465,6 +2487,7 @@
       icon_view->priv->cursor_item->selected = !icon_view->priv->cursor_item->selected;
       g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0); 
       
+      gtk_icon_view_item_selected_changed (icon_view, icon_view->priv->cursor_item);      
       gtk_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item);
       break;
     }
@@ -3209,14 +3232,23 @@
 {
   AtkObject *obj;
   AtkObject *item_obj;
+  AtkObject *cursor_item_obj;
 
   if (icon_view->priv->cursor_item == item &&
       (cursor_cell < 0 || cursor_cell == icon_view->priv->cursor_cell))
     return;
 
+  obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view));
   if (icon_view->priv->cursor_item != NULL)
-    gtk_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item);
-  
+    {
+      gtk_icon_view_queue_draw_item (icon_view, icon_view->priv->cursor_item);
+      if (obj != NULL)
+        {
+          cursor_item_obj = atk_object_ref_accessible_child (obj, icon_view->priv->cursor_item->index);
+          if (cursor_item_obj != NULL)
+            atk_object_notify_state_change (cursor_item_obj, ATK_STATE_FOCUSED, FALSE);
+        }
+    }
   icon_view->priv->cursor_item = item;
   if (cursor_cell >= 0)
     icon_view->priv->cursor_cell = cursor_cell;
@@ -3224,12 +3256,12 @@
   gtk_icon_view_queue_draw_item (icon_view, item);
   
   /* Notify that accessible focus object has changed */
-  obj = gtk_widget_get_accessible (GTK_WIDGET (icon_view));
   item_obj = atk_object_ref_accessible_child (obj, item->index);
 
   if (item_obj != NULL)
     {
       atk_focus_tracker_notify (item_obj);
+      atk_object_notify_state_change (item_obj, ATK_STATE_FOCUSED, TRUE);
       g_object_unref (item_obj); 
     }
 }
@@ -3336,9 +3368,10 @@
 
   item->selected = TRUE;
 
+  gtk_icon_view_item_selected_changed (icon_view, item);
+  g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
+
   gtk_icon_view_queue_draw_item (icon_view, item);
-
-  g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
 }
 
 
@@ -3358,6 +3391,7 @@
   
   item->selected = FALSE;
 
+  gtk_icon_view_item_selected_changed (icon_view, item);
   g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
 
   gtk_icon_view_queue_draw_item (icon_view, item);
@@ -3855,10 +3889,11 @@
 	  col1 <= item->col && item->col <= col2)
 	{
 	  if (!item->selected)
-	    dirty = TRUE;
-
-	  item->selected = TRUE;
-	  
+	    {
+	      dirty = TRUE;
+	      item->selected = TRUE;
+	      gtk_icon_view_item_selected_changed (icon_view, item);
+	    }
 	  gtk_icon_view_queue_draw_item (icon_view, item);
 	}
     }
@@ -8487,6 +8522,10 @@
     atk_state_set_add_state (item->state_set, ATK_STATE_FOCUSED);
   else
     atk_state_set_remove_state (item->state_set, ATK_STATE_FOCUSED);
+  if (item->item->selected)
+    atk_state_set_add_state (item->state_set, ATK_STATE_SELECTED);
+  else
+    atk_state_set_remove_state (item->state_set, ATK_STATE_SELECTED);
 
   return g_object_ref (item->state_set);
 }
