diff --git src/orca/Gecko.py src/orca/Gecko.py
index ba3782d..304dffe 100644
--- src/orca/Gecko.py
+++ src/orca/Gecko.py
@@ -4640,24 +4640,32 @@ class Script(default.Script):
                 if isFocusedObj:
                     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)
-
-                regions = [braille.Region(
-                    string,
-                    focusedCharacterOffset - startOffset,
-                    expandOnCursor=True)]
+                string = text.getText(startOffset, endOffset).decode('utf-8')
+                string = string.rstrip()
+                endOffset = startOffset + len(string)
+
+                if endOffset == startOffset:
+                    continue
+
                 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)))
@@ -7602,6 +7610,28 @@ class Script(default.Script):
 
         self._updateLineCache(obj, characterOffset)
 
+    def getTextLineAtCaret(self, obj):
+        """Gets the line of text where the caret is. This is an override to accomodate
+        the intricities of our caret navigation management.
+
+        Argument:
+        - obj: an Accessible object that implements the AccessibleText
+               interface
+
+        Returns the [string, caretOffset, startOffset] for the line of text
+        where the caret is.
+        """
+
+        contextObj, contextCaret = self.getCaretContext()
+
+        string, caretOffset, startOffset = default.Script.getTextLineAtCaret(self, obj)
+
+        if contextObj == obj:
+            if not obj.getState().contains(pyatspi.STATE_EDITABLE):
+                caretOffset = contextCaret
+        
+        return string, caretOffset, startOffset
+
     def getCaretContext(self, includeNonText=True):
         """Returns the current [obj, caretOffset] if defined.  If not,
         it returns the first [obj, caretOffset] found by an in order
@@ -8239,6 +8269,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 c985536..06bec2f 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=None, endOffset=None):
         """Creates a new Text region.
 
         Arguments:
@@ -467,19 +468,21 @@ 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)
+        string = string.decode("UTF-8")
+
+        try:
+            endOffset = endOffset - self.lineOffset
+        except TypeError:
+            pass
+
+        try:
+            self.startOffset = startOffset - self.lineOffset
+        except TypeError:
+            self.startOffset = 0
+
+        string = string[self.startOffset:endOffset]
+
+        self.caretOffset -= self.startOffset
 
         cursorOffset = min(self.caretOffset - self.lineOffset, len(string))
 
@@ -495,7 +498,7 @@ class Text(Region):
         string = self.label + string
 
         cursorOffset += len(self.label)
-        
+
         Region.__init__(self, string, cursorOffset, True)
 
         if not self.contracted:
@@ -540,7 +543,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 +575,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:
@@ -610,6 +616,7 @@ class Text(Region):
         # any label that might be present.
         #
         regionMask += [0]*len(self.eol)
+
         if self.label:
             regionMask = [0]*len(self.label) + regionMask
 
@@ -623,6 +630,7 @@ class Text(Region):
 
     def displayToBufferOffset(self, display_offset):
         offset = Region.displayToBufferOffset(self, display_offset)
+        offset += self.startOffset
         offset -= len(self.label)
         return offset
 
@@ -644,7 +652,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
@@ -665,7 +672,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
@@ -679,7 +685,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 9386c35..30ed065 100644
--- src/orca/default.py
+++ src/orca/default.py
@@ -6822,6 +6822,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.
@@ -6986,7 +7001,7 @@ class Script(script.Script):
             ti = acc.queryText()
         except NotImplementedError:
             return '', 0, 0
-        
+
         text_contents = ti.getText(0, -1)
         line_offsets = []
         start_offset = 0
diff --git src/orca/flat_review.py src/orca/flat_review.py
index 285c7c3..fb89b6b 100644
--- src/orca/flat_review.py
+++ src/orca/flat_review.py
@@ -531,10 +531,19 @@ class Line:
                 # 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)):
+                   ((zone.accessible.getRole() in \
+                         (pyatspi.ROLE_TEXT,  
+                          pyatspi.ROLE_PASSWORD_TEXT,
+                          pyatspi.ROLE_TERMINAL)) or \
+                    # [[[TODO: Eitan - HACK: 
+                    # This is just to get FF3 cursor key routing support.
+                    # We really should not be determining all this stuff here,
+                    # it should be in the scripts. 
+                    # Same applies to roles above.]]]
+                    (zone.accessible.getRole() in \
+                         (pyatspi.ROLE_PARAGRAPH,
+                          pyatspi.ROLE_HEADING,
+                          pyatspi.ROLE_LINK))):
                     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
+        
