diff --git src/orca/Gecko.py src/orca/Gecko.py
index 958d993..37b92b7 100644
--- src/orca/Gecko.py
+++ src/orca/Gecko.py
@@ -4647,25 +4647,30 @@ class Script(default.Script):
                     focusedRegion = regions[0]
             elif text and (obj.getRole() != pyatspi.ROLE_MENU_ITEM):
                 string = text.getText(startOffset, endOffset)
-                if string.endswith(" "):
-                    endOffset -= 1
-                    string = text.getText(startOffset, endOffset)
-                if not len(string):
+                string = string.strip(" ")
+                endOffset = startOffset + len(string)
+                if endOffset == startOffset:
                     continue
 
-                regions = [braille.Region(
-                    string,
-                    focusedCharacterOffset - startOffset,
-                    expandOnCursor=True)]
                 if obj.getRole() == pyatspi.ROLE_LINK:
                     link = obj
                 else:
                     link = self.getAncestor(obj,
                                             [pyatspi.ROLE_LINK],
                                             [pyatspi.ROLE_DOCUMENT_FRAME])
+
+                if not link:
+                    regions = [braille.Text(obj, 
+                                            startOffset=startOffset, 
+                                            endOffset=endOffset)]
+
                 if link:
-                    regions.append(braille.Region(
-                        " " + rolenames.getBrailleForRoleName(link)))
+                    regions = [braille.Component(
+                            link,
+                            string + " " + \
+                                rolenames.getBrailleForRoleName(link),
+                            focusedCharacterOffset - startOffset,
+                            expandOnCursor=True)]
                 elif obj.getRole() == pyatspi.ROLE_CAPTION:
                     regions.append(braille.Region(
                         " " + rolenames.getBrailleForRoleName(obj)))
@@ -8229,6 +8234,10 @@ class Script(default.Script):
     #                                                                  #
     ####################################################################
 
+    def setCaretOffset(self, obj, characterOffset):
+        self.setCaretPosition(obj, characterOffset)
+        self.updateBraille(obj)
+
     def setCaretPosition(self, obj, characterOffset):
         """Sets the caret position to the given character offset in the
         given object.
diff --git src/orca/braille.py src/orca/braille.py
index 0900d4f..b5d342a 100644
--- src/orca/braille.py
+++ src/orca/braille.py
@@ -454,7 +454,8 @@ class Text(Region):
     [[[TODO: WDW - need to add in text selection capabilities.  Logged
     as bugzilla bug 319754.]]]"""
 
-    def __init__(self, accessible, label="", eol=""):
+    def __init__(self, accessible, label="", eol="", 
+                 startOffset=0, endOffset=-1):
         """Creates a new Text region.
 
         Arguments:
@@ -467,20 +468,17 @@ class Text(Region):
             [string, self.caretOffset, self.lineOffset] = \
                  orca_state.activeScript.getTextLineAtCaret(self.accessible)
 
-        # Sometimes, gnome-terminal will give us very odd values when
-        # the user is editing using 'vi' and has positioned the caret
-        # at the first character of the first line.  In this case, we
-        # end up getting a very large negative number for the line offset.
-        # So, we just assume the user is at the first character.
-        #
-        if self.lineOffset < 0:
-            self.caretOffset = 0
-            self.lineOffset = 0
-            [string, startOffset, endOffset] = \
-                self.accessible.queryText().getTextAtOffset(
-                    0,
-                    pyatspi.TEXT_BOUNDARY_LINE_START)
+        if endOffset == -1:
+            self.endOffset = len(string)
+        else:
+            self.endOffset = endOffset - self.lineOffset
+
+        self.startOffset = startOffset - self.lineOffset
+
+        string = string.decode("UTF-8")[self.startOffset:self.endOffset]
 
+
+        self.caretOffset -= self.startOffset
         cursorOffset = min(self.caretOffset - self.lineOffset, len(string))
 
         self._maxCaretOffset = self.lineOffset + len(string.decode("UTF-8"))
@@ -540,7 +538,8 @@ class Text(Region):
             return
 
         newCaretOffset = min(self.lineOffset + offset, self._maxCaretOffset)
-        self.accessible.queryText().setCaretOffset(newCaretOffset)
+        orca_state.activeScript.setCaretOffset(
+            self.accessible, newCaretOffset)
 
     def getAttributeMask(self):
         """Creates a string which can be used as the attrOr field of brltty's
@@ -571,6 +570,8 @@ class Text(Region):
                 attributes, startOffset, endOffset = \
                             script.getTextAttributes(self.accessible,
                                                      offset, True)
+                if endOffset <= offset:
+                    break
                 mask = settings.TEXT_ATTR_BRAILLE_NONE
                 offset = endOffset
                 for attrib in attributes:
