Index: src/Perks/BasicSpeechPerk.py
===================================================================
--- src/Perks/BasicSpeechPerk.py	(revision 554)
+++ src/Perks/BasicSpeechPerk.py	(working copy)
@@ -535,11 +535,14 @@
       defaults to L{task_por} if None
     @type por: L{POR}
     '''
+    
     role = self.getAccRoleName(por)
-    if self.perk_state.RepeatRole or role != self.perk.last_role:
+    if (self.perk_state.RepeatRole or role != self.perk.last_role) and \
+           self.getTempVal('ReadNewRole') != 'selector':
       self.sayRole(text=role)
       self.perk.last_role = role
       
+      
 class ReadNewLevel(Task.Task):
   '''
   Reads the tree level of a widget if it is different from the last level read.
@@ -796,6 +799,7 @@
       text = self.getItemText()
     # announce the item role
     #if self.getAccFocus() != self.task_por:
+#    self.mayStop()
     self.doTask('read new role')
     # announce the item text only if it is different than the label
     label = self.getAccLabel()
@@ -881,6 +885,7 @@
     # container
     self.doTask('read new label', por=por)
     # only announce role when it has changed
+    self.setTempVal('ReadNewRole', 'focus')
     self.doTask('read new role', por=por)
     # prevent the next selector or caret from stopping this announcement
     self.inhibitMayStop()
@@ -902,6 +907,7 @@
     @type text: string
     '''
     self.mayStop()
+    self.setTempVal('ReadNewRole', 'selector')
     self.doTask('read item details', por=por, text=text)
     
   def executeText(self, por, text, **kwargs):
Index: src/Perks/FirefoxPerk.py
===================================================================
--- src/Perks/FirefoxPerk.py	(revision 554)
+++ src/Perks/FirefoxPerk.py	(working copy)
@@ -457,24 +457,25 @@
   @type por: L{POR}
   '''
   def execute(self, por=None, **kwargs):
-    # get human readable role name, hyperlinks are blank currently
-    rolename = self.getAccRoleName(por) or _('link')   
+    rolename = self.getAccRoleName(por) or _('link') 
+    # get untranslated role name
+    role = self.getAccRole(por) 
+    if role == 'heading':
+      attrs = self.getAccAttrs()
+      if attrs.has_key('level'):
+        # i18n: string is translated word 'heading', int is value 1 through 6
+        outtext = _("%s level %s") % (rolename, attrs['level'])
+      else:
+        outtext = rolename
+    else: # default case
+      outtext = rolename
+        
     if (self.getPerkSettingVal("RepeatRole", 'BasicSpeechPerk') or 
-        rolename != self.getPerkVar("BasicSpeechPerk", "last_role")):
-      # get untranslated role name
-      role = self.getAccRole(por) 
-      if role == 'heading':
-        attrs = self.getAccAttrs()
-        if attrs.has_key('level'):
-          # i18n: string is translated word 'heading', int is value 1 through 6
-          outtext = _("%s level %s") % (rolename, attrs['level'])
-      else: # default case
-        outtext = rolename
-     
+        outtext != self.getPerkVar("BasicSpeechPerk", "last_role")): 
       if not ((role in self.perk.SKIPPED_ROLES) or
               (role == 'table cell' and self.perk.isLayoutTable(por, role))):
-        self.sayRole(text=outtext)
-     
+        if self.getTempVal('ReadNewRole') != 'selector':
+          self.sayRole(text=outtext)
       self.setPerkVar("BasicSpeechPerk", "last_role", outtext)
 
 class FFShouldSkip(Task.InputTask):
