[orca] New, updated, and cleaned up tests for Writer



commit a5bd22fcfc3c41734a9d043d26550eb16a3a7bdd
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Sat May 10 17:02:50 2014 -0400

    New, updated, and cleaned up tests for Writer

 .../oowriter => documents}/column-example.odt      |  Bin 19352 -> 19352 bytes
 test/{keystrokes/oocalc => documents}/fruit.ods    |  Bin 9593 -> 9593 bytes
 test/documents/navigator.odt                       |  Bin 0 -> 9298 bytes
 .../{keystrokes/oowriter => documents}/spanish.odt |  Bin 10127 -> 10127 bytes
 .../oowriter => documents}/table-sample.odt        |  Bin 9266 -> 9266 bytes
 .../oowriter => documents}/table-sample2.odt       |  Bin 9440 -> 9440 bytes
 test/harness/.gitignore                            |    2 +
 test/harness/runone.sh                             |    8 +-
 test/harness/utils.py                              |  120 +-----
 test/keystrokes/oowriter/bug_342602.py             |  113 -----
 test/keystrokes/oowriter/bug_350219.py             |   56 ---
 test/keystrokes/oowriter/bug_353268.py             |  108 -----
 test/keystrokes/oowriter/bug_355733.py             |  101 -----
 test/keystrokes/oowriter/bug_361624.params         |    1 -
 test/keystrokes/oowriter/bug_361624.py             |  110 -----
 test/keystrokes/oowriter/bug_361747.params         |    1 -
 test/keystrokes/oowriter/bug_361747.py             |  132 ------
 test/keystrokes/oowriter/bug_362979.py             |  125 ------
 test/keystrokes/oowriter/bug_364765.py             |   71 ----
 test/keystrokes/oowriter/bug_382408.params         |    1 -
 test/keystrokes/oowriter/bug_382408.py             |  100 -----
 test/keystrokes/oowriter/bug_382415.params         |    1 -
 test/keystrokes/oowriter/bug_382415.py             |  131 ------
 test/keystrokes/oowriter/bug_382418.py             |  118 ------
 test/keystrokes/oowriter/bug_382880.params         |    1 -
 test/keystrokes/oowriter/bug_382880.py             |  171 --------
 test/keystrokes/oowriter/bug_382888.params         |    1 -
 test/keystrokes/oowriter/bug_382888.py             |  170 --------
 test/keystrokes/oowriter/bug_384893.params         |    1 -
 test/keystrokes/oowriter/bug_384893.py             |  114 -----
 test/keystrokes/oowriter/bug_385828.py             |   62 ---
 test/keystrokes/oowriter/bug_413909.py             |  138 -------
 test/keystrokes/oowriter/bug_430402.py             |  107 -----
 test/keystrokes/oowriter/bug_435201.params         |    1 -
 test/keystrokes/oowriter/bug_435201.py             |  132 ------
 test/keystrokes/oowriter/bug_435226.params         |    1 -
 test/keystrokes/oowriter/bug_435226.py             |  133 ------
 test/keystrokes/oowriter/bug_450210.py             |   57 ---
 test/keystrokes/oowriter/bug_469367.params         |    1 -
 test/keystrokes/oowriter/bug_469367.py             |   90 ----
 test/keystrokes/oowriter/bug_546941.py             |  106 -----
 test/keystrokes/oowriter/document_nav_cell.params  |    1 +
 test/keystrokes/oowriter/document_nav_cell.py      |   64 +++
 test/keystrokes/oowriter/document_nav_line.py      |   56 +++
 .../oowriter/document_nav_line_bullets.py          |   52 +++
 .../oowriter/document_nav_paragraph.params         |    1 +
 test/keystrokes/oowriter/document_nav_paragraph.py |   86 ++++
 test/keystrokes/oowriter/document_nav_word.py      |  116 ++++++
 test/keystrokes/oowriter/document_new.py           |   22 +
 test/keystrokes/oowriter/empty_document.odt        |  Bin 6841 -> 0 bytes
 test/keystrokes/oowriter/flat_review_line.py       |   84 ++++
 .../oowriter/flat_review_line_columns.params       |    1 +
 .../oowriter/flat_review_line_columns.py           |   77 ++++
 .../oowriter/flat_review_platform_menubar.py       |   96 +++++
 test/keystrokes/oowriter/flat_review_word.py       |  110 +++++
 test/keystrokes/oowriter/messages_table.py         |   83 ++++
 test/keystrokes/oowriter/row_inserted.py           |  121 ------
 test/keystrokes/oowriter/say_all.py                |   37 ++
 test/keystrokes/oowriter/say_all_no_sentences.py   |   29 ++
 test/keystrokes/oowriter/selection_word.py         |  225 ++++++++++
 test/keystrokes/oowriter/spellcheck.py             |   40 ++
 test/keystrokes/oowriter/spellcheck.settings       |  177 ++++++++
 test/keystrokes/oowriter/spoken_indentation.py     |   24 ++
 .../oowriter/spoken_indentation.settings           |  177 ++++++++
 .../oowriter/structural_nav_table.params           |    1 +
 test/keystrokes/oowriter/structural_nav_table.py   |  145 +++++++
 .../oowriter/structural_nav_table.settings         |  177 ++++++++
 test/keystrokes/oowriter/table_cell_row.params     |    1 +
 test/keystrokes/oowriter/table_cell_row.py         |   61 +++
 test/keystrokes/oowriter/table_cells.params        |    1 -
 test/keystrokes/oowriter/table_cells.py            |  341 ---------------
 .../table_cells_structural_navigation1.params      |    1 -
 .../oowriter/table_cells_structural_navigation1.py |  288 -------------
 test/keystrokes/oowriter/text_attributes.py        |   55 +++
 test/keystrokes/oowriter/toolbar-buttons.py        |  422 -------------------
 test/keystrokes/oowriter/ui_navigator.params       |    1 +
 test/keystrokes/oowriter/ui_navigator.py           |   50 +++
 test/keystrokes/oowriter/ui_role_combo_box.py      |   37 ++
 test/keystrokes/oowriter/ui_role_label.py          |   36 ++
 test/keystrokes/oowriter/ui_role_list_item.py      |   37 ++
 test/keystrokes/oowriter/ui_role_menu.py           |   32 ++
 test/keystrokes/oowriter/ui_role_toolbar.py        |  238 +++++++++++
 .../keystrokes/oowriter/where_am_i_document.params |    1 +
 test/keystrokes/oowriter/where_am_i_document.py    |   42 ++
 .../oowriter/where_am_i_document.settings          |  177 ++++++++
 test/keystrokes/oowriter/word-navigation.py        |  434 --------------------
 86 files changed, 2667 insertions(+), 4175 deletions(-)
---
diff --git a/test/documents/navigator.odt b/test/documents/navigator.odt
new file mode 100644
index 0000000..d27a8df
Binary files /dev/null and b/test/documents/navigator.odt differ
diff --git a/test/harness/.gitignore b/test/harness/.gitignore
index 047c431..196664a 100644
--- a/test/harness/.gitignore
+++ b/test/harness/.gitignore
@@ -6,3 +6,5 @@ utils.pyc
 *.speech
 *.braille
 *.out
+app-settings
+orca-scripts
\ No newline at end of file
diff --git a/test/harness/runone.sh b/test/harness/runone.sh
index 83f153a..5397fff 100755
--- a/test/harness/runone.sh
+++ b/test/harness/runone.sh
@@ -84,15 +84,10 @@ else
    fi
 fi
 
-# FIXME(LMS): Temporary hack to tell OpenOffice Writer and Calc
-# to not attempt to recover edited files after a crash. There
-# should be a general way specify command line arguments when
-# starting test applications.
-#
 if [ "$APP_NAME" == "swriter" ] || [ "$APP_NAME" == "oowriter" ] || [ "$APP_NAME" == "scalc" ] || [ 
"$APP_NAME" == "oocalc" ] || [ "$APP_NAME" == "simpress" ] || [ "$APP_NAME" == "ooimpress" ] || [ "$APP_NAME" 
== "sbase" ] || [ "$APP_NAME" == "oobase" ] || [ "$APP_NAME" == "soffice" ] || [ "$APP_NAME" == "ooffice" ]
 then
     SOFFICE=1
-    ARGS="-norestore"
+    ARGS="--norestore --nologo"
 fi
 
 # If we're using Firefox, give it a known profile to work from.
@@ -145,6 +140,7 @@ fi
 if [ "x$SOFFICE" == "x1" ]
 then
     APP_PID=$(ps -eo pid,ruid,args | grep norestore | grep -v grep | awk '{ print $1 }')
+    kill $APP_PID > /dev/null 2>&1
 fi
 
 if [ "$APP_NAME" == "epiphany" ]
diff --git a/test/harness/utils.py b/test/harness/utils.py
index 0f0de24..d83aff3 100644
--- a/test/harness/utils.py
+++ b/test/harness/utils.py
@@ -1,9 +1,12 @@
-"""Utilities that can be imported by tests.  You need to make
-sure your PYTHONPATH includes the directory containing this
-file in order for the tests that use it to work.  The test
-harness does that automatically for you."""
+"""Utilities that can be used by tests."""
+
+import difflib
+import re
+import sys
 
 from gi.repository import Gio