@@ -625,6 +626,7 @@ class Text(Region):
 
     def displayToBufferOffset(self, display_offset):
         offset = Region.displayToBufferOffset(self, display_offset)
+        offset += self.startOffset
         offset -= len(self.label)
         return offset
 
@@ -646,7 +648,6 @@ class ReviewComponent(Component):
                         for this Region if it gets focus.
         - zone: the flat review Zone associated with this component
         """
-
         Component.__init__(self, accessible, string,
                            cursorOffset, expandOnCursor=True)
         self.zone = zone
@@ -667,7 +668,6 @@ class ReviewText(Region):
         - lineOffset: the character offset into where the text line starts
         - zone: the flat review Zone associated with this component
         """
-
         Region.__init__(self, string, expandOnCursor=True)
         self.accessible = accessible
         self.lineOffset = lineOffset
@@ -681,7 +681,7 @@ class ReviewText(Region):
 
         offset = self.displayToBufferOffset(offset)
         newCaretOffset = self.lineOffset + offset
-        self.accessible.queryText().setCaretOffset(newCaretOffset)
+        orca_state.activeScript.setCaretOffset(self.accessible, newCaretOffset)
 
 class Line:
     """A horizontal line on the display.  Each Line is composed of a sequential
diff --git src/orca/default.py src/orca/default.py
index 7bc386b..95ca26c 100644
--- src/orca/default.py
+++ src/orca/default.py
@@ -6739,6 +6739,21 @@ class Script(script.Script):
         """
         print "\a"
 
+    def setCaretOffset(self, obj, offset):
+        """Set the caret offset on a given accessible. Similar to
+        Accessible.setCaretOffset()
+
+        Arguments:
+        - obj: Given accessible object.
+        - offset: Offset to hich to set the caret.
+        """
+        try:
+            texti = obj.queryText()
+        except:
+           return None
+
+        texti.setCaretOffset(offset)
+
     def attribsToDictionary(self, dict_string):
         """Creates a Python dict from a typical attributes list returned from
         different AT-SPI methods.
@@ -6806,7 +6821,7 @@ class Script(script.Script):
         rv.update(self.attribsToDictionary(attrib_str))
 
         return rv, start, end
-
+        
 # Dictionary that defines the state changes we care about for various
 # objects.  The key represents the role and the value represents a list
 # of states that we care about.
diff --git src/orca/flat_review.py src/orca/flat_review.py
index a404c46..d5bb76a 100644
--- src/orca/flat_review.py
+++ src/orca/flat_review.py
@@ -530,11 +530,13 @@ class Line:
             for zone in self.zones:
                 # The 'isinstance(zone, TextZone)' test is a sanity check
                 # to handle problems with Java text. See Bug 435553.
-                if isinstance(zone, TextZone) and \
-                   ((zone.accessible.getRole() == pyatspi.ROLE_TEXT) \
-                    or (zone.accessible.getRole() == \
-                                                pyatspi.ROLE_PASSWORD_TEXT) \
-                    or (zone.accessible.getRole() == pyatspi.ROLE_TERMINAL)):
+                try:
+                    zone.accessible.queryText()
+                except NotImplementedError:
+                    has_text_iface = False
+                else:
+                    has_text_iface = True
+                if isinstance(zone, TextZone) and has_text_iface:
                     region = braille.ReviewText(zone.accessible,
                                                 zone.string,
                                                 zone.startOffset,
diff --git src/orca/scripts/gnome-terminal.py src/orca/scripts/gnome-terminal.py
index 3f256c4..d5a0c68 100644
--- src/orca/scripts/gnome-terminal.py
+++ src/orca/scripts/gnome-terminal.py
@@ -266,3 +266,33 @@ class Script(default.Script):
            and self.isWordDelimiter(text.decode("UTF-8")[-1:]):
             if matchFound:
                 self.echoPreviousWord(event.source)
+
+    def getTextLineAtCaret(self, acc):
+        """Gets the line of text where the caret is.
+
+        Argument:
+        - obj: an Accessible object that implements the AccessibleText
+               interface
+
+        Returns the [string, caretOffset, startOffset] for the line of text
+        where the caret is.
+        """
+        string, caretOffset, lineOffset = \
+                default.Script.getTextLineAtCaret(self, acc)
+
+        # Sometimes, gnome-terminal will give us very odd values when
+        # the user is editing using 'vi' and has positioned the caret
+        # at the first character of the first line.  In this case, we
+        # end up getting a very large negative number for the line offset.
+        # So, we just assume the user is at the first character.
+        #
+        if lineOffset < 0:
+            caretOffset = 0
+            lineOffset = 0
+            texti = acc.queryText()
+            string, startOffset, endOffset = \
+                    texti.getTextAtOffset(0,
+                                          pyatspi.TEXT_BOUNDARY_LINE_START)
+
+        return string, caretOffset, lineOffset
+        
