Index: src/orca/liveregions.py
===================================================================
--- src/orca/liveregions.py	(revision 3527)
+++ src/orca/liveregions.py	(working copy)
@@ -389,22 +389,30 @@
         attrs = self._getAttrDictionary(event.source)
         content = [] 
         labels = []
+        
+        # A message is divided into two parts: labels and content.  We
+        # will first try to get the content.  If there is None, 
+        # assume it is an invalid message and return None
         if event.type.startswith('object:children-changed:add'):
-            # Get a handle to the Text interface for the target.
-            try:
-                targetitext = event.any_data.queryText()
-            except NotImplementedError:
-                return None
-
             # Get the text based on the atomic property
             try:
                 if attrs['container-atomic'] == 'true':
-                    content.append(self._script.expandEOCs(event.source))
+                    # expand the source if atomic is true
+                    newcontent = self._script.expandEOCs(event.source)
                 else:
-                    content.append(targetitext.getText(0, -1))
+                    # expand the target if atomic is false
+                    newcontent = self._script.expandEOCs(event.any_data)
             except (KeyError, TypeError):
-                content.append(targetitext.getText(0, -1))
+                    # expand the target if there is no ARIA markup
+                    newcontent = self._script.expandEOCs(event.any_data)
 
+            # add our content to the returned message or return None if no
+            # content
+            if newcontent:
+                content.append(newcontent)
+            else:
+                return None
+
         else: #object:text-changed:insert
             # Get a handle to the Text interface for the source.
             # Serious problems if this fails.
@@ -417,21 +425,28 @@
             # We found an embed character.  We can expect a children-changed
             # event, which we will act on, so just return.
             txt = sourceitext.getText(0, -1)
-            if txt.find(self._script.EMBEDDED_OBJECT_CHARACTER) == 0:
+            if txt.count(self._script.EMBEDDED_OBJECT_CHARACTER) > 0:
                 return None
 
-            # Get labeling information
-            labels = self._getLabelsAsUtterances(event.source)
-
             # Get the text based on the atomic property
             try:
                 if attrs['container-atomic'] == 'true':
-                    content.append(txt)
+                    newcontent = txt
                 else:
-                    content.append(txt[event.detail1:]) 
+                    newcontent = txt[event.detail1:event.detail1+event.detail2]
             except KeyError:
-                content.append(txt)
+                newcontent = txt[event.detail1:event.detail1+event.detail2]
 
+            # add our content to the returned message or return None if no
+            # content
+            if len(newcontent) > 0:
+                content.append(newcontent)
+            else:
+                return None
+
+        # Get the labeling information now that we have good content.
+        labels = self._getLabelsAsUtterances(event.source)
+
         return {'content':content, 'labels':labels}
 
     def flushMessages(self):
Index: src/orca/Gecko.py
===================================================================
--- src/orca/Gecko.py	(revision 3527)
+++ src/orca/Gecko.py	(working copy)
@@ -5228,9 +5228,12 @@
         if event.type.startswith('object:children-changed'):
             # This will filter out lists that are not of interest and
             # events from other tabs.
-            stateset = event.source.getState()
+            
+            
+            # We need to look at the target too
+            stateset = event.any_data.getState()
             if stateset.contains(pyatspi.STATE_FOCUSABLE) \
-                   or stateset.contains(pyatspi.STATE_FOCUSED) \
+                   or stateset.contains(pyatspi.STATE_SELECTABLE) \
                    or not stateset.contains(pyatspi.STATE_VISIBLE):
                 return False
 
@@ -5245,8 +5248,7 @@
                 return False
 
             # This eliminates all ARIA widgets that are not considered live
-            if attrs.has_key('xml-roles') \
-                                    and not attrs.has_key('container-live'):
+            if attrs.has_key('xml-roles'):
                 return False
 
         else: # object:text-inserted event
@@ -5254,7 +5256,7 @@
             # Filter out events from hidden tabs (not VISIBLE)
             stateset = event.source.getState()
             if stateset.contains(pyatspi.STATE_FOCUSABLE) \
-                   or stateset.contains(pyatspi.STATE_FOCUSED) \
+                   or stateset.contains(pyatspi.STATE_SELECTABLE) \
                    or not stateset.contains(pyatspi.STATE_VISIBLE):
                 return False
 
@@ -5271,9 +5273,9 @@
                 return False
 
             # This eliminates all ARIA widgets that are not considered live
-            if attrs.has_key('xml-roles') \
-                                and not attrs.has_key('container-live'):
+            if attrs.has_key('xml-roles'):
                 return False
+
         # It sure looks like a live region
         return True
 