+from macaroon.playback import *
+
 testLogger = Gio.DBusProxy.new_for_bus_sync(
     Gio.BusType.SESSION,
     Gio.DBusProxyFlags.NONE,
@@ -13,67 +16,6 @@ testLogger = Gio.DBusProxy.new_for_bus_sync(
     'org.gnome.Orca.Logger',
     None)
 
-# Where to find Dojo tests.
-#
-DojoNightlyURLPrefix="http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/";
-#DojoURLPrefix="http://localhost/apache2-default/dojo-release-1.1.0b2/dijit/tests/";
-#DojoURLPrefix="http://bashautomation.com/dojo-release-1.1.0b2/dijit/tests/";
-DojoJuly09URLPrefix="http://archive.dojotoolkit.org/dojo-2009-08-05/dojotoolkit/dijit/tests/";
-DojoURLPrefix=DojoJuly09URLPrefix
-
-# Where to find our local HTML tests.
-#
-import sys, os, re
-wd = os.path.dirname(sys.argv[0])
-fullPath = os.path.abspath(wd)
-htmlDir = os.path.abspath(fullPath + "/../../html")
-htmlURLPrefix = "file://" + htmlDir + "/"
-
-# Various Firefox names as a regex.  These are needed because they like
-# to do various things with the app and frame names from release to release. 
-# These regex's attempt to provide a way to manage those differences.
-#
-firefoxAppNames = "(Firefox|Minefield|Namoroka)"
-firefoxFrameNames = "(Mozilla Firefox|Mozilla Firefox 4.0(| Beta [0-9](|pre))|Minefield|Namoroka)"
-firefoxLocationBarNames = "(Location|Search Bookmarks and History)"
-
-# Various OpenOffice names as a regex.  These are needed because OOo likes
-# to do various things with its window titles from release to release. 
-# These regex's attempt to provide a way to manage those differences.
-#
-OOoWriterNames = "(StarOffice Writer|OpenOffice.org Writer|OOo-dev Writer Beta)"
-
-#OOO_VERSION="Release"
-#OOO_VERSION="Beta"
-OOO_VERSION="Dev"
-
-def getOOoName(app):
-    if OOO_VERSION == "Release":
-        return "OpenOffice.org %s" % app
-    elif OOO_VERSION == "Beta":
-        return "OOo-dev %s Beta" % app
-    elif OOO_VERSION == "Dev":
-        return "OOo-dev %s" % app
-        
-def getOOoBrailleLine(app, title, remainder):
-    if OOO_VERSION == "Release":
-        return "soffice Application " + title + " - OpenOffice.org " + app + " Frame " +  title + " - 
OpenOffice.org " + app + " RootPane ScrollPane Document view " + remainder
-    elif OOO_VERSION == "Beta":
-        return "soffice Application " + title + " - OOo-dev " + app + " Beta Frame " +  title + " - OOo-dev 
" + app + " Beta RootPane ScrollPane Document view " + remainder
-    elif OOO_VERSION == "Dev":
-        return "soffice Application " + title + " - OOo-dev " + app + " Frame " +  title + " - OOo-dev " + 
app + " RootPane ScrollPane Document view " + remainder
-
-createDiffs = True
-try:
-    # If the difflib module is not found, fall back to generating the
-    # old-style EXPECTED/ACTUAL output.
-    #
-    import difflib
-except:
-    createDiffs = False
-
-from macaroon.playback import *
-
 enable_assert = \
     environ.get('HARNESS_ASSERT', 'yes') in ('yes', 'true', 'y', '1', 1)
 errFilename = environ.get('HARNESS_ERR', None)
@@ -146,7 +88,7 @@ class AssertPresentationAction(AtomicAction):
     totalFail = 0
     totalKnownIssues = 0
 
-    def __init__(self, name, expectedResults, 
+    def __init__(self, name, expectedResults,
                  assertionPredicate=assertListEquality):
         '''name:               the name of the test
            expectedResults:    the results we want (typically a list of strings
@@ -212,56 +154,23 @@ class AssertPresentationAction(AtomicAction):
 
         return knownIssue
 
-    def printResults(self, results):
-        """Print out the expected results and the actual results.
-
-        Arguments:
-        - results: the actual results.
-
-        Returns an indication of whether this test was expected to fail.
-        """
-
-        knownIssue = False
-        print("EXPECTED:", file=myErr)
-        if isinstance(self._expectedResults, [].__class__):
-            for result in self._expectedResults:
-                if result.startswith("KNOWN ISSUE") \
-                        or result.startswith("BUG?"):
-                    knownIssue = True
-                print('     "%s",' % result, file=myErr)
-        else:
-            if self._expectedResults.startswith("KNOWN ISSUE") \
-               or self._expectedResults.startswith("BUG?"):
-                knownIssue = True
-            print('     "%s"' % self._expectedResults, file=myErr)
-        print("ACTUAL:", file=myErr)
-        if isinstance(results, [].__class__):
-            for result in results:
-                print('     "%s",' % result, file=myErr)
-        else:
-            print('     "%s"' % results, file=myErr)
-        return knownIssue
-
     def _stopRecording(self):
         result = testLogger.stopRecording()
         results = self._assertionPredicate(result, self._expectedResults)
         if not results:
             AssertPresentationAction.totalSucceed += 1
             print("Test %d of %d SUCCEEDED: %s" \
-                            % (self._num, 
-                               AssertPresentationAction.totalCount, 
+                            % (self._num,
+                               AssertPresentationAction.totalCount,
                                self._name), file=myOut)
         else:
             AssertPresentationAction.totalFail += 1
             print("Test %d of %d FAILED: %s" \
-                            % (self._num, 
-                               AssertPresentationAction.totalCount, 
+                            % (self._num,
+                               AssertPresentationAction.totalCount,
                                self._name), file=myErr)
-            if createDiffs:
-                knownIssue = self.printDiffs(results)
-            else:
-                knownIssue = self.printResults(results)
 
+            knownIssue = self.printDiffs(results)
             if knownIssue:
                 AssertPresentationAction.totalKnownIssues += 1
                 print('[FAILURE WAS EXPECTED - ' \
@@ -274,7 +183,7 @@ class AssertPresentationAction(AtomicAction):
         return 'Assert Presentation Action: %s' % self._name
 
 class AssertionSummaryAction(AtomicAction):
-    '''Output the summary of successes and failures of 
+    '''Output the summary of successes and failures of
     AssertPresentationAction assertions.'''
 
     def __init__(self):
@@ -291,4 +200,3 @@ class AssertionSummaryAction(AtomicAction):
 
     def __str__(self):
         return 'Start Recording Action'
-
diff --git a/test/keystrokes/oowriter/document_nav_cell.params 
b/test/keystrokes/oowriter/document_nav_cell.params
new file mode 100644
index 0000000..6952e8c
--- /dev/null
+++ b/test/keystrokes/oowriter/document_nav_cell.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../documents/table-sample.odt
diff --git a/test/keystrokes/oowriter/document_nav_cell.py b/test/keystrokes/oowriter/document_nav_cell.py
new file mode 100644
index 0000000..251f016
--- /dev/null
+++ b/test/keystrokes/oowriter/document_nav_cell.py
@@ -0,0 +1,64 @@
+#!/usr/bin/python
+
+"""Test of speech output when tabbing amongst table cells."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Down"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to Tue",
+    ["BRAILLE LINE:  'Tue $l'",
+     "     VISIBLE:  'Tue $l', cursor=1",
+     "SPEECH OUTPUT: 'Tue'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Tab to Wed",
+    ["BRAILLE LINE:  'Wed $l'",
+     "     VISIBLE:  'Wed $l', cursor=1",
+     "SPEECH OUTPUT: 'Wed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab to Thu",
+    ["BRAILLE LINE:  'Thu $l'",
+     "     VISIBLE:  'Thu $l', cursor=1",
+     "SPEECH OUTPUT: 'Thu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Tab to Fri",
+    ["BRAILLE LINE:  'Fri $l'",
+     "     VISIBLE:  'Fri $l', cursor=1",
+     "SPEECH OUTPUT: 'Fri'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Tab to Sat",
+    ["BRAILLE LINE:  'Sat $l'",
+     "     VISIBLE:  'Sat $l', cursor=1",
+     "SPEECH OUTPUT: 'Sat'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Tab to blank cell in next row",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'blank blank blank blank blank 1 2'"]))
+
+sequence.append(KeyComboAction("<Control>w"))
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/document_nav_line.py b/test/keystrokes/oowriter/document_nav_line.py
new file mode 100644
index 0000000..65a58fa
--- /dev/null
+++ b/test/keystrokes/oowriter/document_nav_line.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+
+"""Test presentation of caret navigation by line."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("Line 1"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("Line 2"))
+sequence.append(KeyComboAction("Return"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Return to top of document",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view Line 1 $l'",
+     "     VISIBLE:  'Line 1 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Arrow down to 'Line 2'",
+    ["BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Arrow down over the empty line",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Arrow up to 'Line 2'",
+    ["BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Arrow up to 'Line 1'",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view Line 1 $l'",
+     "     VISIBLE:  'Line 1 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line 1'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/document_nav_line_bullets.py 
b/test/keystrokes/oowriter/document_nav_line_bullets.py
new file mode 100644
index 0000000..0c4f0c0
--- /dev/null
+++ b/test/keystrokes/oowriter/document_nav_line_bullets.py
@@ -0,0 +1,52 @@
+#!/usr/bin/python
+
+"""Test presentation of caret navigation by line in list with bullets."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Shift>F12"))
+sequence.append(TypeAction("Line 1"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("Line 2"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("Line 3"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Down to next bulleted line",
+    ["BRAILLE LINE:  '•Line 2 $l'",
+     "     VISIBLE:  '•Line 2 $l', cursor=2",
+     "SPEECH OUTPUT: '•Line 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down to next bulleted line",
+    ["BRAILLE LINE:  '•Line 3 $l'",
+     "     VISIBLE:  '•Line 3 $l', cursor=2",
+     "SPEECH OUTPUT: '•Line 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Up to previous bulleted line",
+    ["BRAILLE LINE:  '•Line 2 $l'",
+     "     VISIBLE:  '•Line 2 $l', cursor=2",
+     "SPEECH OUTPUT: '•Line 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Up to previous bulleted line",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view •Line 1 $l'",
+     "     VISIBLE:  '•Line 1 $l', cursor=2",
+     "SPEECH OUTPUT: '•Line 1'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/document_nav_paragraph.params 
b/test/keystrokes/oowriter/document_nav_paragraph.params
new file mode 100644
index 0000000..2ff8051
--- /dev/null
+++ b/test/keystrokes/oowriter/document_nav_paragraph.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../documents/spanish.odt
diff --git a/test/keystrokes/oowriter/document_nav_paragraph.py 
b/test/keystrokes/oowriter/document_nav_paragraph.py
new file mode 100644
index 0000000..05ce81c
--- /dev/null
+++ b/test/keystrokes/oowriter/document_nav_paragraph.py
@@ -0,0 +1,86 @@
+#!/usr/bin/python
+
+"""Test of presentation of caret navigation by paragraph."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Next paragraph",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Amongst our weaponry are such diverse  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=1",
+     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Amongst our weaponry are such diverse elements 
as: fear, surprise, ruthless efficiency, an almost fanatical devotion to the Pope, and nice red uniforms - Oh 
damn!'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Next paragraph",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Next paragraph",
+    ["BRAILLE LINE:  'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject  
$l'",
+     "     VISIBLE:  'Now old lady, you have one last ', cursor=1",
+     "SPEECH OUTPUT: 'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject the 
works of the ungodly. Two last chances. And you shall be free. Three last chances. You have three last 
chances, the nature of which I have divulged in my previous utterance.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Next paragraph",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Next paragraph",
+    ["BRAILLE LINE:  'Hm! She is made of harder stuff! Cardinal Fang! Fetch the COMFY CHAIR! $l'",
+     "     VISIBLE:  'Hm! She is made of harder stuff!', cursor=1",
+     "SPEECH OUTPUT: 'Hm! She is made of harder stuff! Cardinal Fang! Fetch the COMFY CHAIR!'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Up"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Previous paragraph",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Up"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Previous paragraph",
+    ["BRAILLE LINE:  'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject  
$l'",
+     "     VISIBLE:  'Now old lady, you have one last ', cursor=1",
+     "SPEECH OUTPUT: 'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject the 
works of the ungodly. Two last chances. And you shall be free. Three last chances. You have three last 
chances, the nature of which I have divulged in my previous utterance.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Up"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Previous paragraph",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Up"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Previous paragraph",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Amongst our weaponry are such diverse  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=1",
+     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Amongst our weaponry are such diverse elements 
as: fear, surprise, ruthless efficiency, an almost fanatical devotion to the Pope, and nice red uniforms - Oh 
damn!'"]))
+
+sequence.append(KeyComboAction("<Control>w"))
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/document_nav_word.py b/test/keystrokes/oowriter/document_nav_word.py
new file mode 100644
index 0000000..66e25f1
--- /dev/null
+++ b/test/keystrokes/oowriter/document_nav_word.py
@@ -0,0 +1,116 @@
+#!/usr/bin/python
+
+"""Test presentation of caret navigation by word."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("This is a test."))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("So is this."))
+sequence.append(KeyComboAction("Return"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=6",
+     "SPEECH OUTPUT: 'is '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=9",
+     "SPEECH OUTPUT: 'a '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=11",
+     "SPEECH OUTPUT: 'test.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=15",
+     "SPEECH OUTPUT: 'dot'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  ' This is a test. $l', cursor=1",
+     "BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=1",
+     "SPEECH OUTPUT: 'blank' voice=system",
+     "SPEECH OUTPUT: 'So '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Next Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=4",
+     "SPEECH OUTPUT: 'is '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Previous Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=1",
+     "SPEECH OUTPUT: 'So '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=15",
+     "SPEECH OUTPUT: 'dot'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=11",
+     "SPEECH OUTPUT: 'test.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=9",
+     "SPEECH OUTPUT: 'a '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=6",
+     "SPEECH OUTPUT: 'is '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=1",
+     "SPEECH OUTPUT: 'This '"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/document_new.py b/test/keystrokes/oowriter/document_new.py
new file mode 100644
index 0000000..775af0e
--- /dev/null
+++ b/test/keystrokes/oowriter/document_new.py
@@ -0,0 +1,22 @@
+#!/usr/bin/python
+
+"""Test to verify what is announced when you create a new document."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>N"))
+sequence.append(utils.AssertPresentationAction(
+    "New text document",
+    ["BRAILLE LINE:  'soffice application Untitled 2 - LibreOffice Writer frame'",
+     "     VISIBLE:  'Untitled 2 - LibreOffice Writer ', cursor=1",
+     "BRAILLE LINE:  'soffice application Untitled 2 - LibreOffice Writer frame Untitled 2 - LibreOffice 
Writer root pane Document view  $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Untitled 2 - LibreOffice Writer frame'",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/flat_review_line.py b/test/keystrokes/oowriter/flat_review_line.py
new file mode 100644
index 0000000..9dd3e69
--- /dev/null
+++ b/test/keystrokes/oowriter/flat_review_line.py
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+
+"""Test flat review by line."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("Line 1"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("Line 2"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_8"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Review current line.",
+    ["BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=7",
+     "SPEECH OUTPUT: 'ruler Line 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_9"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Review next line.",
+    ["BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_8"))
+sequence.append(KeyComboAction("KP_8"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Spell current line.",
+    ["BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line 2'",
+     "SPEECH OUTPUT: 'L'",
+     "SPEECH OUTPUT: 'i'",
+     "SPEECH OUTPUT: 'n'",
+     "SPEECH OUTPUT: 'e'",
+     "SPEECH OUTPUT: 'space'",
+     "SPEECH OUTPUT: '2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_8"))
+sequence.append(KeyComboAction("KP_8"))
+sequence.append(KeyComboAction("KP_8"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Phonetic spell current line.",
+    ["BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line 2'",
+     "SPEECH OUTPUT: 'L'",
+     "SPEECH OUTPUT: 'i'",
+     "SPEECH OUTPUT: 'n'",
+     "SPEECH OUTPUT: 'e'",
+     "SPEECH OUTPUT: 'space'",
+     "SPEECH OUTPUT: '2'",
+     "SPEECH OUTPUT: 'lima' voice=uppercase",
+     "SPEECH OUTPUT: 'india'",
+     "SPEECH OUTPUT: 'november'",
+     "SPEECH OUTPUT: 'echo'",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: '2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_7"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Review previous line.",
+    ["BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=1",
+     "SPEECH OUTPUT: 'ruler Line 1'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/flat_review_line_columns.params 
b/test/keystrokes/oowriter/flat_review_line_columns.params
new file mode 100644
index 0000000..1113c6c
--- /dev/null
+++ b/test/keystrokes/oowriter/flat_review_line_columns.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../documents/column-example.odt
diff --git a/test/keystrokes/oowriter/flat_review_line_columns.py 
b/test/keystrokes/oowriter/flat_review_line_columns.py
new file mode 100644
index 0000000..fe53eb4
--- /dev/null
+++ b/test/keystrokes/oowriter/flat_review_line_columns.py
@@ -0,0 +1,77 @@
+#!/usr/bin/python
+
+"""Test flat review in multi-columned text."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(PauseAction(1000))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_8"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Review current line.",
+    ["BRAILLE LINE:  'ruler EFFector Vol. 19, No. 38  October  Intercept Personal  $l'",
+     "     VISIBLE:  'EFFector Vol. 19, No. 38  Octobe', cursor=1",
+     "SPEECH OUTPUT: 'ruler EFFector Vol. 19, No. 38  October  Intercept Personal ",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_9"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Review next line.",
+    ["BRAILLE LINE:  '10, 2006  editor eff org Communications $l'",
+     "     VISIBLE:  '10, 2006  editor eff org Communi', cursor=1",
+     "SPEECH OUTPUT: '10, 2006  editor eff org",
+     " Communications",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_9"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Review next line.",
+    ["BRAILLE LINE:  '  $l'",
+     "     VISIBLE:  '  $l', cursor=1",
+     "SPEECH OUTPUT: 'white space'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_9"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Review next line.",
+    ["BRAILLE LINE:  'A Publication of the Electronic  Washington, D.C. - The FLAG  $l'",
+     "     VISIBLE:  'A Publication of the Electronic ', cursor=1",
+     "SPEECH OUTPUT: 'A Publication of the Electronic  Washington, D.C. - The FLAG '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_7"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Review previous line.",
+    ["BRAILLE LINE:  '  $l'",
+     "     VISIBLE:  '  $l', cursor=1",
+     "SPEECH OUTPUT: 'white space'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_7"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Review previous line.",
+    ["BRAILLE LINE:  '10, 2006  editor eff org Communications $l'",
+     "     VISIBLE:  '10, 2006  editor eff org Communi', cursor=1",
+     "SPEECH OUTPUT: '10, 2006  editor eff org",
+     " Communications",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_7"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Review previous line.",
+    ["BRAILLE LINE:  'ruler EFFector Vol. 19, No. 38  October  Intercept Personal  $l'",
+     "     VISIBLE:  'ruler EFFector Vol. 19, No. 38  ', cursor=1",
+     "SPEECH OUTPUT: 'ruler EFFector Vol. 19, No. 38  October  Intercept Personal ",
+     "'"]))
+
+sequence.append(KeyComboAction("<Control>w"))
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/flat_review_platform_menubar.py 
b/test/keystrokes/oowriter/flat_review_platform_menubar.py
new file mode 100644
index 0000000..b85c18c
--- /dev/null
+++ b/test/keystrokes/oowriter/flat_review_platform_menubar.py
@@ -0,0 +1,96 @@
+#!/usr/bin/python
+
+"""Test flat review on menubar."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+sequence.append(KeyComboAction("F6"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_8"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Review current line.",
+    ["BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=1",
+     "SPEECH OUTPUT: 'File Edit View Insert Format Table Tools Window Help'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_5"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Review current word.",
+    ["BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=1",
+     "SPEECH OUTPUT: 'File'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_6"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Review next word.",
+    ["BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=6",
+     "SPEECH OUTPUT: 'Edit'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_6"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Review next word.",
+    ["BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=11",
+     "SPEECH OUTPUT: 'View'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_4"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Review previous word.",
+    ["BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=6",
+     "SPEECH OUTPUT: 'Edit'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_4"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Review previous word.",
+    ["BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=1",
+     "SPEECH OUTPUT: 'File'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_2"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Review current char.",
+    ["BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=1",
+     "SPEECH OUTPUT: 'F'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_2"))
+sequence.append(KeyComboAction("KP_2"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Spell current char.",
+    ["BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=1",
+     "BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=1",
+     "SPEECH OUTPUT: 'F'",
+     "SPEECH OUTPUT: 'foxtrot' voice=uppercase"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_2"))
+sequence.append(KeyComboAction("KP_2"))
+sequence.append(KeyComboAction("KP_2"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Unicode for current char.",
+    ["BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=1",
+     "BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=1",
+     "BRAILLE LINE:  'File Edit View Insert Format Table Tools Window Help $l'",
+     "     VISIBLE:  'File Edit View Insert Format Tab', cursor=1",
+     "SPEECH OUTPUT: 'F'",
+     "SPEECH OUTPUT: 'foxtrot' voice=uppercase",
+     "SPEECH OUTPUT: 'Unicode 0046'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/flat_review_word.py b/test/keystrokes/oowriter/flat_review_word.py
new file mode 100644
index 0000000..5bc5914
--- /dev/null
+++ b/test/keystrokes/oowriter/flat_review_word.py
@@ -0,0 +1,110 @@
+#!/usr/bin/python
+
+"""Test flat review by word."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("Line 1"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("Line 2"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_5"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Review current word.",
+    ["BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=7",
+     "SPEECH OUTPUT: 'Line'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_5"))
+sequence.append(KeyComboAction("KP_5"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Spell current word.",
+    ["BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=7",
+     "BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=7",
+     "SPEECH OUTPUT: 'Line'",
+     "SPEECH OUTPUT: 'L'",
+     "SPEECH OUTPUT: 'i'",
+     "SPEECH OUTPUT: 'n'",
+     "SPEECH OUTPUT: 'e'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_5"))
+sequence.append(KeyComboAction("KP_5"))
+sequence.append(KeyComboAction("KP_5"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Phonetic spell current word.",
+    ["BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=7",
+     "BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=7",
+     "BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=7",
+     "SPEECH OUTPUT: 'Line'",
+     "SPEECH OUTPUT: 'L'",
+     "SPEECH OUTPUT: 'i'",
+     "SPEECH OUTPUT: 'n'",
+     "SPEECH OUTPUT: 'e'",
+     "SPEECH OUTPUT: 'lima' voice=uppercase",
+     "SPEECH OUTPUT: 'india'",
+     "SPEECH OUTPUT: 'november'",
+     "SPEECH OUTPUT: 'echo'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_6"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Review next word.",
+    ["BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=12",
+     "SPEECH OUTPUT: '1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_6"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Review next word.",
+    ["BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_6"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Review next word.",
+    ["BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=6",
+     "SPEECH OUTPUT: '2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_4"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Review previous word.",
+    ["BRAILLE LINE:  'Line 2 $l'",
+     "     VISIBLE:  'Line 2 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_4"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Review previous word.",
+    ["BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=12",
+     "SPEECH OUTPUT: '1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_4"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Review previous word.",
+    ["BRAILLE LINE:  'ruler Line 1 $l'",
+     "     VISIBLE:  'ruler Line 1 $l', cursor=7",
+     "SPEECH OUTPUT: 'Line'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/messages_table.py b/test/keystrokes/oowriter/messages_table.py
new file mode 100644
index 0000000..0f719aa
--- /dev/null
+++ b/test/keystrokes/oowriter/messages_table.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+
+"""Test to verify table message presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("Line 1"))
+sequence.append(KeyComboAction("Return"))
+
+sequence.append(KeyComboAction("<Control>F12"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Down arrow to enter the table",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Table1-1 table with 2 rows 2 columns'",
+     "SPEECH OUTPUT: 'blank blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down arrow to next row of the table",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'blank blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Down arrow to exit the table",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'leaving table.'",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Up arrow to enter the table",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Table1-1 table with 2 rows 2 columns'",
+     "SPEECH OUTPUT: 'blank blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Tab to move to last cell of the table",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'End of table blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Tab to insert a new row in the table",
+    ["BRAILLE LINE:  'Row inserted at the end of the table.'",
+     "     VISIBLE:  'Row inserted at the end of the t', cursor=0",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Row inserted at the end of the table.' voice=system",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Z"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Ctrl+Z to undo that insertion",
+    ["BRAILLE LINE:  'Last row deleted.'",
+     "     VISIBLE:  'Last row deleted.', cursor=0",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Last row deleted.' voice=system",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/say_all.py b/test/keystrokes/oowriter/say_all.py
new file mode 100644
index 0000000..bceb37b
--- /dev/null
+++ b/test/keystrokes/oowriter/say_all.py
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+
+"""Test to verify SayAll works in Writer."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("Line 1"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("Line 2"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("Line 3"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("Line 4"))
+sequence.append(KeyComboAction("Return"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Return to top of document",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view Line 1 $l'",
+     "     VISIBLE:  'Line 1 $l', cursor=1",
+     "SPEECH OUTPUT: 'Line 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Say all on document",
+    ["SPEECH OUTPUT: 'Line 1'",
+     "SPEECH OUTPUT: 'Line 2'",
+     "SPEECH OUTPUT: 'Line 3'",
+     "SPEECH OUTPUT: 'Line 4'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/say_all_no_sentences.py 
b/test/keystrokes/oowriter/say_all_no_sentences.py
new file mode 100644
index 0000000..747687d
--- /dev/null
+++ b/test/keystrokes/oowriter/say_all_no_sentences.py
@@ -0,0 +1,29 @@
+#!/usr/bin/python
+
+"""Test SayAll presentation in document without sentence punctuation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("The quick"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("brown"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("fox jumps over"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("the lazy dog"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. SayAll",
+    ["SPEECH OUTPUT: 'The quick'",
+     "SPEECH OUTPUT: 'brown'",
+     "SPEECH OUTPUT: 'fox jumps over'",
+     "SPEECH OUTPUT: 'the lazy dog'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/selection_word.py b/test/keystrokes/oowriter/selection_word.py
new file mode 100644
index 0000000..11dd5a6
--- /dev/null
+++ b/test/keystrokes/oowriter/selection_word.py
@@ -0,0 +1,225 @@
+#!/usr/bin/python
+
+"""Test of Orca's presentation of Writer word navigation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("This is a test."))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("So is this."))
+sequence.append(KeyComboAction("Return"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Select Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=6",
+     "SPEECH OUTPUT: 'This '",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Select Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=9",
+     "SPEECH OUTPUT: 'is '",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Select Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=11",
+     "SPEECH OUTPUT: 'a '",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Select Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=15",
+     "SPEECH OUTPUT: 'test'",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Select Next Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=1",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  ' This is a test. $l', cursor=1",
+     "SPEECH OUTPUT: 'blank' voice=system",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Unselect Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  ' This is a test. $l', cursor=16",
+     "BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=0",
+     "SPEECH OUTPUT: 'dot'",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Unselect Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=11",
+     "SPEECH OUTPUT: 'test'",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Unselect Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=9",
+     "SPEECH OUTPUT: 'a '",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Unselect Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=6",
+     "SPEECH OUTPUT: 'is '",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Unselect Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=1",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=1",
+     "SPEECH OUTPUT: 'This '",
+     "SPEECH OUTPUT: 'This '",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>End"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Move to end of document",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  ' This is a test. $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Select Previous Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=11",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=0",
+     "SPEECH OUTPUT: 'dot'",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Select Previous Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=7",
+     "SPEECH OUTPUT: 'this'",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Select Previous Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=4",
+     "SPEECH OUTPUT: 'is '",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Select Previous Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=1",
+     "SPEECH OUTPUT: 'So '",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Select Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=15",
+     "SPEECH OUTPUT: 'dot'",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Select Previous Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=11",
+     "SPEECH OUTPUT: 'test'",
+     "SPEECH OUTPUT: 'selected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Unselect Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=15",
+     "SPEECH OUTPUT: 'test'",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Unselect Next Word",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Document view This is a test. $l'",
+     "     VISIBLE:  ' This is a test. $l', cursor=1",
+     "SPEECH OUTPUT: 'blank' voice=system",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Unselect Next Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=4",
+     "SPEECH OUTPUT: 'So '",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Unselect Next Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=7",
+     "SPEECH OUTPUT: 'is '",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Unselect Next Word",
+    ["BRAILLE LINE:  'So is this. $l'",
+     "     VISIBLE:  'So is this. $l', cursor=11",
+     "SPEECH OUTPUT: 'this'",
+     "SPEECH OUTPUT: 'unselected' voice=system"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/spellcheck.py b/test/keystrokes/oowriter/spellcheck.py
new file mode 100644
index 0000000..b0649e4
--- /dev/null
+++ b/test/keystrokes/oowriter/spellcheck.py
@@ -0,0 +1,40 @@
+#!/usr/bin/python
+
+"""Test to verify spell checking support."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("The quuuiick brown fox"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("jumps overr the lazy dog"))
+sequence.append(KeyComboAction("Return"))
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(PauseAction(3000))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("F7"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Enter F7 to bring up the spell checking dialog",
+    ["KNOWN ISSUE: LibreOffice broke accessibility for multiline text fields so we don't present the error.",
+     "SPEECH OUTPUT: 'Spelling: English (USA) frame'",
+     "SPEECH OUTPUT: 'Spelling: English (USA)'",
+     "SPEECH OUTPUT: 'Correct push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>I"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Alt I to ignore the first error and present the next",
+    ["KNOWN ISSUE: In addition to the above issue, we are very chatty here.",
+     "SPEECH OUTPUT: 'Ignore Once push button'",
+     "SPEECH OUTPUT: 'Ignore All push button'",
+     "SPEECH OUTPUT: 'Add to Dictionary push button'",
+     "SPEECH OUTPUT: 'Suggestions'",
+     "SPEECH OUTPUT: 'quick'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/spellcheck.settings b/test/keystrokes/oowriter/spellcheck.settings
new file mode 100644
index 0000000..fbf4726
--- /dev/null
+++ b/test/keystrokes/oowriter/spellcheck.settings
@@ -0,0 +1,177 @@
+{
+    "pronunciations": {}, 
+    "keybindings": {}, 
+    "profiles": {
+        "default": {
+            "speechServerFactory": "orca.speechdispatcherfactory", 
+            "profile": [
+                "Default", 
+                "default"
+            ], 
+            "voices": {
+                "default": {
+                    "average-pitch": 5.0, 
+                    "rate": 50.0, 
+                    "gain": 10.0
+                }, 
+                "uppercase": {
+                    "average-pitch": 5.6
+                }, 
+                "system": {
+                    "established": false
+                }, 
+                "hyperlink": {
+                    "average-pitch": 3.0
+                }
+            }, 
+            "speechServerInfo": [
+                "Default Synthesizer", 
+                "default"
+            ], 
+            "keybindings": {}, 
+            "pronunciations": {}
+        }
+    }, 
+    "general": {
+        "speakCellHeaders": true, 
+        "magEdgeMargin": 0, 
+        "brailleContractionTable": "", 
+        "magPointerFollowsFocus": false, 
+        "magTextTrackingMode": 2, 
+        "magZoomerBorderSize": 1, 
+        "brailleAlignmentStyle": 0, 
+        "enableEchoByWord": false, 
+        "enableMagZoomerColorInversion": false, 
+        "magCursorSize": 32, 
+        "magSmoothingMode": 0, 
+        "magZoomerLeft": 1200, 
+        "sayAllStyle": 1, 
+        "brailleSelectorIndicator": 192, 
+        "presentDateFormat": "%x", 
+        "magContrastLevel": 0, 
+        "magMouseTrackingMode": 0, 
+        "speakCellSpan": true, 
+        "progressBarUpdateInterval": 10, 
+        "speakCellCoordinates": true, 
+        "enablePauseBreaks": true, 
+        "brailleEOLIndicator": " $l", 
+        "verbalizePunctuationStyle": 1, 
+        "progressBarVerbosity": 1, 
+        "enableSpeech": true, 
+        "enableBraille": false, 
+        "chatAnnounceBuddyTyping": false, 
+        "speakMultiCaseStringsAsWords": false, 
+        "enableBrailleGrouping": false, 
+        "readTableCellRow": true, 
+        "activeProfile": [
+            "Default", 
+            "default"
+        ], 
+        "textAttributesBrailleIndicator": 0, 
+        "enableMagCursorExplicitSize": false, 
+        "messageVerbosityLevel": 1, 
+        "enableMagLiveUpdating": true, 
+        "enableSpeechIndentation": true, 
+        "enableKeyEcho": false, 
+        "magHideCursor": false, 
+        "magZoomerBorderColor": "#000000", 
+        "magPointerFollowsZoomer": true, 
+        "mouseDwellDelay": 0, 
+        "magBrightnessLevelRed": 0, 
+        "enableMagnifier": false, 
+        "magZoomFactor": 4.0, 
+        "speechServerFactory": "speechdispatcherfactory", 
+        "enableMagZoomerBorder": false, 
+        "flashVerbosityLevel": 1, 
+        "enableFlashMessages": true, 
+        "speechServerInfo": null, 
+        "presentToolTips": false, 
+        "flashIsPersistent": false, 
+        "brailleRequiredStateString": "required", 
+        "firstStart": false, 
+        "largeObjectTextLength": 75, 
+        "enableEchoBySentence": false, 
+        "magContrastLevelBlue": 0, 
+        "magContrastLevelRed": 0, 
+        "enableContractedBraille": false, 
+        "orcaModifierKeys": [
+            "Insert", 
+            "KP_Insert"
+        ], 
+        "enableMagCursor": true, 
+        "speechRequiredStateString": "required", 
+        "quitOrcaNoConfirmation": false, 
+        "skipBlankCells": false, 
+        "magCursorColor": "#000000", 
+        "enablePositionSpeaking": false, 
+        "magZoomerType": 0, 
+        "onlySpeakDisplayedText": false, 
+        "enableProgressBarUpdates": true, 
+        "wrappedStructuralNavigation": true, 
+        "chatRoomHistories": false, 
+        "brailleVerbosityLevel": 1, 
+        "enableFunctionKeys": true, 
+        "enableModifierKeys": true, 
+        "magCrossHairColor": "#000000", 
+        "enableTutorialMessages": false, 
+        "enableActionKeys": true, 
+        "speakBlankLines": true, 
+        "magColorFilteringMode": 0, 
+        "magZoomerRight": 2400, 
+        "keyboardLayout": 1, 
+        "magTargetDisplay": "", 
+        "disableBrailleEOL": false, 
+        "magZoomerTop": 0, 
+        "magSourceDisplay": "", 
+        "enableDiacriticalKeys": false, 
+        "enableMnemonicSpeaking": false, 
+        "enabledBrailledTextAttributes": "size:; family-name:; weight:400; indent:0; underline:none; 
strikethrough:false; justification:left; style:normal; text-spelling:none;", 
+        "speechVerbosityLevel": 1, 
+        "enableMagCrossHair": true, 
+        "enableBrailleMonitor": false, 
+        "voices": {
+            "default": {
+                "established": false
+            }, 
+            "uppercase": {
+                "average-pitch": 5.6
+            }, 
+            "system": {
+                "established": false
+            }, 
+            "hyperlink": {
+                "established": false
+            }
+        }, 
+        "magContrastLevelGreen": 0, 
+        "brailleFlashTime": 5000, 
+        "magCrossHairSize": 16, 
+        "enableMouseReview": false, 
+        "enableNavigationKeys": false, 
+        "magBrightnessLevelGreen": 0, 
+        "chatSpeakRoomName": false, 
+        "startingProfile": [
+            "Default", 
+            "default"
+        ], 
+        "enableLockingKeys": true, 
+        "profile": [
+            "Default", 
+            "default"
+        ], 
+        "brailleRolenameStyle": 1, 
+        "brailleLinkIndicator": 192, 
+        "enableEchoByCharacter": false, 
+        "magBrightnessLevelBlue": 0, 
+        "enableBrailleContext": true, 
+        "magControlTrackingMode": 2, 
+        "magZoomerBottom": 1920, 
+        "enablePrintableKeys": true, 
+        "enabledSpokenTextAttributes": "size:; family-name:; weight:400; indent:0; underline:none; 
strikethrough:false; justification:left; style:normal; paragraph-style:; text-spelling:none;", 
+        "chatMessageVerbosity": 0, 
+        "presentTimeFormat": "%X", 
+        "magBrightnessLevel": 0, 
+        "presentRequiredState": false, 
+        "enableMagCrossHairClip": false
+    }
+}
diff --git a/test/keystrokes/oowriter/spoken_indentation.py b/test/keystrokes/oowriter/spoken_indentation.py
new file mode 100644
index 0000000..fb9295d
--- /dev/null
+++ b/test/keystrokes/oowriter/spoken_indentation.py
@@ -0,0 +1,24 @@
+#!/usr/bin/python
+
+"""Test of presentation of indentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(TypeAction("   This is a test."))
+sequence.append(KeyComboAction("Return"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Up Arrow to typed line",
+    ["KNOWN ISSUE: We are failing to announce indentation",
+     "SPEECH OUTPUT: '            This is a test.'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/spoken_indentation.settings 
b/test/keystrokes/oowriter/spoken_indentation.settings
new file mode 100644
index 0000000..6bc57bf
--- /dev/null
+++ b/test/keystrokes/oowriter/spoken_indentation.settings
@@ -0,0 +1,177 @@
+{
+    "pronunciations": {}, 
+    "keybindings": {}, 
+    "profiles": {
+        "default": {
+            "speechServerFactory": "orca.speechdispatcherfactory", 
+            "profile": [
+                "Default", 
+                "default"
+            ], 
+            "voices": {
+                "default": {
+                    "average-pitch": 5.0, 
+                    "rate": 50.0, 
+                    "gain": 10.0
+                }, 
+                "uppercase": {
+                    "average-pitch": 5.6
+                }, 
+                "system": {
+                    "established": false
+                }, 
+                "hyperlink": {
+                    "average-pitch": 3.0
+                }
+            }, 
+            "speechServerInfo": [
+                "Default Synthesizer", 
+                "default"
+            ], 
+            "keybindings": {}, 
+            "pronunciations": {}
+        }
+    }, 
+    "general": {
+        "speakCellHeaders": true, 
+        "magEdgeMargin": 0, 
+        "brailleContractionTable": "", 
+        "magPointerFollowsFocus": false, 
+        "magTextTrackingMode": 2, 
+        "magZoomerBorderSize": 1, 
+        "brailleAlignmentStyle": 0, 
+        "enableEchoByWord": false, 
+        "enableMagZoomerColorInversion": false, 
+        "magCursorSize": 32, 
+        "magSmoothingMode": 0, 
+        "magZoomerLeft": 1200, 
+        "sayAllStyle": 1, 
+        "brailleSelectorIndicator": 192, 
+        "presentDateFormat": "%x", 
+        "magContrastLevel": 0, 
+        "magMouseTrackingMode": 0, 
+        "speakCellSpan": true, 
+        "progressBarUpdateInterval": 10, 
+        "speakCellCoordinates": true, 
+        "enablePauseBreaks": true, 
+        "brailleEOLIndicator": " $l", 
+        "verbalizePunctuationStyle": 1, 
+        "progressBarVerbosity": 1, 
+        "enableSpeech": true, 
+        "enableBraille": false, 
+        "chatAnnounceBuddyTyping": false, 
+        "speakMultiCaseStringsAsWords": false, 
+        "enableBrailleGrouping": false, 
+        "readTableCellRow": true, 
+        "activeProfile": [
+            "Default", 
+            "default"
+        ], 
+        "textAttributesBrailleIndicator": 0, 
+        "enableMagCursorExplicitSize": false, 
+        "messageVerbosityLevel": 1, 
+        "enableMagLiveUpdating": true, 
+        "enableSpeechIndentation": true, 
+        "enableKeyEcho": true, 
+        "magHideCursor": false, 
+        "magZoomerBorderColor": "#000000", 
+        "magPointerFollowsZoomer": true, 
+        "mouseDwellDelay": 0, 
+        "magBrightnessLevelRed": 0, 
+        "enableMagnifier": false, 
+        "magZoomFactor": 4.0, 
+        "speechServerFactory": "speechdispatcherfactory", 
+        "enableMagZoomerBorder": false, 
+        "flashVerbosityLevel": 1, 
+        "enableFlashMessages": true, 
+        "speechServerInfo": null, 
+        "presentToolTips": false, 
+        "flashIsPersistent": false, 
+        "brailleRequiredStateString": "required", 
+        "firstStart": false, 
+        "largeObjectTextLength": 75, 
+        "enableEchoBySentence": false, 
+        "magContrastLevelBlue": 0, 
+        "magContrastLevelRed": 0, 
+        "enableContractedBraille": false, 
+        "orcaModifierKeys": [
+            "Insert", 
+            "KP_Insert"
+        ], 
+        "enableMagCursor": true, 
+        "speechRequiredStateString": "required", 
+        "quitOrcaNoConfirmation": false, 
+        "skipBlankCells": false, 
+        "magCursorColor": "#000000", 
+        "enablePositionSpeaking": false, 
+        "magZoomerType": 0, 
+        "onlySpeakDisplayedText": false, 
+        "enableProgressBarUpdates": true, 
+        "wrappedStructuralNavigation": true, 
+        "chatRoomHistories": false, 
+        "brailleVerbosityLevel": 1, 
+        "enableFunctionKeys": true, 
+        "enableModifierKeys": true, 
+        "magCrossHairColor": "#000000", 
+        "enableTutorialMessages": false, 
+        "enableActionKeys": true, 
+        "speakBlankLines": true, 
+        "magColorFilteringMode": 0, 
+        "magZoomerRight": 2400, 
+        "keyboardLayout": 1, 
+        "magTargetDisplay": "", 
+        "disableBrailleEOL": false, 
+        "magZoomerTop": 0, 
+        "magSourceDisplay": "", 
+        "enableDiacriticalKeys": false, 
+        "enableMnemonicSpeaking": false, 
+        "enabledBrailledTextAttributes": "size:; family-name:; weight:400; indent:0; underline:none; 
strikethrough:false; justification:left; style:normal; text-spelling:none;", 
+        "speechVerbosityLevel": 1, 
+        "enableMagCrossHair": true, 
+        "enableBrailleMonitor": false, 
+        "voices": {
+            "default": {
+                "established": false
+            }, 
+            "uppercase": {
+                "average-pitch": 5.6
+            }, 
+            "system": {
+                "established": false
+            }, 
+            "hyperlink": {
+                "established": false
+            }
+        }, 
+        "magContrastLevelGreen": 0, 
+        "brailleFlashTime": 5000, 
+        "magCrossHairSize": 16, 
+        "enableMouseReview": false, 
+        "enableNavigationKeys": false, 
+        "magBrightnessLevelGreen": 0, 
+        "chatSpeakRoomName": false, 
+        "startingProfile": [
+            "Default", 
+            "default"
+        ], 
+        "enableLockingKeys": true, 
+        "profile": [
+            "Default", 
+            "default"
+        ], 
+        "brailleRolenameStyle": 1, 
+        "brailleLinkIndicator": 192, 
+        "enableEchoByCharacter": false, 
+        "magBrightnessLevelBlue": 0, 
+        "enableBrailleContext": true, 
+        "magControlTrackingMode": 2, 
+        "magZoomerBottom": 1920, 
+        "enablePrintableKeys": true, 
+        "enabledSpokenTextAttributes": "size:; family-name:; weight:400; indent:0; underline:none; 
strikethrough:false; justification:left; style:normal; paragraph-style:; text-spelling:none;", 
+        "chatMessageVerbosity": 0, 
+        "presentTimeFormat": "%X", 
+        "magBrightnessLevel": 0, 
+        "presentRequiredState": false, 
+        "enableMagCrossHairClip": false
+    }
+}
diff --git a/test/keystrokes/oowriter/structural_nav_table.params 
b/test/keystrokes/oowriter/structural_nav_table.params
new file mode 100644
index 0000000..d9cc650
--- /dev/null
+++ b/test/keystrokes/oowriter/structural_nav_table.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../documents/table-sample2.odt
diff --git a/test/keystrokes/oowriter/structural_nav_table.py 
b/test/keystrokes/oowriter/structural_nav_table.py
new file mode 100644
index 0000000..0c3155d
--- /dev/null
+++ b/test/keystrokes/oowriter/structural_nav_table.py
@@ -0,0 +1,145 @@
+#!/usr/bin/python
+
+"""Test for structural navigation amongst table cells in Writer."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Down"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("z"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Toggle structural navigation on",
+    ["SPEECH OUTPUT: 'Structural navigation keys on.' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Left"))
+sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_PARAGRAPH))
+sequence.append(utils.AssertPresentationAction(
+    "1. Alt Shift Left.",
+    ["SPEECH OUTPUT: '3'",
+     "SPEECH OUTPUT: 'Row 3, column 1.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Alt Shift Left.",
+    ["SPEECH OUTPUT: 'Beginning of row.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Right"))
+sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_PARAGRAPH))
+sequence.append(utils.AssertPresentationAction(
+    "3. Alt Shift Right.",
+    ["SPEECH OUTPUT: '4'",
+     "SPEECH OUTPUT: 'Row 3, column 2.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Right"))
+sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_PARAGRAPH))
+sequence.append(utils.AssertPresentationAction(
+    "4. Alt Shift Right.",
+    ["SPEECH OUTPUT: '5'",
+     "SPEECH OUTPUT: 'Row 3, column 3.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Right"))
+sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_PARAGRAPH))
+sequence.append(utils.AssertPresentationAction(
+    "5. Alt Shift Right.",
+    ["SPEECH OUTPUT: '6'",
+     "SPEECH OUTPUT: '7'",
+     "SPEECH OUTPUT: 'Row 3, column 4.'",
+     "SPEECH OUTPUT: 'Cell spans 2 columns'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Up"))
+sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_PARAGRAPH))
+sequence.append(utils.AssertPresentationAction(
+    "6. Alt Shift Up.",
+    ["KNOWN ISSUE: We should say 'blank' here.",
+     "SPEECH OUTPUT: ''",
+     "SPEECH OUTPUT: 'Row 2, column 4.' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Up"))
+sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_PARAGRAPH))
+sequence.append(utils.AssertPresentationAction(
+    "7. Alt Shift Up.",
+    ["SPEECH OUTPUT: 'Wed'",
+     "SPEECH OUTPUT: 'Row 1, column 4.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Up"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Alt Shift Up.",
+    ["SPEECH OUTPUT: 'Top of column.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>End"))
+sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_PARAGRAPH))
+sequence.append(utils.AssertPresentationAction(
+    "9. Alt Shift End.",
+    ["KNOWN ISSUE: We should say 'blank' here.",
+     "SPEECH OUTPUT: ''",
+     "SPEECH OUTPUT: 'Row 7, column 7.' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Alt Shift Down.",
+    ["SPEECH OUTPUT: 'Bottom of column.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Alt Shift Right.",
+    ["SPEECH OUTPUT: 'End of row.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Home"))
+sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_PARAGRAPH))
+sequence.append(utils.AssertPresentationAction(
+    "12. Alt Shift Home.",
+    ["SPEECH OUTPUT: 'Sun'",
+     "SPEECH OUTPUT: 'Row 1, column 1.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Up"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Alt Shift Up.",
+    ["SPEECH OUTPUT: 'Top of column.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Up Arrow out of table.",
+    ["SPEECH OUTPUT: 'leaving table.'",
+     "SPEECH OUTPUT: 'This is a test.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt><Shift>Up"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Alt Shift Up when not in a table.",
+    ["SPEECH OUTPUT: 'Not in a table.' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("z"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Toggle structural navigation off",
+    ["SPEECH OUTPUT: 'Structural navigation keys off.' voice=system"]))
+
+sequence.append(KeyComboAction("<Control>W"))
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/structural_nav_table.settings 
b/test/keystrokes/oowriter/structural_nav_table.settings
new file mode 100644
index 0000000..fbf4726
--- /dev/null
+++ b/test/keystrokes/oowriter/structural_nav_table.settings
@@ -0,0 +1,177 @@
+{
+    "pronunciations": {}, 
+    "keybindings": {}, 
+    "profiles": {
+        "default": {
+            "speechServerFactory": "orca.speechdispatcherfactory", 
+            "profile": [
+                "Default", 
+                "default"
+            ], 
+            "voices": {
+                "default": {
+                    "average-pitch": 5.0, 
+                    "rate": 50.0, 
+                    "gain": 10.0
+                }, 
+                "uppercase": {
+                    "average-pitch": 5.6
+                }, 
+                "system": {
+                    "established": false
+                }, 
+                "hyperlink": {
+                    "average-pitch": 3.0
+                }
+            }, 
+            "speechServerInfo": [
+                "Default Synthesizer", 
+                "default"
+            ], 
+            "keybindings": {}, 
+            "pronunciations": {}
+        }
+    }, 
+    "general": {
+        "speakCellHeaders": true, 
+        "magEdgeMargin": 0, 
+        "brailleContractionTable": "", 
+        "magPointerFollowsFocus": false, 
+        "magTextTrackingMode": 2, 
+        "magZoomerBorderSize": 1, 
+        "brailleAlignmentStyle": 0, 
+        "enableEchoByWord": false, 
+        "enableMagZoomerColorInversion": false, 
+        "magCursorSize": 32, 
+        "magSmoothingMode": 0, 
+        "magZoomerLeft": 1200, 
+        "sayAllStyle": 1, 
+        "brailleSelectorIndicator": 192, 
+        "presentDateFormat": "%x", 
+        "magContrastLevel": 0, 
+        "magMouseTrackingMode": 0, 
+        "speakCellSpan": true, 
+        "progressBarUpdateInterval": 10, 
+        "speakCellCoordinates": true, 
+        "enablePauseBreaks": true, 
+        "brailleEOLIndicator": " $l", 
+        "verbalizePunctuationStyle": 1, 
+        "progressBarVerbosity": 1, 
+        "enableSpeech": true, 
+        "enableBraille": false, 
+        "chatAnnounceBuddyTyping": false, 
+        "speakMultiCaseStringsAsWords": false, 
+        "enableBrailleGrouping": false, 
+        "readTableCellRow": true, 
+        "activeProfile": [
+            "Default", 
+            "default"
+        ], 
+        "textAttributesBrailleIndicator": 0, 
+        "enableMagCursorExplicitSize": false, 
+        "messageVerbosityLevel": 1, 
+        "enableMagLiveUpdating": true, 
+        "enableSpeechIndentation": true, 
+        "enableKeyEcho": false, 
+        "magHideCursor": false, 
+        "magZoomerBorderColor": "#000000", 
+        "magPointerFollowsZoomer": true, 
+        "mouseDwellDelay": 0, 
+        "magBrightnessLevelRed": 0, 
+        "enableMagnifier": false, 
+        "magZoomFactor": 4.0, 
+        "speechServerFactory": "speechdispatcherfactory", 
+        "enableMagZoomerBorder": false, 
+        "flashVerbosityLevel": 1, 
+        "enableFlashMessages": true, 
+        "speechServerInfo": null, 
+        "presentToolTips": false, 
+        "flashIsPersistent": false, 
+        "brailleRequiredStateString": "required", 
+        "firstStart": false, 
+        "largeObjectTextLength": 75, 
+        "enableEchoBySentence": false, 
+        "magContrastLevelBlue": 0, 
+        "magContrastLevelRed": 0, 
+        "enableContractedBraille": false, 
+        "orcaModifierKeys": [
+            "Insert", 
+            "KP_Insert"
+        ], 
+        "enableMagCursor": true, 
+        "speechRequiredStateString": "required", 
+        "quitOrcaNoConfirmation": false, 
+        "skipBlankCells": false, 
+        "magCursorColor": "#000000", 
+        "enablePositionSpeaking": false, 
+        "magZoomerType": 0, 
+        "onlySpeakDisplayedText": false, 
+        "enableProgressBarUpdates": true, 
+        "wrappedStructuralNavigation": true, 
+        "chatRoomHistories": false, 
+        "brailleVerbosityLevel": 1, 
+        "enableFunctionKeys": true, 
+        "enableModifierKeys": true, 
+        "magCrossHairColor": "#000000", 
+        "enableTutorialMessages": false, 
+        "enableActionKeys": true, 
+        "speakBlankLines": true, 
+        "magColorFilteringMode": 0, 
+        "magZoomerRight": 2400, 
+        "keyboardLayout": 1, 
+        "magTargetDisplay": "", 
+        "disableBrailleEOL": false, 
+        "magZoomerTop": 0, 
+        "magSourceDisplay": "", 
+        "enableDiacriticalKeys": false, 
+        "enableMnemonicSpeaking": false, 
+        "enabledBrailledTextAttributes": "size:; family-name:; weight:400; indent:0; underline:none; 
strikethrough:false; justification:left; style:normal; text-spelling:none;", 
+        "speechVerbosityLevel": 1, 
+        "enableMagCrossHair": true, 
+        "enableBrailleMonitor": false, 
+        "voices": {
+            "default": {
+                "established": false
+            }, 
+            "uppercase": {
+                "average-pitch": 5.6
+            }, 
+            "system": {
+                "established": false
+            }, 
+            "hyperlink": {
+                "established": false
+            }
+        }, 
+        "magContrastLevelGreen": 0, 
+        "brailleFlashTime": 5000, 
+        "magCrossHairSize": 16, 
+        "enableMouseReview": false, 
+        "enableNavigationKeys": false, 
+        "magBrightnessLevelGreen": 0, 
+        "chatSpeakRoomName": false, 
+        "startingProfile": [
+            "Default", 
+            "default"
+        ], 
+        "enableLockingKeys": true, 
+        "profile": [
+            "Default", 
+            "default"
+        ], 
+        "brailleRolenameStyle": 1, 
+        "brailleLinkIndicator": 192, 
+        "enableEchoByCharacter": false, 
+        "magBrightnessLevelBlue": 0, 
+        "enableBrailleContext": true, 
+        "magControlTrackingMode": 2, 
+        "magZoomerBottom": 1920, 
+        "enablePrintableKeys": true, 
+        "enabledSpokenTextAttributes": "size:; family-name:; weight:400; indent:0; underline:none; 
strikethrough:false; justification:left; style:normal; paragraph-style:; text-spelling:none;", 
+        "chatMessageVerbosity": 0, 
+        "presentTimeFormat": "%X", 
+        "magBrightnessLevel": 0, 
+        "presentRequiredState": false, 
+        "enableMagCrossHairClip": false
+    }
+}
diff --git a/test/keystrokes/oowriter/table_cell_row.params b/test/keystrokes/oowriter/table_cell_row.params
new file mode 100644
index 0000000..6952e8c
--- /dev/null
+++ b/test/keystrokes/oowriter/table_cell_row.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../documents/table-sample.odt
diff --git a/test/keystrokes/oowriter/table_cell_row.py b/test/keystrokes/oowriter/table_cell_row.py
new file mode 100644
index 0000000..09524fc
--- /dev/null
+++ b/test/keystrokes/oowriter/table_cell_row.py
@@ -0,0 +1,61 @@
+#!/usr/bin/python
+
+"""Test of cell and row reading in Writer tables."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Down"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("F11"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Enable cell reading",
+    ["BRAILLE LINE:  'Speak cell'",
+     "     VISIBLE:  'Speak cell', cursor=0",
+     "SPEECH OUTPUT: 'Speak cell' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down Arrow to the Mon table column header with cell reading enabled",
+    ["BRAILLE LINE:  'This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=16",
+     "BRAILLE LINE:  'Mon $l'",
+     "     VISIBLE:  'Mon $l', cursor=4",
+     "SPEECH OUTPUT: 'Calendar-1 table with 7 rows 7 columns'",
+     "SPEECH OUTPUT: 'Mon'"]))
+
+sequence.append(KeyComboAction("Up"))
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Down"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("F11"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Enable row reading",
+    ["BRAILLE LINE:  'Speak row'",
+     "     VISIBLE:  'Speak row', cursor=0",
+     "SPEECH OUTPUT: 'Speak row' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Down Arrow to the Mon table column header with row reading enabled",
+    ["BRAILLE LINE:  'This is a test. $l'",
+     "     VISIBLE:  'This is a test. $l', cursor=16",
+     "BRAILLE LINE:  'Mon $l'",
+     "     VISIBLE:  'Mon $l', cursor=4",
+     "SPEECH OUTPUT: 'Calendar-1 table with 7 rows 7 columns'",
+     "SPEECH OUTPUT: 'Sun Mon Tue Wed Thu Fri Sat'"]))
+
+sequence.append(KeyComboAction("<Control>w"))
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/text_attributes.py b/test/keystrokes/oowriter/text_attributes.py
new file mode 100644
index 0000000..ec4eaff
--- /dev/null
+++ b/test/keystrokes/oowriter/text_attributes.py
@@ -0,0 +1,55 @@
+#!/usr/bin/python
+
+"""Test presentation of character attributes."""
+
+from macaroon.playback import *
+
+sequence = MacroSequence()
+import utils
+
+sequence.append(KeyComboAction("<Control>b"))
+sequence.append(TypeAction("Bold"))
+sequence.append(KeyComboAction("<Control>b"))
+sequence.append(TypeAction(" "))
+sequence.append(KeyComboAction("<Control>i"))
+sequence.append(TypeAction("Italic"))
+sequence.append(KeyComboAction("<Control>i"))
+sequence.append(TypeAction(" Normal"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(TypeAction ("f"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Font information for bold word",
+    ["SPEECH OUTPUT: 'size 12' voice=system",
+     "SPEECH OUTPUT: 'family name Liberation Serif' voice=system",
+     "SPEECH OUTPUT: 'bold' voice=system",
+     "SPEECH OUTPUT: 'paragraph style Default Style' voice=system"]))
+
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(TypeAction ("f"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Font information for italic word",
+    ["SPEECH OUTPUT: 'size 12' voice=system",
+     "SPEECH OUTPUT: 'family name Liberation Serif' voice=system",
+     "SPEECH OUTPUT: 'style italic' voice=system",
+     "SPEECH OUTPUT: 'paragraph style Default Style' voice=system"]))
+
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(TypeAction ("f"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Font information for regular word",
+    ["SPEECH OUTPUT: 'size 12' voice=system",
+     "SPEECH OUTPUT: 'family name Liberation Serif' voice=system",
+     "SPEECH OUTPUT: 'paragraph style Default Style' voice=system"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/ui_navigator.params b/test/keystrokes/oowriter/ui_navigator.params
new file mode 100644
index 0000000..e777502
--- /dev/null
+++ b/test/keystrokes/oowriter/ui_navigator.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../documents/navigator.odt
diff --git a/test/keystrokes/oowriter/ui_navigator.py b/test/keystrokes/oowriter/ui_navigator.py
new file mode 100644
index 0000000..d320d6e
--- /dev/null
+++ b/test/keystrokes/oowriter/ui_navigator.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+
+"""Test to verify presentation of the navigator."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(PauseAction(2000))
+sequence.append(KeyComboAction("F5"))
+sequence.append(PauseAction(2000))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Down arrow to the next item",
+    ["BRAILLE LINE:  'soffice application Navigator frame Navigator frame Navigator panel Content View tree 
Tables'",
+     "     VISIBLE:  ' Tables', cursor=1",
+     "SPEECH OUTPUT: 'Tables collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Expand it",
+    ["BRAILLE LINE:  'soffice application Navigator frame Navigator frame Navigator panel Content View tree 
Tables'",
+     "     VISIBLE:  ' Tables', cursor=1",
+     "SPEECH OUTPUT: 'expanded'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Collapse it",
+    ["BRAILLE LINE:  'soffice application Navigator frame Navigator frame Navigator panel Content View tree 
Tables'",
+     "     VISIBLE:  ' Tables', cursor=1",
+     "SPEECH OUTPUT: 'collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Down arrow to the next item",
+    ["BRAILLE LINE:  'soffice application Navigator frame Navigator frame Navigator panel Content View tree 
Text frames'",
+     "     VISIBLE:  ' Text frames', cursor=1",
+     "SPEECH OUTPUT: 'Text frames'"]))
+
+sequence.append(KeyComboAction("F5"))
+sequence.append(PauseAction(2000))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/ui_role_combo_box.py b/test/keystrokes/oowriter/ui_role_combo_box.py
new file mode 100644
index 0000000..42b5e9a
--- /dev/null
+++ b/test/keystrokes/oowriter/ui_role_combo_box.py
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+
+"""Test of Orca's presentation of a combo box."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("This is a test."))
+sequence.append(KeyComboAction("Left"))
+sequence.append(KeyComboAction("<Control><Shift>Left"))
+
+sequence.append(KeyComboAction("<Alt>o"))
+sequence.append(TypeAction("h"))
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "Move to Strikethrough",
+    ["KNOWN ISSUE: Too chatty",
+     "BRAILLE LINE:  'soffice application Character frame Character dialog Font Effects page tab Options 
panel (Without) combo box'",
+     "     VISIBLE:  '(Without) combo box', cursor=1",
+     "BRAILLE LINE:  'soffice application Character frame Character dialog Font Effects page tab Options 
panel (Without) $l'",
+     "     VISIBLE:  '(Without) $l', cursor=1",
+     "BRAILLE LINE:  'soffice application Character frame Character dialog Font Effects page tab Options 
panel  combo box(Without) (Without) list item'",
+     "     VISIBLE:  '(Without) list item', cursor=1",
+     "SPEECH OUTPUT: '(Without) combo box'",
+     "SPEECH OUTPUT: 'text (Without)'",
+     "SPEECH OUTPUT: '(Without)'"]))
+
+sequence.append(KeyComboAction("Escape"))
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/ui_role_label.py b/test/keystrokes/oowriter/ui_role_label.py
new file mode 100644
index 0000000..d656571
--- /dev/null
+++ b/test/keystrokes/oowriter/ui_role_label.py
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+
+"""Test to verify presentation of focusable labels."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>f"))
+sequence.append(TypeAction("w"))
+sequence.append(TypeAction("a"))
+sequence.append(PauseAction(3000))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Down arrow to the first item",
+    ["BRAILLE LINE:  'soffice application Agenda Wizard frame Agenda Wizard dialog Steps panel General 
information'",
+     "     VISIBLE:  ' General information', cursor=1",
+     "SPEECH OUTPUT: 'Agenda Wizard Please choose the page design for the agenda Page design: This wizard 
helps you to create an agenda template. The template can then be used to create an agenda whenever needed.'",
+     "SPEECH OUTPUT: 'Steps panel'",
+     "SPEECH OUTPUT: 'General information'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down arrow to the next item",
+    ["BRAILLE LINE:  'soffice application Agenda Wizard frame Agenda Wizard dialog Steps panel Headings to 
include'",
+     "     VISIBLE:  ' Headings to include', cursor=1",
+     "SPEECH OUTPUT: 'Headings to include'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/ui_role_list_item.py b/test/keystrokes/oowriter/ui_role_list_item.py
new file mode 100644
index 0000000..d57f6af
--- /dev/null
+++ b/test/keystrokes/oowriter/ui_role_list_item.py
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+
+"""Test to verify presentation of selectable list items."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control><Shift>n"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to list item",
+    ["KNOWN ISSUE: We are presenting nothing here",
+     ""]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Right to next list item",
+    ["BRAILLE LINE:  'soffice application Template Manager frame Template Manager dialog Drawings page tab 
list Presentation Backgrounds list item'",
+     "     VISIBLE:  'Presentation Backgrounds list it', cursor=1",
+     "SPEECH OUTPUT: 'Presentation Backgrounds'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Left to previous list item",
+    ["BRAILLE LINE:  'soffice application Template Manager frame Template Manager dialog Drawings page tab 
list My Templates list item'",
+     "     VISIBLE:  'My Templates list item', cursor=1",
+     "SPEECH OUTPUT: 'My Templates'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/ui_role_menu.py b/test/keystrokes/oowriter/ui_role_menu.py
new file mode 100644
index 0000000..0470bf5
--- /dev/null
+++ b/test/keystrokes/oowriter/ui_role_menu.py
@@ -0,0 +1,32 @@
+#!/usr/bin/python
+
+"""Test to verify result of entering and escaping out of a submenu."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>f"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction("w"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Open the Wizards submenu",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame (1 dialog) Untitled 1 - 
LibreOffice Writer root pane Wizards menu'",
+     "     VISIBLE:  'Wizards menu', cursor=1",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame (1 dialog) Untitled 1 - 
LibreOffice Writer root pane File menu Letter...'",
+     "     VISIBLE:  'Letter...', cursor=1",
+     "SPEECH OUTPUT: 'Wizards menu'",
+     "SPEECH OUTPUT: 'Letter...'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Escape"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Exit the Wizards submenu",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame (1 dialog) Untitled 1 - 
LibreOffice Writer root pane Wizards menu'",
+     "     VISIBLE:  'Wizards menu', cursor=1",
+     "SPEECH OUTPUT: 'Wizards menu'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/ui_role_toolbar.py b/test/keystrokes/oowriter/ui_role_toolbar.py
new file mode 100644
index 0000000..7ee92dc
--- /dev/null
+++ b/test/keystrokes/oowriter/ui_role_toolbar.py
@@ -0,0 +1,238 @@
+#!/usr/bin/python
+
+"""Test of Orca's presentation of Writer toolbar buttons."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("F6"))
+sequence.append(utils.AssertPresentationAction(
+    "1. F6 to menu bar",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane File menu'",
+     "     VISIBLE:  'File menu', cursor=1",
+     "SPEECH OUTPUT: 'File menu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("F6"))
+sequence.append(utils.AssertPresentationAction(
+    "2. F6 to Standard toolbar",
+    ["KNOWN ISSUE: We are not speaking the toolbar name",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Standard tool bar New push button'",
+     "     VISIBLE:  'New push button', cursor=1",
+     "SPEECH OUTPUT: 'New push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>F1"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Control F1 to show Tooltip.",
+    ["KNOWN ISSUE: We are presenting nothing here.",
+     ""]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Right Arrow to Open button",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Standard tool bar Open push button'",
+     "     VISIBLE:  'Open push button', cursor=1",
+     "SPEECH OUTPUT: 'Open push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Right Arrow to Save button",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Standard tool bar Save push button'",
+     "     VISIBLE:  'Save push button', cursor=1",
+     "SPEECH OUTPUT: 'Save push button grayed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("F6"))
+sequence.append(KeyComboAction("F6"))
+sequence.append(utils.AssertPresentationAction(
+    "6. F6 to Formatting Toolbar",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Styles and Formatting push button'",
+     "     VISIBLE:  'Styles and Formatting push butto', cursor=1",
+     "SPEECH OUTPUT: 'Styles and Formatting push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Right to Apply Style",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Apply Style panel'",
+     "     VISIBLE:  'Apply Style panel', cursor=1",
+     "SPEECH OUTPUT: 'Apply Style panel'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Return to activate Apply Style",
+    ["KNOWN ISSUE: Way too chatty here and in the next assertions",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Default Style $l'",
+     "     VISIBLE:  'Default Style $l', cursor=14",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Default Style $l'",
+     "     VISIBLE:  'Default Style $l', cursor=14",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar  combo boxDefault Style $l Clear formatting list item'",
+     "     VISIBLE:  'Clear formatting list item', cursor=1",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Default Style $l'",
+     "     VISIBLE:  'Default Style $l', cursor=14",
+     "SPEECH OUTPUT: 'Default Style combo box'",
+     "SPEECH OUTPUT: 'text Default Style selected'",
+     "SPEECH OUTPUT: 'Clear formatting'",
+     "SPEECH OUTPUT: 'text Default Style selected'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Down in Apply Style (Collapsed)",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Text Body $l'",
+     "     VISIBLE:  'Text Body $l', cursor=10",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Text Body $l'",
+     "     VISIBLE:  'Text Body $l', cursor=10",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Text Body $l'",
+     "     VISIBLE:  'Text Body $l', cursor=10",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Text Body $l'",
+     "     VISIBLE:  'Text Body $l', cursor=10",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar  combo boxText Body $l Text Body list item'",
+     "     VISIBLE:  'Text Body list item', cursor=1",
+     "SPEECH OUTPUT: 'Text Body'",
+     "SPEECH OUTPUT: 'unselected' voice=system",
+     "SPEECH OUTPUT: 'Text Body'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Down in Apply Style (Collapsed)",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Quotations $l'",
+     "     VISIBLE:  'Quotations $l', cursor=11",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Quotations $l'",
+     "     VISIBLE:  'Quotations $l', cursor=11",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar  combo boxQuotations $l Quotations list item'",
+     "     VISIBLE:  'Quotations list item', cursor=1",
+     "SPEECH OUTPUT: 's'",
+     "SPEECH OUTPUT: 'selected' voice=system",
+     "SPEECH OUTPUT: 'Quotations'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Alt Down to expand list",
+    ["KNOWN ISSUE: We are presenting nothing here.",
+     ""]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Down in Apply Style (Expanded)",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Title $l'",
+     "     VISIBLE:  'Title $l', cursor=6",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Title $l'",
+     "     VISIBLE:  'Title $l', cursor=6",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar  combo boxTitle $l Title list item'",
+     "     VISIBLE:  'Title list item', cursor=1",
+     "SPEECH OUTPUT: 'unselected' voice=system",
+     "SPEECH OUTPUT: 'Title'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Down in Apply Style (Expanded)",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Subtitle $l'",
+     "     VISIBLE:  'Subtitle $l', cursor=9",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Subtitle $l'",
+     "     VISIBLE:  'Subtitle $l', cursor=9",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar  combo boxSubtitle $l Subtitle list item'",
+     "     VISIBLE:  'Subtitle list item', cursor=1",
+     "SPEECH OUTPUT: 'tle'",
+     "SPEECH OUTPUT: 'selected' voice=system",
+     "SPEECH OUTPUT: 'Subtitle'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Up in Apply Style (Expanded)",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Title $l'",
+     "     VISIBLE:  'Title $l', cursor=6",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Title $l'",
+     "     VISIBLE:  'Title $l', cursor=6",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar  combo boxTitle $l Title list item'",
+     "     VISIBLE:  'Title list item', cursor=1",
+     "SPEECH OUTPUT: 'unselected' voice=system",
+     "SPEECH OUTPUT: 'Title'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Up in Apply Style (Expanded)",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Quotations $l'",
+     "     VISIBLE:  'Quotations $l', cursor=11",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Quotations $l'",
+     "     VISIBLE:  'Quotations $l', cursor=11",
+     "BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar  combo boxQuotations $l Quotations list item'",
+     "     VISIBLE:  'Quotations list item', cursor=1",
+     "SPEECH OUTPUT: 'tions'",
+     "SPEECH OUTPUT: 'selected' voice=system",
+     "SPEECH OUTPUT: 'Quotations'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>Up"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Alt+Up to collapse list",
+    ["KNOWN ISSUE: We are presenting nothing here.",
+     ""]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Tab to Font Name",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Font Name panel'",
+     "     VISIBLE:  'Font Name panel', cursor=1",
+     "SPEECH OUTPUT: 'Font Name panel'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Tab to Font Size",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar Font Size panel'",
+     "     VISIBLE:  'Font Size panel', cursor=1",
+     "SPEECH OUTPUT: 'Font Size panel'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Tab to Bold",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar & y Bold toggle button'",
+     "     VISIBLE:  '& y Bold toggle button', cursor=1",
+     "SPEECH OUTPUT: 'Bold off'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Toggle Bold on",
+    ["SPEECH OUTPUT: 'Bold on'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Tab to Italic",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar & y Italic toggle button'",
+     "     VISIBLE:  '& y Italic toggle button', cursor=1",
+     "SPEECH OUTPUT: 'Italic off'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>ISO_Left_Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Shift Tab to Bold",
+    ["BRAILLE LINE:  'soffice application Untitled 1 - LibreOffice Writer frame Untitled 1 - LibreOffice 
Writer root pane Formatting tool bar &=y Bold toggle button'",
+     "     VISIBLE:  '&=y Bold toggle button', cursor=1",
+     "SPEECH OUTPUT: 'Bold on'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Toggle Bold off",
+    ["SPEECH OUTPUT: 'Bold off'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/where_am_i_document.params 
b/test/keystrokes/oowriter/where_am_i_document.params
new file mode 100644
index 0000000..2ff8051
--- /dev/null
+++ b/test/keystrokes/oowriter/where_am_i_document.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../documents/spanish.odt
diff --git a/test/keystrokes/oowriter/where_am_i_document.py b/test/keystrokes/oowriter/where_am_i_document.py
new file mode 100644
index 0000000..e3fb0e3
--- /dev/null
+++ b/test/keystrokes/oowriter/where_am_i_document.py
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+
+"""Test WhereAmI presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Basic WhereAmI with no text selected",
+    ["SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
'"]))
+
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(KeyComboAction("<Control>Right"))
+sequence.append(KeyComboAction("<Shift><Control>Down"))
+sequence.append(KeyComboAction("<Shift><Control>Down"))
+sequence.append(KeyComboAction("<Shift><Control>Down"))
+sequence.append(KeyComboAction("<Shift><Control>Down"))
+sequence.append(KeyComboAction("<Shift><Control>Down"))
+sequence.append(KeyComboAction("<Shift>Down"))
+sequence.append(KeyComboAction("<Shift><Control>Right"))
+sequence.append(KeyComboAction("<Shift><Control>Right"))
+sequence.append(KeyComboAction("<Shift><Control>Right"))
+sequence.append(KeyComboAction("<Shift><Control>Right"))
+sequence.append(KeyComboAction("<Shift><Control>Right"))
+sequence.append(PauseAction(3000))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic WhereAmI with multiple paragraphs selected",
+    ["SPEECH OUTPUT: 'Spanish Inquisition! Our chief weapon is surprise. Surprise and fear. Fear and 
surprise. Our two weapons are fear and surprise. And ruthless efficiency. Our three weapons are fear, 
surprise, and ruthless efficiency. And an almost fanatical devotion to the Pope. Our four. No. Amongst our 
weapons. Amongst our weaponry, are such elements as fear, surprise. I'll come in again. NOBODY expects the 
Spanish Inquisition! Amongst our weaponry are such diverse elements as: fear, surprise, ruthless efficiency, 
an almost fanatical devotion to the Pope, and nice red uniforms - Oh damn! Now old lady, you have one last 
chance. Confess the heinous sin of heresy, reject the works of the ungodly. Two last chances. And you shall 
be free. Three last chances. You have three last chances, the nature of which I have divulged in my previous 
utterance. Hm! She is made '",
+     "SPEECH OUTPUT: 'selected'"]))
+
+sequence.append(KeyComboAction("<Control>w"))
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/oowriter/where_am_i_document.settings 
b/test/keystrokes/oowriter/where_am_i_document.settings
new file mode 100644
index 0000000..fbf4726
--- /dev/null
+++ b/test/keystrokes/oowriter/where_am_i_document.settings
@@ -0,0 +1,177 @@
+{
+    "pronunciations": {}, 
+    "keybindings": {}, 
+    "profiles": {
+        "default": {
+            "speechServerFactory": "orca.speechdispatcherfactory", 
+            "profile": [
+                "Default", 
+                "default"
+            ], 
+            "voices": {
+                "default": {
+                    "average-pitch": 5.0, 
+                    "rate": 50.0, 
+                    "gain": 10.0
+                }, 
+                "uppercase": {
+                    "average-pitch": 5.6
+                }, 
+                "system": {
+                    "established": false
+                }, 
+                "hyperlink": {
+                    "average-pitch": 3.0
+                }
+            }, 
+            "speechServerInfo": [
+                "Default Synthesizer", 
+                "default"
+            ], 
+            "keybindings": {}, 
+            "pronunciations": {}
+        }
+    }, 
+    "general": {
+        "speakCellHeaders": true, 
+        "magEdgeMargin": 0, 
+        "brailleContractionTable": "", 
+        "magPointerFollowsFocus": false, 
+        "magTextTrackingMode": 2, 
+        "magZoomerBorderSize": 1, 
+        "brailleAlignmentStyle": 0, 
+        "enableEchoByWord": false, 
+        "enableMagZoomerColorInversion": false, 
+        "magCursorSize": 32, 
+        "magSmoothingMode": 0, 
+        "magZoomerLeft": 1200, 
+        "sayAllStyle": 1, 
+        "brailleSelectorIndicator": 192, 
+        "presentDateFormat": "%x", 
+        "magContrastLevel": 0, 
+        "magMouseTrackingMode": 0, 
+        "speakCellSpan": true, 
+        "progressBarUpdateInterval": 10, 
+        "speakCellCoordinates": true, 
+        "enablePauseBreaks": true, 
+        "brailleEOLIndicator": " $l", 
+        "verbalizePunctuationStyle": 1, 
+        "progressBarVerbosity": 1, 
+        "enableSpeech": true, 
+        "enableBraille": false, 
+        "chatAnnounceBuddyTyping": false, 
+        "speakMultiCaseStringsAsWords": false, 
+        "enableBrailleGrouping": false, 
+        "readTableCellRow": true, 
+        "activeProfile": [
+            "Default", 
+            "default"
+        ], 
+        "textAttributesBrailleIndicator": 0, 
+        "enableMagCursorExplicitSize": false, 
+        "messageVerbosityLevel": 1, 
+        "enableMagLiveUpdating": true, 
+        "enableSpeechIndentation": true, 
+        "enableKeyEcho": false, 
+        "magHideCursor": false, 
+        "magZoomerBorderColor": "#000000", 
+        "magPointerFollowsZoomer": true, 
+        "mouseDwellDelay": 0, 
+        "magBrightnessLevelRed": 0, 
+        "enableMagnifier": false, 
+        "magZoomFactor": 4.0, 
+        "speechServerFactory": "speechdispatcherfactory", 
+        "enableMagZoomerBorder": false, 
+        "flashVerbosityLevel": 1, 
+        "enableFlashMessages": true, 
+        "speechServerInfo": null, 
+        "presentToolTips": false, 
+        "flashIsPersistent": false, 
+        "brailleRequiredStateString": "required", 
+        "firstStart": false, 
+        "largeObjectTextLength": 75, 
+        "enableEchoBySentence": false, 
+        "magContrastLevelBlue": 0, 
+        "magContrastLevelRed": 0, 
+        "enableContractedBraille": false, 
+        "orcaModifierKeys": [
+            "Insert", 
+            "KP_Insert"
+        ], 
+        "enableMagCursor": true, 
+        "speechRequiredStateString": "required", 
+        "quitOrcaNoConfirmation": false, 
+        "skipBlankCells": false, 
+        "magCursorColor": "#000000", 
+        "enablePositionSpeaking": false, 
+        "magZoomerType": 0, 
+        "onlySpeakDisplayedText": false, 
+        "enableProgressBarUpdates": true, 
+        "wrappedStructuralNavigation": true, 
+        "chatRoomHistories": false, 
+        "brailleVerbosityLevel": 1, 
+        "enableFunctionKeys": true, 
+        "enableModifierKeys": true, 
+        "magCrossHairColor": "#000000", 
+        "enableTutorialMessages": false, 
+        "enableActionKeys": true, 
+        "speakBlankLines": true, 
+        "magColorFilteringMode": 0, 
+        "magZoomerRight": 2400, 
+        "keyboardLayout": 1, 
+        "magTargetDisplay": "", 
+        "disableBrailleEOL": false, 
+        "magZoomerTop": 0, 
+        "magSourceDisplay": "", 
+        "enableDiacriticalKeys": false, 
+        "enableMnemonicSpeaking": false, 
+        "enabledBrailledTextAttributes": "size:; family-name:; weight:400; indent:0; underline:none; 
strikethrough:false; justification:left; style:normal; text-spelling:none;", 
+        "speechVerbosityLevel": 1, 
+        "enableMagCrossHair": true, 
+        "enableBrailleMonitor": false, 
+        "voices": {
+            "default": {
+                "established": false
+            }, 
+            "uppercase": {
+                "average-pitch": 5.6
+            }, 
+            "system": {
+                "established": false
+            }, 
+            "hyperlink": {
+                "established": false
+            }
+        }, 
+        "magContrastLevelGreen": 0, 
+        "brailleFlashTime": 5000, 
+        "magCrossHairSize": 16, 
+        "enableMouseReview": false, 
+        "enableNavigationKeys": false, 
+        "magBrightnessLevelGreen": 0, 
+        "chatSpeakRoomName": false, 
+        "startingProfile": [
+            "Default", 
+            "default"
+        ], 
+        "enableLockingKeys": true, 
+        "profile": [
+            "Default", 
+            "default"
+        ], 
+        "brailleRolenameStyle": 1, 
+        "brailleLinkIndicator": 192, 
+        "enableEchoByCharacter": false, 
+        "magBrightnessLevelBlue": 0, 
+        "enableBrailleContext": true, 
+        "magControlTrackingMode": 2, 
+        "magZoomerBottom": 1920, 
+        "enablePrintableKeys": true, 
+        "enabledSpokenTextAttributes": "size:; family-name:; weight:400; indent:0; underline:none; 
strikethrough:false; justification:left; style:normal; paragraph-style:; text-spelling:none;", 
+        "chatMessageVerbosity": 0, 
+        "presentTimeFormat": "%X", 
+        "magBrightnessLevel": 0, 
+        "presentRequiredState": false, 
+        "enableMagCrossHairClip": false
+    }
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]