diff --git a/src/orca/braille.py b/src/orca/braille.py
index f9a8c82..ce937db 100644
--- a/src/orca/braille.py
+++ b/src/orca/braille.py
@@ -37,6 +37,9 @@ log = logging.getLogger("braille")
 import signal
 import os
 
+import gobject
+gobject.threads_init()
+
 try:
     import louis
 except ImportError:
@@ -44,8 +47,6 @@ except ImportError:
 
 try:
     import brlapi
-    import gobject
-    gobject.threads_init()
 
     _brlAPI = None
     _brlAPIAvailable = True
@@ -209,6 +210,14 @@ beginningIsShowing = False
 #
 cursorCell = 0
 
+# The event source of a timeout used for flashing a message.
+#
+_flashEventSourceId = 0
+
+# Line information saved prior to flashing any messages
+#
+_saved = None
+
 # Translators: These are the braille translation table names for different
 # languages. You could read about braille tables at:
 # http://en.wikipedia.org/wiki/Braille
@@ -1042,7 +1051,10 @@ def setFocus(region, panToFocus=True, getLinkMask=True):
 
     viewport[0] = max(0, offset)
 
-def refresh(panToCursor=True, targetCursorCell=0, getLinkMask=True):
+def refresh(panToCursor=True,
+            targetCursorCell=0,
+            getLinkMask=True,
+            killFlash=True):
     """Repaints the Braille on the physical display.  This clips the entire
     logical structure by the viewport and also sets the cursor to the
     appropriate location.  [[[TODO: WDW - I'm not sure how BrlTTY handles
@@ -1063,12 +1075,19 @@ def refresh(panToCursor=True, targetCursorCell=0, getLinkMask=True):
       attributeMask for links. Reasons we might not want to include
       knowning that we will fail and/or it taking an unreasonable
       amount of time (AKA Gecko).
+    - killFlash: if True, kill any flashed message that may be showing.
     """
 
     global endIsShowing
     global beginningIsShowing
     global cursorCell
     global _monitor
+    global _flashEventSourceId
+
+    if killFlash and _flashEventSourceId:
+        if _flashEventSourceId > 0:
+            gobject.source_remove(_flashEventSourceId)
+        _flashEventSourceId = 0
 
     if len(_lines) == 0:
         if not _brlAPIRunning:
@@ -1195,7 +1214,47 @@ def refresh(panToCursor=True, targetCursorCell=0, getLinkMask=True):
     beginningIsShowing = startPos == 0
     endIsShowing = endPos >= len(string)
 
-def displayRegions(regionInfo):
+def _flashCallback():
+    global _lines
+    global _regionWithFocus
+    global viewport
+    global _flashEventSourceId
+
+    if _flashEventSourceId:
+        (_lines, _regionWithFocus, viewport) = _saved
+        refresh(panToCursor=False, killFlash=False)
+        _flashEventSourceId = 0
+
+    return False
+
+def _handleFlash(flashTime):
+    """Sets up the state needed to flash a message or clears any existing
+    flash if nothing is to be flashed.
+
+    Arguments:
+    - flashTime:  if non-0, the number of milliseconds to display the
+                  regions before reverting back to what was there before.
+                  A 0 means to not do any flashing.  A negative number
+                  means display the message until some other message
+                  comes along or the user presses a cursor routing key.
+    """
+
+    global _saved
+    global _flashEventSourceId
+
+    if _flashEventSourceId:
+        if _flashEventSourceId > 0:
+            gobject.source_remove(_flashEventSourceId)
+        _flashEventSourceId = 0
+    else:
+        _saved = (_lines, _regionWithFocus, viewport)
+
+    if flashTime > 0:
+        _flashEventSourceId = gobject.timeout_add(flashTime, _flashCallback)
+    elif flashTime < 0:
+        _flashEventSourceId = -666
+
+def displayRegions(regionInfo, flashTime=0):
     """Displays a list of regions on a single line, setting focus to the
        specified region.  The regionInfo parameter is something that is
        typically returned by a call to braille_generator.generateBraille.
@@ -1204,8 +1263,14 @@ def displayRegions(regionInfo):
     - regionInfo: a list where the first element is a list of regions
                   to display and the second element is the region
                   with focus (must be in the list from element 0)
+    - flashTime:  if non-0, the number of milliseconds to display the
+                  regions before reverting back to what was there before.
+                  A 0 means to not do any flashing.  A negative number
+                  means display the message until some other message
+                  comes along or the user presses a cursor routing key.
     """
 
+    _handleFlash(flashTime)
     regions = regionInfo[0]
     focusedRegion = regionInfo[1]
 
@@ -1215,22 +1280,28 @@ def displayRegions(regionInfo):
         line.addRegion(item)
     addLine(line)
     setFocus(focusedRegion)
-    refresh()
+    refresh(killFlash=False)
 
-def displayMessage(message, cursor=-1):
+def displayMessage(message, cursor=-1, flashTime=0):
     """Displays a single line, setting the cursor to the given position,
     ensuring that the cursor is in view.
 
     Arguments:
     - message: the string to display
     - cursor: the 0-based cursor position, where -1 (default) means no cursor
+    - flashTime:  if non-0, the number of milliseconds to display the
+                  regions before reverting back to what was there before.
+                  A 0 means to not do any flashing.  A negative number
+                  means display the message until some other message
+                  comes along or the user presses a cursor routing key.
     """
 
+    _handleFlash(flashTime)
     clear()
     region = Region(message, cursor)
     addLine(Line(region))
     setFocus(region)
-    refresh(True)
+    refresh(True, killFlash=False)
 
 def panLeft(panAmount=0):
     """Pans the display to the left, limiting the pan to the beginning
@@ -1330,6 +1401,14 @@ def processRoutingKey(event):
     the dictionary form of the expanded BrlAPI event.
     """
 
+    # If a message is being flashed, we'll use a routing key to dismiss it.
+    #
+    if _flashEventSourceId:
+        if _flashEventSourceId > 0:
+            gobject.source_remove(_flashEventSourceId)
+        _flashCallback()
+        return
+
     cell = event.event["argument"]
 
     if len(_lines) > 0:
diff --git a/src/orca/default.py b/src/orca/default.py
index 83e1d00..6a5034e 100644
--- a/src/orca/default.py
+++ b/src/orca/default.py
@@ -4967,7 +4967,7 @@ class Script(script.Script):
                 self.reviewPreviousCharacter(inputEvent)
         else:
             braille.panLeft(panAmount)
-            braille.refresh(False)
+            braille.refresh(False, killFlash=False)
 
         return True
 
@@ -5025,7 +5025,7 @@ class Script(script.Script):
                 text.setCaretOffset(endOffset)
         else:
             braille.panRight(panAmount)
-            braille.refresh(False)
+            braille.refresh(False, killFlash=False)
 
         return True
 
diff --git a/src/orca/settings.py b/src/orca/settings.py
index 536ca53..f9ff1e1 100644
--- a/src/orca/settings.py
+++ b/src/orca/settings.py
@@ -362,6 +362,10 @@ enableBrailleContext    = True
 #
 enableBrailleGrouping   = False
 
+# The timeout (in milliseconds) to use for messages flashed in braille.
+#
+brailleFlashTime        = 5000
+
 # If True, enable braille monitor.
 #
 enableBrailleMonitor    = False
