diff --git a/src/orca/braille.py b/src/orca/braille.py
index f069504..f846b7c 100644
--- a/src/orca/braille.py
+++ b/src/orca/braille.py
@@ -188,6 +188,15 @@ _lines = []
 #
 _regionWithFocus = None
 
+# The last text information painted.  This has the following fields:
+#
+# lastTextObj = the last accessible
+# lastCaretOffset = the last caret offset of the last text displayed
+# lastLineOffset = the last line offset of the last text displayed
+# lastCursorCell = the last cell on the braille display for the caret
+#
+_lastTextInfo = (None, 0, 0, 0)
+
 # The viewport is a rectangular region of size _displaySize whose upper left
 # corner is defined by the point (x, line number).  As such, the viewport is
 # identified solely by its upper left point.
@@ -1087,6 +1096,21 @@ def refresh(panToCursor=True,
     global beginningIsShowing
     global cursorCell
     global _monitor
+    global _lastTextInfo
+
+    # Check out what we were displaying the last time - it might be
+    # the same text object we are displaying now.
+    #
+    (lastTextObj, lastCaretOffset, lastLineOffset, lastCursorCell) = \
+        _lastTextInfo
+    if _regionWithFocus and isinstance(_regionWithFocus, Text):
+        currentTextObj = _regionWithFocus.accessible
+        currentCaretOffset = _regionWithFocus.caretOffset
+        currentLineOffset = _regionWithFocus.lineOffset
+    else:
+        currentTextObj = None
+        currentCaretOffset = 0
+        currentLineOffset = 0
 
     if stopFlash:
         killFlash(restoreSaved=False)
@@ -1102,6 +1126,7 @@ def refresh(panToCursor=True,
                               "BrlTTY seems to have disappeared:")
                 debug.printException(debug.LEVEL_WARNING)
                 shutdown()
+        _lastTextInfo = (None, 0, 0, 0)
         return
 
     # Now determine the location of the cursor.  First, we'll figure
@@ -1112,6 +1137,26 @@ def refresh(panToCursor=True,
     if targetCursorCell < 0:
         targetCursorCell = _displaySize[0] + targetCursorCell + 1
 
+    # If there is no target cursor cell, then try to set one.  We
+    # currently only do this for text objects, and we do so by looking
+    # at the last position of the caret offset and cursor cell.  The
+    # primary goal here is to keep the cursor movement on the display
+    # somewhat predictable.
+    #
+    if (targetCursorCell == 0) \
+       and currentTextObj and (currentTextObj == lastTextObj) \
+       and (currentLineOffset == lastLineOffset):
+        if lastCaretOffset == currentCaretOffset:
+            targetCursorCell = lastCursorCell
+        elif lastCaretOffset < currentCaretOffset:
+            targetCursorCell = min(_displaySize[0],
+                                   lastCursorCell \
+                                   + (currentCaretOffset - lastCaretOffset))
+        elif lastCaretOffset > currentCaretOffset:
+            targetCursorCell = max(1,
+                                   lastCursorCell \
+                                   - (lastCaretOffset - currentCaretOffset))
+
     # Now, we figure out the 0-based offset for where the cursor
     # actually is in the string.
     #
@@ -1148,6 +1193,9 @@ def refresh(panToCursor=True,
     else:
         cursorCell += 1 # Normalize to 1-based offset
 
+    # [[[TODO: WDW - this is a potential spot where we might realign
+    # the viewport and cursorCell to show complete words and such.]]]
+
     logLine = "BRAILLE LINE:  '%s'" % string
     debug.println(debug.LEVEL_INFO, logLine)
     log.info(logLine.encode("UTF-8"))
@@ -1216,6 +1264,16 @@ def refresh(panToCursor=True,
     beginningIsShowing = startPos == 0
     endIsShowing = endPos >= len(string)
 
+    # Remember the text information we were presenting (if any)
+    #
+    if _regionWithFocus and isinstance(_regionWithFocus, Text):
+        _lastTextInfo = (_regionWithFocus.accessible,
+                         _regionWithFocus.caretOffset,
+                         _regionWithFocus.lineOffset,
+                         cursorCell)
+    else:
+        _lastTextInfo = (None, 0, 0, 0)
+
 def _flashCallback():
     global _lines
     global _regionWithFocus
diff --git a/src/orca/braille_generator.py b/src/orca/braille_generator.py
index 6a1e2e0..5526dfb 100644
--- a/src/orca/braille_generator.py
+++ b/src/orca/braille_generator.py
@@ -297,7 +297,8 @@ class BrailleGenerator(generator.Generator):
             text = obj.queryText()
         except NotImplementedError:
             text = None
-        if text and self._script.isTextArea(obj):
+        if text and (self._script.isTextArea(obj) \
+                     or (obj.getRole() == pyatspi.ROLE_LABEL)):
             [lineString, startOffset, endOffset] = text.getTextAtOffset(
                 text.caretOffset,
                 pyatspi.TEXT_BOUNDARY_LINE_START)
