[orca] Work on Gecko regression tests * Update tests to reflect new results with changes to Orca and Gecko



commit 1157c6b9e047ba36ec479a373326a48bc75cf8f8
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Tue Aug 19 13:37:53 2014 -0400

    Work on Gecko regression tests
    * Update tests to reflect new results with changes to Orca and Gecko
    * General cleanup and reorganization
    * Added additional test cases
    * Eliminated unneeded delays in some of the tests

 test/html/FirefoxProfile/prefs.js                  |    2 +-
 test/html/abbr.html                                |   10 +
 test/html/clickable.html                           |   16 +
 test/html/fb-stuck.html                            |   10 +
 test/html/longdesc-content.html                    |   17 +
 test/html/longdesc.html                            |    7 +
 test/html/longdesc.txt                             |    1 +
 test/html/so.html                                  |   15 +
 test/keystrokes/firefox/aria_alert.params          |    1 +
 test/keystrokes/firefox/aria_alert.py              |  164 ++
 test/keystrokes/firefox/aria_alert_uiuc.params     |    1 +
 test/keystrokes/firefox/aria_alert_uiuc.py         |   60 +
 test/keystrokes/firefox/aria_button.params         |    1 +
 test/keystrokes/firefox/aria_button.py             |   46 +
 test/keystrokes/firefox/aria_button_dojo.params    |    1 +
 test/keystrokes/firefox/aria_button_dojo.py        |  366 +++++
 test/keystrokes/firefox/aria_button_uiuc.params    |    1 +
 test/keystrokes/firefox/aria_button_uiuc.py        |   95 ++
 test/keystrokes/firefox/aria_checkbox.params       |    1 +
 test/keystrokes/firefox/aria_checkbox.py           |  117 ++
 test/keystrokes/firefox/aria_checkbox_dojo.params  |    1 +
 test/keystrokes/firefox/aria_checkbox_dojo.py      |  109 ++
 test/keystrokes/firefox/aria_combobox_dojo.params  |    1 +
 test/keystrokes/firefox/aria_combobox_dojo.py      |  138 ++
 test/keystrokes/firefox/aria_dialog_dojo.params    |    1 +
 test/keystrokes/firefox/aria_dialog_dojo.py        |   44 +
 .../firefox/aria_editor_navigation_dojo.params     |    1 +
 .../firefox/aria_editor_navigation_dojo.py         |   50 +
 test/keystrokes/firefox/aria_grid_uiuc.params      |    1 +
 test/keystrokes/firefox/aria_grid_uiuc.py          |   83 +
 test/keystrokes/firefox/aria_list.params           |    1 +
 test/keystrokes/firefox/aria_list.py               |   51 +
 test/keystrokes/firefox/aria_menu.params           |    1 +
 test/keystrokes/firefox/aria_menu.py               |  162 ++
 test/keystrokes/firefox/aria_progressbar.params    |    1 +
 test/keystrokes/firefox/aria_progressbar.py        |   28 +
 .../firefox/aria_radio_button_uiuc.params          |    1 +
 test/keystrokes/firefox/aria_radio_button_uiuc.py  |  102 ++
 test/keystrokes/firefox/aria_slider.params         |    1 +
 test/keystrokes/firefox/aria_slider.py             |   73 +
 test/keystrokes/firefox/aria_slider_dojo.params    |    1 +
 test/keystrokes/firefox/aria_slider_dojo.py        |  128 ++
 test/keystrokes/firefox/aria_slider_tpg.params     |    1 +
 test/keystrokes/firefox/aria_slider_tpg.py         |  250 +++
 test/keystrokes/firefox/aria_slider_uiuc.params    |    1 +
 test/keystrokes/firefox/aria_slider_uiuc.py        |  130 ++
 test/keystrokes/firefox/aria_spinner_dojo.params   |    1 +
 test/keystrokes/firefox/aria_spinner_dojo.py       |   68 +
 .../firefox/aria_tabcontainer_dojo.params          |    1 +
 test/keystrokes/firefox/aria_tabcontainer_dojo.py  |   57 +
 test/keystrokes/firefox/aria_tabpanel.params       |    1 +
 test/keystrokes/firefox/aria_tabpanel.py           |   87 +
 .../firefox/aria_tabpanel_text_dojo.params         |    1 +
 test/keystrokes/firefox/aria_tabpanel_text_dojo.py |   72 +
 test/keystrokes/firefox/aria_tabpanel_uiuc.params  |    1 +
 test/keystrokes/firefox/aria_tabpanel_uiuc.py      |  100 ++
 test/keystrokes/firefox/aria_toolbar_dojo.params   |    1 +
 test/keystrokes/firefox/aria_toolbar_dojo.py       |  127 ++
 test/keystrokes/firefox/aria_tree_dojo.params      |    1 +
 test/keystrokes/firefox/aria_tree_dojo.py          |  161 ++
 test/keystrokes/firefox/aria_tree_uiuc.params      |    1 +
 test/keystrokes/firefox/aria_tree_uiuc.py          |  188 +++
 test/keystrokes/firefox/aria_treegrid.params       |    1 +
 test/keystrokes/firefox/aria_treegrid.py           |  150 ++
 test/keystrokes/firefox/bug_511389.py              |   77 -
 test/keystrokes/firefox/bug_544771.py              |   79 -
 test/keystrokes/firefox/bug_552887a.py             |  401 -----
 test/keystrokes/firefox/bug_568631.py              |   77 -
 test/keystrokes/firefox/bug_568768.py              |   39 -
 test/keystrokes/firefox/bug_589455.py              |   95 --
 test/keystrokes/firefox/bug_591807.py              |   95 --
 test/keystrokes/firefox/codetalks_alert.py         |  164 --
 test/keystrokes/firefox/codetalks_button.py        |  115 --
 test/keystrokes/firefox/codetalks_list.py          |  138 --
 test/keystrokes/firefox/codetalks_panel_text.py    |  187 ---
 test/keystrokes/firefox/codetalks_tree.py          |  107 --
 test/keystrokes/firefox/codetalks_treegrid.py      |  187 ---
 test/keystrokes/firefox/doc_tabs.py                |  130 --
 test/keystrokes/firefox/dojo_bug_570566.py         |  103 --
 test/keystrokes/firefox/dojo_button.py             |  622 -------
 test/keystrokes/firefox/dojo_checkbox.py           |  162 --
 test/keystrokes/firefox/dojo_combo_box.py          |  195 ---
 test/keystrokes/firefox/dojo_dialog.py             |  118 --
 test/keystrokes/firefox/dojo_panel_text.py         |  191 ---
 test/keystrokes/firefox/dojo_slider.py             |  349 ----
 test/keystrokes/firefox/dojo_spinner.py            |  117 --
 test/keystrokes/firefox/dojo_tabcontainer.py.hang  |  127 --
 test/keystrokes/firefox/dojo_tree.py               |  187 ---
 test/keystrokes/firefox/find_wiki.params           |    1 +
 test/keystrokes/firefox/find_wiki.py               |  158 +--
 .../firefox/flat_review_combo_box.params           |    1 +
 test/keystrokes/firefox/flat_review_combo_box.py   |   84 +-
 .../firefox/flat_review_text_by_line.params        |    1 +
 .../keystrokes/firefox/flat_review_text_by_line.py |  212 +---
 .../flat_review_text_by_word_and_char.params       |    1 +
 .../firefox/flat_review_text_by_word_and_char.py   |  321 +---
 .../firefox/focus_tracking_imagemap.params         |    1 +
 test/keystrokes/firefox/focus_tracking_imagemap.py |   82 +
 .../keystrokes/firefox/focus_tracking_links.params |    1 +
 test/keystrokes/firefox/focus_tracking_links.py    |   54 +
 test/keystrokes/firefox/html_page_summary.params   |    1 +
 test/keystrokes/firefox/html_page_summary.py       |   35 +
 test/keystrokes/firefox/html_role_combo_box.params |    1 +
 test/keystrokes/firefox/html_role_combo_box.py     |  332 ++---
 test/keystrokes/firefox/html_role_links.params     |    1 +
 test/keystrokes/firefox/html_role_links.py         |  120 +--
 .../firefox/html_role_list_item_where_am_i.params  |    1 +
 .../firefox/html_role_list_item_where_am_i.py      |   95 +-
 test/keystrokes/firefox/html_role_lists.params     |    1 +
 test/keystrokes/firefox/html_role_lists.py         |  206 ++--
 .../firefox/html_struct_nav_activate_link.params   |    1 +
 .../firefox/html_struct_nav_activate_link.py       |   82 +
 .../firefox/html_struct_nav_blockquote.params      |    1 +
 .../firefox/html_struct_nav_blockquote.py          |  123 +--
 .../firefox/html_struct_nav_bug_554616.params      |    1 +
 .../firefox/html_struct_nav_bug_554616.py          |  201 +--
 .../firefox/html_struct_nav_bug_556470.params      |    1 +
 .../firefox/html_struct_nav_bug_556470.py          |   81 +-
 .../firefox/html_struct_nav_bug_567984.params      |    1 +
 .../firefox/html_struct_nav_bug_567984.py          |  115 +-
 .../firefox/html_struct_nav_bug_591592.params      |    1 +
 .../firefox/html_struct_nav_bug_591592.py          |   94 +-
 .../firefox/html_struct_nav_large_obj.params       |    1 +
 .../firefox/html_struct_nav_large_obj.py           |   88 +-
 .../firefox/html_struct_nav_links.params           |    1 +
 test/keystrokes/firefox/html_struct_nav_links.py   |  211 +--
 .../firefox/html_struct_nav_list_item.params       |    1 +
 .../firefox/html_struct_nav_list_item.py           |  214 +--
 .../firefox/html_struct_nav_lists.params           |    1 +
 test/keystrokes/firefox/html_struct_nav_lists.py   |  268 ++--
 test/keystrokes/firefox/imagemap.py                |  387 -----
 test/keystrokes/firefox/images_in_links.py         |  262 ---
 test/keystrokes/firefox/label_guess_bug_546815.py  |  227 ---
 .../firefox/label_guess_bugzilla_search.py         |  555 -------
 .../firefox/label_inference_bug_546815.params      |    1 +
 .../firefox/label_inference_bug_546815.py          |  211 +++
 .../firefox/label_inference_bugzilla_search.params |    1 +
 .../firefox/label_inference_bugzilla_search.py     |  653 ++++++++
 .../firefox/label_inference_entries.params         |    1 +
 ...guess_entries.py => label_inference_entries.py} |  321 ++--
 .../firefox/label_inference_mailman.params         |    1 +
 ...ss_bug_509809.py => label_inference_mailman.py} |  175 +--
 test/keystrokes/firefox/line_nav_bug_546815.params |    1 +
 test/keystrokes/firefox/line_nav_bug_546815.py     |  553 +++++++
 .../firefox/line_nav_bug_547573.py.broken          | 1689 --------------------
 test/keystrokes/firefox/line_nav_bug_549128.params |    1 +
 test/keystrokes/firefox/line_nav_bug_549128.py     |  225 +--
 .../keystrokes/firefox/line_nav_bug_552887a.params |    1 +
 test/keystrokes/firefox/line_nav_bug_552887a.py    |  228 +++
 test/keystrokes/firefox/line_nav_bug_554616.params |    1 +
 test/keystrokes/firefox/line_nav_bug_554616.py     |  150 +-
 test/keystrokes/firefox/line_nav_bug_555055.params |    1 +
 test/keystrokes/firefox/line_nav_bug_555055.py     |  232 ++--
 test/keystrokes/firefox/line_nav_bug_570757.params |    1 +
 test/keystrokes/firefox/line_nav_bug_570757.py     |   93 +-
 test/keystrokes/firefox/line_nav_bug_577239.params |    1 +
 test/keystrokes/firefox/line_nav_bug_577239.py     |  176 +--
 test/keystrokes/firefox/line_nav_bug_577979.params |    1 +
 test/keystrokes/firefox/line_nav_bug_577979.py     |  115 +-
 test/keystrokes/firefox/line_nav_bug_592383.params |    1 +
 test/keystrokes/firefox/line_nav_bug_592383.py     |  107 +-
 .../keystrokes/firefox/line_nav_bugzilla_search.py | 1186 --------------
 .../firefox/line_nav_bugzilla_search_down.params   |    1 +
 .../firefox/line_nav_bugzilla_search_down.py       |  815 ++++++++++
 .../firefox/line_nav_bugzilla_search_up.params     |    1 +
 .../firefox/line_nav_bugzilla_search_up.py         |  791 +++++++++
 test/keystrokes/firefox/line_nav_clickables.params |    1 +
 test/keystrokes/firefox/line_nav_clickables.py     |  125 ++
 .../firefox/line_nav_empty_anchor.params           |    1 +
 test/keystrokes/firefox/line_nav_empty_anchor.py   |  213 ++--
 test/keystrokes/firefox/line_nav_enter_bug.params  |    1 +
 test/keystrokes/firefox/line_nav_enter_bug.py      |  669 +++++---
 .../firefox/line_nav_follow_same_page_link.params  |    1 +
 .../firefox/line_nav_follow_same_page_link.py      |   61 +
 .../line_nav_follow_same_page_link_2.params        |    1 +
 .../firefox/line_nav_follow_same_page_link_2.py    |   31 +
 .../line_nav_follow_same_page_link_3.params        |    1 +
 .../firefox/line_nav_follow_same_page_link_3.py    |   19 +
 .../firefox/line_nav_heading_section.params        |    1 +
 .../keystrokes/firefox/line_nav_heading_section.py |  118 +-
 .../firefox/line_nav_hidden_buttons.params         |    1 +
 test/keystrokes/firefox/line_nav_hidden_buttons.py |   73 +
 .../firefox/line_nav_hidden_links.params           |    1 +
 test/keystrokes/firefox/line_nav_hidden_links.py   |  144 ++
 .../firefox/line_nav_home_end_on_blank_line.params |    1 +
 .../firefox/line_nav_home_end_on_blank_line.py     |   61 +
 test/keystrokes/firefox/line_nav_imagemap.params   |    1 +
 test/keystrokes/firefox/line_nav_imagemap.py       |  273 +++-
 .../firefox/line_nav_images_in_links.params        |    1 +
 .../keystrokes/firefox/line_nav_images_in_links.py |  641 ++++++++
 .../firefox/line_nav_multi_line_text.params        |    1 +
 .../keystrokes/firefox/line_nav_multi_line_text.py |  234 ++--
 .../firefox/line_nav_nested_tables.params          |    1 +
 test/keystrokes/firefox/line_nav_nested_tables.py  |  320 +++--
 .../keystrokes/firefox/line_nav_simple_form.params |    1 +
 test/keystrokes/firefox/line_nav_simple_form.py    |  301 ++--
 test/keystrokes/firefox/line_nav_slash_test.params |    1 +
 test/keystrokes/firefox/line_nav_slash_test.py     |  197 ++--
 test/keystrokes/firefox/line_nav_sun_java.params   |    1 +
 test/keystrokes/firefox/line_nav_sun_java.py       |  471 ++++++
 .../firefox/line_nav_table_captions.params         |    1 +
 .../{bug_512303.py => line_nav_table_captions.py}  |   54 +-
 .../firefox/line_nav_table_cell_links.params       |    1 +
 .../firefox/line_nav_table_cell_links.py           |  119 +-
 .../keystrokes/firefox/line_nav_twitter_bug.params |    1 +
 test/keystrokes/firefox/line_nav_twitter_bug.py    |  102 +-
 test/keystrokes/firefox/line_nav_wiki.py           | 1539 ------------------
 test/keystrokes/firefox/line_nav_wiki_down.params  |    1 +
 test/keystrokes/firefox/line_nav_wiki_down.py      | 1110 +++++++++++++
 test/keystrokes/firefox/line_nav_wiki_up.params    |    1 +
 test/keystrokes/firefox/line_nav_wiki_up.py        | 1037 ++++++++++++
 test/keystrokes/firefox/link_where_am_i.params     |    1 +
 test/keystrokes/firefox/link_where_am_i.py         |   77 +-
 .../firefox/mouseover_javascript_alert.params      |    1 +
 .../firefox/mouseover_javascript_alert.py          |   82 +-
 test/keystrokes/firefox/mouseover_yahoo_menus.py   |  115 --
 test/keystrokes/firefox/moz_checkbox.py            |  169 --
 test/keystrokes/firefox/moz_menu.py                |  195 ---
 test/keystrokes/firefox/moz_progressbar.py         |  170 --
 test/keystrokes/firefox/moz_slider.py              |  203 ---
 test/keystrokes/firefox/moz_tabpanel.py            |  126 --
 test/keystrokes/firefox/ms_tree_bug_570571.py      |  174 --
 test/keystrokes/firefox/orca_bookmarks.py          |  126 --
 test/keystrokes/firefox/page_summary.py            |   71 -
 test/keystrokes/firefox/sayAll_blockquote.py       |   75 -
 test/keystrokes/firefox/sayAll_bug-591351-1.py     |   76 -
 test/keystrokes/firefox/sayAll_bug_511389.py       |   71 -
 test/keystrokes/firefox/sayAll_bug_512303.py       |   80 -
 test/keystrokes/firefox/sayAll_bugzilla_search.py  |  181 ---
 test/keystrokes/firefox/sayAll_empty_anchor.py     |   92 --
 test/keystrokes/firefox/sayAll_enter_bug.py        |  117 --
 test/keystrokes/firefox/sayAll_entries.py          |  156 --
 test/keystrokes/firefox/sayAll_heading_section.py  |   73 -
 test/keystrokes/firefox/sayAll_imagemap.py         |   99 --
 test/keystrokes/firefox/sayAll_multi_line_text.py  |   71 -
 test/keystrokes/firefox/sayAll_nested_tables.py    |   80 -
 test/keystrokes/firefox/sayAll_role_combo_box.py   |   78 -
 test/keystrokes/firefox/sayAll_role_links.py       |   84 -
 test/keystrokes/firefox/sayAll_role_lists.py       |   69 -
 test/keystrokes/firefox/sayAll_simple_form.py      |   79 -
 test/keystrokes/firefox/sayAll_table_cell_links.py |   79 -
 test/keystrokes/firefox/sayAll_wiki.py             |  149 --
 test/keystrokes/firefox/say_all_blockquote.params  |    1 +
 test/keystrokes/firefox/say_all_blockquote.py      |   22 +
 test/keystrokes/firefox/say_all_bug_511389.params  |    1 +
 test/keystrokes/firefox/say_all_bug_511389.py      |   27 +
 .../keystrokes/firefox/say_all_bug_591351_1.params |    1 +
 test/keystrokes/firefox/say_all_bug_591351_1.py    |   25 +
 ...51-1.settings => say_all_bug_591351_1.settings} |    0
 .../firefox/say_all_bugzilla_search.params         |    1 +
 test/keystrokes/firefox/say_all_bugzilla_search.py |  187 +++
 .../keystrokes/firefox/say_all_empty_anchor.params |    1 +
 test/keystrokes/firefox/say_all_empty_anchor.py    |   42 +
 test/keystrokes/firefox/say_all_enter_bug.params   |    1 +
 test/keystrokes/firefox/say_all_enter_bug.py       |  120 ++
 test/keystrokes/firefox/say_all_entries.params     |    1 +
 test/keystrokes/firefox/say_all_entries.py         |  121 ++
 .../firefox/say_all_heading_section.params         |    1 +
 test/keystrokes/firefox/say_all_heading_section.py |   28 +
 test/keystrokes/firefox/say_all_imagemap.params    |    1 +
 test/keystrokes/firefox/say_all_imagemap.py        |   56 +
 .../firefox/say_all_multi_line_text.params         |    1 +
 test/keystrokes/firefox/say_all_multi_line_text.py |   45 +
 .../firefox/say_all_nested_tables.params           |    1 +
 test/keystrokes/firefox/say_all_nested_tables.py   |   49 +
 .../firefox/say_all_role_combo_box.params          |    1 +
 test/keystrokes/firefox/say_all_role_combo_box.py  |   30 +
 test/keystrokes/firefox/say_all_role_links.params  |    1 +
 test/keystrokes/firefox/say_all_role_links.py      |   65 +
 test/keystrokes/firefox/say_all_role_lists.params  |    1 +
 test/keystrokes/firefox/say_all_role_lists.py      |   19 +
 test/keystrokes/firefox/say_all_simple_form.params |    1 +
 test/keystrokes/firefox/say_all_simple_form.py     |   29 +
 .../firefox/say_all_table_caption.params           |    1 +
 test/keystrokes/firefox/say_all_table_caption.py   |   35 +
 .../firefox/say_all_table_cell_links.params        |    1 +
 .../keystrokes/firefox/say_all_table_cell_links.py |   38 +
 test/keystrokes/firefox/say_all_wiki.params        |    1 +
 test/keystrokes/firefox/say_all_wiki.py            |   45 +
 test/keystrokes/firefox/spelling_errors.params     |    1 +
 test/keystrokes/firefox/spelling_errors.py         |  237 +---
 test/keystrokes/firefox/tpg_aria_slider.py         | 1416 ----------------
 test/keystrokes/firefox/ui_doc_tabs.params         |    1 +
 test/keystrokes/firefox/ui_doc_tabs.py             |   63 +
 test/keystrokes/firefox/ui_role_accel_label.py     |   43 +
 test/keystrokes/firefox/ui_role_check_box.py       |   77 +
 test/keystrokes/firefox/ui_role_check_menu_item.py |   37 +
 test/keystrokes/firefox/ui_role_combo_box.py       |  111 ++
 test/keystrokes/firefox/ui_role_entry.py           |  151 ++
 test/keystrokes/firefox/ui_role_list_item.py       |   47 +
 test/keystrokes/firefox/ui_role_menu_bar.py        |   49 +
 test/keystrokes/firefox/ui_role_page_tab.py        |   51 +
 test/keystrokes/firefox/ui_role_push_button.py     |   34 +
 test/keystrokes/firefox/ui_role_radio_button.py    |   35 +
 test/keystrokes/firefox/ui_role_radio_menu_item.py |   65 +
 test/keystrokes/firefox/ui_role_tree.py            |  126 ++
 test/keystrokes/firefox/ui_role_tree_table.py      |   41 +
 test/keystrokes/firefox/uiuc_alert.py              |  109 --
 test/keystrokes/firefox/uiuc_button.py             |  157 --
 test/keystrokes/firefox/uiuc_grid.py               |  129 --
 test/keystrokes/firefox/uiuc_radiobutton.py        |  167 --
 test/keystrokes/firefox/uiuc_slider.py             |  178 --
 test/keystrokes/firefox/uiuc_tabpanel.py           |  123 --
 test/keystrokes/firefox/uiuc_tree.py               |  193 ---
 test/keystrokes/firefox/xul_role_accel_label.py    |   86 -
 test/keystrokes/firefox/xul_role_alert.py          |   79 -
 test/keystrokes/firefox/xul_role_check_box.py      |  119 --
 .../keystrokes/firefox/xul_role_check_menu_item.py |   68 -
 test/keystrokes/firefox/xul_role_combo_box.py      |  185 ---
 test/keystrokes/firefox/xul_role_entry.py          |  352 ----
 test/keystrokes/firefox/xul_role_list_item.py      |   73 -
 test/keystrokes/firefox/xul_role_menu_bar.py       |  114 --
 test/keystrokes/firefox/xul_role_page_tab.py       |   85 -
 test/keystrokes/firefox/xul_role_push_button.py    |   62 -
 test/keystrokes/firefox/xul_role_radio_button.py   |   61 -
 .../keystrokes/firefox/xul_role_radio_menu_item.py |   95 --
 test/keystrokes/firefox/xul_role_tree.py           |  201 ---
 test/keystrokes/firefox/xul_role_tree_table.py     |   94 --
 test/keystrokes/firefox/xul_where_am_i_dialog.py   |   85 -
 test/keystrokes/firefox/yahoo_tab_view.py          |  136 --
 320 files changed, 15540 insertions(+), 21887 deletions(-)
---
diff --git a/test/html/FirefoxProfile/prefs.js b/test/html/FirefoxProfile/prefs.js
index a0f6091..42abf95 100644
--- a/test/html/FirefoxProfile/prefs.js
+++ b/test/html/FirefoxProfile/prefs.js
@@ -50,4 +50,4 @@ user_pref("intl.charset.default", "UTF-8");
 user_pref("intl.charset.default", "UTF-8");
 user_pref("intl.charsetmenu.browser.cache", "UTF-8");
 user_pref("intl.charsetmenu.browser.static", "UTF-8");
-
+user_pref("spellchecker.dictionary", "en_US");
diff --git a/test/html/abbr.html b/test/html/abbr.html
new file mode 100644
index 0000000..70c1bd8
--- /dev/null
+++ b/test/html/abbr.html
@@ -0,0 +1,10 @@
+<html>
+<head></head>
+<body>
+<p>No abbreviation here.</p>
+<p>
+<abbr title="Web Hypertext Application Technology Working Group">WHATWG</abbr>
+started working on HTML5 in 2004.</p>
+<p>No abbreviation here either.</p>
+</body>
+</html>
diff --git a/test/html/clickable.html b/test/html/clickable.html
new file mode 100644
index 0000000..df3d21d
--- /dev/null
+++ b/test/html/clickable.html
@@ -0,0 +1,16 @@
+<html>
+<head><title>Clickable</title></head>
+<script language="JavaScript">
+<!--
+function myMessage(msg) {
+    alert(msg);
+}
+//-->
+</script>
+<body>
+<p>Clickable image: <img src="orca-for-tests.jpg" alt="Orca Logo" onClick="myMessage('image clicked');">More 
text.</p>
+<p>Clickable span: <span onClick="myMessage('span clicked');">Click Me.</span> More text.</p>
+<p>Clickable div: <div onClick="myMessage('div clicked');">Click Me.</div> More text.</p>
+</body>
+</html>
+
diff --git a/test/html/fb-stuck.html b/test/html/fb-stuck.html
new file mode 100644
index 0000000..464b517
--- /dev/null
+++ b/test/html/fb-stuck.html
@@ -0,0 +1,10 @@
+<html>
+<body>
+<p>The start</p>
+<div style="word-wrap:break-word;">
+<a style="height:1px;overflow:hidden;position:absolute;width:1px;" role="button">Button 1</a>
+<a role="button">Button 2</a>
+</div>
+<p>The end</p>
+</body>
+</html>
diff --git a/test/html/longdesc-content.html b/test/html/longdesc-content.html
new file mode 100644
index 0000000..d077e42
--- /dev/null
+++ b/test/html/longdesc-content.html
@@ -0,0 +1,17 @@
+<html>
+<body>
+<h1>About Orca</h1>
+<div id="desc1">
+  <h2>Orca used to look much different</h2>
+  <p>He stood up, had muscles, and a tattoo.</p>
+</div>
+<section id="desc2">
+  <h2>Orca is not an acronym</h2>
+  <p>Orca is a whale. He holds a white cane. And he is cute.</p>
+</section>
+<div id="blah">
+  <h2>Some random text</h2>
+  <p>Bla bla bla.</p>
+</div>
+</body>
+</html>
diff --git a/test/html/longdesc.html b/test/html/longdesc.html
new file mode 100644
index 0000000..f1442f1
--- /dev/null
+++ b/test/html/longdesc.html
@@ -0,0 +1,7 @@
+<html>
+<body>
+<img src="orca-for-tests.jpg" alt="First Orca" longdesc="longdesc.txt" />
+<img src="orca-for-tests.jpg" alt="Second Orca" longdesc="longdesc-content.html#desc1" />
+<img src="orca-for-tests.jpg" alt="Third Orca" longdesc="longdesc-content.html#desc2" />
+</body>
+</html>
diff --git a/test/html/longdesc.txt b/test/html/longdesc.txt
new file mode 100644
index 0000000..f88ed3f
--- /dev/null
+++ b/test/html/longdesc.txt
@@ -0,0 +1 @@
+This is a plain text description. It is also a plain description which is text. It should probably instead 
describe Orca.
diff --git a/test/html/so.html b/test/html/so.html
new file mode 100644
index 0000000..8c65431
--- /dev/null
+++ b/test/html/so.html
@@ -0,0 +1,15 @@
+<html>
+<head>
+<style>
+.foo{display:block;text-indent:-9999em;font-size:1px}
+</style>
+</head>
+<body>
+<p>Start</p>
+    <a class="foo">up vote</a>
+    <span style="display:block;font-size:24px;">74</span>
+    <a class="foo">down vote</a>
+    <span class="foo">accepted</span>
+<p>End</p>
+</body>
+</html>
diff --git a/test/keystrokes/firefox/aria_alert.params b/test/keystrokes/firefox/aria_alert.params
new file mode 100644
index 0000000..d963605
--- /dev/null
+++ b/test/keystrokes/firefox/aria_alert.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/aria-alert.html
diff --git a/test/keystrokes/firefox/aria_alert.py b/test/keystrokes/firefox/aria_alert.py
new file mode 100644
index 0000000..a08da86
--- /dev/null
+++ b/test/keystrokes/firefox/aria_alert.py
@@ -0,0 +1,164 @@
+#!/usr/bin/python
+
+"""Test of ARIA alert presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "1. Press button",
+    ["KNOWN ISSUE: Because the link has focus, we double-present it.",
+     "BRAILLE LINE:  'This popup is created as a div in the'",
+     "     VISIBLE:  'This popup is created as a div i', cursor=1",
+     "BRAILLE LINE:  'close'",
+     "     VISIBLE:  'close', cursor=1",
+     "BRAILLE LINE:  'close'",
+     "     VISIBLE:  'close', cursor=1",
+     "SPEECH OUTPUT: 'This popup is created as a div in the HTML content, rather than being created in the 
DOM at the time of use. The display style is changed from \"none\" to \"block\" to hide and show it. close'",
+     "SPEECH OUTPUT: 'close'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Up Arrow",
+    ["BRAILLE LINE:  'show it.'",
+     "     VISIBLE:  'show it.', cursor=1",
+     "SPEECH OUTPUT: 'show it. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Up Arrow",
+    ["BRAILLE LINE:  'from \"none\" to \"block\" to hide and'",
+     "     VISIBLE:  'from \"none\" to \"block\" to hide a', cursor=1",
+     "SPEECH OUTPUT: 'from \"none\" to \"block\" to hide and '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Up Arrow",
+    ["BRAILLE LINE:  'use. The display style is changed'",
+     "     VISIBLE:  'use. The display style is change', cursor=1",
+     "SPEECH OUTPUT: 'use. The display style is changed '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Up Arrow",
+    ["BRAILLE LINE:  'created in the DOM at the time of'",
+     "     VISIBLE:  'created in the DOM at the time o', cursor=1",
+     "SPEECH OUTPUT: 'created in the DOM at the time of '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Up Arrow",
+    ["BRAILLE LINE:  'HTML content, rather than being'",
+     "     VISIBLE:  'HTML content, rather than being', cursor=1",
+     "SPEECH OUTPUT: 'HTML content, rather than being '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Up Arrow",
+    ["BRAILLE LINE:  'This popup is created as a div in the'",
+     "     VISIBLE:  'This popup is created as a div i', cursor=1",
+     "SPEECH OUTPUT: 'This popup is created as a div in the '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Up Arrow",
+    ["KNOWN ISSUE: You should not be able to arrow out of this alert.",
+     "BRAILLE LINE:  'Show (via display style) and put focus inside alert (on link) push button'",
+     "     VISIBLE:  'Show (via display style) and put', cursor=1",
+     "SPEECH OUTPUT: 'Show (via display style) and put focus inside alert (on link)'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Down Arrow",
+    ["BRAILLE LINE:  'This popup is created as a div in the'",
+     "     VISIBLE:  'This popup is created as a div i', cursor=1",
+     "SPEECH OUTPUT: 'This popup is created as a div in the '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Down Arrow",
+    ["BRAILLE LINE:  'HTML content, rather than being'",
+     "     VISIBLE:  'HTML content, rather than being', cursor=1",
+     "SPEECH OUTPUT: 'HTML content, rather than being '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Down Arrow",
+    ["BRAILLE LINE:  'created in the DOM at the time of'",
+     "     VISIBLE:  'created in the DOM at the time o', cursor=1",
+     "SPEECH OUTPUT: 'created in the DOM at the time of '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Down Arrow",
+    ["BRAILLE LINE:  'use. The display style is changed'",
+     "     VISIBLE:  'use. The display style is change', cursor=1",
+     "SPEECH OUTPUT: 'use. The display style is changed '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Down Arrow",
+    ["BRAILLE LINE:  'from \"none\" to \"block\" to hide and'",
+     "     VISIBLE:  'from \"none\" to \"block\" to hide a', cursor=1",
+     "SPEECH OUTPUT: 'from \"none\" to \"block\" to hide and '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Down Arrow",
+    ["BRAILLE LINE:  'show it.'",
+     "     VISIBLE:  'show it.', cursor=1",
+     "SPEECH OUTPUT: 'show it. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Down Arrow",
+    ["BRAILLE LINE:  'close'",
+     "     VISIBLE:  'close', cursor=1",
+     "SPEECH OUTPUT: 'close'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Down Arrow",
+    ["BRAILLE LINE:  'Some text after the alert to help with selection in order to view alert source'",
+     "     VISIBLE:  'Some text after the alert to hel', cursor=1",
+     "SPEECH OUTPUT: 'Some text after the alert to help with selection in order to view alert source'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Return on close link",
+    ["KNOWN ISSUE: We should present something here."
+     ""]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_alert_uiuc.params b/test/keystrokes/firefox/aria_alert_uiuc.params
new file mode 100644
index 0000000..e5c2ea8
--- /dev/null
+++ b/test/keystrokes/firefox/aria_alert_uiuc.params
@@ -0,0 +1 @@
+PARAMS=http://test.cita.illinois.edu/aria/alertdialog/alertdialog1.php
\ No newline at end of file
diff --git a/test/keystrokes/firefox/aria_alert_uiuc.py b/test/keystrokes/firefox/aria_alert_uiuc.py
new file mode 100644
index 0000000..c19cbd6
--- /dev/null
+++ b/test/keystrokes/firefox/aria_alert_uiuc.py
@@ -0,0 +1,60 @@
+#!/usr/bin/python
+
+"""Test of UIUC button presentation using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(TypeAction("12"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Open Alert Box",
+    ["KNOWN ISSUE: We are missing spaces between the words in speech",
+     "BRAILLE LINE:  'dialog'",
+     "     VISIBLE:  'dialog', cursor=1",
+     "BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "BRAILLE LINE:  'Alert Box'",
+     "     VISIBLE:  'Alert Box', cursor=0",
+     "BRAILLE LINE:  'Alert Box'",
+     "     VISIBLE:  'Alert Box', cursor=0",
+     "SPEECH OUTPUT: 'Alert BoxYou must choose a number between 1 and 10!Close'",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down to message",
+    ["BRAILLE LINE:  'You must choose a number'",
+     "     VISIBLE:  'You must choose a number', cursor=1",
+     "SPEECH OUTPUT: 'You must choose a number '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Down arrow to read next line of message",
+    ["BRAILLE LINE:  'between 1 and 10!'",
+     "     VISIBLE:  'between 1 and 10!', cursor=1",
+     "SPEECH OUTPUT: 'between 1 and 10!'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Close Alert",
+    ["KNOWN ISSUE: We shouldn't be brailling the EOC",
+     "BRAILLE LINE:  'Guess a number between 1 and 10 12 $l'",
+     "     VISIBLE:  'ss a number between 1 and 10 12 ', cursor=32",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  '\ufffc $l'",
+     "     VISIBLE:  '\ufffc $l', cursor=1",
+     "BRAILLE LINE:  'Guess a number between 1 and 10 12 $l'",
+     "     VISIBLE:  'ss a number between 1 and 10 12 ', cursor=32",
+     "SPEECH OUTPUT: 'Guess a number between 1 and 10 entry 12 selected'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_button.params b/test/keystrokes/firefox/aria_button.params
new file mode 100644
index 0000000..ddcf389
--- /dev/null
+++ b/test/keystrokes/firefox/aria_button.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/aria-button.html
diff --git a/test/keystrokes/firefox/aria_button.py b/test/keystrokes/firefox/aria_button.py
new file mode 100644
index 0000000..369852d
--- /dev/null
+++ b/test/keystrokes/firefox/aria_button.py
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+
+"""Test of ARIA button presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to Tracking number text entry",
+    ["BRAILLE LINE:  'Tracking number Tracking number  $l'",
+     "     VISIBLE:  'Tracking number  $l', cursor=17",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'Tracking number entry'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Tab to Check Now push button",
+    ["BRAILLE LINE:  'Check Now push button'",
+     "     VISIBLE:  'Check Now push button', cursor=1",
+     "BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "BRAILLE LINE:  'Check Now push button Check to see if your order has been'",
+     "     VISIBLE:  'Check Now push button Check to s', cursor=1",
+     "SPEECH OUTPUT: 'Check Now push button Check to see if your order has been shipped.'",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Basic whereamI",
+    ["BRAILLE LINE:  'Check Now push button Check to see if your order has been'",
+     "     VISIBLE:  'Check Now push button Check to s', cursor=1",
+     "SPEECH OUTPUT: 'Check Now'",
+     "SPEECH OUTPUT: 'push button Check to see if your order has been shipped.'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_button_dojo.params b/test/keystrokes/firefox/aria_button_dojo.params
new file mode 100644
index 0000000..7232ca9
--- /dev/null
+++ b/test/keystrokes/firefox/aria_button_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_Button.html
diff --git a/test/keystrokes/firefox/aria_button_dojo.py b/test/keystrokes/firefox/aria_button_dojo.py
new file mode 100644
index 0000000..30a7ccb
--- /dev/null
+++ b/test/keystrokes/firefox/aria_button_dojo.py
@@ -0,0 +1,366 @@
+#!/usr/bin/python
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to the <button> button",
+    ["BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button Createsave options push button   Savesave options push button Disabled push button 
push button'",
+     "     VISIBLE:  '<button> push button <input type', cursor=1",
+     "BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button Createsave options push button   Savesave options push button Disabled push button 
push button'",
+     "     VISIBLE:  '<button> push button <input type', cursor=1",
+     "SPEECH OUTPUT: '<button> push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic Where Am I on <button>",
+    ["BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button Createsave options push button   Savesave options push button Disabled push button 
push button'",
+     "     VISIBLE:  '<button> push button <input type', cursor=1",
+     "SPEECH OUTPUT: '<button>'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab to <input type='button'>",
+    ["BRAILLE LINE:  '<button> push button  Create push button Create push button Viewpush button Createsave 
options push button   Savesave options push button Disabled push button push button <input type='button'> 
push button'",
+     "     VISIBLE:  '<input type='button'> push butto', cursor=1",
+     "BRAILLE LINE:  '<button> push button  Create push button Create push button Viewpush button Createsave 
options push button   Savesave options push button Disabled push button push button <input type='button'> 
push button'",
+     "     VISIBLE:  '<input type='button'> push butto', cursor=1",
+     "SPEECH OUTPUT: '<input type='button'> push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Basic Where Am I on <input type='button'>",
+    ["BRAILLE LINE:  '<button> push button  Create push button Create push button Viewpush button Createsave 
options push button   Savesave options push button Disabled push button push button <input type='button'> 
push button'",
+     "     VISIBLE:  '<input type='button'> push butto', cursor=1",
+     "SPEECH OUTPUT: '<input type='button'>'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Tab to first Create button",
+    ["BRAILLE LINE:  '<button> push button  Create push button Create push button Viewpush button Createsave 
options push button   Savesave options push button Disabled push button push button <input type='button'> 
push button'",
+     "     VISIBLE:  'Create push button Create push b', cursor=1",
+     "BRAILLE LINE:  '<button> push button  Create push button Create push button Viewpush button Createsave 
options push button   Savesave options push button Disabled push button push button <input type='button'> 
push button'",
+     "     VISIBLE:  'Create push button Create push b', cursor=1",
+     "SPEECH OUTPUT: 'Create push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Basic Where Am I on first Create button",
+    ["BRAILLE LINE:  '<button> push button  Create push button Create push button Viewpush button Createsave 
options push button   Savesave options push button Disabled push button push button <input type='button'> 
push button'",
+     "     VISIBLE:  'Create push button Create push b', cursor=1",
+     "SPEECH OUTPUT: 'Create'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Tab to View push button",
+    ["BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button push button Createsave options push button   Savesave options push button Disabled push button push 
button View'",
+     "     VISIBLE:  '<button> push button <input type', cursor=0",
+     "BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button push button Createsave options push button   Savesave options push button Disabled push button push 
button View'",
+     "     VISIBLE:  '<button> push button <input type', cursor=0",
+     "SPEECH OUTPUT: 'View push button view title'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Tab to second Create button",
+    ["BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button save options push button   Savesave options push button Disabled push button push 
button Create'",
+     "     VISIBLE:  '<button> push button <input type', cursor=0",
+     "BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button save options push button   Savesave options push button Disabled push button push 
button Create'",
+     "     VISIBLE:  '<button> push button <input type', cursor=0",
+     "SPEECH OUTPUT: 'Create push button creative title'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Tab to drop down menu on Create -- whose tooltip and accessible name is 'save options'",
+    ["BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button    Savesave options push button Disabled push button push button Createsave options 
push button'",
+     "     VISIBLE:  'save options push button', cursor=1",
+     "BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button    Savesave options push button Disabled push button push button Createsave options 
push button'",
+     "     VISIBLE:  'save options push button', cursor=1",
+     "SPEECH OUTPUT: 'save options push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "10. Open drop down menu on Create",
+    ["BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button    Savesave options push button Disabled push button push button Createsave options 
push button'",
+     "     VISIBLE:  'save options push button', cursor=1",
+     "BRAILLE LINE:  'Create blank'",
+     "     VISIBLE:  'Create blank', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'Create blank'",
+     "     VISIBLE:  'Create blank', cursor=1",
+     "SPEECH OUTPUT: 'createMenu panel'",
+     "SPEECH OUTPUT: 'Create blank'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Down to Create from template",
+    ["BRAILLE LINE:  'Create from template'",
+     "     VISIBLE:  'Create from template', cursor=1",
+     "BRAILLE LINE:  'Create from template'",
+     "     VISIBLE:  'Create from template', cursor=1",
+     "SPEECH OUTPUT: 'Create from template'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Escape"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Close Create drop down menu",
+    ["BRAILLE LINE:  'save options collapsed push button'",
+     "     VISIBLE:  'save options collapsed push butt', cursor=1",
+     "BRAILLE LINE:  'save options collapsed push button'",
+     "     VISIBLE:  'save options collapsed push butt', cursor=1",
+     "SPEECH OUTPUT: 'save options collapsed push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Go to Edit!",
+    ["BRAILLE LINE:  'Edit! push button'",
+     "     VISIBLE:  'Edit! push button', cursor=1",
+     "BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button Create   Savesave options push button Disabled push button push button Edit!Edit! push 
button'",
+     "     VISIBLE:  'Edit! push button', cursor=1",
+     "SPEECH OUTPUT: 'Edit! push button edit title'",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("space"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Open the Edit! menu",
+    ["BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button Create   Savesave options push button Disabled push button push button Edit!Edit! push 
button'",
+     "     VISIBLE:  'Edit! push button', cursor=1",
+     "BRAILLE LINE:  'Cut'",
+     "     VISIBLE:  'Cut', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'Cut'",
+     "     VISIBLE:  'Cut', cursor=1",
+     "SPEECH OUTPUT: 'Edit! edit title panel'",
+     "SPEECH OUTPUT: 'Edit! Edit! edit title menu'",
+     "SPEECH OUTPUT: 'Cut'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Go to Copy",
+    ["BRAILLE LINE:  'Copy'",
+     "     VISIBLE:  'Copy', cursor=1",
+     "BRAILLE LINE:  'Copy'",
+     "     VISIBLE:  'Copy', cursor=1",
+     "SPEECH OUTPUT: 'Copy'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Go to Paste",
+    ["BRAILLE LINE:  'Paste'",
+     "     VISIBLE:  'Paste', cursor=1",
+     "BRAILLE LINE:  'Paste'",
+     "     VISIBLE:  'Paste', cursor=1",
+     "SPEECH OUTPUT: 'Paste'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Go to Submenu",
+    ["BRAILLE LINE:  'Submenu menu'",
+     "     VISIBLE:  'Submenu menu', cursor=1",
+     "BRAILLE LINE:  'Submenu menu'",
+     "     VISIBLE:  'Submenu menu', cursor=1",
+     "SPEECH OUTPUT: 'Submenu menu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("space"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Open Submenu",
+    ["BRAILLE LINE:  'Submenu Item One'",
+     "     VISIBLE:  'Submenu Item One', cursor=1",
+     "BRAILLE LINE:  'Submenu Item One'",
+     "     VISIBLE:  'Submenu Item One', cursor=1",
+     "SPEECH OUTPUT: 'Submenu panel'",
+     "SPEECH OUTPUT: 'Submenu menu'",
+     "SPEECH OUTPUT: 'Submenu Item One'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Down to Submenu Item Two",
+    ["BRAILLE LINE:  'Submenu Item Two'",
+     "     VISIBLE:  'Submenu Item Two', cursor=1",
+     "BRAILLE LINE:  'Submenu Item Two'",
+     "     VISIBLE:  'Submenu Item Two', cursor=1",
+     "SPEECH OUTPUT: 'Submenu Item Two'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Down to Deeper Submenu",
+    ["BRAILLE LINE:  'Deeper Submenu menu'",
+     "     VISIBLE:  'Deeper Submenu menu', cursor=1",
+     "BRAILLE LINE:  'Deeper Submenu menu'",
+     "     VISIBLE:  'Deeper Submenu menu', cursor=1",
+     "SPEECH OUTPUT: 'Deeper Submenu menu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Escape"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Close the Submenu",
+    ["KNOWN ISSUE: Too much speech context",
+     "BRAILLE LINE:  'Submenu menu'",
+     "     VISIBLE:  'Submenu menu', cursor=1",
+     "BRAILLE LINE:  'Submenu menu'",
+     "     VISIBLE:  'Submenu menu', cursor=1",
+     "SPEECH OUTPUT: 'Edit! edit title panel'",
+     "SPEECH OUTPUT: 'Edit! Edit! edit title menu'",
+     "SPEECH OUTPUT: 'Submenu menu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Escape"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Close the Edit! menu",
+    ["BRAILLE LINE:  'Edit! collapsed push button'",
+     "     VISIBLE:  'Edit! collapsed push button', cursor=1",
+     "BRAILLE LINE:  'Edit! collapsed push button'",
+     "     VISIBLE:  'Edit! collapsed push button', cursor=1",
+     "SPEECH OUTPUT: 'Edit! collapsed push button edit title'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Tab to the Color button",
+    ["BRAILLE LINE:  'Color push button'",
+     "     VISIBLE:  'Color push button', cursor=1",
+     "BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button Create   Savesave options push button Disabled push button push button ColorColor push 
button'",
+     "     VISIBLE:  'Color push button', cursor=1",
+     "SPEECH OUTPUT: 'Color push button'",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("space"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Open the Color menu",
+    ["KNOWN ISSUE: This is messed up on several different levels",
+     "BRAILLE LINE:  '<button> push button <input type='button'> push button Create push button Create push 
button Viewpush button Create   Savesave options push button Disabled push button push button ColorColor push 
button'",
+     "     VISIBLE:  'Color push button', cursor=1",
+     "BRAILLE LINE:  'white lime green blue'",
+     "     VISIBLE:  'white lime green blue', cursor=0",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'white table cell'",
+     "     VISIBLE:  'white table cell', cursor=1",
+     "BRAILLE LINE:  '\ufffc $l'",
+     "     VISIBLE:  '\ufffc $l', cursor=2",
+     "SPEECH OUTPUT: 'Color panel'",
+     "SPEECH OUTPUT: 'white'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "25. Go to lime",
+    ["KNOWN ISSUE: We should not be presenting this embedded object char",
+     "BRAILLE LINE:  'lime table cell'",
+     "     VISIBLE:  'lime table cell', cursor=1",
+     "BRAILLE LINE:  'lime table cell'",
+     "     VISIBLE:  'lime table cell', cursor=1",
+     "BRAILLE LINE:  '\ufffc $l'",
+     "     VISIBLE:  '\ufffc $l', cursor=2",
+     "SPEECH OUTPUT: 'lime'",
+     "SPEECH OUTPUT: '\ufffc'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Escape"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Close the Color menu",
+    ["BRAILLE LINE:  'Color collapsed push button'",
+     "     VISIBLE:  'Color collapsed push button', cursor=1",
+     "BRAILLE LINE:  'Color collapsed push button'",
+     "     VISIBLE:  'Color collapsed push button', cursor=1",
+     "SPEECH OUTPUT: 'Color collapsed push button'"]))
+
+for i in range(18):
+    sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "27. Tab to the toggle me off button",
+    ["BRAILLE LINE:  'Toggle me off&=y Toggle me off toggle button'",
+     "     VISIBLE:  '&=y Toggle me off toggle button', cursor=1",
+     "BRAILLE LINE:  'Toggle me off&=y Toggle me off toggle button'",
+     "     VISIBLE:  '&=y Toggle me off toggle button', cursor=1",
+     "SPEECH OUTPUT: 'Toggle me off toggle button pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("space"))
+sequence.append(utils.AssertPresentationAction(
+    "28. Toggle the state of the toggle me off button",
+    ["BRAILLE LINE:  'Toggle me off& y toggle me on Toggle me off toggle button'",
+     "     VISIBLE:  '& y toggle me on Toggle me off t', cursor=1",
+     "BRAILLE LINE:  'toggle me on& y toggle me on Toggle me off toggle button'",
+     "     VISIBLE:  '& y toggle me on Toggle me off t', cursor=1",
+     "BRAILLE LINE:  'toggle me on& y toggle me on Toggle me off toggle button'",
+     "     VISIBLE:  '& y toggle me on Toggle me off t', cursor=1",
+     "SPEECH OUTPUT: 'not pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("space"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Toggle the state of the toggle me off button",
+    ["BRAILLE LINE:  'toggle me on&=y toggle me off Toggle me off toggle button'",
+     "     VISIBLE:  '&=y toggle me off Toggle me off ', cursor=1",
+     "BRAILLE LINE:  'toggle me off&=y toggle me off Toggle me off toggle button'",
+     "     VISIBLE:  '&=y toggle me off Toggle me off ', cursor=1",
+     "BRAILLE LINE:  'toggle me off&=y toggle me off Toggle me off toggle button'",
+     "     VISIBLE:  '&=y toggle me off Toggle me off ', cursor=1",
+     "SPEECH OUTPUT: 'pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Tab to the toggle me button",
+    ["BRAILLE LINE:  'toggle me off&=y toggle me off Toggle me off toggle button push button push button 
Toggle meToggle me push button'",
+     "     VISIBLE:  'Toggle me push button', cursor=1",
+     "BRAILLE LINE:  'toggle me off&=y toggle me off Toggle me off toggle button push button push button 
Toggle meToggle me push button'",
+     "     VISIBLE:  'Toggle me push button', cursor=1",
+     "SPEECH OUTPUT: 'Toggle me push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("space"))
+sequence.append(utils.AssertPresentationAction(
+    "31. Toggle the state of the toggle me button",
+    ["KNOWN ISSUE: We seem to be missing the expected events and state changes. Dojo bug?",
+     "BRAILLE LINE:  'toggle me off&=y toggle me off Toggle me off toggle button push button push button 
Toggle meToggle me push button'",
+     "     VISIBLE:  'Toggle me push button', cursor=1"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("space"))
+sequence.append(utils.AssertPresentationAction(
+    "32. Toggle the state of the toggle me button",
+    ["KNOWN ISSUE: We seem to be missing the expected events and state changes. Dojo bug?",
+     "BRAILLE LINE:  'toggle me off&=y toggle me off Toggle me off toggle button push button push button 
Toggle meToggle me push button'",
+     "     VISIBLE:  'Toggle me push button', cursor=1"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_button_uiuc.params b/test/keystrokes/firefox/aria_button_uiuc.params
new file mode 100644
index 0000000..fc93cf4
--- /dev/null
+++ b/test/keystrokes/firefox/aria_button_uiuc.params
@@ -0,0 +1 @@
+PARAMS=http://test.cita.illinois.edu/aria/button/button1.php
diff --git a/test/keystrokes/firefox/aria_button_uiuc.py b/test/keystrokes/firefox/aria_button_uiuc.py
new file mode 100644
index 0000000..92b3a8a
--- /dev/null
+++ b/test/keystrokes/firefox/aria_button_uiuc.py
@@ -0,0 +1,95 @@
+#!/usr/bin/python
+
+"""Test of UIUC button presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to first button",
+    ["BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=1",
+     "BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=1",
+     "SPEECH OUTPUT: 'Font Larger + toggle button not pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic whereamI",
+    ["BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=1",
+     "SPEECH OUTPUT: 'Font Larger +'",
+     "SPEECH OUTPUT: 'toggle button not pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab to second button",
+    ["BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=3",
+     "BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=3",
+     "SPEECH OUTPUT: 'Font Smaller - toggle button not pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "4. Push second button",
+    ["KNOWN ISSUE: We are presenting nothing here for some reason. Missing event?",
+     ""]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Tab to third button",
+    ["BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=5",
+     "BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=5",
+     "SPEECH OUTPUT: 'Italic i toggle button pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "6. Push third button",
+    ["BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=5",
+     "SPEECH OUTPUT: 'not pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Tab to fourth button",
+    ["BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=7",
+     "BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=7",
+     "SPEECH OUTPUT: 'Bold B toggle button not pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "8. Push fourth button",
+    ["BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=7",
+     "SPEECH OUTPUT: 'pressed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "9. Push fourth button again",
+    ["BRAILLE LINE:  '+ - i B'",
+     "     VISIBLE:  '+ - i B', cursor=7",
+     "SPEECH OUTPUT: 'not pressed'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_checkbox.params b/test/keystrokes/firefox/aria_checkbox.params
new file mode 100644
index 0000000..cca3b7f
--- /dev/null
+++ b/test/keystrokes/firefox/aria_checkbox.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/aria-checkbox.html
diff --git a/test/keystrokes/firefox/aria_checkbox.py b/test/keystrokes/firefox/aria_checkbox.py
new file mode 100644
index 0000000..352bc1f
--- /dev/null
+++ b/test/keystrokes/firefox/aria_checkbox.py
@@ -0,0 +1,117 @@
+#!/usr/bin/python
+
+"""Test of ARIA checkbox presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to first checkbox",
+    ["KNOWN ISSUE: The indicators are all missing",
+     "BRAILLE LINE:  ' Include decorative fruit basket'",
+     "     VISIBLE:  ' Include decorative fruit basket', cursor=1",
+     "BRAILLE LINE:  ' Include decorative fruit basket'",
+     "     VISIBLE:  ' Include decorative fruit basket', cursor=1",
+     "SPEECH OUTPUT: 'Include decorative fruit basket check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "2. Change state of first checkbox",
+    ["BRAILLE LINE:  ' Include decorative fruit basket'",
+     "     VISIBLE:  ' Include decorative fruit basket', cursor=1",
+     "SPEECH OUTPUT: 'not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab to second checkbox",
+    ["BRAILLE LINE:  ' Invalid checkbox'",
+     "     VISIBLE:  ' Invalid checkbox', cursor=1",
+     "BRAILLE LINE:  ' Invalid checkbox'",
+     "     VISIBLE:  ' Invalid checkbox', cursor=1",
+     "SPEECH OUTPUT: 'Invalid checkbox check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "4. Change state of second checkbox",
+    ["BRAILLE LINE:  ' Invalid checkbox'",
+     "     VISIBLE:  ' Invalid checkbox', cursor=1",
+     "SPEECH OUTPUT: 'not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Tab to third checkbox",
+    ["BRAILLE LINE:  ' Required checkbox'",
+     "     VISIBLE:  ' Required checkbox', cursor=1",
+     "BRAILLE LINE:  ' Required checkbox'",
+     "     VISIBLE:  ' Required checkbox', cursor=1",
+     "SPEECH OUTPUT: 'Required checkbox check box checked required'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "6. Change state of third checkbox",
+    ["BRAILLE LINE:  ' Required checkbox'",
+     "     VISIBLE:  ' Required checkbox', cursor=1",
+     "SPEECH OUTPUT: 'not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "7. Change state of third checkbox again",
+    ["BRAILLE LINE:  ' Required checkbox'",
+     "     VISIBLE:  ' Required checkbox', cursor=1",
+     "SPEECH OUTPUT: 'checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Basic whereAmI",
+    ["BRAILLE LINE:  ' Required checkbox'",
+     "     VISIBLE:  ' Required checkbox', cursor=1",
+     "SPEECH OUTPUT: 'Required checkbox'",
+     "SPEECH OUTPUT: 'check box checked required'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Tab to checkbox tristate",
+    ["BRAILLE LINE:  ' Tri-state checkbox'",
+     "     VISIBLE:  ' Tri-state checkbox', cursor=1",
+     "BRAILLE LINE:  ' Tri-state checkbox'",
+     "     VISIBLE:  ' Tri-state checkbox', cursor=1",
+     "SPEECH OUTPUT: 'Tri-state checkbox check box checked required'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "10. Change state of tristate checkbox",
+    ["BRAILLE LINE:  ' Tri-state checkbox'",
+     "     VISIBLE:  ' Tri-state checkbox', cursor=1",
+     "SPEECH OUTPUT: 'not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "11. Change state of tristate checkbox",
+    ["BRAILLE LINE:  ' Tri-state checkbox'",
+     "     VISIBLE:  ' Tri-state checkbox', cursor=1",
+     "SPEECH OUTPUT: 'partially checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "12. Change state of tristate checkbox",
+    ["BRAILLE LINE:  ' Tri-state checkbox'",
+     "     VISIBLE:  ' Tri-state checkbox', cursor=1",
+     "SPEECH OUTPUT: 'checked'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_checkbox_dojo.params 
b/test/keystrokes/firefox/aria_checkbox_dojo.params
new file mode 100644
index 0000000..60d937c
--- /dev/null
+++ b/test/keystrokes/firefox/aria_checkbox_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_CheckBox.html
diff --git a/test/keystrokes/firefox/aria_checkbox_dojo.py b/test/keystrokes/firefox/aria_checkbox_dojo.py
new file mode 100644
index 0000000..6d81f5b
--- /dev/null
+++ b/test/keystrokes/firefox/aria_checkbox_dojo.py
@@ -0,0 +1,109 @@
+#!/usr/bin/python
+
+"""Test of Dojo checkbox presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to the cb0 checkbox",
+    ["BRAILLE LINE:  '<x> cb0: Vanilla (non-dojo) checkbox (for comparison purposes) cb0: Vanilla (non-dojo) 
checkbox (for comparison purposes) check box cb0: Vanilla (non-dojo) checkbox (for comparison purposes)'",
+     "     VISIBLE:  '<x> cb0: Vanilla (non-dojo) chec', cursor=1",
+     "BRAILLE LINE:  '<x> cb0: Vanilla (non-dojo) checkbox (for comparison purposes) cb0: Vanilla (non-dojo) 
checkbox (for comparison purposes) check box cb0: Vanilla (non-dojo) checkbox (for comparison purposes)'",
+     "     VISIBLE:  '<x> cb0: Vanilla (non-dojo) chec', cursor=1",
+     "SPEECH OUTPUT: 'cb0: Vanilla (non-dojo) checkbox (for comparison purposes) check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "2. Change state on cb0 checkbox",
+    ["BRAILLE LINE:  '< > cb0: Vanilla (non-dojo) checkbox (for comparison purposes) cb0: Vanilla (non-dojo) 
checkbox (for comparison purposes) check box cb0: Vanilla (non-dojo) checkbox (for comparison purposes)'",
+     "     VISIBLE:  '< > cb0: Vanilla (non-dojo) chec', cursor=1",
+     "SPEECH OUTPUT: 'not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab to the cb1 checkbox",
+    ["BRAILLE LINE:  '< > cb1: normal checkbox, with value=foo, clicking generates console log messages cb1: 
normal checkbox, with value=foo, clicking generates console log messages check box cb1: normal checkbox, with 
value=foo, clicking generates console log messages get('value') push button'",
+     "     VISIBLE:  '< > cb1: normal checkbox, with v', cursor=1",
+     "BRAILLE LINE:  '< > cb1: normal checkbox, with value=foo, clicking generates console log messages cb1: 
normal checkbox, with value=foo, clicking generates console log messages check box cb1: normal checkbox, with 
value=foo, clicking generates console log messages get('value') push button'",
+     "     VISIBLE:  '< > cb1: normal checkbox, with v', cursor=1",
+     "SPEECH OUTPUT: 'cb1: normal checkbox, with value=foo, clicking generates console log messages check 
box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "4. Change state on cb1 checkbox",
+    ["BRAILLE LINE:  '<x> cb1: normal checkbox, with value=foo, clicking generates console log messages cb1: 
normal checkbox, with value=foo, clicking generates console log messages check box cb1: normal checkbox, with 
value=foo, clicking generates console log messages get('value') push button'",
+     "     VISIBLE:  '<x> cb1: normal checkbox, with v', cursor=1",
+     "SPEECH OUTPUT: 'checked'"]))
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Tab to the cb2 checkbox",
+    ["BRAILLE LINE:  '<x> cb2: normal checkbox, with default value, initially turned on. cb2: normal 
checkbox, with default value, initially turned on. check box cb2: normal checkbox, with default value, 
initially turned on. \"onChange\" handler updates: [] get('value') push button'",
+     "     VISIBLE:  '<x> cb2: normal checkbox, with d', cursor=1",
+     "BRAILLE LINE:  '<x> cb2: normal checkbox, with default value, initially turned on. cb2: normal 
checkbox, with default value, initially turned on. check box cb2: normal checkbox, with default value, 
initially turned on. \"onChange\" handler updates: [] get('value') push button'",
+     "     VISIBLE:  '<x> cb2: normal checkbox, with d', cursor=1",
+     "SPEECH OUTPUT: 'cb2: normal checkbox, with default value, initially turned on. check box checked'"]))
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Tab to the cb4 checkbox",
+    ["BRAILLE LINE:  '<x> cb4: readOnly checkbox, turned on cb4: readOnly checkbox, turned on check box cb4: 
readOnly checkbox, turned on'",
+     "     VISIBLE:  '<x> cb4: readOnly checkbox, turn', cursor=1",
+     "BRAILLE LINE:  '<x> cb4: readOnly checkbox, turned on cb4: readOnly checkbox, turned on check box cb4: 
readOnly checkbox, turned on'",
+     "     VISIBLE:  '<x> cb4: readOnly checkbox, turn', cursor=1",
+     "SPEECH OUTPUT: 'cb4: readOnly checkbox, turned on check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Tab to the cb5 checkbox",
+    ["BRAILLE LINE:  '< > cb5: normal checkbox, with specified value=\"\", clicking generates console log 
messages cb5: normal checkbox, with specified value=\"\", clicking generates console log messages check box 
cb5: normal checkbox, with specified value=\"\", clicking generates console log messages get('value') push 
button'",
+     "     VISIBLE:  '< > cb5: normal checkbox, with s', cursor=1",
+     "BRAILLE LINE:  '< > cb5: normal checkbox, with specified value=\"\", clicking generates console log 
messages cb5: normal checkbox, with specified value=\"\", clicking generates console log messages check box 
cb5: normal checkbox, with specified value=\"\", clicking generates console log messages get('value') push 
button'",
+     "     VISIBLE:  '< > cb5: normal checkbox, with s', cursor=1",
+     "SPEECH OUTPUT: 'cb5: normal checkbox, with specified value=\"\", clicking generates console log 
messages check box not checked'"]))
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Tab to the cb6 checkbox",
+    ["BRAILLE LINE:  '<x> cb6: instantiated from script cb6: instantiated from script check box cb6: 
instantiated from script'",
+     "     VISIBLE:  '<x> cb6: instantiated from scrip', cursor=1",
+     "BRAILLE LINE:  '<x> cb6: instantiated from script cb6: instantiated from script check box cb6: 
instantiated from script'",
+     "     VISIBLE:  '<x> cb6: instantiated from scrip', cursor=1",
+     "SPEECH OUTPUT: 'cb6: instantiated from script check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Tab to the cb7 checkbox",
+    ["BRAILLE LINE:  '< > cb7: normal checkbox. cb7: normal checkbox. check box cb7: normal checkbox. 
disable push button enable push button set value to \"fish\" push button Reset value+checked push button 
\"onChange\" handler updates: []'",
+     "     VISIBLE:  '< > cb7: normal checkbox. cb7: n', cursor=1",
+     "BRAILLE LINE:  '< > cb7: normal checkbox. cb7: normal checkbox. check box cb7: normal checkbox. 
disable push button enable push button set value to \"fish\" push button Reset value+checked push button 
\"onChange\" handler updates: []'",
+     "     VISIBLE:  '< > cb7: normal checkbox. cb7: n', cursor=1",
+     "SPEECH OUTPUT: 'cb7: normal checkbox. check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Basic Where Am I",
+    ["BRAILLE LINE:  '< > cb7: normal checkbox. cb7: normal checkbox. check box cb7: normal checkbox. 
disable push button enable push button set value to \"fish\" push button Reset value+checked push button 
\"onChange\" handler updates: []'",
+     "     VISIBLE:  '< > cb7: normal checkbox. cb7: n', cursor=1",
+     "SPEECH OUTPUT: 'cb7: normal checkbox.'",
+     "SPEECH OUTPUT: 'check box not checked'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_combobox_dojo.params 
b/test/keystrokes/firefox/aria_combobox_dojo.params
new file mode 100644
index 0000000..3e8b647
--- /dev/null
+++ b/test/keystrokes/firefox/aria_combobox_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_ComboBox.html
diff --git a/test/keystrokes/firefox/aria_combobox_dojo.py b/test/keystrokes/firefox/aria_combobox_dojo.py
new file mode 100644
index 0000000..abec97f
--- /dev/null
+++ b/test/keystrokes/firefox/aria_combobox_dojo.py
@@ -0,0 +1,138 @@
+#!/usr/bin/python
+
+"""Test of Dojo combo box presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to the first combo box",
+    ["KNOWN ISSUE: We are presenting an EOC.",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font):  \u25bc push button US State test 1 (200% Courier 
font): California $l'",
+     "     VISIBLE:  '(200% Courier font): California ', cursor=32",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): California $l'",
+     "     VISIBLE:  '(200% Courier font): California ', cursor=32",
+     "BRAILLE LINE:  '\ufffc'",
+     "     VISIBLE:  '\ufffc', cursor=1",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'US State test 1 (200% Courier font): entry California selected'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction("C"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Replace existing text with a 'C'",
+    ["KNOWN ISSUE: It would be good to present the appearance of the popup so one knows there's something to 
Down arrow into.",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): C $l'",
+     "     VISIBLE:  'e test 1 (200% Courier font): C ', cursor=32",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): C $l'",
+     "     VISIBLE:  'e test 1 (200% Courier font): C ', cursor=32"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Down Arrow",
+    ["KNOWN ISSUE: Too much braille updating",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): California $l'",
+     "     VISIBLE:  'e test 1 (200% Courier font): Ca', cursor=30",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): California $l'",
+     "     VISIBLE:  'e test 1 (200% Courier font): Ca', cursor=30",
+     "BRAILLE LINE:  'California (CA)'",
+     "     VISIBLE:  'California (CA)', cursor=1",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): California $l'",
+     "     VISIBLE:  'ate test 1 (200% Courier font): ', cursor=32",
+     "SPEECH OUTPUT: 'California'",
+     "SPEECH OUTPUT: 'California panel'",
+     "SPEECH OUTPUT: 'California List with 3 items'",
+     "SPEECH OUTPUT: 'California (CA)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Down Arrow",
+    ["BRAILLE LINE:  'Colorado (CO)'",
+     "     VISIBLE:  'Colorado (CO)', cursor=1",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): Colorado $l'",
+     "     VISIBLE:  'ate test 1 (200% Courier font): ', cursor=32",
+     "SPEECH OUTPUT: 'Colorado (CO)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Down Arrow",
+    ["BRAILLE LINE:  'Connecticut (CT)'",
+     "     VISIBLE:  'Connecticut (CT)', cursor=1",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): Connecticut $l'",
+     "     VISIBLE:  'ate test 1 (200% Courier font): ', cursor=32",
+     "SPEECH OUTPUT: 'Connecticut (CT)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Down Arrow",
+    ["BRAILLE LINE:  'California (CA)'",
+     "     VISIBLE:  'California (CA)', cursor=1",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): California $l'",
+     "     VISIBLE:  'ate test 1 (200% Courier font): ', cursor=32",
+     "SPEECH OUTPUT: 'California (CA)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Up Arrow",
+    ["BRAILLE LINE:  'Connecticut (CT)'",
+     "     VISIBLE:  'Connecticut (CT)', cursor=1",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): Connecticut $l'",
+     "     VISIBLE:  'ate test 1 (200% Courier font): ', cursor=32",
+     "SPEECH OUTPUT: 'Connecticut (CT)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Up Arrow",
+    ["BRAILLE LINE:  'Colorado (CO)'",
+     "     VISIBLE:  'Colorado (CO)', cursor=1",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): Colorado $l'",
+     "     VISIBLE:  'ate test 1 (200% Courier font): ', cursor=32",
+     "SPEECH OUTPUT: 'Colorado (CO)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Up Arrow",
+    ["BRAILLE LINE:  'California (CA)'",
+     "     VISIBLE:  'California (CA)', cursor=1",
+     "BRAILLE LINE:  'US State test 1 (200% Courier font): California $l'",
+     "     VISIBLE:  'ate test 1 (200% Courier font): ', cursor=32",
+     "SPEECH OUTPUT: 'California (CA)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Basic Where Am I - Combo box expanded",
+    ["BRAILLE LINE:  'California (CA)'",
+     "     VISIBLE:  'California (CA)', cursor=1",
+     "SPEECH OUTPUT: 'list item'",
+     "SPEECH OUTPUT: 'California (CA)'",
+     "SPEECH OUTPUT: '1 of 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Escape"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Escape",
+    ["BRAILLE LINE:  'US State test 1 (200% Courier font): California $l'",
+     "     VISIBLE:  '(200% Courier font): California ', cursor=32",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'US State test 1 (200% Courier font): entry California selected'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_dialog_dojo.params b/test/keystrokes/firefox/aria_dialog_dojo.params
new file mode 100644
index 0000000..0d432c8
--- /dev/null
+++ b/test/keystrokes/firefox/aria_dialog_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/test_Dialog.html
diff --git a/test/keystrokes/firefox/aria_dialog_dojo.py b/test/keystrokes/firefox/aria_dialog_dojo.py
new file mode 100644
index 0000000..5d9e999
--- /dev/null
+++ b/test/keystrokes/firefox/aria_dialog_dojo.py
@@ -0,0 +1,44 @@
+#!/usr/bin/python
+
+"""Test of Dojo dialog presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(PauseAction(3000))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Launch dialog",
+    ["BRAILLE LINE:  'TabContainer Dialog h0  Cancel push button'",
+     "     VISIBLE:  'TabContainer Dialog h0  Cancel p', cursor=0",
+     "BRAILLE LINE:  'First tab'",
+     "     VISIBLE:  'First tab', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'First tab page tab'",
+     "     VISIBLE:  'First tab page tab', cursor=1",
+     "SPEECH OUTPUT: 'TabContainer Dialog First tab Second tab This is the first tab. Lorem ipsum dolor sit 
amet, consectetuer adipiscing elit. Aenean semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. 
Proin porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi. Maecenas luctus venenatis nulla. 
In sit amet dui non mi semper iaculis. Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae 
risus. '",
+     "SPEECH OUTPUT: 'First tab page tab'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic whereAmI",
+    ["BRAILLE LINE:  'First tab page tab'",
+     "     VISIBLE:  'First tab page tab', cursor=1",
+     "SPEECH OUTPUT: 'page tab list'",
+     "SPEECH OUTPUT: 'First tab'",
+     "SPEECH OUTPUT: 'page tab 1 of 2'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_editor_navigation_dojo.params 
b/test/keystrokes/firefox/aria_editor_navigation_dojo.params
new file mode 100644
index 0000000..028cc6a
--- /dev/null
+++ b/test/keystrokes/firefox/aria_editor_navigation_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/editor/test_Editor.html
diff --git a/test/keystrokes/firefox/aria_editor_navigation_dojo.py 
b/test/keystrokes/firefox/aria_editor_navigation_dojo.py
new file mode 100644
index 0000000..156b93b
--- /dev/null
+++ b/test/keystrokes/firefox/aria_editor_navigation_dojo.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+
+"""Test navigation out of the Dojo editor."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Up Arrow in Focus Mode",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("a"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Toggle Browse Mode",
+    ["BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Up Arrow in Browse Mode",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "BRAILLE LINE:  'editor0 tool bar'",
+     "     VISIBLE:  'editor0 tool bar', cursor=1",
+     "BRAILLE LINE:  'editor0 tool bar'",
+     "     VISIBLE:  'editor0 tool bar', cursor=1",
+     "SPEECH OUTPUT: 'editor0'",
+     "SPEECH OUTPUT: 'tool bar'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Up Arrow in Browse Mode",
+    ["BRAILLE LINE:  'No plugins, initially empty h2'",
+     "     VISIBLE:  'No plugins, initially empty h2', cursor=1",
+     "SPEECH OUTPUT: 'No plugins, initially empty'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_grid_uiuc.params b/test/keystrokes/firefox/aria_grid_uiuc.params
new file mode 100644
index 0000000..d16670b
--- /dev/null
+++ b/test/keystrokes/firefox/aria_grid_uiuc.params
@@ -0,0 +1 @@
+PARAMS=http://test.cita.illinois.edu/aria/grid/grid2.php
diff --git a/test/keystrokes/firefox/aria_grid_uiuc.py b/test/keystrokes/firefox/aria_grid_uiuc.py
new file mode 100644
index 0000000..8b9d93d
--- /dev/null
+++ b/test/keystrokes/firefox/aria_grid_uiuc.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+
+"""Test of UIUC grid presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to grid",
+    ["BRAILLE LINE:  'SelSort Sel column Msg'",
+     "     VISIBLE:  'SelSort Sel column Msg', cursor=0",
+     "BRAILLE LINE:  'SelSort Sel column Msg'",
+     "     VISIBLE:  'SelSort Sel column Msg', cursor=0",
+     "BRAILLE LINE:  'SelSort Sel column Msg'",
+     "     VISIBLE:  'SelSort Sel column Msg', cursor=0",
+     "SPEECH OUTPUT: 'Selected Sort Sel column push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. basic whereAmI",
+    ["BRAILLE LINE:  'Sel'",
+     "     VISIBLE:  'Sel', cursor=0",
+     "SPEECH OUTPUT: 'Selected Sort Sel column'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Move down into first data row",
+    ["BRAILLE LINE:  'Sel'",
+     "     VISIBLE:  'Sel', cursor=4",
+     "SPEECH OUTPUT: 'Sel'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'clickable'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Move right in first data row",
+    ["KNOWN ISSUE: This doesn't seem right.",
+     "BRAILLE LINE:  'Sel'",
+     "     VISIBLE:  'Sel', cursor=4",
+     "SPEECH OUTPUT: 'image clickable'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Move right in first data row",
+    ["KNOWN ISSUE: It appears we are not treating this as an ARIA widget",
+     "BRAILLE LINE:  'Sort Sel column'",
+     "     VISIBLE:  'Sort Sel column', cursor=1",
+     "SPEECH OUTPUT: 'S'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Move right in first data row",
+    ["KNOWN ISSUE: It appears we are not treating this as an ARIA widget",
+     "BRAILLE LINE:  'Sort Sel column'",
+     "     VISIBLE:  'Sort Sel column', cursor=2",
+     "SPEECH OUTPUT: 'o'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Move down to third row",
+    ["BRAILLE LINE:  'Msg'",
+     "     VISIBLE:  'Msg', cursor=1",
+     "SPEECH OUTPUT: 'Msg'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'clickable'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_list.params b/test/keystrokes/firefox/aria_list.params
new file mode 100644
index 0000000..ec48346
--- /dev/null
+++ b/test/keystrokes/firefox/aria_list.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/aria-role-list.html
diff --git a/test/keystrokes/firefox/aria_list.py b/test/keystrokes/firefox/aria_list.py
new file mode 100644
index 0000000..1a77bf2
--- /dev/null
+++ b/test/keystrokes/firefox/aria_list.py
@@ -0,0 +1,51 @@
+#!/usr/bin/python
+
+"""Test of presentation of ARIA role list."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Down Arrow",
+    ["KNOWN ISSUE: We're moving to the end of this line and getting stuck",
+     "BRAILLE LINE:  'dog'",
+     "     VISIBLE:  'dog', cursor=1",
+     "SPEECH OUTPUT: 'dog'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down Arrow",
+    ["KNOWN ISSUE: We're moving to the end of this line and getting stuck",
+     "BRAILLE LINE:  'dog'",
+     "     VISIBLE:  'dog', cursor=1",
+     "SPEECH OUTPUT: 'dog'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Basic whereAmI",
+    ["KNOWN ISSUE: We're moving to the end of this line and getting stuck",
+     "BRAILLE LINE:  'dog'",
+     "     VISIBLE:  'dog', cursor=1",
+     "SPEECH OUTPUT: 'list item'",
+     "SPEECH OUTPUT: 'dog'",
+     "SPEECH OUTPUT: '1 of 4'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Up Arrow",
+    ["KNOWN ISSUE: We're moving to the end of this line and getting stuck",
+     "BRAILLE LINE:  'dog'",
+     "     VISIBLE:  'dog', cursor=1",
+     "SPEECH OUTPUT: 'dog'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_menu.params b/test/keystrokes/firefox/aria_menu.params
new file mode 100644
index 0000000..43b7878
--- /dev/null
+++ b/test/keystrokes/firefox/aria_menu.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/aria-spreadsheet.html
diff --git a/test/keystrokes/firefox/aria_menu.py b/test/keystrokes/firefox/aria_menu.py
new file mode 100644
index 0000000..6d545c2
--- /dev/null
+++ b/test/keystrokes/firefox/aria_menu.py
@@ -0,0 +1,162 @@
+#!/usr/bin/python
+
+"""Test of ARIA menu presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control><Alt>m"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Move to the menu",
+    ["BRAILLE LINE:  'Edit menu'",
+     "     VISIBLE:  'Edit menu', cursor=1",
+     "BRAILLE LINE:  'Edit menu'",
+     "     VISIBLE:  'Edit menu', cursor=1",
+     "SPEECH OUTPUT: 'Edit menu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(PauseAction(3000))
+sequence.append(utils.AssertPresentationAction(
+    "2. basic whereAmI",
+    ["BRAILLE LINE:  'Edit menu'",
+     "     VISIBLE:  'Edit menu', cursor=1",
+     "SPEECH OUTPUT: 'Edit'",
+     "SPEECH OUTPUT: 'menu 1 of 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Move to View",
+    ["BRAILLE LINE:  'View menu'",
+     "     VISIBLE:  'View menu', cursor=1",
+     "BRAILLE LINE:  'View menu'",
+     "     VISIBLE:  'View menu', cursor=1",
+     "SPEECH OUTPUT: 'View menu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Move to Themes",
+    ["BRAILLE LINE:  'Themes          > menu'",
+     "     VISIBLE:  'Themes          > menu', cursor=1",
+     "BRAILLE LINE:  'Themes          > menu'",
+     "     VISIBLE:  'Themes          > menu', cursor=1",
+     "SPEECH OUTPUT: 'Themes          > menu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Move to basic grey",
+    ["BRAILLE LINE:  'Basic Grey'",
+     "     VISIBLE:  'Basic Grey', cursor=1",
+     "BRAILLE LINE:  'Basic Grey'",
+     "     VISIBLE:  'Basic Grey', cursor=1",
+     "SPEECH OUTPUT: 'Basic Grey'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Move to the blues",
+    ["BRAILLE LINE:  'The Blues'",
+     "     VISIBLE:  'The Blues', cursor=1",
+     "BRAILLE LINE:  'The Blues'",
+     "     VISIBLE:  'The Blues', cursor=1",
+     "SPEECH OUTPUT: 'The Blues'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Move to garden",
+    ["BRAILLE LINE:  'Garden'",
+     "     VISIBLE:  'Garden', cursor=1",
+     "BRAILLE LINE:  'Garden'",
+     "     VISIBLE:  'Garden', cursor=1",
+     "SPEECH OUTPUT: 'Garden'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Move to in the pink",
+    ["BRAILLE LINE:  'In the Pink grayed'",
+     "     VISIBLE:  'In the Pink grayed', cursor=1",
+     "BRAILLE LINE:  'In the Pink grayed'",
+     "     VISIBLE:  'In the Pink grayed', cursor=1",
+     "SPEECH OUTPUT: 'In the Pink grayed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Move to rose",
+    ["BRAILLE LINE:  'Rose'",
+     "     VISIBLE:  'Rose', cursor=1",
+     "BRAILLE LINE:  'Rose'",
+     "     VISIBLE:  'Rose', cursor=1",
+     "SPEECH OUTPUT: 'Rose'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Move back to Themes",
+    ["BRAILLE LINE:  'Themes          > menu'",
+     "     VISIBLE:  'Themes          > menu', cursor=1",
+     "BRAILLE LINE:  'Themes          > menu'",
+     "     VISIBLE:  'Themes          > menu', cursor=1",
+     "SPEECH OUTPUT: 'Themes          > menu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Move to hide",
+    ["BRAILLE LINE:  'Hide'",
+     "     VISIBLE:  'Hide', cursor=1",
+     "BRAILLE LINE:  'Hide'",
+     "     VISIBLE:  'Hide', cursor=1",
+     "SPEECH OUTPUT: 'Hide'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Move to show",
+    ["BRAILLE LINE:  'Show'",
+     "     VISIBLE:  'Show', cursor=1",
+     "BRAILLE LINE:  'Show'",
+     "     VISIBLE:  'Show', cursor=1",
+     "SPEECH OUTPUT: 'Show'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Move to more",
+    ["BRAILLE LINE:  'More                > menu'",
+     "     VISIBLE:  'More                > menu', cursor=1",
+     "BRAILLE LINE:  'More                > menu'",
+     "     VISIBLE:  'More                > menu', cursor=1",
+     "SPEECH OUTPUT: 'More                > menu'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Move to one",
+    ["BRAILLE LINE:  'one'",
+     "     VISIBLE:  'one', cursor=1",
+     "BRAILLE LINE:  'one'",
+     "     VISIBLE:  'one', cursor=1",
+     "SPEECH OUTPUT: 'one'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Move to two",
+    ["BRAILLE LINE:  'two'",
+     "     VISIBLE:  'two', cursor=1",
+     "BRAILLE LINE:  'two'",
+     "     VISIBLE:  'two', cursor=1",
+     "SPEECH OUTPUT: 'two'"]))
+
+sequence.append(KeyComboAction("Escape"))
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_progressbar.params b/test/keystrokes/firefox/aria_progressbar.params
new file mode 100644
index 0000000..72bf04e
--- /dev/null
+++ b/test/keystrokes/firefox/aria_progressbar.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/aria-progressbar.html
diff --git a/test/keystrokes/firefox/aria_progressbar.py b/test/keystrokes/firefox/aria_progressbar.py
new file mode 100644
index 0000000..a82f24e
--- /dev/null
+++ b/test/keystrokes/firefox/aria_progressbar.py
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+
+"""Test of ARIA progressbar presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(PauseAction(5000))
+sequence.append(utils.AssertPresentationAction(
+    "1. Progress output",
+    ["SPEECH OUTPUT: '10 percent.'",
+     "SPEECH OUTPUT: '20 percent.'",
+     "SPEECH OUTPUT: '30 percent.'",
+     "SPEECH OUTPUT: '40 percent.'",
+     "SPEECH OUTPUT: '50 percent.'",
+     "SPEECH OUTPUT: '60 percent.'",
+     "SPEECH OUTPUT: '70 percent.'",
+     "SPEECH OUTPUT: '80 percent.'",
+     "SPEECH OUTPUT: '90 percent.'",
+     "SPEECH OUTPUT: '100 percent.'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_radio_button_uiuc.params 
b/test/keystrokes/firefox/aria_radio_button_uiuc.params
new file mode 100644
index 0000000..0f9b422
--- /dev/null
+++ b/test/keystrokes/firefox/aria_radio_button_uiuc.params
@@ -0,0 +1 @@
+PARAMS=http://test.cita.illinois.edu/aria/radio/radio1.php
diff --git a/test/keystrokes/firefox/aria_radio_button_uiuc.py 
b/test/keystrokes/firefox/aria_radio_button_uiuc.py
new file mode 100644
index 0000000..5f2ef56
--- /dev/null
+++ b/test/keystrokes/firefox/aria_radio_button_uiuc.py
@@ -0,0 +1,102 @@
+#!/usr/bin/python
+
+"""Test of UIUC radio button presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to first radio button",
+    ["KNOWN ISSUE: This is broken. So are the tests which follow.",
+     "BRAILLE LINE:  ' Radio'",
+     "     VISIBLE:  ' Radio', cursor=1",
+     "BRAILLE LINE:  ' Radio'",
+     "     VISIBLE:  ' Radio', cursor=1",
+     "SPEECH OUTPUT: 'Lunch Options panel'",
+     "SPEECH OUTPUT: 'Johns Radio Maria selected radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic whereamI",
+    ["BRAILLE LINE:  ' Radio'",
+     "     VISIBLE:  ' Radio', cursor=1",
+     "SPEECH OUTPUT: 'Lunch Options Johns Radio Maria'",
+     "SPEECH OUTPUT: 'radio button selected'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Move to next radio button",
+    ["BRAILLE LINE:  'Maria'",
+     "     VISIBLE:  'Maria', cursor=1",
+     "SPEECH OUTPUT: 'Maria '",
+     "SPEECH OUTPUT: 'radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Move to next radio button",
+    ["BRAILLE LINE:  ' Rainbow'",
+     "     VISIBLE:  ' Rainbow', cursor=1",
+     "SPEECH OUTPUT: ' Rainbow '",
+     "SPEECH OUTPUT: 'radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Move to next radio button",
+    ["BRAILLE LINE:  'Gardens'",
+     "     VISIBLE:  'Gardens', cursor=1",
+     "SPEECH OUTPUT: 'Gardens '",
+     "SPEECH OUTPUT: 'radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Move to next line",
+    ["BRAILLE LINE:  'Drink Options h3'",
+     "     VISIBLE:  'Drink Options h3', cursor=1",
+     "SPEECH OUTPUT: 'Drink Options'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Tab to second radio group",
+    ["BRAILLE LINE:  ' Water'",
+     "     VISIBLE:  ' Water', cursor=1",
+     "BRAILLE LINE:  ' Water'",
+     "     VISIBLE:  ' Water', cursor=1",
+     "SPEECH OUTPUT: 'Drink Options panel'",
+     "SPEECH OUTPUT: 'Water selected radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Move to next radio button",
+    ["BRAILLE LINE:  ' Tea'",
+     "     VISIBLE:  ' Tea', cursor=1",
+     "SPEECH OUTPUT: ' Tea '",
+     "SPEECH OUTPUT: 'radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Move back to previous radio button",
+    ["BRAILLE LINE:  ' Water'",
+     "     VISIBLE:  ' Water', cursor=1",
+     "SPEECH OUTPUT: ' Water '",
+     "SPEECH OUTPUT: 'radio button'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_slider.params b/test/keystrokes/firefox/aria_slider.params
new file mode 100644
index 0000000..1eb4f7c
--- /dev/null
+++ b/test/keystrokes/firefox/aria_slider.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/aria-slider.html
diff --git a/test/keystrokes/firefox/aria_slider.py b/test/keystrokes/firefox/aria_slider.py
new file mode 100644
index 0000000..eb1a35a
--- /dev/null
+++ b/test/keystrokes/firefox/aria_slider.py
@@ -0,0 +1,73 @@
+#!/usr/bin/python
+
+"""Test of ARIA slider presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. tab to slider",
+    ["BRAILLE LINE:  '0Move slider left push button $lMy slider 10% slider'",
+     "     VISIBLE:  'My slider 10% slider', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "SPEECH OUTPUT: 'My slider slider 10%'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. basic whereAmI",
+    ["BRAILLE LINE:  '0Move slider left push button $lMy slider 10% slider'",
+     "     VISIBLE:  'My slider 10% slider', cursor=1",
+     "BRAILLE LINE:  'My slider 10% slider'",
+     "     VISIBLE:  'My slider 10% slider', cursor=1",
+     "SPEECH OUTPUT: 'My slider'",
+     "SPEECH OUTPUT: 'slider 10% 10 percent.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. move slider right",
+    ["BRAILLE LINE:  'My slider $15.00 slider'",
+     "     VISIBLE:  'My slider $15.00 slider', cursor=1",
+     "SPEECH OUTPUT: '$15.00'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "4. move slider right",
+    ["BRAILLE LINE:  'My slider $20.00 slider'",
+     "     VISIBLE:  'My slider $20.00 slider', cursor=1",
+     "SPEECH OUTPUT: '$20.00'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "5. move slider left",
+    ["BRAILLE LINE:  'My slider $15.00 slider'",
+     "     VISIBLE:  'My slider $15.00 slider', cursor=1",
+     "SPEECH OUTPUT: '$15.00'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("End"))
+sequence.append(utils.AssertPresentationAction(
+    "6. move slider end",
+    ["BRAILLE LINE:  'My slider $100.00 slider'",
+     "     VISIBLE:  'My slider $100.00 slider', cursor=1",
+     "SPEECH OUTPUT: '$100.00'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Home"))
+sequence.append(utils.AssertPresentationAction(
+    "7. move slider home",
+    ["BRAILLE LINE:  'My slider $0.00 slider'",
+     "     VISIBLE:  'My slider $0.00 slider', cursor=1",
+     "SPEECH OUTPUT: '$0.00'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_slider_dojo.params b/test/keystrokes/firefox/aria_slider_dojo.params
new file mode 100644
index 0000000..f467b69
--- /dev/null
+++ b/test/keystrokes/firefox/aria_slider_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_Slider.html
diff --git a/test/keystrokes/firefox/aria_slider_dojo.py b/test/keystrokes/firefox/aria_slider_dojo.py
new file mode 100644
index 0000000..3cbd7b9
--- /dev/null
+++ b/test/keystrokes/firefox/aria_slider_dojo.py
@@ -0,0 +1,128 @@
+#!/usr/bin/python
+
+"""Test of Dojo slider presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to first slider",
+    ["KNOWN ISSUE: Why are we not displaying the value after focus mode?",
+     "BRAILLE LINE:  'slider 1 10 slider'",
+     "     VISIBLE:  'slider 1 10 slider', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'slider 1'",
+     "     VISIBLE:  'slider 1', cursor=1",
+     "SPEECH OUTPUT: 'slider 1 slider 10'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Increment first slider",
+    ["KNOWN ISSUE: This is the value exposed to us so we're passing it along as-is.",
+     "BRAILLE LINE:  'slider 1 10.238095238095237 slider'",
+     "     VISIBLE:  'slider 1 10.238095238095237 slid', cursor=1",
+     "SPEECH OUTPUT: '10.238095238095237'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Increment first slider",
+    ["BRAILLE LINE:  'slider 1 10.476190476190476 slider'",
+     "     VISIBLE:  'slider 1 10.476190476190476 slid', cursor=1",
+     "SPEECH OUTPUT: '10.476190476190476'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Decrement first slider",
+    ["BRAILLE LINE:  'slider 1 10.238095238095237 slider'",
+     "     VISIBLE:  'slider 1 10.238095238095237 slid', cursor=1",
+     "SPEECH OUTPUT: '10.238095238095237'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Decrement first slider",
+    ["BRAILLE LINE:  'slider 1 10 slider'",
+     "     VISIBLE:  'slider 1 10 slider', cursor=1",
+     "SPEECH OUTPUT: '10'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Move to entry",
+    ["BRAILLE LINE:  'Slider1 Value: 10.0% $l rdonly'",
+     "     VISIBLE:  'Slider1 Value: 10.0% $l rdonly', cursor=21",
+     "BRAILLE LINE:  'Slider1 Value: 10.0% $l rdonly'",
+     "     VISIBLE:  'Slider1 Value: 10.0% $l rdonly', cursor=21",
+     "BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'Slider1 Value: read only entry 10.0% selected'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Move to button",
+    ["BRAILLE LINE:  'Disable previous slider push button'",
+     "     VISIBLE:  'Disable previous slider push but', cursor=1",
+     "BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "BRAILLE LINE:  'Disable previous slider'",
+     "     VISIBLE:  'Disable previous slider', cursor=0",
+     "SPEECH OUTPUT: 'Disable previous slider push button'",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Tab to second slider",
+    ["BRAILLE LINE:  'slider 2 10 slider'",
+     "     VISIBLE:  'slider 2 10 slider', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'slider 2'",
+     "     VISIBLE:  'slider 2', cursor=1",
+     "SPEECH OUTPUT: 'slider 2 slider 10'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Increment second slider",
+    ["BRAILLE LINE:  'slider 2 20 slider'",
+     "     VISIBLE:  'slider 2 20 slider', cursor=1",
+     "SPEECH OUTPUT: '20'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Increment second slider",
+    ["BRAILLE LINE:  'slider 2 30 slider'",
+     "     VISIBLE:  'slider 2 30 slider', cursor=1",
+     "SPEECH OUTPUT: '30'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Decrement second slider",
+    ["BRAILLE LINE:  'slider 2 20 slider'",
+     "     VISIBLE:  'slider 2 20 slider', cursor=1",
+     "SPEECH OUTPUT: '20'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Decrement second slider",
+    ["BRAILLE LINE:  'slider 2 10 slider'",
+     "     VISIBLE:  'slider 2 10 slider', cursor=1",
+     "SPEECH OUTPUT: '10'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_slider_tpg.params b/test/keystrokes/firefox/aria_slider_tpg.params
new file mode 100644
index 0000000..7e2fae0
--- /dev/null
+++ b/test/keystrokes/firefox/aria_slider_tpg.params
@@ -0,0 +1 @@
+PARAMS=http://www.paciellogroup.com/blog/misc/samples/aria/slider/
diff --git a/test/keystrokes/firefox/aria_slider_tpg.py b/test/keystrokes/firefox/aria_slider_tpg.py
new file mode 100644
index 0000000..725e3da
--- /dev/null
+++ b/test/keystrokes/firefox/aria_slider_tpg.py
@@ -0,0 +1,250 @@
+#!/usr/bin/python
+
+"""Test of ARIA sliders using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to Volume Slider",
+    ["BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "SPEECH OUTPUT: 'Volume slider 0 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Volume Right Arrow",
+    ["BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "SPEECH OUTPUT: '1 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Volume Right Arrow",
+    ["BRAILLE LINE:  'Volume 2 % slider'",
+     "     VISIBLE:  'Volume 2 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 2 % slider'",
+     "     VISIBLE:  'Volume 2 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 2 % slider'",
+     "     VISIBLE:  'Volume 2 % slider', cursor=1",
+     "SPEECH OUTPUT: '2 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Volume Left Arrow",
+    ["BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "SPEECH OUTPUT: '1 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Volume Left Arrow",
+    ["BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "SPEECH OUTPUT: '0 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Volume Up Arrow",
+    ["BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "SPEECH OUTPUT: '1 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Volume Up Arrow",
+    ["BRAILLE LINE:  'Volume 2 % slider'",
+     "     VISIBLE:  'Volume 2 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 2 % slider'",
+     "     VISIBLE:  'Volume 2 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 2 % slider'",
+     "     VISIBLE:  'Volume 2 % slider', cursor=1",
+     "SPEECH OUTPUT: '2 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Volume Down Arrow",
+    ["BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 1 % slider'",
+     "     VISIBLE:  'Volume 1 % slider', cursor=1",
+     "SPEECH OUTPUT: '1 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Volume Down Arrow",
+    ["BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "SPEECH OUTPUT: '0 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Page_Up"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Volume Page Up",
+    ["BRAILLE LINE:  'Volume 25 % slider'",
+     "     VISIBLE:  'Volume 25 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 25 % slider'",
+     "     VISIBLE:  'Volume 25 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 25 % slider'",
+     "     VISIBLE:  'Volume 25 % slider', cursor=1",
+     "SPEECH OUTPUT: '25 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Page_Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Volume Page Down",
+    ["BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "SPEECH OUTPUT: '0 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("End"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Volume End",
+    ["BRAILLE LINE:  'Volume 100 % slider'",
+     "     VISIBLE:  'Volume 100 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 100 % slider'",
+     "     VISIBLE:  'Volume 100 % slider', cursor=1",
+     "SPEECH OUTPUT: '100 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Home"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Volume Home",
+    ["BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "BRAILLE LINE:  'Volume 0 % slider'",
+     "     VISIBLE:  'Volume 0 % slider', cursor=1",
+     "SPEECH OUTPUT: '0 %'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Tab to Food Quality Slider",
+    ["BRAILLE LINE:  'Food Quality terrible slider'",
+     "     VISIBLE:  'Food Quality terrible slider', cursor=1",
+     "SPEECH OUTPUT: 'Food Quality slider terrible'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Food Quality Right Arrow",
+    ["BRAILLE LINE:  'Food Quality bad slider'",
+     "     VISIBLE:  'Food Quality bad slider', cursor=1",
+     "SPEECH OUTPUT: 'bad'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Food Quality Right Arrow",
+    ["BRAILLE LINE:  'Food Quality decent slider'",
+     "     VISIBLE:  'Food Quality decent slider', cursor=1",
+     "SPEECH OUTPUT: 'decent'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Food Quality Left Arrow",
+    ["BRAILLE LINE:  'Food Quality bad slider'",
+     "     VISIBLE:  'Food Quality bad slider', cursor=1",
+     "SPEECH OUTPUT: 'bad'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Food Quality Up Arrow",
+    ["BRAILLE LINE:  'Food Quality decent slider'",
+     "     VISIBLE:  'Food Quality decent slider', cursor=1",
+     "SPEECH OUTPUT: 'decent'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Food Quality Down Arrow",
+    ["BRAILLE LINE:  'Food Quality bad slider'",
+     "     VISIBLE:  'Food Quality bad slider', cursor=1",
+     "SPEECH OUTPUT: 'bad'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Food Quality Down Arrow",
+    ["BRAILLE LINE:  'Food Quality terrible slider'",
+     "     VISIBLE:  'Food Quality terrible slider', cursor=1",
+     "SPEECH OUTPUT: 'terrible'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Page_Up"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Food Quality Page Up",
+    ["BRAILLE LINE:  'Food Quality bad slider'",
+     "     VISIBLE:  'Food Quality bad slider', cursor=1",
+     "SPEECH OUTPUT: 'bad'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Page_Down"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Food Quality Page Down",
+    ["BRAILLE LINE:  'Food Quality terrible slider'",
+     "     VISIBLE:  'Food Quality terrible slider', cursor=1",
+     "SPEECH OUTPUT: 'terrible'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("End"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Food Quality End",
+    ["BRAILLE LINE:  'Food Quality excellent slider'",
+     "     VISIBLE:  'Food Quality excellent slider', cursor=1",
+     "SPEECH OUTPUT: 'excellent'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Home"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Food Quality Home",
+    ["BRAILLE LINE:  'Food Quality terrible slider'",
+     "     VISIBLE:  'Food Quality terrible slider', cursor=1",
+     "SPEECH OUTPUT: 'terrible'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_slider_uiuc.params b/test/keystrokes/firefox/aria_slider_uiuc.params
new file mode 100644
index 0000000..3b820c3
--- /dev/null
+++ b/test/keystrokes/firefox/aria_slider_uiuc.params
@@ -0,0 +1 @@
+PARAMS=http://test.cita.illinois.edu/aria/slider/slider1.php
diff --git a/test/keystrokes/firefox/aria_slider_uiuc.py b/test/keystrokes/firefox/aria_slider_uiuc.py
new file mode 100644
index 0000000..209b03b
--- /dev/null
+++ b/test/keystrokes/firefox/aria_slider_uiuc.py
@@ -0,0 +1,130 @@
+#!/usr/bin/python
+
+"""Test of UIUC slider presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to slider 1",
+    ["KNOWN ISSUE: Why are we clearing braille here?",
+     "BRAILLE LINE:  '30 slider'",
+     "     VISIBLE:  '30 slider', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'slider 30'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic whereAmI on slider 1",
+    ["BRAILLE LINE:  '30 slider'",
+     "     VISIBLE:  '30 slider', cursor=1",
+     "SPEECH OUTPUT: 'slider 30 30 percent.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Increment slider 1",
+    ["BRAILLE LINE:  '35 slider'",
+     "     VISIBLE:  '35 slider', cursor=1",
+     "SPEECH OUTPUT: '35'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Increment slider 1",
+    ["BRAILLE LINE:  '40 slider'",
+     "     VISIBLE:  '40 slider', cursor=1",
+     "SPEECH OUTPUT: '40'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Decrement slider 1",
+    ["BRAILLE LINE:  '35 slider'",
+     "     VISIBLE:  '35 slider', cursor=1",
+     "SPEECH OUTPUT: '35'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Tab to slider 2's left range",
+    ["KNOWN ISSUE: Why are we clearing braille here?",
+     "BRAILLE LINE:  '1950 slider'",
+     "     VISIBLE:  '1950 slider', cursor=1",
+     "BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'slider 1950'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Increment slider 2's left range",
+    ["BRAILLE LINE:  '1951 slider'",
+     "     VISIBLE:  '1951 slider', cursor=1",
+     "SPEECH OUTPUT: '1951'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Increment slider 2's left range",
+    ["BRAILLE LINE:  '1952 slider'",
+     "     VISIBLE:  '1952 slider', cursor=1",
+     "SPEECH OUTPUT: '1952'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Decrement slider 2's left range",
+    ["BRAILLE LINE:  '1951 slider'",
+     "     VISIBLE:  '1951 slider', cursor=1",
+     "SPEECH OUTPUT: '1951'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Tab to slider 2's right range",
+    ["KNOWN ISSUE: Why are we clearing braille here?",
+     "BRAILLE LINE:  '2000 slider'",
+     "     VISIBLE:  '2000 slider', cursor=1",
+     "BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'slider 2000'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Increment slider 2's right range",
+    ["BRAILLE LINE:  '2001 slider'",
+     "     VISIBLE:  '2001 slider', cursor=1",
+     "SPEECH OUTPUT: '2001'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Increment slider 2's right range",
+    ["BRAILLE LINE:  '2002 slider'",
+     "     VISIBLE:  '2002 slider', cursor=1",
+     "SPEECH OUTPUT: '2002'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Decrement slider 2's right range",
+    ["BRAILLE LINE:  '2001 slider'",
+     "     VISIBLE:  '2001 slider', cursor=1",
+     "SPEECH OUTPUT: '2001'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_spinner_dojo.params 
b/test/keystrokes/firefox/aria_spinner_dojo.params
new file mode 100644
index 0000000..b8af32b
--- /dev/null
+++ b/test/keystrokes/firefox/aria_spinner_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/form/test_Spinner.html
diff --git a/test/keystrokes/firefox/aria_spinner_dojo.py b/test/keystrokes/firefox/aria_spinner_dojo.py
new file mode 100644
index 0000000..21b033f
--- /dev/null
+++ b/test/keystrokes/firefox/aria_spinner_dojo.py
@@ -0,0 +1,68 @@
+#!/usr/bin/python
+
+"""Test of Dojo spinner presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to the first spinner",
+    ["BRAILLE LINE:  '900 onChange: onChange: not fired yet! $l Set value to 400 push button Set value to 
null push button Set required to false push button'",
+     "     VISIBLE:  '900 onChange: onChange: not fire', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'Spinbox #1: 900 $l'",
+     "     VISIBLE:  'Spinbox #1: 900 $l', cursor=13",
+     "BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'Spinbox #1: 900 selected spin button'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Decrement first spinner",
+    ["BRAILLE LINE:  'Spinbox #1: 900 $l'",
+     "     VISIBLE:  'Spinbox #1: 900 $l', cursor=13",
+     "BRAILLE LINE:  'Spinbox #1: 899 $l'",
+     "     VISIBLE:  'Spinbox #1: 899 $l', cursor=13",
+     "SPEECH OUTPUT: '899'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Decrement first spinner",
+    ["BRAILLE LINE:  'Spinbox #1: 898 $l'",
+     "     VISIBLE:  'Spinbox #1: 898 $l', cursor=13",
+     "BRAILLE LINE:  'Spinbox #1: 898 $l'",
+     "     VISIBLE:  'Spinbox #1: 898 $l', cursor=13",
+     "SPEECH OUTPUT: '898'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Increment first spinner",
+    ["BRAILLE LINE:  'Spinbox #1: 899 $l'",
+     "     VISIBLE:  'Spinbox #1: 899 $l', cursor=13",
+     "BRAILLE LINE:  'Spinbox #1: 899 $l'",
+     "     VISIBLE:  'Spinbox #1: 899 $l', cursor=13",
+     "SPEECH OUTPUT: '899'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "5. basic whereAmI",
+    ["BRAILLE LINE:  'Spinbox #1: 899 $l'",
+     "     VISIBLE:  'Spinbox #1: 899 $l', cursor=13",
+     "SPEECH OUTPUT: 'Spinbox #1:'",
+     "SPEECH OUTPUT: 'spin button'",
+     "SPEECH OUTPUT: '899'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_tabcontainer_dojo.params 
b/test/keystrokes/firefox/aria_tabcontainer_dojo.params
new file mode 100644
index 0000000..9b22bed
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tabcontainer_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/layout/test_TabContainer.html
diff --git a/test/keystrokes/firefox/aria_tabcontainer_dojo.py 
b/test/keystrokes/firefox/aria_tabcontainer_dojo.py
new file mode 100644
index 0000000..af978bb
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tabcontainer_dojo.py
@@ -0,0 +1,57 @@
+#!/usr/bin/python
+
+"""Test of Dojo tab container presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(PauseAction(3000))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to tab list",
+    ["BRAILLE LINE:  '  Tab 3 Inlined Sub TabContainer Sub TabContainer from href SplitContainer from href 
Embedded layout widgets Tab 2'",
+     "     VISIBLE:  'Tab 2', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'Tab 2 page tab'",
+     "     VISIBLE:  'Tab 2 page tab', cursor=1",
+     "SPEECH OUTPUT: 'Tab 2 page tab'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Right arrow to next tab",
+    ["BRAILLE LINE:  'Tab 3 page tab'",
+     "     VISIBLE:  'Tab 3 page tab', cursor=1",
+     "BRAILLE LINE:  'Tab 3 page tab'",
+     "     VISIBLE:  'Tab 3 page tab', cursor=1",
+     "SPEECH OUTPUT: 'Tab 3 page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Right arrow to next tab",
+    ["BRAILLE LINE:  'Inlined Sub TabContainer page tab'",
+     "     VISIBLE:  'Inlined Sub TabContainer page ta', cursor=1",
+     "BRAILLE LINE:  'Inlined Sub TabContainer page tab'",
+     "     VISIBLE:  'Inlined Sub TabContainer page ta', cursor=1",
+     "SPEECH OUTPUT: 'Inlined Sub TabContainer page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Tab to contents",
+    ["BRAILLE LINE:  'SubTab 2 page tab'",
+     "     VISIBLE:  'SubTab 2 page tab', cursor=1",
+     "BRAILLE LINE:  'SubTab 2 page tab'",
+     "     VISIBLE:  'SubTab 2 page tab', cursor=1",
+     "SPEECH OUTPUT: 'SubTab 2 page tab'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_tabpanel.params b/test/keystrokes/firefox/aria_tabpanel.params
new file mode 100644
index 0000000..752dfd7
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tabpanel.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/aria-tabpanel.html
diff --git a/test/keystrokes/firefox/aria_tabpanel.py b/test/keystrokes/firefox/aria_tabpanel.py
new file mode 100644
index 0000000..c889186
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tabpanel.py
@@ -0,0 +1,87 @@
+#!/usr/bin/python
+
+"""Test of ARIA tabpanel presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Basic whereAmI",
+    ["BRAILLE LINE:  'Tab Zero page tab'",
+     "     VISIBLE:  'Tab Zero page tab', cursor=1",
+     "SPEECH OUTPUT: 'page tab list'",
+     "SPEECH OUTPUT: 'Tab Zero'",
+     "SPEECH OUTPUT: 'page tab 1 of 5'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Right arrow to next tab",
+    ["BRAILLE LINE:  'Tab One page tab'",
+     "     VISIBLE:  'Tab One page tab', cursor=1",
+     "BRAILLE LINE:  'Tab One page tab'",
+     "     VISIBLE:  'Tab One page tab', cursor=1",
+     "SPEECH OUTPUT: 'Tab One page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Right arrow to next tab",
+    ["BRAILLE LINE:  'Tab Two page tab'",
+     "     VISIBLE:  'Tab Two page tab', cursor=1",
+     "BRAILLE LINE:  'Tab Two page tab'",
+     "     VISIBLE:  'Tab Two page tab', cursor=1",
+     "SPEECH OUTPUT: 'Tab Two page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Tab to contents",
+    ["BRAILLE LINE:  '&=y Internal Portal Bookmark radio button'",
+     "     VISIBLE:  '&=y Internal Portal Bookmark rad', cursor=1",
+     "BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "BRAILLE LINE:  '&=y Internal Portal Bookmark radio button Internal Portal Bookmark & y External URL 
radio button External URL'",
+     "     VISIBLE:  '&=y Internal Portal Bookmark rad', cursor=1",
+     "SPEECH OUTPUT: 'Internal Portal Bookmark selected radio button'",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Shift+Tab out of contents",
+    ["BRAILLE LINE:  'Tab Zero Tab One Tab Two Tab Three Tab Four'",
+     "     VISIBLE:  'Tab Two Tab Three Tab Four', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'Tab Two page tab'",
+     "     VISIBLE:  'Tab Two page tab', cursor=1",
+     "SPEECH OUTPUT: 'Tab Two page tab'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Right arrow to next tab",
+    ["BRAILLE LINE:  'Tab Three page tab'",
+     "     VISIBLE:  'Tab Three page tab', cursor=1",
+     "BRAILLE LINE:  'Tab Three page tab'",
+     "     VISIBLE:  'Tab Three page tab', cursor=1",
+     "SPEECH OUTPUT: 'Tab Three page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Right arrow to next tab",
+    ["BRAILLE LINE:  'Tab Four page tab'",
+     "     VISIBLE:  'Tab Four page tab', cursor=1",
+     "BRAILLE LINE:  'Tab Four page tab'",
+     "     VISIBLE:  'Tab Four page tab', cursor=1",
+     "SPEECH OUTPUT: 'Tab Four page tab'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_tabpanel_text_dojo.params 
b/test/keystrokes/firefox/aria_tabpanel_text_dojo.params
new file mode 100644
index 0000000..0d432c8
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tabpanel_text_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/test_Dialog.html
diff --git a/test/keystrokes/firefox/aria_tabpanel_text_dojo.py 
b/test/keystrokes/firefox/aria_tabpanel_text_dojo.py
new file mode 100644
index 0000000..5f4fa32
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tabpanel_text_dojo.py
@@ -0,0 +1,72 @@
+#!/usr/bin/python
+
+"""Test of presentation of Dojo's panel text."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(PauseAction(3000))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "1. Space to press the Show TabContainer Dialog",
+    ["BRAILLE LINE:  'TabContainer Dialog h0  Cancel push button'",
+     "     VISIBLE:  'TabContainer Dialog h0  Cancel p', cursor=0",
+     "BRAILLE LINE:  'First tab'",
+     "     VISIBLE:  'First tab', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'First tab page tab'",
+     "     VISIBLE:  'First tab page tab', cursor=1",
+     "SPEECH OUTPUT: 'TabContainer Dialog First tab Second tab This is the first tab. Lorem ipsum dolor sit 
amet, consectetuer adipiscing elit. Aenean semper sagittis velit. Cras in mi. Duis porta mauris ut ligula. 
Proin porta rutrum lacus. Etiam consequat scelerisque quam. Nulla facilisi. Maecenas luctus venenatis nulla. 
In sit amet dui non mi semper iaculis. Sed molestie tortor at ipsum. Morbi dictum rutrum magna. Sed vitae 
risus. '",
+     "SPEECH OUTPUT: 'First tab page tab'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Right Arrow to the Second tab page",
+    ["BRAILLE LINE:  'Second tab page tab'",
+     "     VISIBLE:  'Second tab page tab', cursor=1",
+     "BRAILLE LINE:  'Second tab page tab'",
+     "     VISIBLE:  'Second tab page tab', cursor=1",
+     "SPEECH OUTPUT: 'Second tab page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab into the panel",
+    ["BRAILLE LINE:  'ipsum dolor sit amet'",
+     "     VISIBLE:  'ipsum dolor sit amet', cursor=1",
+     "BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "BRAILLE LINE:  'ipsum dolor sit amet'",
+     "     VISIBLE:  'ipsum dolor sit amet', cursor=1",
+     "SPEECH OUTPUT: 'ipsum dolor sit amet'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Down Arrow in Browse Mode",
+    ["KNOWN ISSUE: We're winding up at the end of the line rather than on the next line",
+     "BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=0"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Down Arrow in Browse Mode",
+    ["BRAILLE LINE:  'lacus. Etiam consequat scelerisque quam. Nulla facilisi. Maecenas luctus'",
+     "     VISIBLE:  'lacus. Etiam consequat scelerisq', cursor=1",
+     "SPEECH OUTPUT: 'lacus. Etiam consequat scelerisque quam. Nulla facilisi. Maecenas luctus '"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_tabpanel_uiuc.params 
b/test/keystrokes/firefox/aria_tabpanel_uiuc.params
new file mode 100644
index 0000000..4bccc7d
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tabpanel_uiuc.params
@@ -0,0 +1 @@
+PARAMS=http://test.cita.illinois.edu/aria/tabpanel/tabpanel1.php
diff --git a/test/keystrokes/firefox/aria_tabpanel_uiuc.py b/test/keystrokes/firefox/aria_tabpanel_uiuc.py
new file mode 100644
index 0000000..168cc6e
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tabpanel_uiuc.py
@@ -0,0 +1,100 @@
+#!/usr/bin/python
+
+"""Test of UIUC tab panel presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Give focus to a widget in the first Tab",
+    ["BRAILLE LINE:  '&=y Thick and cheesy radio button Thick and cheesy'",
+     "     VISIBLE:  '&=y Thick and cheesy radio butto', cursor=1",
+     "BRAILLE LINE:  '&=y Thick and cheesy radio button Thick and cheesy'",
+     "     VISIBLE:  '&=y Thick and cheesy radio butto', cursor=1",
+     "SPEECH OUTPUT: 'Thick and cheesy selected radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Page_Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Ctrl Page Down to second tab",
+    ["KNOWN ISSUE: Missing a space",
+     "BRAILLE LINE:  'Crust VeggiesCarnivore Delivery'",
+     "     VISIBLE:  'Crust VeggiesCarnivore Delivery', cursor=7",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'Veggies page tab'",
+     "     VISIBLE:  'Veggies page tab', cursor=1",
+     "SPEECH OUTPUT: 'Veggies page tab'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Right arrow to third tab",
+    ["BRAILLE LINE:  'Carnivore page tab'",
+     "     VISIBLE:  'Carnivore page tab', cursor=1",
+     "BRAILLE LINE:  'Carnivore page tab'",
+     "     VISIBLE:  'Carnivore page tab', cursor=1",
+     "SPEECH OUTPUT: 'Carnivore page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "4. basic whereAmI",
+    ["BRAILLE LINE:  'Carnivore page tab'",
+     "     VISIBLE:  'Carnivore page tab', cursor=1",
+     "SPEECH OUTPUT: 'page tab list'",
+     "SPEECH OUTPUT: 'Carnivore'",
+     "SPEECH OUTPUT: 'page tab 3 of 4'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Right arrow to fourth tab",
+    ["BRAILLE LINE:  'Delivery page tab'",
+     "     VISIBLE:  'Delivery page tab', cursor=1",
+     "BRAILLE LINE:  'Delivery page tab'",
+     "     VISIBLE:  'Delivery page tab', cursor=1",
+     "SPEECH OUTPUT: 'Delivery page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Left arrow back to third tab",
+    ["BRAILLE LINE:  'Carnivore page tab'",
+     "     VISIBLE:  'Carnivore page tab', cursor=1",
+     "BRAILLE LINE:  'Carnivore page tab'",
+     "     VISIBLE:  'Carnivore page tab', cursor=1",
+     "SPEECH OUTPUT: 'Carnivore page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Press Tab to move into the third page",
+    ["BRAILLE LINE:  '< > Pepperoni Pepperoni check box'",
+     "     VISIBLE:  '< > Pepperoni Pepperoni check bo', cursor=1",
+     "BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "BRAILLE LINE:  '< > Pepperoni Pepperoni check box Pepperoni'",
+     "     VISIBLE:  '< > Pepperoni Pepperoni check bo', cursor=1",
+     "SPEECH OUTPUT: 'Pepperoni check box not checked'",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "8. Toggle the focused checkbox",
+    ["BRAILLE LINE:  '<x> Pepperoni Pepperoni check box Pepperoni'",
+     "     VISIBLE:  '<x> Pepperoni Pepperoni check bo', cursor=1",
+     "SPEECH OUTPUT: 'checked'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_toolbar_dojo.params 
b/test/keystrokes/firefox/aria_toolbar_dojo.params
new file mode 100644
index 0000000..62d0148
--- /dev/null
+++ b/test/keystrokes/firefox/aria_toolbar_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/test_Toolbar.html
diff --git a/test/keystrokes/firefox/aria_toolbar_dojo.py b/test/keystrokes/firefox/aria_toolbar_dojo.py
new file mode 100644
index 0000000..91e9ee7
--- /dev/null
+++ b/test/keystrokes/firefox/aria_toolbar_dojo.py
@@ -0,0 +1,127 @@
+#!/usr/bin/python
+
+"""Test of Dojo toolbar presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Down Arrow",
+    ["BRAILLE LINE:  'Toolbar from markup h2'",
+     "     VISIBLE:  'Toolbar from markup h2', cursor=1",
+     "SPEECH OUTPUT: 'Toolbar from markup'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down Arrow",
+    ["BRAILLE LINE:  'input before toolbar1 $l'",
+     "     VISIBLE:  'input before toolbar1 $l', cursor=1",
+     "BRAILLE LINE:  'input before toolbar1 $l'",
+     "     VISIBLE:  'input before toolbar1 $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'input before toolbar1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Down Arrow",
+    ["BRAILLE LINE:  'Buttons: '",
+     "     VISIBLE:  'Buttons: ', cursor=1",
+     "SPEECH OUTPUT: 'Buttons: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Down Arrow",
+    ["KNOWN ISSUE: These results are not correct here and in the following assertions",
+     "BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Right Arrow on toolbar",
+    ["BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Right Arrow on toolbar",
+    ["BRAILLE LINE:  'Copy'",
+     "     VISIBLE:  'Copy', cursor=1"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Left Arrow on toolbar",
+    ["BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("End"))
+sequence.append(utils.AssertPresentationAction(
+    "8. End to last widget on toolbar",
+    ["BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Down Arrow",
+    ["BRAILLE LINE:  'Copy'",
+     "     VISIBLE:  'Copy', cursor=1",
+     "SPEECH OUTPUT: 'Copy'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Down Arrow",
+    ["BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Down Arrow",
+    ["BRAILLE LINE:  ' Toggles: '",
+     "     VISIBLE:  ' Toggles: ', cursor=1",
+     "SPEECH OUTPUT: ' Toggles: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Down Arrow",
+    ["BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Right Arrow on toolbar",
+    ["BRAILLE LINE:  'push button'",
+     "     VISIBLE:  'push button', cursor=1",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_tree_dojo.params b/test/keystrokes/firefox/aria_tree_dojo.params
new file mode 100644
index 0000000..851ccef
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tree_dojo.params
@@ -0,0 +1 @@
+PARAMS=http://archive.dojotoolkit.org/nightly/dojotoolkit/dijit/tests/tree/test_Tree.html
diff --git a/test/keystrokes/firefox/aria_tree_dojo.py b/test/keystrokes/firefox/aria_tree_dojo.py
new file mode 100644
index 0000000..4f220f5
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tree_dojo.py
@@ -0,0 +1,161 @@
+#!/usr/bin/python
+
+"""Test of Dojo tree presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to continents",
+    ["BRAILLE LINE:  'Continents expanded list item'",
+     "     VISIBLE:  'Continents expanded list item', cursor=1",
+     "BRAILLE LINE:  'Continents expanded list item'",
+     "     VISIBLE:  'Continents expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'Continents expanded tree level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down arrow to Africa",
+    ["KNOWN ISSUE: We shouldn't be speaking the panel here",
+     "BRAILLE LINE:  'Africa collapsed list item'",
+     "     VISIBLE:  'Africa collapsed list item', cursor=1",
+     "BRAILLE LINE:  'Africa collapsed list item'",
+     "     VISIBLE:  'Africa collapsed list item', cursor=1",
+     "SPEECH OUTPUT: 'Continents panel'",
+     "SPEECH OUTPUT: 'Africa collapsed tree level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Basic whereAmI",
+    ["BRAILLE LINE:  'Africa collapsed list item'",
+     "     VISIBLE:  'Africa collapsed list item', cursor=1",
+     "SPEECH OUTPUT: 'list item'",
+     "SPEECH OUTPUT: 'Africa'",
+     "SPEECH OUTPUT: '1 of 6 collapsed tree level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Expand Africa",
+    ["BRAILLE LINE:  'Africa expanded list item'",
+     "     VISIBLE:  'Africa expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'expanded'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Down arrow to Egypt",
+    ["KNOWN ISSUE: We shouldn't be speaking the panel here",
+     "BRAILLE LINE:  'Egypt list item'",
+     "     VISIBLE:  'Egypt list item', cursor=1",
+     "BRAILLE LINE:  'Egypt list item'",
+     "     VISIBLE:  'Egypt list item', cursor=1",
+     "SPEECH OUTPUT: 'Africa panel'",
+     "SPEECH OUTPUT: 'Egypt tree level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Down arrow to Kenya",
+    ["BRAILLE LINE:  'Kenya collapsed list item'",
+     "     VISIBLE:  'Kenya collapsed list item', cursor=1",
+     "BRAILLE LINE:  'Kenya collapsed list item'",
+     "     VISIBLE:  'Kenya collapsed list item', cursor=1",
+     "SPEECH OUTPUT: 'Kenya collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Expand Kenya",
+    ["BRAILLE LINE:  'Kenya expanded list item'",
+     "     VISIBLE:  'Kenya expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'expanded'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Collapse Kenya",
+    ["BRAILLE LINE:  'Kenya collapsed list item'",
+     "     VISIBLE:  'Kenya collapsed list item', cursor=1",
+     "SPEECH OUTPUT: 'collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Down arrow to Sudan",
+    ["BRAILLE LINE:  'Sudan collapsed list item'",
+     "     VISIBLE:  'Sudan collapsed list item', cursor=1",
+     "BRAILLE LINE:  'Sudan collapsed list item'",
+     "     VISIBLE:  'Sudan collapsed list item', cursor=1",
+     "SPEECH OUTPUT: 'Sudan collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Down arrow to Asia",
+    ["BRAILLE LINE:  'Asia collapsed list item'",
+     "     VISIBLE:  'Asia collapsed list item', cursor=1",
+     "BRAILLE LINE:  'Asia collapsed list item'",
+     "     VISIBLE:  'Asia collapsed list item', cursor=1",
+     "SPEECH OUTPUT: 'Asia collapsed tree level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Expand Asia",
+    ["BRAILLE LINE:  'Asia expanded list item'",
+     "     VISIBLE:  'Asia expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'expanded'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Down arrow to China",
+    ["KNOWN ISSUE: We shouldn't be speaking the panel here",
+     "BRAILLE LINE:  'China list item'",
+     "     VISIBLE:  'China list item', cursor=1",
+     "BRAILLE LINE:  'China list item'",
+     "     VISIBLE:  'China list item', cursor=1",
+     "SPEECH OUTPUT: 'Asia panel'",
+     "SPEECH OUTPUT: 'China tree level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Down arrow to India",
+    ["BRAILLE LINE:  'India list item'",
+     "     VISIBLE:  'India list item', cursor=1",
+     "BRAILLE LINE:  'India list item'",
+     "     VISIBLE:  'India list item', cursor=1",
+     "SPEECH OUTPUT: 'India'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Down arrow to Russia",
+    ["BRAILLE LINE:  'Russia list item'",
+     "     VISIBLE:  'Russia list item', cursor=1",
+     "BRAILLE LINE:  'Russia list item'",
+     "     VISIBLE:  'Russia list item', cursor=1",
+     "SPEECH OUTPUT: 'Russia'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Down arrow to Mongolia",
+    ["BRAILLE LINE:  'Mongolia list item'",
+     "     VISIBLE:  'Mongolia list item', cursor=1",
+     "BRAILLE LINE:  'Mongolia list item'",
+     "     VISIBLE:  'Mongolia list item', cursor=1",
+     "SPEECH OUTPUT: 'Mongolia'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_tree_uiuc.params b/test/keystrokes/firefox/aria_tree_uiuc.params
new file mode 100644
index 0000000..97adb6c
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tree_uiuc.params
@@ -0,0 +1 @@
+PARAMS=http://test.cita.illinois.edu/aria/tree/tree1.php
diff --git a/test/keystrokes/firefox/aria_tree_uiuc.py b/test/keystrokes/firefox/aria_tree_uiuc.py
new file mode 100644
index 0000000..131a26c
--- /dev/null
+++ b/test/keystrokes/firefox/aria_tree_uiuc.py
@@ -0,0 +1,188 @@
+#!/usr/bin/python
+
+"""Test of UIUC tree presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to tree",
+    ["BRAILLE LINE:  'Fruits Oranges Pineapples'",
+     "     VISIBLE:  'Fruits Oranges Pineapples', cursor=0",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'Fruits expanded list item'",
+     "     VISIBLE:  'Fruits expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'Fruits expanded tree level 1'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic whereAmI",
+    ["BRAILLE LINE:  'Fruits expanded list item'",
+     "     VISIBLE:  'Fruits expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'list item'",
+     "SPEECH OUTPUT: 'Fruits'",
+     "SPEECH OUTPUT: '1 of 2 expanded tree level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Down arrow to oranges",
+    ["BRAILLE LINE:  'Oranges list item'",
+     "     VISIBLE:  'Oranges list item', cursor=1",
+     "BRAILLE LINE:  'Oranges list item'",
+     "     VISIBLE:  'Oranges list item', cursor=1",
+     "SPEECH OUTPUT: 'Oranges tree level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Down arrow to pineapples",
+    ["BRAILLE LINE:  'Pineapples list item'",
+     "     VISIBLE:  'Pineapples list item', cursor=1",
+     "BRAILLE LINE:  'Pineapples list item'",
+     "     VISIBLE:  'Pineapples list item', cursor=1",
+     "SPEECH OUTPUT: 'Pineapples'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Down arrow to apples",
+    ["BRAILLE LINE:  'Apples collapsed list item'",
+     "     VISIBLE:  'Apples collapsed list item', cursor=1",
+     "BRAILLE LINE:  'Apples collapsed list item'",
+     "     VISIBLE:  'Apples collapsed list item', cursor=1",
+     "SPEECH OUTPUT: 'Apples collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Expand apples",
+    ["BRAILLE LINE:  'Apples expanded list item'",
+     "     VISIBLE:  'Apples expanded list item', cursor=1",
+     "BRAILLE LINE:  'Apples expanded list item'",
+     "     VISIBLE:  'Apples expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'expanded'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Down arrow to macintosh",
+    ["BRAILLE LINE:  'Macintosh list item'",
+     "     VISIBLE:  'Macintosh list item', cursor=1",
+     "BRAILLE LINE:  'Macintosh list item'",
+     "     VISIBLE:  'Macintosh list item', cursor=1",
+     "SPEECH OUTPUT: 'Macintosh tree level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Down arrow to granny smith",
+    ["BRAILLE LINE:  'Granny Smith collapsed list item'",
+     "     VISIBLE:  'Granny Smith collapsed list item', cursor=1",
+     "BRAILLE LINE:  'Granny Smith collapsed list item'",
+     "     VISIBLE:  'Granny Smith collapsed list item', cursor=1",
+     "SPEECH OUTPUT: 'Granny Smith collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Expand granny smith",
+    ["BRAILLE LINE:  'Granny Smith expanded list item'",
+     "     VISIBLE:  'Granny Smith expanded list item', cursor=1",
+     "BRAILLE LINE:  'Granny Smith expanded list item'",
+     "     VISIBLE:  'Granny Smith expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'expanded'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Down arrow to washington state",
+    ["BRAILLE LINE:  'Washington State list item'",
+     "     VISIBLE:  'Washington State list item', cursor=1",
+     "BRAILLE LINE:  'Washington State list item'",
+     "     VISIBLE:  'Washington State list item', cursor=1",
+     "SPEECH OUTPUT: 'Washington State tree level 4'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Down arrow to michigan",
+    ["BRAILLE LINE:  'Michigan list item'",
+     "     VISIBLE:  'Michigan list item', cursor=1",
+     "BRAILLE LINE:  'Michigan list item'",
+     "     VISIBLE:  'Michigan list item', cursor=1",
+     "SPEECH OUTPUT: 'Michigan'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Down arrow to new york",
+    ["BRAILLE LINE:  'New York list item'",
+     "     VISIBLE:  'New York list item', cursor=1",
+     "BRAILLE LINE:  'New York list item'",
+     "     VISIBLE:  'New York list item', cursor=1",
+     "SPEECH OUTPUT: 'New York'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Down arrow to fuji",
+    ["BRAILLE LINE:  'Fuji list item'",
+     "     VISIBLE:  'Fuji list item', cursor=1",
+     "BRAILLE LINE:  'Fuji list item'",
+     "     VISIBLE:  'Fuji list item', cursor=1",
+     "SPEECH OUTPUT: 'Fuji tree level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Down arrow to bananas",
+    ["BRAILLE LINE:  'Bananas list item'",
+     "     VISIBLE:  'Bananas list item', cursor=1",
+     "BRAILLE LINE:  'Bananas list item'",
+     "     VISIBLE:  'Bananas list item', cursor=1",
+     "SPEECH OUTPUT: 'Bananas tree level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Down arrow to pears",
+    ["BRAILLE LINE:  'Pears list item'",
+     "     VISIBLE:  'Pears list item', cursor=1",
+     "BRAILLE LINE:  'Pears list item'",
+     "     VISIBLE:  'Pears list item', cursor=1",
+     "SPEECH OUTPUT: 'Pears'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Down arrow to vegetables",
+    ["BRAILLE LINE:  'Vegetables expanded list item'",
+     "     VISIBLE:  'Vegetables expanded list item', cursor=1",
+     "BRAILLE LINE:  'Vegetables expanded list item'",
+     "     VISIBLE:  'Vegetables expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'Vegetables expanded tree level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Collapse vegetables",
+    ["BRAILLE LINE:  'Vegetables collapsed list item'",
+     "     VISIBLE:  'Vegetables collapsed list item', cursor=1",
+     "BRAILLE LINE:  'Vegetables collapsed list item'",
+     "     VISIBLE:  'Vegetables collapsed list item', cursor=1",
+     "SPEECH OUTPUT: 'collapsed'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/aria_treegrid.params b/test/keystrokes/firefox/aria_treegrid.params
new file mode 100644
index 0000000..9708c22
--- /dev/null
+++ b/test/keystrokes/firefox/aria_treegrid.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/aria-treegrid.html
diff --git a/test/keystrokes/firefox/aria_treegrid.py b/test/keystrokes/firefox/aria_treegrid.py
new file mode 100644
index 0000000..a0f23f6
--- /dev/null
+++ b/test/keystrokes/firefox/aria_treegrid.py
@@ -0,0 +1,150 @@
+#!/usr/bin/python
+
+"""Test of ARIA treegrid presentation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Navigate to the treegrid",
+    ["BRAILLE LINE:  '+A Question of Love'",
+     "     VISIBLE:  '+A Question of Love', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  '+A Question of Love table cell'",
+     "     VISIBLE:  '+A Question of Love table cell', cursor=1",
+     "SPEECH OUTPUT: '+A Question of Love'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down Arrow",
+    ["BRAILLE LINE:  '+ Piece of Peace table cell'",
+     "     VISIBLE:  '+ Piece of Peace table cell', cursor=1",
+     "BRAILLE LINE:  '+ Piece of Peace table cell'",
+     "     VISIBLE:  '+ Piece of Peace table cell', cursor=1",
+     "SPEECH OUTPUT: '+ Piece of Peace'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Down Arrow",
+    ["BRAILLE LINE:  '+ International Law table cell'",
+     "     VISIBLE:  '+ International Law table cell', cursor=1",
+     "BRAILLE LINE:  '+ International Law table cell'",
+     "     VISIBLE:  '+ International Law table cell', cursor=1",
+     "SPEECH OUTPUT: '+ International Law'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Up Arrow",
+    ["BRAILLE LINE:  '+ Piece of Peace table cell'",
+     "     VISIBLE:  '+ Piece of Peace table cell', cursor=1",
+     "BRAILLE LINE:  '+ Piece of Peace table cell'",
+     "     VISIBLE:  '+ Piece of Peace table cell', cursor=1",
+     "SPEECH OUTPUT: '+ Piece of Peace'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Up Arrow",
+    ["BRAILLE LINE:  '+A Question of Love table cell'",
+     "     VISIBLE:  '+A Question of Love table cell', cursor=1",
+     "BRAILLE LINE:  '+A Question of Love table cell'",
+     "     VISIBLE:  '+A Question of Love table cell', cursor=1",
+     "SPEECH OUTPUT: '+A Question of Love'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "6. basic whereAmI",
+    ["BRAILLE LINE:  '+A Question of Love table cell'",
+     "     VISIBLE:  '+A Question of Love table cell', cursor=1",
+     "SPEECH OUTPUT: 'table row +A Question of Love'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "7. Space to expand the current item",
+    ["KNOWN ISSUE: Why aren't we also speaking this?",
+     "BRAILLE LINE:  '-A Question of Love table cell'",
+     "     VISIBLE:  '-A Question of Love table cell', cursor=1",
+     "BRAILLE LINE:  '-A Question of Love table cell'",
+     "     VISIBLE:  '-A Question of Love table cell', cursor=1"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "8. basic whereAmI",
+    ["BRAILLE LINE:  '-A Question of Love table cell'",
+     "     VISIBLE:  '-A Question of Love table cell', cursor=1",
+     "SPEECH OUTPUT: 'table row -A Question of Love'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Down Arrow into child",
+    ["BRAILLE LINE:  '978-3-453-40540-0 table cell'",
+     "     VISIBLE:  '978-3-453-40540-0 table cell', cursor=1",
+     "BRAILLE LINE:  '978-3-453-40540-0 table cell'",
+     "     VISIBLE:  '978-3-453-40540-0 table cell', cursor=1",
+     "SPEECH OUTPUT: '978-3-453-40540-0'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Right Arrow in child",
+    ["BRAILLE LINE:  'Nora Roberts table cell'",
+     "     VISIBLE:  'Nora Roberts table cell', cursor=1",
+     "BRAILLE LINE:  'Nora Roberts table cell'",
+     "     VISIBLE:  'Nora Roberts table cell', cursor=1",
+     "SPEECH OUTPUT: 'Nora Roberts'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Right Arrow in child",
+    ["BRAILLE LINE:  '$ 9.99 table cell'",
+     "     VISIBLE:  '$ 9.99 table cell', cursor=1",
+     "BRAILLE LINE:  '$ 9.99 table cell'",
+     "     VISIBLE:  '$ 9.99 table cell', cursor=1",
+     "SPEECH OUTPUT: '$ 9.99'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Left Arrow in child",
+    ["BRAILLE LINE:  'Nora Roberts table cell'",
+     "     VISIBLE:  'Nora Roberts table cell', cursor=1",
+     "BRAILLE LINE:  'Nora Roberts table cell'",
+     "     VISIBLE:  'Nora Roberts table cell', cursor=1",
+     "SPEECH OUTPUT: 'Nora Roberts'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Left Arrow in child",
+    ["BRAILLE LINE:  '978-3-453-40540-0 table cell'",
+     "     VISIBLE:  '978-3-453-40540-0 table cell', cursor=1",
+     "BRAILLE LINE:  '978-3-453-40540-0 table cell'",
+     "     VISIBLE:  '978-3-453-40540-0 table cell', cursor=1",
+     "SPEECH OUTPUT: '978-3-453-40540-0'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Up Arrow back to parent",
+    ["BRAILLE LINE:  '-A Question of Love table cell'",
+     "     VISIBLE:  '-A Question of Love table cell', cursor=1",
+     "BRAILLE LINE:  '-A Question of Love table cell'",
+     "     VISIBLE:  '-A Question of Love table cell', cursor=1",
+     "SPEECH OUTPUT: '-A Question of Love'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/find_wiki.params b/test/keystrokes/firefox/find_wiki.params
new file mode 100644
index 0000000..0dafc37
--- /dev/null
+++ b/test/keystrokes/firefox/find_wiki.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/orca-wiki.html
diff --git a/test/keystrokes/firefox/find_wiki.py b/test/keystrokes/firefox/find_wiki.py
index 584ae96..15fc2b3 100644
--- a/test/keystrokes/firefox/find_wiki.py
+++ b/test/keystrokes/firefox/find_wiki.py
@@ -1,166 +1,66 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of find output of Firefox on the Orca wiki."""
+"""Test of find result presentation."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "wiki" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "orca-wiki.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("Orca - GNOME Live!",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-sequence.append(PauseAction(6000))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'Home News Projects Art Support Development Community'",
-     "     VISIBLE:  'Home News Projects Art Support D', cursor=1",
-     "SPEECH OUTPUT: 'Home link News link Projects link Art link Support link Development link Community 
link'"]))
-
-########################################################################
-# Get into the Find toolbar and type Orca.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>F"))
-sequence.append(utils.AssertPresentationAction(
-    "Get into the Find Toolbar", 
-    ["BRAILLE LINE:  '" + utils.firefoxAppNames + " Application Orca - GNOME Live! - " + 
utils.firefoxFrameNames + " Frame ScrollPane ToolBar Find:  \$l'",
-     "     VISIBLE:  'Find:  $l', cursor=7",
-     "BRAILLE LINE:  '" + utils.firefoxAppNames + " Application Orca - GNOME Live! - " + 
utils.firefoxFrameNames + " Frame ScrollPane ToolBar Find:  \$l'",
-     "     VISIBLE:  'Find:  $l', cursor=7",
-     "SPEECH OUTPUT: 'Find: text'"]))
-
-# We won't use an assert here because different builds of Firefox give
-# different results.
-#
 sequence.append(TypeAction("orca"))
 
-########################################################################
-# Press Return to move from result to result.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Return"))
-sequence.append(utils.AssertPresentationAction(
-    "1. Return",
-    ["SPEECH OUTPUT: 'Welcome to Orca! heading level 1'"]))
-
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Return"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Return",
-    ["SPEECH OUTPUT: '1. Welcome to Orca! link'"]))
+    "1. Return to next result",
+    ["BRAILLE LINE:  'Welcome to Orca! heading'",
+     "     VISIBLE:  'Welcome to Orca! heading', cursor=12",
+     "SPEECH OUTPUT: 'Welcome to Orca!'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Return"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Return",
-    ["SPEECH OUTPUT: 'Orca is a free, open source, flexible, extensible, and powerful'"]))
+    "2. Return to next result",
+    ["BRAILLE LINE:  'Welcome to Orca!'",
+     "     VISIBLE:  'Welcome to Orca!', cursor=1",
+     "SPEECH OUTPUT: '1.'",
+     "SPEECH OUTPUT: 'Welcome to Orca!'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Return"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Return",
-    ["SPEECH OUTPUT: 'magnification, Orca helps provide access to applications and'"]))
+    "3. Return to next result",
+    ["BRAILLE LINE:  'Orca is a free, open source, flexible, extensible, and  $l'",
+     "     VISIBLE:  'Orca is a free, open source, fle', cursor=1",
+     "SPEECH OUTPUT: 'Orca is a free, open source, flexible, extensible, and '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Return"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Return",
-    ["SPEECH OUTPUT: 'development of Orca has been led by the Accessibility Program link'"]))
+    "4. Return to next result",
+    ["BRAILLE LINE:  'synthesis, braille, and magnification, Orca helps provide  $l'",
+     "     VISIBLE:  's, braille, and magnification, O', cursor=32",
+     "SPEECH OUTPUT: 'synthesis, braille, and magnification, Orca helps provide '"]))
 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Return"))
-sequence.append(utils.AssertPresentationAction(
-    "6. Return",
-    ["SPEECH OUTPUT: 'Please join and participate on the Orca mailing list link  \( archives link \): it's a 
helpful, kind, and productive'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Return"))
-sequence.append(utils.AssertPresentationAction(
-    "7. Return",
-    ["SPEECH OUTPUT: 'Darragh Ó Héiligh link  has created several audio guides for Orca. This is a fantastic 
contribution'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Return"))
-sequence.append(utils.AssertPresentationAction(
-    "8. Return",
-    ["SPEECH OUTPUT: '• Review of Fedora 7 and the Orca screen reader for the Gnome graphical desktop 
link'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Return"))
-sequence.append(utils.AssertPresentationAction(
-    "9. Return",
-    ["SPEECH OUTPUT: '(• |)Guide to installing the latest versions of Firefox and Orca link'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Return"))
-sequence.append(utils.AssertPresentationAction(
-    "10. Return",
-    ["SPEECH OUTPUT: 'As of GNOME 2.16, Orca is a part of the GNOME platform. As a result, Orca is already 
provided by'"]))
-
-########################################################################
-# Press Escape to exit the Find toolbar and return to the page content.
-#
-# Depending on the version of Firefox, we sometimes behave as if the page
-# has just finished loading. I'm not sure what triggers that, and it does
-# not always occur. It also seems to be fixed in the latest Firefox trunk.
-# Therefore, we'll accept either situation for the purpose of reproducible
-# results and not use an assertion here.
-# 
 sequence.append(KeyComboAction("Escape"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Escape to return to page content",
+    ["BRAILLE LINE:  'synthesis, braille, and magnification, Orca helps provide'",
+     "     VISIBLE:  'raille, and magnification, Orca ', cursor=32",
+     "SPEECH OUTPUT: 'synthesis, braille, and magnification, Orca helps provide  selected'"]))
 
-########################################################################
-# Press Down Arrow to read the next line (verifying that the caret 
-# position was correctly updated when the Find toolbar was closed).
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Down",
-    ["BRAILLE LINE:  'default on a number of operating system distributions, including Open Solaris and 
Ubuntu.'",
-     "     VISIBLE:  'default on a number of operating', cursor=1",
-     "SPEECH OUTPUT: 'default on a number of operating system distributions, including Open Solaris link  
and Ubuntu link .'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+    "6. Down arrow to be sure we've updated our position",
+    ["BRAILLE LINE:  'access to applications and toolkits that support the AT-SPI'",
+     "     VISIBLE:  'access to applications and toolk', cursor=1",
+     "SPEECH OUTPUT: 'access to applications and toolkits that support the AT-SPI '"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/flat_review_combo_box.params 
b/test/keystrokes/firefox/flat_review_combo_box.params
new file mode 100644
index 0000000..d5d4a59
--- /dev/null
+++ b/test/keystrokes/firefox/flat_review_combo_box.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/combobox.html
diff --git a/test/keystrokes/firefox/flat_review_combo_box.py 
b/test/keystrokes/firefox/flat_review_combo_box.py
index 62d4490..9fcf2c7 100644
--- a/test/keystrokes/firefox/flat_review_combo_box.py
+++ b/test/keystrokes/firefox/flat_review_combo_box.py
@@ -1,73 +1,27 @@
 #!/usr/bin/python
 
-"""Test of HTML combo box output of Firefox, including label guess and
-forcing a combo box that has been reached by caret browsing to expand
-and gain focus.
-"""
+"""Test of flat reviewing HTML."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local combo box test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "combobox.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Combo Box Regression Test",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'Severity: Severity normal Combo'",
-     "     VISIBLE:  'Severity: Severity normal Combo', cursor=1",
-     "SPEECH OUTPUT: 'Severity link : Severity normal combo box'"]))
-
-########################################################################
-# Press Tab once to get to the Severity link. 
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
-sequence.append(utils.AssertPresentationAction(
-    "Tab to Severity combo box", 
-    ["BRAILLE LINE:  'Severity: Severity normal Combo'",
-     "     VISIBLE:  'Severity: Severity normal Combo', cursor=1",
-     "SPEECH OUTPUT: 'Severity link'"]))
 
-########################################################################
-# Read the current line with KP_8.
-#
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_8", 1000))
+sequence.append(KeyComboAction("KP_8"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review current line", 
+    "1. Flat review current line",
     ["BRAILLE LINE:  'Severity Severity :  normal $l'",
-     "     VISIBLE:  'Severity Severity :  normal $l', cursor=10",
+     "     VISIBLE:  'Severity Severity :  normal $l', cursor=22",
      "SPEECH OUTPUT: 'Severity Severity :  normal'"]))
 
-########################################################################
-# Read the rest of the document with KP_9.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
+    "2. Flat review next line",
     ["BRAILLE LINE:  'Priority :  Normal $l'",
      "     VISIBLE:  'Priority :  Normal $l', cursor=1",
      "SPEECH OUTPUT: 'Priority :  Normal'"]))
@@ -75,7 +29,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
+    "3. Flat review next line",
     ["BRAILLE LINE:  'Resolution:  $l'",
      "     VISIBLE:  'Resolution:  $l', cursor=1",
      "SPEECH OUTPUT: 'Resolution: ",
@@ -84,7 +38,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
+    "4. Flat review next line",
     ["BRAILLE LINE:  'FIXED $l'",
      "     VISIBLE:  'FIXED $l', cursor=1",
      "SPEECH OUTPUT: 'FIXED' voice=uppercase"]))
@@ -92,7 +46,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
+    "5. Flat review next line",
     ["BRAILLE LINE:  'Version 2.16 $l'",
      "     VISIBLE:  'Version 2.16 $l', cursor=1",
      "SPEECH OUTPUT: 'Version 2.16'"]))
@@ -100,7 +54,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
+    "6. Flat review next line",
     ["BRAILLE LINE:  'Component $l'",
      "     VISIBLE:  'Component $l', cursor=1",
      "SPEECH OUTPUT: 'Component'"]))
@@ -108,28 +62,10 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
+    "7. Flat review next line",
     ["BRAILLE LINE:  'Speech $l'",
      "     VISIBLE:  'Speech $l', cursor=1",
      "SPEECH OUTPUT: 'Speech'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/flat_review_text_by_line.params 
b/test/keystrokes/firefox/flat_review_text_by_line.params
new file mode 100644
index 0000000..dad99a0
--- /dev/null
+++ b/test/keystrokes/firefox/flat_review_text_by_line.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/blockquotes.html
diff --git a/test/keystrokes/firefox/flat_review_text_by_line.py 
b/test/keystrokes/firefox/flat_review_text_by_line.py
index 1f2f2f2..c6db860 100644
--- a/test/keystrokes/firefox/flat_review_text_by_line.py
+++ b/test/keystrokes/firefox/flat_review_text_by_line.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
 """Test of flat review by line in a simple text document."""
@@ -8,224 +7,53 @@ import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local blockquote test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "blockquotes.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Blockquote Regression Test",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-sequence.append(PauseAction(3000))
-
-########################################################################
-# Read the current line with KP_8.
-#
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_8", 1000))
+sequence.append(KeyComboAction("KP_8"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review current line", 
+    "1. Flat review current line",
     ["BRAILLE LINE:  'On weaponry: $l'",
      "     VISIBLE:  'On weaponry: $l', cursor=1",
      "SPEECH OUTPUT: 'On weaponry:'"]))
 
-########################################################################
-# Read the rest of the document with KP_9.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
+    "2. Flat review next line",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
      "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=1",
-     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and '"]))
+     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["BRAILLE LINE:  'surprise. And ruthless efficiency. Our three weapons are fear, surprise, and ruthless 
efficiency. And an almost fanatical devotion to the Pope.  $l'",
-     "     VISIBLE:  'surprise. And ruthless efficienc', cursor=1",
-     "SPEECH OUTPUT: 'surprise. And ruthless efficiency. Our three weapons are fear, surprise, and ruthless 
efficiency. And an almost fanatical devotion to the Pope. '"]))
+    "3. Flat review next line",
+    ["BRAILLE LINE:  'surprise. Our two weapons are fear and surprise. And ruthless efficiency. Our three 
weapons are fear,  $l'",
+     "     VISIBLE:  'surprise. Our two weapons are fe', cursor=1",
+     "SPEECH OUTPUT: 'surprise. Our two weapons are fear and surprise. And ruthless efficiency. Our three 
weapons are fear, '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_9"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["BRAILLE LINE:  'Our four. No. Amongst our weapons. Amongst our weaponry, are such elements as fear, 
surprise. I'll come in again. NOBODY expects the  $l'",
-     "     VISIBLE:  'Our four. No. Amongst our weapon', cursor=1",
-     "SPEECH OUTPUT: 'Our four. No. Amongst our weapons. Amongst our weaponry, are such elements as fear, 
surprise. I'll come in again. NOBODY expects the '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_9"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["BRAILLE LINE:  'Spanish Inquisition! Amongst our weaponry are such diverse elements as: fear, 
surprise, ruthless efficiency, an almost fanatical devotion to the  $l'",
-     "     VISIBLE:  'Spanish Inquisition! Amongst our', cursor=1",
-     "SPEECH OUTPUT: 'Spanish Inquisition! Amongst our weaponry are such diverse elements as: fear, 
surprise, ruthless efficiency, an almost fanatical devotion to the '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_9"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["BUG? - Why are we presenting the text twice?",
-     "BRAILLE LINE:  'Pope, and nice red uniforms - Oh damn! Pope, and nice red uniforms - Oh damn!  $l'",
-     "     VISIBLE:  'Pope, and nice red uniforms - Oh', cursor=1",
-     "SPEECH OUTPUT: 'Pope, and nice red uniforms - Oh damn! Pope, and nice red uniforms - Oh damn! '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_9"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["BRAILLE LINE:  'On old ladies: $l'",
-     "     VISIBLE:  'On old ladies: $l', cursor=1",
-     "SPEECH OUTPUT: 'On old ladies:'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_9"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["BRAILLE LINE:  '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  $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 '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_9"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["BUG? - Why are we presenting the text twice?",
-     "BRAILLE LINE:  'be free. Three last chances. You have three last chances, the nature of which I have 
divulged in my previous utterance. be free. Three last chances. You have three last chances, the nature of 
which I have divulged in my previous utterance.  $l'",
-     "     VISIBLE:  'be free. Three last chances. You', cursor=1",
-     "SPEECH OUTPUT: 'be free. Three last chances. You have three last chances, the nature of which I have 
divulged in my previous utterance. 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("KP_9"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["BRAILLE LINE:  'On castle decor: $l'",
-     "     VISIBLE:  'On castle decor: $l', cursor=1",
-     "SPEECH OUTPUT: 'On castle decor:'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_9"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next line", 
-    ["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! '"]))
-
-########################################################################
-# Read the document in reverse order with KP_7.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_7"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BRAILLE LINE:  'On castle decor: $l'",
-     "     VISIBLE:  'On castle decor: $l', cursor=1",
-     "SPEECH OUTPUT: 'On castle decor:'"]))
+    "4. Flat review next line",
+    ["BRAILLE LINE:  'surprise, and ruthless efficiency. And an almost fanatical devotion to the Pope. Our 
four. No. Amongst our  $l'",
+     "     VISIBLE:  'surprise, and ruthless efficienc', cursor=1",
+     "SPEECH OUTPUT: 'surprise, and ruthless efficiency. And an almost fanatical devotion to the Pope. Our 
four. No. Amongst our '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_7"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BUG? - Why are we presenting the text twice?",
-     "BRAILLE LINE:  'be free. Three last chances. You have three last chances, the nature of which I have 
divulged in my previous utterance. be free. Three last chances. You have three last chances, the nature of 
which I have divulged in my previous utterance.  $l'",
-     "     VISIBLE:  'be free. Three last chances. You', cursor=1",
-     "SPEECH OUTPUT: 'be free. Three last chances. You have three last chances, the nature of which I have 
divulged in my previous utterance. be free. Three last chances. You have three last chances, the nature of 
which I have divulged in my previous utterance. '"]))
+    "5. Flat review previous line",
+    ["BRAILLE LINE:  'surprise. Our two weapons are fear and surprise. And ruthless efficiency. Our three 
weapons are fear,  $l'",
+     "     VISIBLE:  'surprise. Our two weapons are fe', cursor=1",
+     "SPEECH OUTPUT: 'surprise. Our two weapons are fear and surprise. And ruthless efficiency. Our three 
weapons are fear, '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_7"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BRAILLE LINE:  '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  $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 '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_7"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BRAILLE LINE:  'On old ladies: $l'",
-     "     VISIBLE:  'On old ladies: $l', cursor=1",
-     "SPEECH OUTPUT: 'On old ladies:'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_7"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BUG? - Why are we presenting the text twice?",
-     "BRAILLE LINE:  'Pope, and nice red uniforms - Oh damn! Pope, and nice red uniforms - Oh damn!  $l'",
-     "     VISIBLE:  'Pope, and nice red uniforms - Oh', cursor=1",
-     "SPEECH OUTPUT: 'Pope, and nice red uniforms - Oh damn! Pope, and nice red uniforms - Oh damn! '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_7"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BRAILLE LINE:  'Spanish Inquisition! Amongst our weaponry are such diverse elements as: fear, 
surprise, ruthless efficiency, an almost fanatical devotion to the  $l'",
-     "     VISIBLE:  'Spanish Inquisition! Amongst our', cursor=1",
-     "SPEECH OUTPUT: 'Spanish Inquisition! Amongst our weaponry are such diverse elements as: fear, 
surprise, ruthless efficiency, an almost fanatical devotion to the '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_7"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BRAILLE LINE:  'Our four. No. Amongst our weapons. Amongst our weaponry, are such elements as fear, 
surprise. I'll come in again. NOBODY expects the  $l'",
-     "     VISIBLE:  'Our four. No. Amongst our weapon', cursor=1",
-     "SPEECH OUTPUT: 'Our four. No. Amongst our weapons. Amongst our weaponry, are such elements as fear, 
surprise. I'll come in again. NOBODY expects the '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_7"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BRAILLE LINE:  'surprise. And ruthless efficiency. Our three weapons are fear, surprise, and ruthless 
efficiency. And an almost fanatical devotion to the Pope.  $l'",
-     "     VISIBLE:  'surprise. And ruthless efficienc', cursor=1",
-     "SPEECH OUTPUT: 'surprise. And ruthless efficiency. Our three weapons are fear, surprise, and ruthless 
efficiency. And an almost fanatical devotion to the Pope. '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_7"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
+    "6. Flat review previous line",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
      "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=1",
-     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and '"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_7"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous line", 
-    ["BRAILLE LINE:  'On weaponry: $l'",
-     "     VISIBLE:  'On weaponry: $l', cursor=1",
-     "SPEECH OUTPUT: 'On weaponry:'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and '"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/flat_review_text_by_word_and_char.params 
b/test/keystrokes/firefox/flat_review_text_by_word_and_char.params
new file mode 100644
index 0000000..dad99a0
--- /dev/null
+++ b/test/keystrokes/firefox/flat_review_text_by_word_and_char.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/blockquotes.html
diff --git a/test/keystrokes/firefox/flat_review_text_by_word_and_char.py 
b/test/keystrokes/firefox/flat_review_text_by_word_and_char.py
index 9acf38c..4cadb6d 100644
--- a/test/keystrokes/firefox/flat_review_text_by_word_and_char.py
+++ b/test/keystrokes/firefox/flat_review_text_by_word_and_char.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
 """Test of flat review by word and char in a simple text document."""
@@ -8,53 +7,27 @@ import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local blockquote test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "blockquotes.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Blockquote Regression Test",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-sequence.append(PauseAction(3000))
-
-########################################################################
-# Read the current word with KP_5 and the next word with KP_6.
-#
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_5", 1000))
+sequence.append(KeyComboAction("KP_5"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review current word", 
+    "1. Flat review current word",
     ["BRAILLE LINE:  'On weaponry: $l'",
      "     VISIBLE:  'On weaponry: $l', cursor=1",
      "SPEECH OUTPUT: 'On'"]))
 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_6", 1000))
+sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review current word", 
+    "2. Flat review next word",
     ["BRAILLE LINE:  'On weaponry: $l'",
      "     VISIBLE:  'On weaponry: $l', cursor=4",
      "SPEECH OUTPUT: 'weaponry:'"]))
 
-########################################################################
-# Spell the current word with KP_5 2x.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_5"))
 sequence.append(KeyComboAction("KP_5"))
 sequence.append(utils.AssertPresentationAction(
-    "spell current word", 
+    "3. Spell current word",
     ["BRAILLE LINE:  'On weaponry: $l'",
      "     VISIBLE:  'On weaponry: $l', cursor=4",
      "BRAILLE LINE:  'On weaponry: $l'",
@@ -68,17 +41,14 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'n'",
      "SPEECH OUTPUT: 'r'",
      "SPEECH OUTPUT: 'y'",
-     "SPEECH OUTPUT: ':'"]))
+     "SPEECH OUTPUT: 'colon'"]))
 
-########################################################################
-# Spell the current word phonetically with KP_5 3x.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_5"))
 sequence.append(KeyComboAction("KP_5"))
 sequence.append(KeyComboAction("KP_5"))
 sequence.append(utils.AssertPresentationAction(
-    "spell current word phonetically", 
+    "4. Spell current word phonetically",
     ["BRAILLE LINE:  'On weaponry: $l'",
      "     VISIBLE:  'On weaponry: $l', cursor=4",
      "BRAILLE LINE:  'On weaponry: $l'",
@@ -94,7 +64,7 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'n'",
      "SPEECH OUTPUT: 'r'",
      "SPEECH OUTPUT: 'y'",
-     "SPEECH OUTPUT: ':'",
+     "SPEECH OUTPUT: 'colon'",
      "SPEECH OUTPUT: 'whiskey'",
      "SPEECH OUTPUT: 'echo'",
      "SPEECH OUTPUT: 'alpha'",
@@ -105,278 +75,107 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'yankee'",
      "SPEECH OUTPUT: ':'"]))
 
-########################################################################
-# Read forward word by word with KP_6.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
+    "flat review next word",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
      "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=1",
      "SPEECH OUTPUT: 'NOBODY' voice=uppercase"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_6"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
+    "flat review next word",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
      "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=8",
      "SPEECH OUTPUT: 'expects'"]))
 
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_6"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=16",
-     "SPEECH OUTPUT: 'the'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_6"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=20",
-     "SPEECH OUTPUT: 'Spanish'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_6"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=28",
-     "SPEECH OUTPUT: 'Inquisition!'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_6"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=9",
-     "SPEECH OUTPUT: 'Our'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_6"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=13",
-     "SPEECH OUTPUT: 'chief'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_6"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=19",
-     "SPEECH OUTPUT: 'weapon'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_6"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=26",
-     "SPEECH OUTPUT: 'is'"]))
-
-########################################################################
-# Read the current char with KP_2.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_2"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review current char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=26",
-     "SPEECH OUTPUT: 'i'"]))
-
-########################################################################
-# Read forward char by char with KP_3.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_3"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review next char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=27",
-     "SPEECH OUTPUT: 's'"]))
+    "flat review current char",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=8",
+     "BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=8",
+     "SPEECH OUTPUT: 'expects'",
+     "SPEECH OUTPUT: 'e'"]))
 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_3"))
+sequence.append(KeyComboAction("KP_2"))
+sequence.append(KeyComboAction("KP_2"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=28",
-     "SPEECH OUTPUT: 'space'"]))
+    "phonetic for current char",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=8",
+     "BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=8",
+     "SPEECH OUTPUT: 'e'",
+     "SPEECH OUTPUT: 'echo'"]))
 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_3"))
+sequence.append(KeyComboAction("KP_2"))
+sequence.append(KeyComboAction("KP_2"))
+sequence.append(KeyComboAction("KP_2"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=29",
-     "SPEECH OUTPUT: 's'"]))
+    "unicode for current char",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=8",
+     "BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=8",
+     "BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=8",
+     "SPEECH OUTPUT: 'e'",
+     "SPEECH OUTPUT: 'echo'",
+     "SPEECH OUTPUT: 'Unicode 0065'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_3"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=30",
-     "SPEECH OUTPUT: 'u'"]))
+    "flat review next char",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=9",
+     "SPEECH OUTPUT: 'x'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_3"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review next char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=31",
-     "SPEECH OUTPUT: 'r'"]))
-
-########################################################################
-# Read backwards char by char with KP_1.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_1"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=30",
-     "SPEECH OUTPUT: 'u'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_1"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=29",
-     "SPEECH OUTPUT: 's'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_1"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=28",
-     "SPEECH OUTPUT: 'space'"]))
+    "flat review next char",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=10",
+     "SPEECH OUTPUT: 'p'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_1"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review previous char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=27",
-     "SPEECH OUTPUT: 's'"]))
+    "flat review previous char",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
+     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=9",
+     "SPEECH OUTPUT: 'x'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_1"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review previous char", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=26",
-     "SPEECH OUTPUT: 'i'"]))
-
-########################################################################
-# Read backwards word by word with KP_4.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_4"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=19",
-     "SPEECH OUTPUT: 'weapon'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_4"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=13",
-     "SPEECH OUTPUT: 'chief'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_4"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'sition! Our chief weapon is surp', cursor=9",
-     "SPEECH OUTPUT: 'Our'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_4"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=28",
-     "SPEECH OUTPUT: 'Inquisition!'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_4"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=20",
-     "SPEECH OUTPUT: 'Spanish'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_4"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
-     "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=16",
-     "SPEECH OUTPUT: 'the'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_4"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
+    "flat review previous char",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
      "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=8",
-     "SPEECH OUTPUT: 'expects'"]))
+     "SPEECH OUTPUT: 'e'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_4"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and  $l'",
+    "flat review previous word",
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and  $l'",
      "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=1",
-     "SPEECH OUTPUT: 'NOBODY'"]))
+     "SPEECH OUTPUT: 'NOBODY' voice=uppercase"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_4"))
 sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
+    "flat review previous word",
     ["BRAILLE LINE:  'On weaponry: $l'",
      "     VISIBLE:  'On weaponry: $l', cursor=4",
      "SPEECH OUTPUT: 'weaponry:'"]))
 
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_4"))
-sequence.append(utils.AssertPresentationAction(
-    "flat review previous word", 
-    ["BRAILLE LINE:  'On weaponry: $l'",
-     "     VISIBLE:  'On weaponry: $l', cursor=1",
-     "SPEECH OUTPUT: 'On'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/focus_tracking_imagemap.params 
b/test/keystrokes/firefox/focus_tracking_imagemap.params
new file mode 100644
index 0000000..1fce9a7
--- /dev/null
+++ b/test/keystrokes/firefox/focus_tracking_imagemap.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/backwards.html
diff --git a/test/keystrokes/firefox/focus_tracking_imagemap.py 
b/test/keystrokes/firefox/focus_tracking_imagemap.py
new file mode 100644
index 0000000..056fdc4
--- /dev/null
+++ b/test/keystrokes/firefox/focus_tracking_imagemap.py
@@ -0,0 +1,82 @@
+#!/usr/bin/python
+
+"""Test of Orca output when tabbing on a page with imagemaps."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab",
+    ["KNOWN ISSUE: This seems a bit redundant/chatty",
+     "BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
+     "     VISIBLE:  'z y x w v u t s r q p o n m l k ', cursor=1",
+     "BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
+     "     VISIBLE:  'z y x w v u t s r q p o n m l k ', cursor=1",
+     "SPEECH OUTPUT: 'z'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink",
+     "SPEECH OUTPUT: 'z image map link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Tab",
+    ["BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
+     "     VISIBLE:  'y x w v u t s r q p o n m l k j ', cursor=1",
+     "BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
+     "     VISIBLE:  'y x w v u t s r q p o n m l k j ', cursor=1",
+     "SPEECH OUTPUT: 'y'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink",
+     "SPEECH OUTPUT: 'y image map link'"]))
+
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab",
+    ["BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
+     "     VISIBLE:  'a', cursor=1",
+     "BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
+     "     VISIBLE:  'a', cursor=1",
+     "SPEECH OUTPUT: 'a'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink",
+     "SPEECH OUTPUT: 'a image map link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Tab",
+    ["BRAILLE LINE:  'table cell wk09_frozenmovie image'",
+     "     VISIBLE:  'table cell wk09_frozenmovie imag', cursor=0",
+     "BRAILLE LINE:  'table cell wk09_frozenmovie image'",
+     "     VISIBLE:  'table cell wk09_frozenmovie imag', cursor=0",
+     "SPEECH OUTPUT: 'wk09_frozenmovie link image' voice=hyperlink"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/focus_tracking_links.params 
b/test/keystrokes/firefox/focus_tracking_links.params
new file mode 100644
index 0000000..5e35199
--- /dev/null
+++ b/test/keystrokes/firefox/focus_tracking_links.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-511389.html
diff --git a/test/keystrokes/firefox/focus_tracking_links.py b/test/keystrokes/firefox/focus_tracking_links.py
new file mode 100644
index 0000000..513b3f6
--- /dev/null
+++ b/test/keystrokes/firefox/focus_tracking_links.py
@@ -0,0 +1,54 @@
+#!/usr/bin/python
+
+"""Test of the fix for bug 511389."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  'Hello world, this is a test.'",
+     "     VISIBLE:  'Hello world, this is a test.', cursor=1",
+     "SPEECH OUTPUT: 'Hello world'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', this is a test. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down to the Foo link",
+    ["BRAILLE LINE:  'Foo'",
+     "     VISIBLE:  'Foo', cursor=1",
+     "SPEECH OUTPUT: 'Foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab to the Bar link",
+    ["BRAILLE LINE:  'Bar'",
+     "     VISIBLE:  'Bar', cursor=1",
+     "BRAILLE LINE:  'Bar'",
+     "     VISIBLE:  'Bar', cursor=1",
+     "SPEECH OUTPUT: 'Bar'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Shift Tab back to the Foo link",
+    ["BRAILLE LINE:  'Foo'",
+     "     VISIBLE:  'Foo', cursor=1",
+     "BRAILLE LINE:  'Foo'",
+     "     VISIBLE:  'Foo', cursor=1",
+     "SPEECH OUTPUT: 'Foo'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/html_page_summary.params 
b/test/keystrokes/firefox/html_page_summary.params
new file mode 100644
index 0000000..ea9c3de
--- /dev/null
+++ b/test/keystrokes/firefox/html_page_summary.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/htmlpage.html
diff --git a/test/keystrokes/firefox/html_page_summary.py b/test/keystrokes/firefox/html_page_summary.py
new file mode 100644
index 0000000..c58c602
--- /dev/null
+++ b/test/keystrokes/firefox/html_page_summary.py
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+
+"""Test of page summary"""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction("6"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Navigate to 'This is a Heading 6.'",
+    ["BRAILLE LINE:  'This is a Heading 6. h6'",
+     "     VISIBLE:  'This is a Heading 6. h6', cursor=1",
+     "SPEECH OUTPUT: 'This is a Heading 6.'",
+     "SPEECH OUTPUT: 'heading level 6'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(PauseAction(5000))
+sequence.append(utils.AssertPresentationAction(
+    "2. Where Am I for page summary info",
+    ["BRAILLE LINE:  'This is a Heading 6. h6'",
+     "     VISIBLE:  'This is a Heading 6. h6', cursor=1",
+     "BRAILLE LINE:  'This is a Heading 6. h6'",
+     "     VISIBLE:  'This is a Heading 6. h6', cursor=1",
+     "SPEECH OUTPUT: 'heading level 6'",
+     "SPEECH OUTPUT: 'This is a Heading 6.'",
+     "SPEECH OUTPUT: '14 headings 3 forms 47 tables'",
+     "SPEECH OUTPUT: '19 unvisited links'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/html_role_combo_box.params 
b/test/keystrokes/firefox/html_role_combo_box.params
new file mode 100644
index 0000000..d5d4a59
--- /dev/null
+++ b/test/keystrokes/firefox/html_role_combo_box.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/combobox.html
diff --git a/test/keystrokes/firefox/html_role_combo_box.py b/test/keystrokes/firefox/html_role_combo_box.py
index 4ef1307..4ef92e9 100644
--- a/test/keystrokes/firefox/html_role_combo_box.py
+++ b/test/keystrokes/firefox/html_role_combo_box.py
@@ -1,309 +1,159 @@
 #!/usr/bin/python
 
-"""Test of HTML combo box output of Firefox, including label guess and
-forcing a combo box that has been reached by caret browsing to expand
-and gain focus.
-"""
+"""Test of HTML combo box presentation."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local combo box test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "combobox.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Combo Box Regression Test",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
+sequence.append(KeyComboAction("<Control>Home"))
 
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Tab"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'Severity: Severity normal Combo'",
-     "     VISIBLE:  'Severity: Severity normal Combo', cursor=1",
-     "SPEECH OUTPUT: 'Severity link : Severity normal combo box'"]))
+    "1. Tab to Severity combo box",
+    ["BRAILLE LINE:  'Severity: Severity Severity combo box'",
+     "     VISIBLE:  'Severity Severity combo box', cursor=10",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  ':  $l'",
+     "     VISIBLE:  ':  $l', cursor=3",
+     "SPEECH OUTPUT: 'Severity normal combo box'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
 
-########################################################################
-# Press Tab once to get to the Severity link. 
-#
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("KP_Enter"))
 sequence.append(utils.AssertPresentationAction(
-    "Tab to Severity combo box", 
-    ["BRAILLE LINE:  'Severity: Severity normal Combo'",
-     "     VISIBLE:  'Severity: Severity normal Combo', cursor=1",
-     "SPEECH OUTPUT: 'Severity link'"]))
+    "2. Basic Where Am I",
+    ["KNOWN ISSUE: We want to present the displayed item",
+     "BRAILLE LINE:  'Severity Severity combo box'",
+     "     VISIBLE:  'Severity Severity combo box', cursor=10",
+     "SPEECH OUTPUT: 'Severity'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'normal'",
+     "SPEECH OUTPUT: '4 of 7'"]))
 
-########################################################################
-# Press Tab once to get to the Severity combo box.  This combo box
-# has a proper label (the Severity link that precedes it).
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
-sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_COMBO_BOX))
 sequence.append(utils.AssertPresentationAction(
-    "Tab to Severity combo box", 
-    ["BRAILLE LINE:  'Severity: Severity normal Combo'",
-     "     VISIBLE:  'Severity: Severity normal Combo', cursor=20",
-     "SPEECH OUTPUT: 'Severity normal combo box'"]))
+    "3. Tab to Priority link",
+    ["BRAILLE LINE:  'Priority'",
+     "     VISIBLE:  'Priority', cursor=1",
+     "BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "BRAILLE LINE:  'Priority:  combo box'",
+     "     VISIBLE:  'Priority:  combo box', cursor=1",
+     "SPEECH OUTPUT: 'Priority'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
 
-########################################################################
-# Press Tab twice to get to the Priority combo box.  This combo box
-# lacks a proper label. 
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
 sequence.append(utils.AssertPresentationAction(
-    "Tab to Priority Link", 
-    ["BRAILLE LINE:  'Priority: Normal Combo'",
-     "     VISIBLE:  'Priority: Normal Combo', cursor=1",
-     "SPEECH OUTPUT: 'Priority link'"]))
+    "4. Tab to Priority combo box",
+    ["BRAILLE LINE:  'Priority:  combo box'",
+     "     VISIBLE:  'Priority:  combo box', cursor=11",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  ':  $l'",
+     "     VISIBLE:  ':  $l', cursor=3",
+     "SPEECH OUTPUT: 'Priority: Normal combo box'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
-sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_COMBO_BOX))
 sequence.append(utils.AssertPresentationAction(
-    "Tab to Priority combo box", 
-    ["BRAILLE LINE:  'Priority: Normal Combo'",
-     "     VISIBLE:  'Priority: Normal Combo', cursor=11",
-     "SPEECH OUTPUT: 'Priority: Normal combo box'"]))
+    "5. Tab to Resolution combo box",
+    ["KNOWN ISSUE: We shouldn't be displaying the EOC",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  '\ufffc $l'",
+     "     VISIBLE:  '\ufffc $l', cursor=1",
+     "SPEECH OUTPUT: 'Resolution: FIXED combo box'"]))
 
-########################################################################
-# Press Down Arrow to change the selection to Low.  
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Change selection Down: Low",
-    ["BRAILLE LINE:  'Low'",
-     "     VISIBLE:  'Low', cursor=1",
-     "SPEECH OUTPUT: 'Low'"]))
+    "6. Change selection Down: WONTFIX",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'WONTFIX'"]))
 
-########################################################################
-# Press Up Arrow to change the selection back to Normal.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Change selection Up: Normal",
-    ["BRAILLE LINE:  'Normal'",
-     "     VISIBLE:  'Normal', cursor=1",
-     "SPEECH OUTPUT: 'Normal'"]))
+    "7. Change selection Up: FIXED",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'FIXED'"]))
 
-########################################################################
-# Press Alt Down Arrow to expand the combo box.  
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Alt>Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Alt Down to Expand",
-    ["BRAILLE LINE:  'Priority: Normal Combo'",
-     "     VISIBLE:  'Priority: Normal Combo', cursor=11",
-     "BRAILLE LINE:  'Normal'",
-     "     VISIBLE:  'Normal', cursor=1",
-     "SPEECH OUTPUT: 'Normal combo box'",
-     "SPEECH OUTPUT: 'Normal'"]))
+    "8. Alt Down to Expand",
+    ["KNOWN ISSUE: We are presenting nothing here",
+     ""]))
 
-########################################################################
-# Press Down Arrow to change the selection back to Low.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Change selection Down: Low",
-    ["BRAILLE LINE:  'Low'",
-     "     VISIBLE:  'Low', cursor=1",
-     "SPEECH OUTPUT: 'Low'"]))
+    "9. Change selection Down: WONTFIX",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'WONTFIX'"]))
 
-########################################################################
-# Press Return to collapse the combo box with Low selected.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Return"))
 sequence.append(utils.AssertPresentationAction(
-    "Return to collapse combo box",
-    ["BRAILLE LINE:  'Priority: Low Combo'",
-     "     VISIBLE:  'Priority: Low Combo', cursor=11",
-     "SPEECH OUTPUT: 'Priority: Low combo box'"]))
+    "10. Return to collapse combo box",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'Resolution: WONTFIX combo box'",
+     "SPEECH OUTPUT: 'WONTFIX'",
+     "SPEECH OUTPUT: 'combo box'"]))
 
-########################################################################
-# Press Tab once to get to the Resolution combo box.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
-sequence.append(WaitForFocus("", acc_role=pyatspi.ROLE_COMBO_BOX))
 sequence.append(utils.AssertPresentationAction(
-    "Tab",
-    ["BRAILLE LINE:  'FIXED Combo'",
-     "     VISIBLE:  'FIXED Combo', cursor=1",
-     "SPEECH OUTPUT: 'Resolution: FIXED combo box'"]))
+    "11. Tab to Version combo box",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'Version 2.16 combo box'"]))
 
-########################################################################
-# Press Left Arrow once to move off of this combo box.
-# 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Left"))
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("a"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Left out of combo box", 
-    ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=0",
-     "SPEECH OUTPUT: 'Resolution: FIXED combo box'"]))
+    "12. Toggle Browse Mode",
+    ["BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
 
-########################################################################
-# Press Down Arrow once to move to the next line.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
-sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Resolution:'",
-     "     VISIBLE:  'Resolution:', cursor=1",
-     "SPEECH OUTPUT: 'Resolution:",
-     "'"]))
 
-########################################################################
-# Press Down Arrow again to move to the next line which contains a
-# combo box.
-#
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Left"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  'FIXED Combo'",
-     "     VISIBLE:  'FIXED Combo', cursor=1",
-     "SPEECH OUTPUT: 'Resolution:'",
-     "SPEECH OUTPUT: 'FIXED' voice=uppercase",
+    "13. Left out of combo box",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "BRAILLE LINE:  'Version combo box'",
+     "     VISIBLE:  'Version combo box', cursor=8",
+     "SPEECH OUTPUT: 'Version 2.16'",
      "SPEECH OUTPUT: 'combo box'"]))
 
-########################################################################
-# Press Down Arrow once to move to the next line.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
-sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Version 2.16 Combo'",
-     "     VISIBLE:  'Version 2.16 Combo', cursor=1",
-     "SPEECH OUTPUT: 'Version 2.16 combo box'"]))
-
-########################################################################
-# Press Down Arrow again to move to the next line which contains the
-# word Component.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
+    "14. Line Down",
     ["BRAILLE LINE:  'Component'",
      "     VISIBLE:  'Component', cursor=1",
      "SPEECH OUTPUT: 'Component'"]))
 
-########################################################################
-# Press Down Arrow again to move to the next line which contains a
-# combo box.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
-sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  'Speech Combo'",
-     "     VISIBLE:  'Speech Combo', cursor=1",
-     "SPEECH OUTPUT: 'Speech combo box'"]))
-
-########################################################################
-# Press Alt Down Arrow once to grab focus on this technically unfocused
-# combo box and force it to expand.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("<Alt>Down"))
-sequence.append(utils.AssertPresentationAction(
-    "Alt Down to Expand", 
-    ["BRAILLE LINE:  'Speech Combo'",
-     "     VISIBLE:  'Speech Combo', cursor=1",
-     "BRAILLE LINE:  'Speech'",
-     "     VISIBLE:  'Speech', cursor=1",
-     "SPEECH OUTPUT: 'Speech combo box'",
-     "SPEECH OUTPUT: 'Speech'"]))
-
-########################################################################
-# Press Down Arrow to change the selection.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
-sequence.append(utils.AssertPresentationAction(
-    "Change selection Down", 
-    ["BRAILLE LINE:  'Braille'",
-     "     VISIBLE:  'Braille', cursor=1",
-     "SPEECH OUTPUT: 'Braille'"]))
-
-########################################################################
-# Press Return to collapse the combo box.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Return"))
-sequence.append(utils.AssertPresentationAction(
-    "Return to collapse combo box",
-    ["BRAILLE LINE:  'Braille Combo'",
-     "     VISIBLE:  'Braille Combo', cursor=1",
-     "SPEECH OUTPUT: 'Component Braille combo box'"]))
-
-########################################################################
-# Do a basic "Where Am I" via KP_Enter. 
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
-sequence.append(utils.AssertPresentationAction(
-    "Basic Where Am I", 
-    ["BUG? - The item count appears to be incorrect",
-     "BRAILLE LINE:  'Braille Combo'",
-     "     VISIBLE:  'Braille Combo', cursor=1",
-     "SPEECH OUTPUT: 'Component combo box Braille 1 of 1'"]))
-
-########################################################################
-# Press Shift Tab once to return to the Version combo box.  
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("<Shift>Tab"))
-sequence.append(utils.AssertPresentationAction(
-    "Shift Tab to Version", 
-    ["BRAILLE LINE:  'Version 2.16 Combo'",
-     "     VISIBLE:  'Version 2.16 Combo', cursor=9",
-     "SPEECH OUTPUT: 'Version 2.16 combo box'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_role_links.params b/test/keystrokes/firefox/html_role_links.params
new file mode 100644
index 0000000..6041395
--- /dev/null
+++ b/test/keystrokes/firefox/html_role_links.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/anchors2.html
diff --git a/test/keystrokes/firefox/html_role_links.py b/test/keystrokes/firefox/html_role_links.py
index ff44402..6fcfbfa 100644
--- a/test/keystrokes/firefox/html_role_links.py
+++ b/test/keystrokes/firefox/html_role_links.py
@@ -1,149 +1,87 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of HTML links output of Firefox, including basic navigation and
-where am I.
-"""
+"""Test of HTML links presentation."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local anchors test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "anchors2.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Links to test files",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
+    "1. Top of file",
     ["BRAILLE LINE:  'Here are some of our local test files:'",
      "     VISIBLE:  'Here are some of our local test ', cursor=1",
      "SPEECH OUTPUT: 'Here are some of our local test files:'"]))
 
-########################################################################
-# Press Tab to move to the anchors.html link.  
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
 sequence.append(utils.AssertPresentationAction(
-    "Tab to anchors.html link", 
+    "2. Tab to anchors.html link",
     ["BRAILLE LINE:  '•anchors.html'",
      "     VISIBLE:  '•anchors.html', cursor=2",
-     "SPEECH OUTPUT: 'anchors.html link'"]))
+     "BRAILLE LINE:  '•anchors.html'",
+     "     VISIBLE:  '•anchors.html', cursor=2",
+     "SPEECH OUTPUT: 'anchors.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-########################################################################
-# Press Tab to move to the blockquotes.html link.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
 sequence.append(utils.AssertPresentationAction(
-    "Tab to blockquotes.html link", 
+    "3. Tab to blockquotes.html link",
     ["BRAILLE LINE:  '•blockquotes.html'",
      "     VISIBLE:  '•blockquotes.html', cursor=2",
-     "SPEECH OUTPUT: 'blockquotes.html link'"]))
+     "BRAILLE LINE:  '•blockquotes.html'",
+     "     VISIBLE:  '•blockquotes.html', cursor=2",
+     "SPEECH OUTPUT: 'blockquotes.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-########################################################################
-# Press Tab to move to the bugzilla_top.html link.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Tab"))
 sequence.append(utils.AssertPresentationAction(
-    "Tab to bugzilla_top.html link", 
+    "4. Tab to bugzilla_top.html link",
     ["BRAILLE LINE:  '•bugzilla_top.html'",
      "     VISIBLE:  '•bugzilla_top.html', cursor=2",
-     "SPEECH OUTPUT: 'bugzilla_top.html link'"]))
+     "BRAILLE LINE:  '•bugzilla_top.html'",
+     "     VISIBLE:  '•bugzilla_top.html', cursor=2",
+     "SPEECH OUTPUT: 'bugzilla_top.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-########################################################################
-# Press Shift+Tab to move to the blockquotes.html link.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>Tab"))
 sequence.append(utils.AssertPresentationAction(
-    "Shift Tab to blockquotes.html link", 
+    "5. Shift Tab to blockquotes.html link",
     ["BRAILLE LINE:  '•blockquotes.html'",
      "     VISIBLE:  '•blockquotes.html', cursor=2",
-     "SPEECH OUTPUT: 'blockquotes.html link'"]))
+     "BRAILLE LINE:  '•blockquotes.html'",
+     "     VISIBLE:  '•blockquotes.html', cursor=2",
+     "SPEECH OUTPUT: 'blockquotes.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-########################################################################
-# Do a basic "Where Am I" via KP_Enter.  Because we're on a link, we
-# get special link-related information.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "Basic Where Am I", 
+    "6. Basic Where Am I",
     ["BRAILLE LINE:  '•blockquotes.html'",
      "     VISIBLE:  '•blockquotes.html', cursor=2",
      "SPEECH OUTPUT: 'file link to blockquotes.html same site 1188 bytes'"]))
 
-########################################################################
-# Press Return to follow the blockquotes.html link.
-#
 sequence.append(KeyComboAction("Return"))
 sequence.append(WaitForDocLoad())
 
-########################################################################
-# Press Alt+Left Arrow to return to the anchors2.html page.
-#
 sequence.append(KeyComboAction("<Alt>Left"))
 sequence.append(WaitForDocLoad())
-sequence.append(PauseAction(3000))
 
-# Hack to ignore a focus event that will temporarily update braille
-#
-sequence.append(KeyComboAction("Down"))
-sequence.append(KeyComboAction("Up"))
-
-########################################################################
-# Press Up Arrow to move to the anchors.html link.  We probably won't
-# get a focus event, so we'll just pause in the next step.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up to anchors.html", 
-    ["BUG? - Focus is not leaving the link we were on. Probably one of those recent Gecko/Mozilla 
regressions. Need to investigate further.",
-     "BRAILLE LINE:  '• anchors.html'",
-     "     VISIBLE:  '• anchors.html', cursor=1",
-     "SPEECH OUTPUT: '• anchors.html link'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l", 1000))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+    "7. Line Up to anchors.html",
+    ["BRAILLE LINE:  '•anchors.html'",
+     "     VISIBLE:  '•anchors.html', cursor=2",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'anchors.html'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_role_list_item_where_am_i.params 
b/test/keystrokes/firefox/html_role_list_item_where_am_i.params
new file mode 100644
index 0000000..734b9c6
--- /dev/null
+++ b/test/keystrokes/firefox/html_role_list_item_where_am_i.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/lists2.html
diff --git a/test/keystrokes/firefox/html_role_list_item_where_am_i.py 
b/test/keystrokes/firefox/html_role_list_item_where_am_i.py
index 304b096..3f13006 100644
--- a/test/keystrokes/firefox/html_role_list_item_where_am_i.py
+++ b/test/keystrokes/firefox/html_role_list_item_where_am_i.py
@@ -1,124 +1,75 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of HTML list output of Firefox, in particular where am I.
-"""
+"""Test of HTML list item whereAmI presentation."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local lists test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "lists2.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Lists Test",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  '•Not in a paragraph'",
-     "     VISIBLE:  '•Not in a paragraph', cursor=1",
+     "     VISIBLE:  '•Not in a paragraph', cursor=2",
      "SPEECH OUTPUT: '•Not in a paragraph'"]))
 
-########################################################################
-# Press Down Arrow to move through the lists doing a where am I for each
-# list item.
-#
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "1. Basic Where Am I",
+    "2. Basic Where Am I next item",
     ["BRAILLE LINE:  '• In a paragraph'",
-     "     VISIBLE:  '• In a paragraph', cursor=1",
-     "SPEECH OUTPUT: 'list item • In a paragraph 2 of 4'"]))
+     "     VISIBLE:  '• In a paragraph', cursor=3",
+     "SPEECH OUTPUT: 'In a paragraph'"]))
 
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "2. Basic Where Am I",
+    "3. Basic Where Am I next item",
     ["BRAILLE LINE:  '• In a section'",
-     "     VISIBLE:  '• In a section', cursor=1",
-     "SPEECH OUTPUT: 'list item • In a section 3 of 4'"]))
+     "     VISIBLE:  '• In a section', cursor=3",
+     "SPEECH OUTPUT: 'In a section'"]))
 
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "3. Basic Where Am I",
+    "4. Basic Where Am I next item",
     ["BRAILLE LINE:  '1.A nested list item, not in a paragraph'",
-     "     VISIBLE:  '1.A nested list item, not in a p', cursor=1",
-     "SPEECH OUTPUT: 'list item 1.A nested list item, not in a paragraph 1 of 3 Nesting level 1'"]))
+     "     VISIBLE:  '1.A nested list item, not in a p', cursor=3",
+     "SPEECH OUTPUT: 'list item'",
+     "SPEECH OUTPUT: '1.A nested list item, not in a paragraph'",
+     "SPEECH OUTPUT: '1 of 3 Nesting level 1'"]))
 
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "4. Basic Where Am I",
+    "5. Basic Where Am I next item",
     ["BRAILLE LINE:  '2. A nested list item, in a paragraph'",
-     "     VISIBLE:  '2. A nested list item, in a para', cursor=1",
-     "SPEECH OUTPUT: 'list item 2. A nested list item, in a paragraph 2 of 3 Nesting level 1'"]))
+     "     VISIBLE:  'A nested list item, in a paragra', cursor=1",
+     "SPEECH OUTPUT: 'A nested list item, in a paragraph'"]))
 
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "5. Basic Where Am I",
+    "6. Basic Where Am I next item",
     ["BRAILLE LINE:  '3. A nested list item, in a section'",
-     "     VISIBLE:  '3. A nested list item, in a sect', cursor=1",
-     "SPEECH OUTPUT: 'list item 3. A nested list item, in a section 3 of 3 Nesting level 1'"]))
+     "     VISIBLE:  'A nested list item, in a section', cursor=1",
+     "SPEECH OUTPUT: 'A nested list item, in a section'"]))
 
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "6. Basic Where Am I",
+    "7. Basic Where Am I next item",
     ["BRAILLE LINE:  '• In a paragraph that's in a section'",
-     "     VISIBLE:  '• In a paragraph that's in a sec', cursor=1",
-     "SPEECH OUTPUT: 'list item • In a paragraph that's in a section 4 of 4'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l", 1000))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "     VISIBLE:  'In a paragraph that's in a secti', cursor=1",
+     "SPEECH OUTPUT: 'In a paragraph that's in a section'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_role_lists.params b/test/keystrokes/firefox/html_role_lists.params
new file mode 100644
index 0000000..4634af5
--- /dev/null
+++ b/test/keystrokes/firefox/html_role_lists.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/lists.html
diff --git a/test/keystrokes/firefox/html_role_lists.py b/test/keystrokes/firefox/html_role_lists.py
index d20309b..e3c286e 100644
--- a/test/keystrokes/firefox/html_role_lists.py
+++ b/test/keystrokes/firefox/html_role_lists.py
@@ -1,188 +1,192 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of HTML list output of Firefox, in particular basic navigation
-and where am I.
-"""
+"""Test of HTML list presentation."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local lists test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "lists.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Lists Test Page",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
+    "1. Top of file",
     ["BRAILLE LINE:  'Welcome to a List of Lists h1'",
      "     VISIBLE:  'Welcome to a List of Lists h1', cursor=1",
-     "SPEECH OUTPUT: 'Welcome to a List of Lists heading level 1'"]))
+     "SPEECH OUTPUT: 'Welcome to a List of Lists",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
-########################################################################
-# Press Down Arrow to move through the lists.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  'Lists are not only fun to make, they are fun to use. They help us:'",
+    "2. Line Down",
+    ["KNOWN ISSUE: We seem to be combining items here",
+     "BRAILLE LINE:  'Lists are not only fun to make, they are fun to use. They help us: 1.remember what the 
heck we are doing each day'",
      "     VISIBLE:  'Lists are not only fun to make, ', cursor=1",
-     "SPEECH OUTPUT: 'Lists are not only fun to make, they are fun to use. They help us:'"]))
+     "SPEECH OUTPUT: 'Lists are not only fun to make, they are fun to use. They help us: '",
+     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  '1.remember what the heck we are doing each day'",
-     "     VISIBLE:  '1.remember what the heck we are ', cursor=1",
-     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
+    "3. Line Down",
+    ["BRAILLE LINE:  'Lists are not only fun to make, they are fun to use. They help us: 1.remember what the 
heck we are doing each day'",
+    "     VISIBLE:  '1.remember what the heck we are ', cursor=3",
+    "SPEECH OUTPUT: 'Lists are not only fun to make, they are fun to use. They help us: '",
+    "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some'",
+     "     VISIBLE:  '2.arrange long and arbitrary lin', cursor=3",
+     "SPEECH OUTPUT: '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some sense of priority, even if it is artificial'",
-     "     VISIBLE:  '2.arrange long and arbitrary lin', cursor=1",
-     "SPEECH OUTPUT: '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some sense of priority, even if it is artificial'"]))
+    "5. Line Down",
+    ["BRAILLE LINE:  'sense of priority, even if it is artificial'",
+     "     VISIBLE:  'sense of priority, even if it is', cursor=1",
+     "SPEECH OUTPUT: 'sense of priority, even if it is artificial'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
+    "6. Line Down",
     ["BRAILLE LINE:  '3.look really cool when we carry them around on yellow Post-Itstm.'",
-     "     VISIBLE:  '3.look really cool when we carry', cursor=1",
+     "     VISIBLE:  '3.look really cool when we carry', cursor=3",
      "SPEECH OUTPUT: '3.look really cool when we carry them around on yellow Post-Itstm.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
+    "7. Line Down",
     ["BRAILLE LINE:  '4.and that other thing I keep forgetting.'",
-     "     VISIBLE:  '4.and that other thing I keep fo', cursor=1",
+     "     VISIBLE:  '4.and that other thing I keep fo', cursor=3",
      "SPEECH OUTPUT: '4.and that other thing I keep forgetting.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  'Your ordered lists can start at a strange number, like:'",
+    "8. Line Down",
+    ["KNOWN ISSUE: We seem to be combining items here",
+     "BRAILLE LINE:  'Your ordered lists can start at a strange number, like: VI.And use roman numerals,'",
      "     VISIBLE:  'Your ordered lists can start at ', cursor=1",
-     "SPEECH OUTPUT: 'Your ordered lists can start at a strange number, like:'"]))
+     "SPEECH OUTPUT: 'Your ordered lists can start at a strange number, like: '",
+     "SPEECH OUTPUT: 'VI.And use roman numerals,'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  'VI.And use roman numerals,'",
-     "     VISIBLE:  'VI.And use roman numerals,', cursor=1",
+    "9. Line Down",
+    ["BRAILLE LINE:  'Your ordered lists can start at a strange number, like: VI.And use roman numerals,'",
+     "     VISIBLE:  'VI.And use roman numerals,', cursor=4",
+     "SPEECH OUTPUT: 'Your ordered lists can start at a strange number, like: '",
      "SPEECH OUTPUT: 'VI.And use roman numerals,'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
+    "10. Line Down",
     ["BRAILLE LINE:  'g.You might try using letters as well,'",
-     "     VISIBLE:  'g.You might try using letters as', cursor=1",
+     "     VISIBLE:  'g.You might try using letters as', cursor=3",
      "SPEECH OUTPUT: 'g.You might try using letters as well,'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
+    "11. Line Down",
     ["BRAILLE LINE:  'H.Maybe you prefer Big Letters,'",
-     "     VISIBLE:  'H.Maybe you prefer Big Letters,', cursor=1",
+     "     VISIBLE:  'H.Maybe you prefer Big Letters,', cursor=3",
      "SPEECH OUTPUT: 'H.Maybe you prefer Big Letters,'"]))
 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  'ix.or small roman numerals'",
-     "     VISIBLE:  'ix.or small roman numerals', cursor=1",
-     "SPEECH OUTPUT: 'ix.or small roman numerals'"]))
+    "12. Line Up",
+    ["BRAILLE LINE:  'You might try using letters as well,'",
+     "     VISIBLE:  'You might try using letters as', cursor=3",
+     "SPEECH OUTPUT: 'You might try using letters as well,'"]))
 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  '•But discs belong to unordered lists'",
-     "     VISIBLE:  '•But discs belong to unordered l', cursor=1",
-     "SPEECH OUTPUT: '•But discs belong to unordered lists'"]))
+    "13. Line Up",
+    ["BRAILLE LINE:  'And use roman numerals,'",
+     "     VISIBLE:  'And use roman numerals,', cursor=1",
+     "SPEECH OUTPUT: 'And use roman numerals,'"]))
 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down", 
-    ["BRAILLE LINE:  '50.Though you can set the value in a list item!'",
-     "     VISIBLE:  '50.Though you can set the value ', cursor=1",
-     "SPEECH OUTPUT: '50.Though you can set the value in a list item!'"]))
+    "14. Line Up",
+    ["KNOWN ISSUE: We seem to be combining items here",
+     "BRAILLE LINE:  'Your ordered lists can start at a strange number, like: VI.And use roman numerals,'",
+     "     VISIBLE:  'Your ordered lists can start at ', cursor=1",
+     "SPEECH OUTPUT: 'Your ordered lists can start at a strange number, like: '",
+     "SPEECH OUTPUT: 'VI.And use roman numerals,'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up", 
-    ["BRAILLE LINE:  '•But discs belong to unordered lists'",
-     "     VISIBLE:  '•But discs belong to unordered l', cursor=1",
-     "SPEECH OUTPUT: '•But discs belong to unordered lists'"]))
+    "15. Line Up",
+    ["KNOWN ISSUE: We lost the list item marker here",
+     "BRAILLE LINE:  'and that other thing I keep forgetting.'",
+     "     VISIBLE:  'and that other thing I keep forg', cursor=1",
+     "SPEECH OUTPUT: 'and that other thing I keep forgetting.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up", 
-    ["BRAILLE LINE:  'ix.or small roman numerals'",
-     "     VISIBLE:  'ix.or small roman numerals', cursor=1",
-     "SPEECH OUTPUT: 'ix.or small roman numerals'"]))
+    "16. Line Up",
+    ["KNOWN ISSUE: We lost the list item marker here",
+     "BRAILLE LINE:  'look really cool when we carry them around on yellow Post-Itstm.'",
+     "     VISIBLE:  'look really cool when we carry t', cursor=1",
+     "SPEECH OUTPUT: 'look really cool when we carry them around on yellow Post-Itstm.'"]))
 
-########################################################################
-# Do a basic "Where Am I" via KP_Enter.  
-#
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
+sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Basic Where Am I", 
-    ["BRAILLE LINE:  'ix.or small roman numerals'",
-     "     VISIBLE:  'ix.or small roman numerals', cursor=1",
-     "SPEECH OUTPUT: 'list item ix.or small roman numerals 4 of 6'"]))
+    "17. Line Up",
+    ["BRAILLE LINE:  'sense of priority, even if it is artificial'",
+     "     VISIBLE:  'sense of priority, even if it is', cursor=1",
+     "SPEECH OUTPUT: 'sense of priority, even if it is artificial'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l", 1000))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Line Up",
+    ["BRAILLE LINE:  'arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some'",
+     "     VISIBLE:  'arrange long and arbitrary lines', cursor=1",
+     "SPEECH OUTPUT: 'arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some '"]))
 
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Up",
+    ["BRAILLE LINE:  'remember what the heck we are doing each day'",
+     "     VISIBLE:  'remember what the heck we are do', cursor=1",
+     "SPEECH OUTPUT: 'remember what the heck we are doing each day'"]))
 
-sequence.append(WaitForDocLoad())
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Line Up",
+    ["BRAILLE LINE:  'Lists are not only fun to make, they are fun to use. They help us: 1.remember what the 
heck we are doing each day'",
+     "     VISIBLE:  'Lists are not only fun to make, ', cursor=1",
+     "SPEECH OUTPUT: 'Lists are not only fun to make, they are fun to use. They help us: '",
+     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
 
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Line Up",
+    ["BRAILLE LINE:  'Welcome to a List of Lists h1'",
+     "     VISIBLE:  'Welcome to a List of Lists h1', cursor=1",
+     "SPEECH OUTPUT: 'Welcome to a List of Lists",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_activate_link.params 
b/test/keystrokes/firefox/html_struct_nav_activate_link.params
new file mode 100644
index 0000000..bd1d8f0
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_activate_link.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-589455.html
diff --git a/test/keystrokes/firefox/html_struct_nav_activate_link.py 
b/test/keystrokes/firefox/html_struct_nav_activate_link.py
new file mode 100644
index 0000000..9db7726
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_activate_link.py
@@ -0,0 +1,82 @@
+#!/usr/bin/python
+
+"""Test for activation of a link after using structural navigation"""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("3"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Press 3 to move to the heading at level 3",
+    ["BRAILLE LINE:  '1.Anchors2.html h3'",
+     "     VISIBLE:  '1.Anchors2.html h3', cursor=3",
+     "SPEECH OUTPUT: 'Anchors2.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Press Return to active the link",
+    ["BRAILLE LINE:  'Finished loading Links to test files.'",
+     "     VISIBLE:  'Finished loading Links to test f', cursor=0",
+     "BRAILLE LINE:  'Here are some of our local test files:'",
+     "     VISIBLE:  'Here are some of our local test ', cursor=1",
+    "SPEECH OUTPUT: 'Finished loading Links to test files.' voice=system",
+    "SPEECH OUTPUT: 'Here are some of our local test files:'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'anchors.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'blockquotes.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'bugzilla_top.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'combobox.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'fieldset.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'htmlpage.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'image-test.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'linebreak-test.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'lists.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'samesizearea.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'simpleform.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'simpleheader.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'slash-test.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'status-bar.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'tables.html'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: '•'",
+    "SPEECH OUTPUT: 'textattributes.html'",
+    "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_blockquote.params 
b/test/keystrokes/firefox/html_struct_nav_blockquote.params
new file mode 100644
index 0000000..dad99a0
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_blockquote.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/blockquotes.html
diff --git a/test/keystrokes/firefox/html_struct_nav_blockquote.py 
b/test/keystrokes/firefox/html_struct_nav_blockquote.py
index ff1999d..4da4d23 100644
--- a/test/keystrokes/firefox/html_struct_nav_blockquote.py
+++ b/test/keystrokes/firefox/html_struct_nav_blockquote.py
@@ -1,154 +1,75 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of HTML blockquote output of Firefox, in particular structural
-navigation and where am I.
-"""
+"""Test of structural navigation by blockquote."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local blockquote test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "blockquotes.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Blockquote Regression Test",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-sequence.append(PauseAction(3000))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'On weaponry:'",
-     "     VISIBLE:  'On weaponry:', cursor=1",
-     "SPEECH OUTPUT: 'On weaponry:'"]))
 
-########################################################################
-# Press Q to move to the first blockquote which begins with: "NOBODY
-# expects the Spanish Inquisition!" 
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("q"))
 sequence.append(utils.AssertPresentationAction(
-    "q to first quote", 
-    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and'",
+    "1. q to first quote", 
+    ["BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and'",
      "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=1",
-     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and'"]))
+     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and '"]))
 
-########################################################################
-# Press Q to move to the second blockquote which begins with: "Now
-# old lady".
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("q"))
 sequence.append(utils.AssertPresentationAction(
-    "q to second quote", 
-    ["BRAILLE LINE:  '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'",
+    "2. q to second quote", 
+    ["BRAILLE LINE:  'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject the 
works of the'",
      "     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'"]))
+     "SPEECH OUTPUT: 'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject the 
works of the '"]))
 
-########################################################################
-# Press Q to move to the third and final blockquote which begins with:
-# "Hm! She is made of harder stuff!"
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("q"))
 sequence.append(utils.AssertPresentationAction(
-    "q to third quote", 
+    "3. q to third quote", 
     ["BRAILLE LINE:  'Hm! She is made of harder stuff! Cardinal Fang! Fetch the COMFY CHAIR!'",
      "     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!'"]))
+     "SPEECH OUTPUT: 'Hm! She is made of harder stuff! Cardinal Fang! Fetch the COMFY CHAIR! '"]))
 
-########################################################################
-# Press Q again.  There are no more blockquotes on this page so we
-# should wrap to the top (announce that we've done so) and then move
-# to the first blockquote.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("q"))
 sequence.append(utils.AssertPresentationAction(
-    "q wrap to top", 
+    "4. q wrap to top", 
     ["BRAILLE LINE:  'Wrapping to top.'",
      "     VISIBLE:  'Wrapping to top.', cursor=0",
-     "BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and'",
+     "BRAILLE LINE:  'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and'",
      "     VISIBLE:  'NOBODY expects the Spanish Inqui', cursor=1",
-     "SPEECH OUTPUT: 'Wrapping to top.'",
-     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and surprise. Our two weapons are fear and'"]))
+     "SPEECH OUTPUT: 'Wrapping to top.' voice=system",
+     "SPEECH OUTPUT: 'NOBODY expects the Spanish Inquisition! Our chief weapon is surprise. Surprise and 
fear. Fear and '"]))
 
-########################################################################
-# Press Shift+Q.  There are no more blockquotes above us on the page
-#  so we should wrap to the bottom (announce that we've done so) and 
-# then move to the third and final blockquote.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>q"))
 sequence.append(utils.AssertPresentationAction(
-    "Shift+q wrap to bottom", 
+    "5. Shift+q wrap to bottom", 
     ["BRAILLE LINE:  'Wrapping to bottom.'",
      "     VISIBLE:  'Wrapping to bottom.', cursor=0",
      "BRAILLE LINE:  'Hm! She is made of harder stuff! Cardinal Fang! Fetch the COMFY CHAIR!'",
      "     VISIBLE:  'Hm! She is made of harder stuff!', cursor=1",
-     "SPEECH OUTPUT: 'Wrapping to bottom.'",
-     "SPEECH OUTPUT: 'Hm! She is made of harder stuff! Cardinal Fang! Fetch the COMFY CHAIR!'"]))
+     "SPEECH OUTPUT: 'Wrapping to bottom.' voice=system",
+     "SPEECH OUTPUT: 'Hm! She is made of harder stuff! Cardinal Fang! Fetch the COMFY CHAIR! "]))
 
-########################################################################
-# Press Shift+Q to move to the second blockquote.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>q"))
 sequence.append(utils.AssertPresentationAction(
-    "Shift+q wrap to second quote", 
-    ["BRAILLE LINE:  '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'",
+    "6. Shift+q wrap to second quote", 
+    ["BRAILLE LINE:  'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject the 
works of the'",
      "     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'"]))
+     "SPEECH OUTPUT: 'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject the 
works of the '"]))
 
-########################################################################
-# Do a basic "Where Am I" via KP_Enter. 
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "Basic Where Am I",
-    ["BRAILLE LINE:  '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'",
+    "7. Basic Where Am I",
+    ["BRAILLE LINE:  'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject the 
works of the'",
      "     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 '"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'Now old lady, you have one last chance. Confess the heinous sin of heresy, reject the 
works of the '"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_bug_554616.params 
b/test/keystrokes/firefox/html_struct_nav_bug_554616.params
new file mode 100644
index 0000000..df67797
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_bug_554616.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-554616.html
diff --git a/test/keystrokes/firefox/html_struct_nav_bug_554616.py 
b/test/keystrokes/firefox/html_struct_nav_bug_554616.py
index 62297d4..5457091 100644
--- a/test/keystrokes/firefox/html_struct_nav_bug_554616.py
+++ b/test/keystrokes/firefox/html_struct_nav_bug_554616.py
@@ -1,179 +1,160 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of table cell navigation output of Firefox. 
-"""
+"""Test of table cell structural navigation."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-554616.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "1. Top of file",
-    ["BRAILLE LINE:  'Snapshot version Date (UTC) Download'",
-     "     VISIBLE:  'Snapshot version Date (UTC) Down', cursor=1",
-     "SPEECH OUTPUT: 'Snapshot version column header Date (UTC) column header Download column header'"]))
 
-########################################################################
-# T to move to the table.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("t"))
 sequence.append(utils.AssertPresentationAction(
-    "2. t",
+    "1. t",
     ["BRAILLE LINE:  'Wrapping to top.'",
      "     VISIBLE:  'Wrapping to top.', cursor=0",
      "BRAILLE LINE:  'table with 4 rows 3 columns'",
      "     VISIBLE:  'table with 4 rows 3 columns', cursor=0",
      "BRAILLE LINE:  'Snapshot version Date (UTC) Download'",
      "     VISIBLE:  'Snapshot version Date (UTC) Down', cursor=1",
-     "SPEECH OUTPUT: 'Wrapping to top.'",
-     "SPEECH OUTPUT: 'table with 4 rows 3 columns'",
-     "SPEECH OUTPUT: 'Snapshot version column header'"]))
+     "SPEECH OUTPUT: 'Wrapping to top.' voice=system",
+     "SPEECH OUTPUT: 'table with 4 rows 3 columns' voice=system",
+     "SPEECH OUTPUT: 'Snapshot version'",
+     "SPEECH OUTPUT: 'column header'"]))
 
-########################################################################
-# Alt+Shift+Arrow to move amongst cells
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Alt><Shift>Down"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Alt Shift Down",
-    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008 in', cursor=1",
-     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008 in', cursor=1",
+    "2. Alt Shift Down",
+    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=1",
+     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=1",
      "BRAILLE LINE:  'Row 2, column 1.'",
      "     VISIBLE:  'Row 2, column 1.', cursor=0",
      "SPEECH OUTPUT: 'r2477'",
-     "SPEECH OUTPUT: 'Row 2, column 1.'"]))
+     "SPEECH OUTPUT: 'Row 2, column 1.' voice=system"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Alt><Shift>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Alt Shift Right",
-    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008 in', cursor=1",
-     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'Wed Nov 5 16:39:00 2008 installe', cursor=1",
-     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'Wed Nov 5 16:39:00 2008 installe', cursor=1",
+    "3. Alt Shift Right",
+    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=1",
+     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=7",
+     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=7",
      "BRAILLE LINE:  'Row 2, column 2.'",
      "     VISIBLE:  'Row 2, column 2.', cursor=0",
      "SPEECH OUTPUT: 'Date (UTC)'",
      "SPEECH OUTPUT: 'Wed Nov 5 16:39:00 2008'",
-     "SPEECH OUTPUT: 'Row 2, column 2.'"]))
+     "SPEECH OUTPUT: 'Row 2, column 2.' voice=system"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Alt><Shift>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Alt Shift Right",
-    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'Wed Nov 5 16:39:00 2008 installe', cursor=1",
-     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'installer (10190 KB)portable arc', cursor=1",
-     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'installer (10190 KB)portable arc', cursor=1",
+    "4. Alt Shift Right",
+    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=7",
+     "BRAILLE LINE:  'installer (10190 KB)'",
+     "     VISIBLE:  'installer (10190 KB)', cursor=1",
+     "BRAILLE LINE:  'installer (10190 KB)'",
+     "     VISIBLE:  'installer (10190 KB)', cursor=1",
      "BRAILLE LINE:  'Row 2, column 3.'",
      "     VISIBLE:  'Row 2, column 3.', cursor=0",
      "SPEECH OUTPUT: 'Download'",
-     "SPEECH OUTPUT: 'installer link  (10190 KB)",
-     " portable archive link  (9154 KB)'",
-     "SPEECH OUTPUT: 'Row 2, column 3.'"]))
+     "SPEECH OUTPUT: 'installer'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (10190 KB)",
+     "'",
+     "SPEECH OUTPUT: 'portable archive'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (9154 KB)'",
+     "SPEECH OUTPUT: 'Row 2, column 3.' voice=system"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Alt><Shift>Down"))
 sequence.append(utils.AssertPresentationAction(
-    "6. Alt Shift Down",
-    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'installer (10190 KB)portable arc', cursor=1",
-     "BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008 installer (10193 KB)'",
+    "5. Alt Shift Down",
+    ["BRAILLE LINE:  'installer (10190 KB)'",
+     "     VISIBLE:  'installer (10190 KB)', cursor=1",
+     "BRAILLE LINE:  'installer (10193 KB)'",
      "     VISIBLE:  'installer (10193 KB)', cursor=1",
-     "BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008 installer (10193 KB)'",
+     "BRAILLE LINE:  'installer (10193 KB)'",
      "     VISIBLE:  'installer (10193 KB)', cursor=1",
      "BRAILLE LINE:  'Row 3, column 3.'",
      "     VISIBLE:  'Row 3, column 3.', cursor=0",
-     "SPEECH OUTPUT: 'installer link  (10193 KB)",
-     " portable archive link  (9149 KB)'",
-     "SPEECH OUTPUT: 'Row 3, column 3.'"]))
+     "SPEECH OUTPUT: 'installer'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (10193 KB)",
+     "'",
+     "SPEECH OUTPUT: 'portable archive'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (9149 KB)'",
+     "SPEECH OUTPUT: 'Row 3, column 3.' voice=system"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Alt><Shift>Left"))
 sequence.append(utils.AssertPresentationAction(
-    "7. Alt Shift Left",
-    ["BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008 installer (10193 KB)'",
+    "6. Alt Shift Left",
+    ["BRAILLE LINE:  'installer (10193 KB)'",
      "     VISIBLE:  'installer (10193 KB)', cursor=1",
-     "BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008 installer (10193 KB)'",
-     "     VISIBLE:  'Tue Nov 4 16:39:02 2008 installe', cursor=1",
-     "BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008 installer (10193 KB)'",
-     "     VISIBLE:  'Tue Nov 4 16:39:02 2008 installe', cursor=1",
+     "BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008'",
+     "     VISIBLE:  'r2468 Tue Nov 4 16:39:02 2008', cursor=7",
+     "BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008'",
+     "     VISIBLE:  'r2468 Tue Nov 4 16:39:02 2008', cursor=7",
      "BRAILLE LINE:  'Row 3, column 2.'",
      "     VISIBLE:  'Row 3, column 2.', cursor=0",
      "SPEECH OUTPUT: 'Date (UTC)'",
      "SPEECH OUTPUT: 'Tue Nov 4 16:39:02 2008'",
-     "SPEECH OUTPUT: 'Row 3, column 2.'"]))
+     "SPEECH OUTPUT: 'Row 3, column 2.' voice=system"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Alt><Shift>Up"))
 sequence.append(utils.AssertPresentationAction(
-    "8. Alt Shift Up",
-    ["BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008 installer (10193 KB)'",
-     "     VISIBLE:  'Tue Nov 4 16:39:02 2008 installe', cursor=1",
-     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'Wed Nov 5 16:39:00 2008 installe', cursor=1",
-     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'Wed Nov 5 16:39:00 2008 installe', cursor=1",
+    "7. Alt Shift Up",
+    ["BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008'",
+     "     VISIBLE:  'r2468 Tue Nov 4 16:39:02 2008', cursor=7",
+     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=7",
+     "BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=7",
      "BRAILLE LINE:  'Row 2, column 2.'",
      "     VISIBLE:  'Row 2, column 2.', cursor=0",
      "SPEECH OUTPUT: 'Wed Nov 5 16:39:00 2008'",
-     "SPEECH OUTPUT: 'Row 2, column 2.'"]))
+     "SPEECH OUTPUT: 'Row 2, column 2.' voice=system"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Alt><Shift>End"))
 sequence.append(utils.AssertPresentationAction(
-    "9. Alt Shift End",
-    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'Wed Nov 5 16:39:00 2008 installe', cursor=1",
-     "BRAILLE LINE:  'r2464 Mon Nov 3 16:39:48 2008 installer (10186 KB)'",
+    "8. Alt Shift End",
+    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=7",
+     "BRAILLE LINE:  'installer (10186 KB)'",
      "     VISIBLE:  'installer (10186 KB)', cursor=1",
-     "BRAILLE LINE:  'r2464 Mon Nov 3 16:39:48 2008 installer (10186 KB)'",
+     "BRAILLE LINE:  'installer (10186 KB)'",
      "     VISIBLE:  'installer (10186 KB)', cursor=1",
      "BRAILLE LINE:  'Row 4, column 3.'",
      "     VISIBLE:  'Row 4, column 3.', cursor=0",
      "SPEECH OUTPUT: 'Download'",
-     "SPEECH OUTPUT: 'installer link  (10186 KB)",
-     " portable archive link  (9146 KB)'",
-     "SPEECH OUTPUT: 'Row 4, column 3.'"]))
+     "SPEECH OUTPUT: 'installer'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (10186 KB)",
+     "'",
+     "SPEECH OUTPUT: 'portable archive'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (9146 KB)'",
+     "SPEECH OUTPUT: 'Row 4, column 3.' voice=system"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Alt><Shift>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "10. Alt Shift Home",
-    ["BRAILLE LINE:  'r2464 Mon Nov 3 16:39:48 2008 installer (10186 KB)'",
+    "9. Alt Shift Home",
+    ["KNOWN ISSUE: We are double-presenting the column header text in speech",
+     "BRAILLE LINE:  'installer (10186 KB)'",
      "     VISIBLE:  'installer (10186 KB)', cursor=1",
      "BRAILLE LINE:  'Snapshot version Date (UTC) Download'",
      "     VISIBLE:  'Snapshot version Date (UTC) Down', cursor=1",
@@ -181,26 +162,10 @@ sequence.append(utils.AssertPresentationAction(
      "     VISIBLE:  'Snapshot version Date (UTC) Down', cursor=1",
      "BRAILLE LINE:  'Row 1, column 1.'",
      "     VISIBLE:  'Row 1, column 1.', cursor=0",
-     "SPEECH OUTPUT: 'Snapshot version column header'",
-     "SPEECH OUTPUT: 'Row 1, column 1.'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'Snapshot version'",
+     "SPEECH OUTPUT: 'Snapshot version'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Row 1, column 1.' voice=system"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_bug_556470.params 
b/test/keystrokes/firefox/html_struct_nav_bug_556470.params
new file mode 100644
index 0000000..e08d713
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_bug_556470.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-556470.html
diff --git a/test/keystrokes/firefox/html_struct_nav_bug_556470.py 
b/test/keystrokes/firefox/html_struct_nav_bug_556470.py
index e1be2e1..1916973 100644
--- a/test/keystrokes/firefox/html_struct_nav_bug_556470.py
+++ b/test/keystrokes/firefox/html_struct_nav_bug_556470.py
@@ -1,48 +1,13 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of table structural navigation with empty tables.
-"""
+"""Test of table structural navigation with empty tables."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
-
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local blockquote test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-556470.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-sequence.append(PauseAction(3000))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'hi, this is a paragraph'",
-     "     VISIBLE:  'hi, this is a paragraph', cursor=1",
-     "SPEECH OUTPUT: 'hi, this is a paragraph'"]))
 
-########################################################################
-# Press t to move amongst the tables
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("t"))
 sequence.append(utils.AssertPresentationAction(
@@ -51,8 +16,9 @@ sequence.append(utils.AssertPresentationAction(
      "     VISIBLE:  'table with 2 rows 3 columns', cursor=0",
      "BRAILLE LINE:  'col 1 col 2 col 3'",
      "     VISIBLE:  'col 1 col 2 col 3', cursor=1",
-     "SPEECH OUTPUT: 'table with 2 rows 3 columns'",
-     "SPEECH OUTPUT: 'col 1 column header'"]))
+     "SPEECH OUTPUT: 'table with 2 rows 3 columns' voice=system",
+     "SPEECH OUTPUT: 'col 1'",
+     "SPEECH OUTPUT: 'column header'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("t"))
@@ -75,17 +41,15 @@ sequence.append(utils.AssertPresentationAction(
      "     VISIBLE:  'table with 2 rows 3 columns', cursor=0",
      "BRAILLE LINE:  'col 1 col 2 col 3'",
      "     VISIBLE:  'col 1 col 2 col 3', cursor=1",
-     "SPEECH OUTPUT: 'Wrapping to top.'",
-     "SPEECH OUTPUT: 'table with 2 rows 3 columns'",
-     "SPEECH OUTPUT: 'col 1 column header'"]))
+     "SPEECH OUTPUT: 'Wrapping to top.' voice=system",
+     "SPEECH OUTPUT: 'table with 2 rows 3 columns' voice=system",
+     "SPEECH OUTPUT: 'col 1'",
+     "SPEECH OUTPUT: 'column header'"]))
 
-########################################################################
-# Press Shift+t to move amongst the tables
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>t"))
 sequence.append(utils.AssertPresentationAction(
-    "1. shift+t", 
+    "4. shift+t", 
     ["BRAILLE LINE:  'Wrapping to bottom.'",
      "     VISIBLE:  'Wrapping to bottom.', cursor=0",
      "BRAILLE LINE:  'table with 2 rows 3 columns'",
@@ -99,18 +63,19 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>t"))
 sequence.append(utils.AssertPresentationAction(
-    "2. shift+t", 
+    "5. shift+t", 
     ["BRAILLE LINE:  'table with 2 rows 3 columns'",
      "     VISIBLE:  'table with 2 rows 3 columns', cursor=0",
      "BRAILLE LINE:  'col 1 col 2 col 3'",
      "     VISIBLE:  'col 1 col 2 col 3', cursor=1",
-     "SPEECH OUTPUT: 'table with 2 rows 3 columns'",
-     "SPEECH OUTPUT: 'col 1 column header'"]))
+     "SPEECH OUTPUT: 'table with 2 rows 3 columns' voice=system",
+     "SPEECH OUTPUT: 'col 1'",
+     "SPEECH OUTPUT: 'column header'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>t"))
 sequence.append(utils.AssertPresentationAction(
-    "3. shift+t",
+    "6. shift+t",
     ["BRAILLE LINE:  'Wrapping to bottom.'",
      "     VISIBLE:  'Wrapping to bottom.', cursor=0",
      "BRAILLE LINE:  'table with 2 rows 3 columns'",
@@ -121,23 +86,5 @@ sequence.append(utils.AssertPresentationAction(
      "SPEECH OUTPUT: 'table with 2 rows 3 columns'",
      "SPEECH OUTPUT: '1'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_bug_567984.params 
b/test/keystrokes/firefox/html_struct_nav_bug_567984.params
new file mode 100644
index 0000000..5466224
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_bug_567984.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-567984.html
diff --git a/test/keystrokes/firefox/html_struct_nav_bug_567984.py 
b/test/keystrokes/firefox/html_struct_nav_bug_567984.py
index 24f17ae..b79d74d 100644
--- a/test/keystrokes/firefox/html_struct_nav_bug_567984.py
+++ b/test/keystrokes/firefox/html_struct_nav_bug_567984.py
@@ -1,59 +1,30 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of table cell navigation output of Firefox. 
-"""
+"""Test of structural navigation by heading."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-567984.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
     "1. Top of file",
-    ["BRAILLE LINE:  'Index Vakbarát Hírportál h1 '",
-     "     VISIBLE:  'Index Vakbarát Hírportál h1 ', cursor=1",
-     "SPEECH OUTPUT: 'Index Vakbarát Hírportál heading level 1 ",
-     "'"]))
+    ["BRAILLE LINE:  'Index Vakbarát Hírportál h1'",
+     "     VISIBLE:  'Index Vakbarát Hírportál h1', cursor=1",
+     "SPEECH OUTPUT: 'Index Vakbarát Hírportál'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
-########################################################################
-# H to move amongst headings
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("h"))
 sequence.append(utils.AssertPresentationAction(
     "2. h",
     ["BRAILLE LINE:  'Legfrissebb hírek h2'",
      "     VISIBLE:  'Legfrissebb hírek h2', cursor=1",
-     "SPEECH OUTPUT: 'Legfrissebb hírek heading level 2'"]))
+     "SPEECH OUTPUT: 'Legfrissebb hírek'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
-########################################################################
-# H to move amongst headings
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("h"))
 sequence.append(utils.AssertPresentationAction(
@@ -61,103 +32,75 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'Izrael bejelentette az  h3'",
      "     VISIBLE:  'Izrael bejelentette az  h3', cursor=1",
      "SPEECH OUTPUT: 'Izrael bejelentette az ",
-     "egyoldalú tûzszünetet link heading level 3'"]))
+     "egyoldalú tûzszünetet'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
-########################################################################
-# H to move amongst headings
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("h"))
 sequence.append(utils.AssertPresentationAction(
     "4. h",
     ["BRAILLE LINE:  'Videók a Hudsonba zuhanó repülõrõl h3'",
      "     VISIBLE:  'Videók a Hudsonba zuhanó repülõr', cursor=1",
-     "SPEECH OUTPUT: 'Videók a Hudsonba zuhanó repülõrõl link heading level 3'"]))
+     "SPEECH OUTPUT: 'Videók a Hudsonba zuhanó repülõrõl'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
-########################################################################
-# H to move amongst headings
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("h"))
 sequence.append(utils.AssertPresentationAction(
     "5. h",
     ["BRAILLE LINE:  'Újabb pénzügyi guru tûnt el, pénzzel együtt h3'",
      "     VISIBLE:  'Újabb pénzügyi guru tûnt el, pén', cursor=1",
-     "SPEECH OUTPUT: 'Újabb pénzügyi guru tûnt el, pénzzel együtt link heading level 3'"]))
+     "SPEECH OUTPUT: 'Újabb pénzügyi guru tûnt el, pénzzel együtt'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
-########################################################################
-# Down Arrow to move to some text in the document frame
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "6. Down",
-    ["BRAILLE LINE:  'A 75 éves Arthur Nadeltõl több százmillió dollár követelnének az ügyfelei, de még a 
férfit sem találják.'",
+    ["BRAILLE LINE:  'A 75 éves Arthur Nadeltõl több százmillió dollár követelnének az ügyfelei, de még a 
férfit sem találják. '",
      "     VISIBLE:  'A 75 éves Arthur Nadeltõl több s', cursor=1",
-     "SPEECH OUTPUT: 'A 75 éves Arthur Nadeltõl több százmillió dollár követelnének az ügyfelei, de még a 
férfit sem találják.'"]))
+     "SPEECH OUTPUT: 'A 75 éves Arthur Nadeltõl több százmillió dollár követelnének az ügyfelei, de még a 
férfit sem találják. '"]))
 
-########################################################################
-# Down Arrow to move to some text in the document frame
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "7. Down",
     ["BRAILLE LINE:  '1150 embert utcára tesz a pécsi Elcoteq h3'",
      "     VISIBLE:  '1150 embert utcára tesz a pécsi ', cursor=1",
-     "SPEECH OUTPUT: '1150 embert utcára tesz a pécsi Elcoteq link heading level 3'"]))
+     "SPEECH OUTPUT: '1150 embert utcára tesz a pécsi Elcoteq'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
-########################################################################
-# H to move to the next heading. It should NOT be the first heading.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("h"))
 sequence.append(utils.AssertPresentationAction(
     "8. h",
     ["BRAILLE LINE:  'Hamarosan újraindul a gázszállítás h3'",
      "     VISIBLE:  'Hamarosan újraindul a gázszállít', cursor=1",
-     "SPEECH OUTPUT: 'Hamarosan újraindul a gázszállítás link heading level 3'"]))
+     "SPEECH OUTPUT: 'Hamarosan újraindul a gázszállítás'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
-########################################################################
-# Down Arrow to move to some text in the document frame
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "9. Down",
-    ["BRAILLE LINE:  'Megállapodott Putyin és Tyimosenko az orosz-ukrán szerzõdésrõl. Amint lepapírozzák, 
jön a gáz.'",
+    ["BRAILLE LINE:  'Megállapodott Putyin és Tyimosenko az orosz-ukrán szerzõdésrõl. Amint lepapírozzák, 
jön a gáz. '",
      "     VISIBLE:  'Megállapodott Putyin és Tyimosen', cursor=1",
-     "SPEECH OUTPUT: 'Megállapodott Putyin és Tyimosenko az orosz-ukrán szerzõdésrõl. Amint lepapírozzák, 
jön a gáz.'"]))
+     "SPEECH OUTPUT: 'Megállapodott Putyin és Tyimosenko az orosz-ukrán szerzõdésrõl. Amint lepapírozzák, 
jön a gáz. '"]))
 
-########################################################################
-# Shift+ H to move to the previous heading. It should NOT be the last
-# heading.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>h"))
 sequence.append(utils.AssertPresentationAction(
     "10. Shift+h",
     ["BRAILLE LINE:  'Hamarosan újraindul a gázszállítás h3'",
      "     VISIBLE:  'Hamarosan újraindul a gázszállít', cursor=1",
-     "SPEECH OUTPUT: 'Hamarosan újraindul a gázszállítás link heading level 3'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'Hamarosan újraindul a gázszállítás'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_bug_591592.params 
b/test/keystrokes/firefox/html_struct_nav_bug_591592.params
new file mode 100644
index 0000000..d555d75
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_bug_591592.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-591592.html
diff --git a/test/keystrokes/firefox/html_struct_nav_bug_591592.py 
b/test/keystrokes/firefox/html_struct_nav_bug_591592.py
index 7a6fb71..81df48f 100644
--- a/test/keystrokes/firefox/html_struct_nav_bug_591592.py
+++ b/test/keystrokes/firefox/html_struct_nav_bug_591592.py
@@ -1,92 +1,80 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of table structural navigation with headings which contain
-anchors."""
+"""Test of table structural navigation with headings which contain anchors."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local blockquote test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-591592.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-sequence.append(PauseAction(3000))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'This is a test. h1'",
      "     VISIBLE:  'This is a test. h1', cursor=1",
-     "SPEECH OUTPUT: 'This is a test. heading level 1'"]))
+     "SPEECH OUTPUT: 'This is a test.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
-########################################################################
-# Press h to move amongst the headings
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("h"))
 sequence.append(utils.AssertPresentationAction(
-    "1. h",
+    "2. h",
     ["BRAILLE LINE:  'Adding IPS Repositories h2'",
      "     VISIBLE:  'Adding IPS Repositories h2', cursor=1",
-     "SPEECH OUTPUT: 'Adding IPS Repositories heading level 2'"]))
+     "SPEECH OUTPUT: 'Adding IPS Repositories'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("h"))
 sequence.append(utils.AssertPresentationAction(
-    "2. h",
+    "3. h",
     ["BRAILLE LINE:  'Other Repositories h3'",
      "     VISIBLE:  'Other Repositories h3', cursor=1",
-     "SPEECH OUTPUT: 'Other Repositories heading level 3'"]))
+     "SPEECH OUTPUT: 'Other Repositories'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("h"))
 sequence.append(utils.AssertPresentationAction(
-    "3. h",
+    "4. h",
     ["BRAILLE LINE:  'Wrapping to top.'",
      "     VISIBLE:  'Wrapping to top.', cursor=0",
      "BRAILLE LINE:  'This is a test. h1'",
      "     VISIBLE:  'This is a test. h1', cursor=1",
-     "SPEECH OUTPUT: 'Wrapping to top.'",
-     "SPEECH OUTPUT: 'This is a test. heading level 1'"]))
+     "SPEECH OUTPUT: 'Wrapping to top.' voice=system",
+     "SPEECH OUTPUT: 'This is a test.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>h"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Shift h",
+    ["BRAILLE LINE:  'Wrapping to bottom.'",
+     "     VISIBLE:  'Wrapping to bottom.', cursor=0",
+     "BRAILLE LINE:  'Other Repositories h3'",
+     "     VISIBLE:  'Other Repositories h3', cursor=1",
+     "SPEECH OUTPUT: 'Wrapping to bottom.' voice=system",
+     "SPEECH OUTPUT: 'Other Repositories'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
-sequence.append(WaitForDocLoad())
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>h"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Shift h",
+    ["BRAILLE LINE:  'Adding IPS Repositories h2'",
+     "     VISIBLE:  'Adding IPS Repositories h2', cursor=1",
+     "SPEECH OUTPUT: 'Adding IPS Repositories'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>h"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Shift h",
+    ["BRAILLE LINE:  'This is a test. h1'",
+     "     VISIBLE:  'This is a test. h1', cursor=1",
+     "SPEECH OUTPUT: 'This is a test.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_large_obj.params 
b/test/keystrokes/firefox/html_struct_nav_large_obj.params
new file mode 100644
index 0000000..4b61bd4
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_large_obj.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/textattributes.html
diff --git a/test/keystrokes/firefox/html_struct_nav_large_obj.py 
b/test/keystrokes/firefox/html_struct_nav_large_obj.py
index b06fb52..2671ab9 100644
--- a/test/keystrokes/firefox/html_struct_nav_large_obj.py
+++ b/test/keystrokes/firefox/html_struct_nav_large_obj.py
@@ -1,49 +1,18 @@
 #!/usr/bin/python
 
-"""Test of navigation to 'large objects'
-"""
+"""Test of structural navigation amongst 'large objects'."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on the Firefox window as well as for focus
-# to move to the frame.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the textattributes.html test page.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-sequence.append(TypeAction(utils.htmlURLPrefix + "textattributes.html"))
-sequence.append(KeyComboAction("Return"))
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Text Attributes and Alignment Test Page", 
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'Text Attributes h1'",
-     "     VISIBLE:  'Text Attributes h1', cursor=1",
-     "SPEECH OUTPUT: 'Text Attributes heading level 1'"]))
 
-########################################################################
-# Navigate to the first 'large chunk'.  It is the 1st paragraph under 'From 
-# Shakespeare's Hamlet'  The following will be presented.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("o"))
 sequence.append(utils.AssertPresentationAction(
-    "First large chunk", 
+    "1. o to first large chunk", 
     ["BRAILLE LINE:  'I have of late but'",
      "     VISIBLE:  'I have of late but', cursor=1",
      "SPEECH OUTPUT: 'I have of late but",
@@ -64,14 +33,10 @@ sequence.append(utils.AssertPresentationAction(
      "in apprehension how like a god!",
      "the beauty of the world, the paragon of animals!'"]))
 
-########################################################################
-# Navigate to the next 'large chunk'.  It is the 2nd paragraph under 'From 
-# Shakespeare's Hamlet' 
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("o"))
 sequence.append(utils.AssertPresentationAction(
-    "Second large chunk", 
+    "2. o to second large chunk", 
     ["BRAILLE LINE:  'I have of late but'",
      "     VISIBLE:  'I have of late but', cursor=1",
      "SPEECH OUTPUT: 'I have of late but",
@@ -92,14 +57,10 @@ sequence.append(utils.AssertPresentationAction(
      "in apprehension how like a god!",
      "the beauty of the world, the paragon of animals!'"]))
 
-########################################################################
-# Navigate to the next 'large chunk'.  It is the 3nd paragraph under 'From 
-# Shakespeare's Hamlet'  The following will be presented.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("o"))
 sequence.append(utils.AssertPresentationAction(
-    "Third large chunk", 
+    "3. o to third large chunk", 
     ["BRAILLE LINE:  'I have of late but'",
      "     VISIBLE:  'I have of late but', cursor=1",
      "SPEECH OUTPUT: 'I have of late but",
@@ -120,16 +81,13 @@ sequence.append(utils.AssertPresentationAction(
      "in apprehension how like a god!",
      "the beauty of the world, the paragon of animals!'"]))
 
-########################################################################
-# Navigate to the next 'large chunk'.  
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("o"))
 sequence.append(utils.AssertPresentationAction(
-    "Fourth large chunk", 
+    "4. o to fourth large chunk", 
     ["BRAILLE LINE:  'I am a tranquilizer.'",
      "     VISIBLE:  'I am a tranquilizer.', cursor=1",
-     "SPEECH OUTPUT: 'I am a tranquilizer.",
+     "SPEECH OUTPUT: 'I am a tranquilizer. ",
      "I am effective at home, ",
      "I work well at the office, ",
      "I take exams, ",
@@ -138,29 +96,29 @@ sequence.append(utils.AssertPresentationAction(
      "all you need do is take me, ",
      "dissolve me under the tongue, ",
      "all you need do is swallow me, ",
-     "just wash me down with water. I know how to cope with misfortune, ",
+     "just wash me down with water. '",
+     "SPEECH OUTPUT: 'I know how to cope with misfortune, ",
      "how to endure bad news, ",
      "take the edge of injustice, ",
      "make up for the absence of God, ",
      "help pick out your widow's weeds. ",
      "What are you waiting for - ",
-     "have faith in chemistry's compassion. You're still a young man/woman, ",
+     "have faith in chemistry's compassion. '",
+     "SPEECH OUTPUT: 'You're still a young man/woman, ",
      "you really should settle down somehow. ",
      "Who said ",
-     "life must be lived courageously? Hand your abyss over to me - ",
+     "life must be lived courageously? '",
+     "SPEECH OUTPUT: 'Hand your abyss over to me - ",
      "I will line it up with soft sleep, ",
      "you'll be grateful for ",
-     "the four-footed landing. Sell me your soul. ",
-     "There's no other buyer likely to turn up.'"]))
+     "the four-footed landing. '",
+     "SPEECH OUTPUT: 'Sell me your soul. ",
+     "There's no other buyer likely to turn up. '"]))
 
-########################################################################
-# Navigate to the previous 'large chunk'.  It is the 3rd paragraph under 'From 
-# Shakespeare's Hamlet'  The following will be presented.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>o"))
 sequence.append(utils.AssertPresentationAction(
-    "Shift + o to third large chunk", 
+    "5. Shift + o to third large chunk", 
     ["BRAILLE LINE:  'I have of late but'",
      "     VISIBLE:  'I have of late but', cursor=1",
      "SPEECH OUTPUT: 'I have of late but",
@@ -181,19 +139,5 @@ sequence.append(utils.AssertPresentationAction(
      "in apprehension how like a god!",
      "the beauty of the world, the paragon of animals!'"]))
 
-########################################################################
-# Close the demo
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_links.params 
b/test/keystrokes/firefox/html_struct_nav_links.params
new file mode 100644
index 0000000..6041395
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_links.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/anchors2.html
diff --git a/test/keystrokes/firefox/html_struct_nav_links.py 
b/test/keystrokes/firefox/html_struct_nav_links.py
index 5028fd4..a4f9a45 100644
--- a/test/keystrokes/firefox/html_struct_nav_links.py
+++ b/test/keystrokes/firefox/html_struct_nav_links.py
@@ -1,212 +1,147 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of HTML links output of Firefox, in particular structural
-navigation.
-"""
+"""Test of structural navigation amongst links."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local links test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "anchors2.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Links to test files",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'Here are some of our local test files:'",
-     "     VISIBLE:  'Here are some of our local test ', cursor=1",
-     "SPEECH OUTPUT: 'Here are some of our local test files:'"]))
-
-########################################################################
-# Press U to move to the next unvisited link, anchors.html. Note that 
-# for the braille I have replaced the bullet character with an asterisk
-# as the bullets are causing "Non-ASCII character" syntax errors.
-#
+
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("u"))
 sequence.append(utils.AssertPresentationAction(
-    "u to anchors.html link", 
+    "1. u to anchors.html link",
     ["BRAILLE LINE:  '•anchors.html'",
      "     VISIBLE:  '•anchors.html', cursor=2",
-     "SPEECH OUTPUT: 'anchors.html link'"]))
+     "BRAILLE LINE:  '•anchors.html'",
+     "     VISIBLE:  '•anchors.html', cursor=2",
+     "SPEECH OUTPUT: 'anchors.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-########################################################################
-# Press U to move to the next unvisited link, blockquotes.html
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("u"))
 sequence.append(utils.AssertPresentationAction(
-    "u to blockquotes.html link", 
+    "2. u to blockquotes.html link",
     ["BRAILLE LINE:  '•blockquotes.html'",
      "     VISIBLE:  '•blockquotes.html', cursor=2",
-     "SPEECH OUTPUT: 'blockquotes.html link'"]))
+     "BRAILLE LINE:  '•blockquotes.html'",
+     "     VISIBLE:  '•blockquotes.html', cursor=2",
+     "SPEECH OUTPUT: 'blockquotes.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-########################################################################
-# Press Shift+U to move to the previous unvisited link.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>u"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + u to anchors.html link", 
+    "3. shift + u to anchors.html link",
     ["BRAILLE LINE:  '•anchors.html'",
      "     VISIBLE:  '•anchors.html', cursor=2",
-     "SPEECH OUTPUT: 'anchors.html link'"]))
-
-########################################################################
-# Press Shift+U to move to the previous unvisited link.  Note that there
-# are no more previous links between us and the top of the page. 
-# Therefore we wrap to the bottom (and announce that fact) and then 
-# move to the first link we come to.
-#
+     "BRAILLE LINE:  '•anchors.html'",
+     "     VISIBLE:  '•anchors.html', cursor=2",
+     "SPEECH OUTPUT: 'anchors.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>u"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + u wrapping to bottom",
+    "4. shift + u wrapping to bottom",
     ["BRAILLE LINE:  'Wrapping to bottom.'",
      "     VISIBLE:  'Wrapping to bottom.', cursor=0",
      "BRAILLE LINE:  '•textattributes.html'",
      "     VISIBLE:  '•textattributes.html', cursor=2",
-     "SPEECH OUTPUT: 'Wrapping to bottom.'",
-     "SPEECH OUTPUT: 'textattributes.html link'"])) 
+     "BRAILLE LINE:  '•textattributes.html'",
+     "     VISIBLE:  '•textattributes.html', cursor=2",
+     "SPEECH OUTPUT: 'Wrapping to bottom.' voice=system",
+     "SPEECH OUTPUT: 'textattributes.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-########################################################################
-# Press Shift+U to move to the previous unvisited link.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>u"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + u to tables.html",
+    "5. shift + u to tables.html",
     ["BRAILLE LINE:  '•tables.html'",
      "     VISIBLE:  '•tables.html', cursor=2",
-     "SPEECH OUTPUT: 'tables.html link'"])) 
+     "BRAILLE LINE:  '•tables.html'",
+     "     VISIBLE:  '•tables.html', cursor=2",
+     "SPEECH OUTPUT: 'tables.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-########################################################################
-# Press Return to follow the tables.html link.
-#
 sequence.append(KeyComboAction("Return"))
 sequence.append(WaitForDocLoad())
 
-########################################################################
-# Press Alt+Left Arrow to return to the anchors2.html page.
-#
 sequence.append(KeyComboAction("<Alt>Left"))
 sequence.append(WaitForDocLoad())
 
-########################################################################
-# Press U to move to the next unvisited link, textattributes.html. 
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("u"))
 sequence.append(utils.AssertPresentationAction(
-    "u to textattributes.html link", 
-    ["KNOWN ISSUE - Due to the Gecko bug/regression with focus, we wind up at the top on anchors",
-     "BRAILLE LINE:  '• textattributes.html'",
-     "     VISIBLE:  '• textattributes.html', cursor=3",
-     "SPEECH OUTPUT: 'textattributes.html link'"])) 
-
-########################################################################
-# Press U to move to the next unvisited link, anchors.html
-#
+    "6. u to textattributes.html link",
+    ["BRAILLE LINE:  '•textattributes.html'",
+     "     VISIBLE:  '•textattributes.html', cursor=2",
+     "BRAILLE LINE:  '•textattributes.html'",
+     "     VISIBLE:  '•textattributes.html', cursor=2",
+     "SPEECH OUTPUT: 'textattributes.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("u"))
 sequence.append(utils.AssertPresentationAction(
-    "u to anchors.html link",
-    ["KNOWN ISSUE - Due to the Gecko bug/regression with focus, this result is wrong",
-     "BRAILLE LINE:  '• anchors.html'",
-     "     VISIBLE:  '• anchors.html', cursor=3",
-     "SPEECH OUTPUT: 'Wrapping to top.'",
-     "SPEECH OUTPUT: 'anchors.html link'"]))
-
-########################################################################
-# Press Return to follow the blockquotes.html link.
-#
+    "7. u to anchors.html link",
+    ["BRAILLE LINE:  'Wrapping to top.'",
+     "     VISIBLE:  'Wrapping to top.', cursor=0",
+     "BRAILLE LINE:  '•anchors.html'",
+     "     VISIBLE:  '•anchors.html', cursor=2",
+     "BRAILLE LINE:  '•anchors.html'",
+     "     VISIBLE:  '•anchors.html', cursor=2",
+     "SPEECH OUTPUT: 'Wrapping to top.' voice=system",
+     "SPEECH OUTPUT: 'anchors.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
 sequence.append(KeyComboAction("Return"))
 sequence.append(WaitForDocLoad())
 
-########################################################################
-# Press Alt+Left Arrow to return to the anchors2.html page.
-#
 sequence.append(KeyComboAction("<Alt>Left"))
 sequence.append(WaitForDocLoad())
 
-########################################################################
-# Press V to move to the next visited link, tables.html
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("v"))
 sequence.append(utils.AssertPresentationAction(
-    "v to tables.html link", 
-    ["BUG? - This is failing. Possibly due to the Gecko bug/regression with focus.",
-     "BRAILLE LINE:  '• tables.html'",
-     "     VISIBLE:  '• tables.html', cursor=3",
-     "SPEECH OUTPUT: 'tables.html link'"]))
-
-########################################################################
-# Press V to move to the next visited link, blockquotes.html 
-#
+    "8. v to tables.html link",
+    ["BRAILLE LINE:  '•tables.html'",
+     "     VISIBLE:  '•tables.html', cursor=2",
+     "BRAILLE LINE:  '•tables.html'",
+     "     VISIBLE:  '•tables.html', cursor=2",
+     "SPEECH OUTPUT: 'tables.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("v"))
 sequence.append(utils.AssertPresentationAction(
-    "v to blockquotes.html link",
-    ["BUG? - This is failing. Possibly due to the Gecko bug/regression with focus.",
-     "BRAILLE LINE:  '• anchors.html'",
-     "     VISIBLE:  '• anchors.html', cursor=3",
-     "SPEECH OUTPUT: 'Wrapping to top.'",
-     "SPEECH OUTPUT: 'anchors.html link'"]))
-
-########################################################################
-# Press Shift V to move to the previous visited link, tables.html. 
-#
+    "9. v to blockquotes.html link",
+    ["BRAILLE LINE:  'Wrapping to top.'",
+     "     VISIBLE:  'Wrapping to top.', cursor=0",
+     "BRAILLE LINE:  '•anchors.html'",
+     "     VISIBLE:  '•anchors.html', cursor=2",
+     "BRAILLE LINE:  '•anchors.html'",
+     "     VISIBLE:  '•anchors.html', cursor=2",
+     "SPEECH OUTPUT: 'Wrapping to top.' voice=system",
+     "SPEECH OUTPUT: 'anchors.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>v"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + v to tables.html link",
+    "10. shift + v to tables.html link",
     ["BRAILLE LINE:  'Wrapping to bottom.'",
      "     VISIBLE:  'Wrapping to bottom.', cursor=0",
      "BRAILLE LINE:  '•tables.html'",
      "     VISIBLE:  '•tables.html', cursor=2",
-     "SPEECH OUTPUT: 'Wrapping to bottom.'",
-     "SPEECH OUTPUT: 'tables.html link'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l", 1000))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "BRAILLE LINE:  '•tables.html'",
+     "     VISIBLE:  '•tables.html', cursor=2",
+     "SPEECH OUTPUT: 'Wrapping to bottom.' voice=system",
+     "SPEECH OUTPUT: 'tables.html'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_list_item.params 
b/test/keystrokes/firefox/html_struct_nav_list_item.params
new file mode 100644
index 0000000..4634af5
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_list_item.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/lists.html
diff --git a/test/keystrokes/firefox/html_struct_nav_list_item.py 
b/test/keystrokes/firefox/html_struct_nav_list_item.py
index 039d5c6..a3144c3 100644
--- a/test/keystrokes/firefox/html_struct_nav_list_item.py
+++ b/test/keystrokes/firefox/html_struct_nav_list_item.py
@@ -1,276 +1,154 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of HTML list output of Firefox, in particular structural
-navigation by list item.
-"""
+"""Test of structural navigation amongst list items."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local lists test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "lists.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Lists Test Page",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'Welcome to a List of Lists h1'",
-     "     VISIBLE:  'Welcome to a List of Lists h1', cursor=1",
-     "SPEECH OUTPUT: 'Welcome to a List of Lists heading level 1'"]))
 
-########################################################################
-# Press L to move to the first list. 
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to first list", 
-    ["BRAILLE LINE:  'List with 4 items'",
+    "1. l to first list",
+    ["KNOWN ISSUE: The list item marker is missing here and in a couple other tests.",
+     "BRAILLE LINE:  'List with 4 items'",
      "     VISIBLE:  'List with 4 items', cursor=0",
-     "BRAILLE LINE:  '1.remember what the heck we are doing each day'",
-     "     VISIBLE:  '1.remember what the heck we are ', cursor=1",
-     "SPEECH OUTPUT: 'List with 4 items'",
-     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
+     "BRAILLE LINE:  'remember what the heck we are doing each day'",
+     "     VISIBLE:  'remember what the heck we are do', cursor=1",
+     "SPEECH OUTPUT: 'List with 4 items' voice=system",
+     "SPEECH OUTPUT: 'remember what the heck we are doing each day'"]))
 
-########################################################################
-# Press L to move to the second list.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to second list",
+    "2. l to second list",
     ["BRAILLE LINE:  'List with 6 items'",
      "     VISIBLE:  'List with 6 items', cursor=0",
-     "BRAILLE LINE:  'VI.And use roman numerals,'",
-     "     VISIBLE:  'VI.And use roman numerals,', cursor=1",
-     "SPEECH OUTPUT: 'List with 6 items'",
-     "SPEECH OUTPUT: 'VI.And use roman numerals,'"]))
+     "BRAILLE LINE:  'And use roman numerals,'",
+     "     VISIBLE:  'And use roman numerals,', cursor=1",
+     "SPEECH OUTPUT: 'List with 6 items' voice=system",
+     "SPEECH OUTPUT: 'And use roman numerals,'"]))
 
-########################################################################
-# Press L to move to the third list.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to third list",
-    ["BRAILLE LINE:  'List with 2 items'",
-     "     VISIBLE:  'List with 2 items', cursor=0",
+    "3. l to third list",
+    ["BRAILLE LINE:  'List with 1 item'",
+     "     VISIBLE:  'List with 1 item', cursor=0",
      "BRAILLE LINE:  '•listing item'",
-     "     VISIBLE:  '•listing item', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
+     "     VISIBLE:  '•listing item', cursor=2",
+     "SPEECH OUTPUT: 'List with 1 item' voice=system",
      "SPEECH OUTPUT: '•listing item'"]))
 
-########################################################################
-# Press I to move among all of the items (sub items, sub sub items, 
-# etc.) in the third list.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "4. i in third list",
     ["BRAILLE LINE:  'â—¦first sublevel'",
-     "     VISIBLE:  'â—¦first sublevel', cursor=1",
+     "     VISIBLE:  'â—¦first sublevel', cursor=2",
      "SPEECH OUTPUT: 'â—¦first sublevel'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "5. i in third list",
     ["BRAILLE LINE:  'â–ªlook for the bullet on'",
-     "     VISIBLE:  'â–ªlook for the bullet on', cursor=1",
+     "     VISIBLE:  'â–ªlook for the bullet on', cursor=2",
      "SPEECH OUTPUT: 'â–ªlook for the bullet on'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "6. i in third list",
     ["BRAILLE LINE:  'â–ªeach sublevel'",
-     "     VISIBLE:  'â–ªeach sublevel', cursor=1",
+     "     VISIBLE:  'â–ªeach sublevel', cursor=2",
      "SPEECH OUTPUT: 'â–ªeach sublevel'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "7. i in third list",
     ["BRAILLE LINE:  'â–ªthey should all be different, except here.'",
-     "     VISIBLE:  'â–ªthey should all be different, e', cursor=1",
+     "     VISIBLE:  'â–ªthey should all be different, e', cursor=2",
      "SPEECH OUTPUT: 'â–ªthey should all be different, except here.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "8. i in third list",
     ["BRAILLE LINE:  'â–ªsecond sublevel'",
-     "     VISIBLE:  'â–ªsecond sublevel', cursor=1",
+     "     VISIBLE:  'â–ªsecond sublevel', cursor=2",
      "SPEECH OUTPUT: 'â–ªsecond sublevel'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
-    ["BRAILLE LINE:  'â–ªor you can specify a square'",
-     "     VISIBLE:  'â–ªor you can specify a square', cursor=1",
-     "SPEECH OUTPUT: 'â–ªor you can specify a square'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("i"))
-sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "9. i in third list",
     ["BRAILLE LINE:  'â—¦if your TYPE is circle'",
-     "     VISIBLE:  'â—¦if your TYPE is circle', cursor=1",
+     "     VISIBLE:  'â—¦if your TYPE is circle', cursor=2",
      "SPEECH OUTPUT: 'â—¦if your TYPE is circle'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "10. i in third list",
     ["BRAILLE LINE:  '•or even a disc'",
-     "     VISIBLE:  '•or even a disc', cursor=1",
+     "     VISIBLE:  '•or even a disc', cursor=2",
      "SPEECH OUTPUT: '•or even a disc'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
-    ["BRAILLE LINE:  'â–ªFranz Liszt'",
-     "     VISIBLE:  'â–ªFranz Liszt', cursor=1",
-     "SPEECH OUTPUT: 'â–ªFranz Liszt'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("i"))
-sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "11. i in third list",
     ["BRAILLE LINE:  'â—¦was a composer who was not square'",
-     "     VISIBLE:  'â—¦was a composer who was not squa', cursor=1",
+     "     VISIBLE:  'â—¦was a composer who was not squa', cursor=2",
      "SPEECH OUTPUT: 'â—¦was a composer who was not square'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "12. i in third list",
     ["BRAILLE LINE:  '•would have liked the Who'",
-     "     VISIBLE:  '•would have liked the Who', cursor=1",
+     "     VISIBLE:  '•would have liked the Who', cursor=2",
      "SPEECH OUTPUT: '•would have liked the Who'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "13. i in third list",
     ["BRAILLE LINE:  'â—¦feeling listless'",
-     "     VISIBLE:  'â—¦feeling listless', cursor=1",
+     "     VISIBLE:  'â—¦feeling listless', cursor=2",
      "SPEECH OUTPUT: 'â—¦feeling listless"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "14. i in third list",
     ["BRAILLE LINE:  'â–ªblah, blah, blah'",
-     "     VISIBLE:  'â–ªblah, blah, blah', cursor=1",
+     "     VISIBLE:  'â–ªblah, blah, blah', cursor=2",
      "SPEECH OUTPUT: 'â–ªblah, blah, blah'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i in third list", 
+    "15. i in third list",
     ["BRAILLE LINE:  '•whine, whine, whine'",
-     "     VISIBLE:  '•whine, whine, whine', cursor=1",
+     "     VISIBLE:  '•whine, whine, whine', cursor=2",
      "SPEECH OUTPUT: '•whine, whine, whine'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("i"))
 sequence.append(utils.AssertPresentationAction(
-    "i should wrap to top", 
+    "16. i should wrap to top",
     ["BRAILLE LINE:  'Wrapping to top.'",
      "     VISIBLE:  'Wrapping to top.', cursor=0",
-     "BRAILLE LINE:  '1.remember what the heck we are doing each day'",
-     "     VISIBLE:  '1.remember what the heck we are ', cursor=1",
+     "BRAILLE LINE:  'remember what the heck we are doing each day'",
+     "     VISIBLE:  'remember what the heck we are do', cursor=1",
      "SPEECH OUTPUT: 'Wrapping to top.'",
-     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("i"))
-sequence.append(utils.AssertPresentationAction(
-    "i in first list", 
-    ["BRAILLE LINE:  '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some sense of priority, even if it is artificial'",
-     "     VISIBLE:  '2.arrange long and arbitrary lin', cursor=1",
-     "SPEECH OUTPUT: '2.arrange long and arbitrary lines of text into ordered lists that are pleasing to the 
eye and suggest some sense of priority, even if it is artificial'"]))
-
-########################################################################
-# Now reverse our direction, but just for a few items.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("<Shift>i"))
-sequence.append(utils.AssertPresentationAction(
-    "shift + i in first list", 
-    ["BRAILLE LINE:  '1.remember what the heck we are doing each day'",
-     "     VISIBLE:  '1.remember what the heck we are ', cursor=1",
-     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("<Shift>i"))
-sequence.append(utils.AssertPresentationAction(
-    "shift + i should wrap to bottom", 
-    ["BRAILLE LINE:  'Wrapping to bottom.'",
-     "     VISIBLE:  'Wrapping to bottom.', cursor=0",
-     "BRAILLE LINE:  '•whine, whine, whine'",
-     "     VISIBLE:  '•whine, whine, whine', cursor=1",
-     "SPEECH OUTPUT: 'Wrapping to bottom.'",
-     "SPEECH OUTPUT: '•whine, whine, whine'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("<Shift>i"))
-sequence.append(utils.AssertPresentationAction(
-    "shift + i in third list", 
-    ["BRAILLE LINE:  'â–ªblah, blah, blah'",
-     "     VISIBLE:  'â–ªblah, blah, blah', cursor=1",
-     "SPEECH OUTPUT: 'â–ªblah, blah, blah'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("<Shift>i"))
-sequence.append(utils.AssertPresentationAction(
-    "shift + i in third list", 
-    ["BRAILLE LINE:  'â—¦feeling listless'",
-     "     VISIBLE:  'â—¦feeling listless', cursor=1",
-     "SPEECH OUTPUT: 'â—¦feeling listless'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l", 1000))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'remember what the heck we are doing each day'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/html_struct_nav_lists.params 
b/test/keystrokes/firefox/html_struct_nav_lists.params
new file mode 100644
index 0000000..4634af5
--- /dev/null
+++ b/test/keystrokes/firefox/html_struct_nav_lists.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/lists.html
diff --git a/test/keystrokes/firefox/html_struct_nav_lists.py 
b/test/keystrokes/firefox/html_struct_nav_lists.py
index a851fb4..cf61fe8 100644
--- a/test/keystrokes/firefox/html_struct_nav_lists.py
+++ b/test/keystrokes/firefox/html_struct_nav_lists.py
@@ -1,347 +1,259 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of HTML list output of Firefox, in particular structural
-navigation by list.
-"""
+"""Test of structural navigation amongst lists."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local lists test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "lists.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Lists Test Page",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'Welcome to a List of Lists h1'",
-     "     VISIBLE:  'Welcome to a List of Lists h1', cursor=1",
-     "SPEECH OUTPUT: 'Welcome to a List of Lists heading level 1'"]))
 
-########################################################################
-# Press L to move to the first list. 
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to first list",
-    ["BRAILLE LINE:  'List with 4 items'",
+    "1. l to first list",
+    ["KNOWN ISSUE: We are missing the list item marker here and in other tests.",
+     "BRAILLE LINE:  'List with 4 items'",
      "     VISIBLE:  'List with 4 items', cursor=0",
-     "BRAILLE LINE:  '1.remember what the heck we are doing each day'",
-     "     VISIBLE:  '1.remember what the heck we are ', cursor=1",
-     "SPEECH OUTPUT: 'List with 4 items'",
-     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
+     "BRAILLE LINE:  'remember what the heck we are doing each day'",
+     "     VISIBLE:  'remember what the heck we are do', cursor=1",
+     "SPEECH OUTPUT: 'List with 4 items' voice=system",
+     "SPEECH OUTPUT: 'remember what the heck we are doing each day'"]))
 
-########################################################################
-# Press L to move to the second list.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to second list", 
+    "2. l to second list",
     ["BRAILLE LINE:  'List with 6 items'",
      "     VISIBLE:  'List with 6 items', cursor=0",
-     "BRAILLE LINE:  'VI.And use roman numerals,'",
-     "     VISIBLE:  'VI.And use roman numerals,', cursor=1",
-     "SPEECH OUTPUT: 'List with 6 items'",
-     "SPEECH OUTPUT: 'VI.And use roman numerals,'"]))
+     "BRAILLE LINE:  'And use roman numerals,'",
+     "     VISIBLE:  'And use roman numerals,', cursor=1",
+     "SPEECH OUTPUT: 'List with 6 items' voice=system",
+     "SPEECH OUTPUT: 'And use roman numerals,'"]))
 
-########################################################################
-# Press L to move to the third list.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to third list",
-    ["BRAILLE LINE:  'List with 2 items'",
-     "     VISIBLE:  'List with 2 items', cursor=0",
+    "3. l to third list",
+    ["BRAILLE LINE:  'List with 1 item'",
+     "     VISIBLE:  'List with 1 item', cursor=0",
      "BRAILLE LINE:  '•listing item'",
-     "     VISIBLE:  '•listing item', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
+     "     VISIBLE:  '•listing item', cursor=2",
+     "SPEECH OUTPUT: 'List with 1 item' voice=system",
      "SPEECH OUTPUT: '•listing item'"]))
 
-########################################################################
-# Press L to move to the first sub-list of the third list.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to third list's first sub list",
-    ["BRAILLE LINE:  'List with 2 items'",
-     "     VISIBLE:  'List with 2 items', cursor=0",
+    "4. l to third list's first sub list",
+    ["BRAILLE LINE:  'List with 1 item'",
+     "     VISIBLE:  'List with 1 item', cursor=0",
      "BRAILLE LINE:  'Nesting level 1'",
      "     VISIBLE:  'Nesting level 1', cursor=0",
      "BRAILLE LINE:  'â—¦first sublevel'",
-     "     VISIBLE:  'â—¦first sublevel', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 1'",
+     "     VISIBLE:  'â—¦first sublevel', cursor=2",
+     "SPEECH OUTPUT: 'List with 1 item' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 1' voice=system",
      "SPEECH OUTPUT: 'â—¦first sublevel'"]))
 
-########################################################################
-# Press L to move to the first list *within* the first sub-list of
-# the third list.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to third list's first sub list's first list", 
+    "5. l to third list's first sub list's first list",
     ["BRAILLE LINE:  'List with 2 items'",
      "     VISIBLE:  'List with 2 items', cursor=0",
      "BRAILLE LINE:  'Nesting level 2'",
      "     VISIBLE:  'Nesting level 2', cursor=0",
      "BRAILLE LINE:  'â–ªlook for the bullet on'",
-     "     VISIBLE:  'â–ªlook for the bullet on', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 2'",
+     "     VISIBLE:  'â–ªlook for the bullet on', cursor=2",
+     "SPEECH OUTPUT: 'List with 2 items' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 2' voice=system",
      "SPEECH OUTPUT: 'â–ªlook for the bullet on'"]))
 
-########################################################################
-# Press L again.  To move to the first sub-sub-list of the third list.
-# Phew, that's the inner-most list.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to third list's inner-most list", 
+    "6. l to third list's inner-most list",
     ["BRAILLE LINE:  'List with 2 items'",
      "     VISIBLE:  'List with 2 items', cursor=0",
      "BRAILLE LINE:  'Nesting level 3'",
      "     VISIBLE:  'Nesting level 3', cursor=0",
      "BRAILLE LINE:  'â–ªeach sublevel'",
-     "     VISIBLE:  'â–ªeach sublevel', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 3'",
+     "     VISIBLE:  'â–ªeach sublevel', cursor=2",
+     "SPEECH OUTPUT: 'List with 2 items' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 3' voice=system",
      "SPEECH OUTPUT: 'â–ªeach sublevel'"]))
 
-########################################################################
-# Press L again.  Now we're working our way out, but still stopping
-# on the first item of each new list we come across.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to next sub list in the third list",
+    "7. l to next sub list in the third list",
     ["BRAILLE LINE:  'List with 2 items'",
      "     VISIBLE:  'List with 2 items', cursor=0",
      "BRAILLE LINE:  'Nesting level 2'",
      "     VISIBLE:  'Nesting level 2', cursor=0",
      "BRAILLE LINE:  'â—¦if your TYPE is circle'",
-     "     VISIBLE:  'â—¦if your TYPE is circle', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 2'",
+     "     VISIBLE:  'â—¦if your TYPE is circle', cursor=2",
+     "SPEECH OUTPUT: 'List with 2 items' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 2' voice=system",
      "SPEECH OUTPUT: 'â—¦if your TYPE is circle'"]))
 
-########################################################################
-# Press L again.  Almost done.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to next sub list in the third list",
+    "8. l to next sub list in the third list",
     ["BRAILLE LINE:  'List with 2 items'",
      "     VISIBLE:  'List with 2 items', cursor=0",
      "BRAILLE LINE:  'Nesting level 1'",
      "     VISIBLE:  'Nesting level 1', cursor=0",
      "BRAILLE LINE:  'â—¦was a composer who was not square'",
-     "     VISIBLE:  'â—¦was a composer who was not squa', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 1'",
+     "     VISIBLE:  'â—¦was a composer who was not squa', cursor=2",
+     "SPEECH OUTPUT: 'List with 2 items' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 1' voice=system",
      "SPEECH OUTPUT: 'â—¦was a composer who was not square'"]))
 
-########################################################################
-# Press L again.  That should be all of the lists.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l to last sub list in the third list",
+    "9. l to last sub list in the third list",
     ["BRAILLE LINE:  'List with 3 items'",
      "     VISIBLE:  'List with 3 items', cursor=0",
      "BRAILLE LINE:  'â—¦feeling listless'",
-     "     VISIBLE:  'â—¦feeling listless', cursor=1",
-     "SPEECH OUTPUT: 'List with 3 items'",
+     "     VISIBLE:  'â—¦feeling listless', cursor=2",
+     "SPEECH OUTPUT: 'List with 3 items' voice=system",
      "SPEECH OUTPUT: 'â—¦feeling listless'"]))
 
-########################################################################
-# Pressing L again should result in our wrapping to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("l"))
 sequence.append(utils.AssertPresentationAction(
-    "l - should wrap to top", 
+    "10. l - should wrap to top",
     ["BRAILLE LINE:  'Wrapping to top.'",
      "     VISIBLE:  'Wrapping to top.', cursor=0",
      "BRAILLE LINE:  'List with 4 items'",
      "     VISIBLE:  'List with 4 items', cursor=0",
-     "BRAILLE LINE:  '1.remember what the heck we are doing each day'",
-     "     VISIBLE:  '1.remember what the heck we are ', cursor=1",
-     "SPEECH OUTPUT: 'Wrapping to top.'",
-     "SPEECH OUTPUT: 'List with 4 items'",
-     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
+     "BRAILLE LINE:  'remember what the heck we are doing each day'",
+     "     VISIBLE:  'remember what the heck we are do', cursor=1",
+     "SPEECH OUTPUT: 'Wrapping to top.' voice=system",
+     "SPEECH OUTPUT: 'List with 4 items' voice=system",
+     "SPEECH OUTPUT: 'remember what the heck we are doing each day'"]))
 
-########################################################################
-# Pressing Shift+L should result in our wrapping to the bottom
-# and then landing on the first item in the last list on the page.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>l"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + l - should wrap to bottom",
+    "11. shift + l - should wrap to bottom",
     ["BRAILLE LINE:  'Wrapping to bottom.'",
      "     VISIBLE:  'Wrapping to bottom.', cursor=0",
      "BRAILLE LINE:  'List with 3 items'",
      "     VISIBLE:  'List with 3 items', cursor=0",
      "BRAILLE LINE:  'â—¦feeling listless'",
-     "     VISIBLE:  'â—¦feeling listless', cursor=1",
-     "SPEECH OUTPUT: 'Wrapping to bottom.'",
-     "SPEECH OUTPUT: 'List with 3 items'",
+     "     VISIBLE:  'â—¦feeling listless', cursor=2",
+     "SPEECH OUTPUT: 'Wrapping to bottom.' voice=system",
+     "SPEECH OUTPUT: 'List with 3 items' voice=system",
      "SPEECH OUTPUT: 'â—¦feeling listless'"]))
 
-########################################################################
-# Pressing Shift+L subsequently should place us on all of the lists
-# we found by pressing L, but in the reverse direction.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>l"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + l", 
+    "12. shift + l",
     ["BRAILLE LINE:  'List with 2 items'",
      "     VISIBLE:  'List with 2 items', cursor=0",
      "BRAILLE LINE:  'Nesting level 1'",
      "     VISIBLE:  'Nesting level 1', cursor=0",
      "BRAILLE LINE:  'â—¦was a composer who was not square'",
-     "     VISIBLE:  'â—¦was a composer who was not squa', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 1'",
+     "     VISIBLE:  'â—¦was a composer who was not squa', cursor=2",
+     "SPEECH OUTPUT: 'List with 2 items' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 1' voice=system",
      "SPEECH OUTPUT: 'â—¦was a composer who was not square'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>l"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + l", 
+    "13. shift + l",
     ["BRAILLE LINE:  'List with 2 items'",
      "     VISIBLE:  'List with 2 items', cursor=0",
      "BRAILLE LINE:  'Nesting level 2'",
      "     VISIBLE:  'Nesting level 2', cursor=0",
      "BRAILLE LINE:  'â—¦if your TYPE is circle'",
-     "     VISIBLE:  'â—¦if your TYPE is circle', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 2'",
+     "     VISIBLE:  'â—¦if your TYPE is circle', cursor=2",
+     "SPEECH OUTPUT: 'List with 2 items' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 2' voice=system",
      "SPEECH OUTPUT: 'â—¦if your TYPE is circle'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>l"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + l", 
+    "14. shift + l",
     ["BRAILLE LINE:  'List with 2 items'",
      "     VISIBLE:  'List with 2 items', cursor=0",
      "BRAILLE LINE:  'Nesting level 3'",
      "     VISIBLE:  'Nesting level 3', cursor=0",
      "BRAILLE LINE:  'â–ªeach sublevel'",
-     "     VISIBLE:  'â–ªeach sublevel', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 3'",
+     "     VISIBLE:  'â–ªeach sublevel', cursor=2",
+     "SPEECH OUTPUT: 'List with 2 items' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 3' voice=system",
      "SPEECH OUTPUT: 'â–ªeach sublevel'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>l"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + l", 
+    "15. shift + l",
     ["BRAILLE LINE:  'List with 2 items'",
      "     VISIBLE:  'List with 2 items', cursor=0",
      "BRAILLE LINE:  'Nesting level 2'",
      "     VISIBLE:  'Nesting level 2', cursor=0",
      "BRAILLE LINE:  'â–ªlook for the bullet on'",
-     "     VISIBLE:  'â–ªlook for the bullet on', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 2'",
+     "     VISIBLE:  'â–ªlook for the bullet on', cursor=2",
+     "SPEECH OUTPUT: 'List with 2 items' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 2' voice=system",
      "SPEECH OUTPUT: 'â–ªlook for the bullet on'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>l"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + l", 
-    ["BRAILLE LINE:  'List with 2 items'",
-     "     VISIBLE:  'List with 2 items', cursor=0",
+    "16. shift + l",
+    ["BRAILLE LINE:  'List with 1 item'",
+     "     VISIBLE:  'List with 1 item', cursor=0",
      "BRAILLE LINE:  'Nesting level 1'",
      "     VISIBLE:  'Nesting level 1', cursor=0",
      "BRAILLE LINE:  'â—¦first sublevel'",
-     "     VISIBLE:  'â—¦first sublevel', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
-     "SPEECH OUTPUT: 'Nesting level 1'",
+     "     VISIBLE:  'â—¦first sublevel', cursor=2",
+     "SPEECH OUTPUT: 'List with 1 item' voice=system",
+     "SPEECH OUTPUT: 'Nesting level 1' voice=system",
      "SPEECH OUTPUT: 'â—¦first sublevel'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>l"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + l", 
-    ["BRAILLE LINE:  'List with 2 items'",
-     "     VISIBLE:  'List with 2 items', cursor=0",
+    "17. shift + l",
+    ["BRAILLE LINE:  'List with 1 item'",
+     "     VISIBLE:  'List with 1 item', cursor=0",
      "BRAILLE LINE:  '•listing item'",
-     "     VISIBLE:  '•listing item', cursor=1",
-     "SPEECH OUTPUT: 'List with 2 items'",
+     "     VISIBLE:  '•listing item', cursor=2",
+     "SPEECH OUTPUT: 'List with 1 item' voice=system",
      "SPEECH OUTPUT: '•listing item'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>l"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + l", 
+    "18. shift + l",
     ["BRAILLE LINE:  'List with 6 items'",
      "     VISIBLE:  'List with 6 items', cursor=0",
-     "BRAILLE LINE:  'VI.And use roman numerals,'",
-     "     VISIBLE:  'VI.And use roman numerals,', cursor=1",
-     "SPEECH OUTPUT: 'List with 6 items'",
-     "SPEECH OUTPUT: 'VI.And use roman numerals,'"]))
+     "BRAILLE LINE:  'And use roman numerals,'",
+     "     VISIBLE:  'And use roman numerals,', cursor=1",
+     "SPEECH OUTPUT: 'List with 6 items' voice=system",
+     "SPEECH OUTPUT: 'And use roman numerals,'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Shift>l"))
 sequence.append(utils.AssertPresentationAction(
-    "shift + l", 
+    "19. shift + l",
     ["BRAILLE LINE:  'List with 4 items'",
      "     VISIBLE:  'List with 4 items', cursor=0",
-     "BRAILLE LINE:  '1.remember what the heck we are doing each day'",
-     "     VISIBLE:  '1.remember what the heck we are ', cursor=1",
-     "SPEECH OUTPUT: 'List with 4 items'",
-     "SPEECH OUTPUT: '1.remember what the heck we are doing each day'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l", 1000))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "BRAILLE LINE:  'remember what the heck we are doing each day'",
+     "     VISIBLE:  'remember what the heck we are do', cursor=1",
+     "SPEECH OUTPUT: 'List with 4 items' voice=system",
+     "SPEECH OUTPUT: 'remember what the heck we are doing each day'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/label_inference_bug_546815.params 
b/test/keystrokes/firefox/label_inference_bug_546815.params
new file mode 100644
index 0000000..c9c621b
--- /dev/null
+++ b/test/keystrokes/firefox/label_inference_bug_546815.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-546815.html
diff --git a/test/keystrokes/firefox/label_inference_bug_546815.py 
b/test/keystrokes/firefox/label_inference_bug_546815.py
new file mode 100644
index 0000000..7769f1c
--- /dev/null
+++ b/test/keystrokes/firefox/label_inference_bug_546815.py
@@ -0,0 +1,211 @@
+#!/usr/bin/python
+
+"""Test of label guess functionality."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Next form field",
+    ["BRAILLE LINE:  'Enter your Name: text field using default type=text $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  'Enter your Name: text field using default type=text $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Enter your Name: entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Next form field",
+    ["BRAILLE LINE:  '1. Enter your Address: text field using SIZE and  $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  '1. Enter your Address: text field using SIZE and  $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: '1. Enter your Address: entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Next form field",
+    ["BRAILLE LINE:  '2. Enter your City: 3. Enter your State:  $l 4. Enter your Country: US $l image text 
field using  $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  '2. Enter your City: 3. Enter your State:  $l 4. Enter your Country: US $l image text 
field using  $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: '2. Enter your City: entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Next form field",
+    ["BRAILLE LINE:  '2. Enter your City: 3. Enter your State:  $l 4. Enter your Country: US $l image text 
field using  $l'",
+     "     VISIBLE:  ' $l 4. Enter your Country: US $l', cursor=1",
+     "BRAILLE LINE:  '2. Enter your City: 3. Enter your State:  $l 4. Enter your Country: US $l image text 
field using  $l'",
+     "     VISIBLE:  ' $l 4. Enter your Country: US $l', cursor=1",
+     "SPEECH OUTPUT: '3. Enter your State: entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Next form field",
+    ["BRAILLE LINE:  '2. Enter your City: 3. Enter your State:  $l 4. Enter your Country: US $l image text 
field using  $l'",
+     "     VISIBLE:  'US $l image text field using  $l', cursor=1",
+     "BRAILLE LINE:  '2. Enter your City: 3. Enter your State:  $l 4. Enter your Country: US $l image text 
field using  $l'",
+     "     VISIBLE:  'US $l image text field using  $l', cursor=1",
+     "SPEECH OUTPUT: '4. Enter your Country: entry US'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Next form field",
+    ["BRAILLE LINE:  '5. Enter your Zip:  $l'",
+     "     VISIBLE:  '5. Enter your Zip:  $l', cursor=20",
+     "BRAILLE LINE:  '5. Enter your Zip:  $l'",
+     "     VISIBLE:  '5. Enter your Zip:  $l', cursor=20",
+     "SPEECH OUTPUT: '5. Enter your Zip: entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Next form field",
+    ["BRAILLE LINE:  'character:  $l'",
+     "     VISIBLE:  'character:  $l', cursor=12",
+     "BRAILLE LINE:  'character:  $l'",
+     "     VISIBLE:  'character:  $l', cursor=12",
+     "SPEECH OUTPUT: 'character: entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Next form field",
+    ["KNOWN ISSUE: This is broken",
+     "BRAILLE LINE:  '< > check box bird'",
+     "     VISIBLE:  '< > check box bird', cursor=1",
+     "BRAILLE LINE:  '< > check box bird'",
+     "     VISIBLE:  '< > check box bird', cursor=1",
+     "SPEECH OUTPUT: 'What are your favorite pets? check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Next form field",
+    ["BRAILLE LINE:  '< > check box fish'",
+     "     VISIBLE:  '< > check box fish', cursor=1",
+     "BRAILLE LINE:  '< > check box fish'",
+     "     VISIBLE:  '< > check box fish', cursor=1",
+     "SPEECH OUTPUT: 'fish check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Next form field",
+    ["KNOWN ISSUE: We are treating the separator as if it is on the same line",
+     "BRAILLE LINE:  '< > check box wild animal separator'",
+     "     VISIBLE:  '< > check box wild animal separa', cursor=1",
+     "BRAILLE LINE:  '< > check box wild animal separator'",
+     "     VISIBLE:  '< > check box wild animal separa', cursor=1",
+     "SPEECH OUTPUT: 'wild animal check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Next form field",
+    ["KNOWN ISSUE: This is broken",
+     "BRAILLE LINE:  '&=y radio button cabernet sauvignon'",
+     "     VISIBLE:  '&=y radio button cabernet sauvig', cursor=1",
+     "BRAILLE LINE:  '&=y radio button cabernet sauvignon'",
+     "     VISIBLE:  '&=y radio button cabernet sauvig', cursor=1",
+     "SPEECH OUTPUT: 'Would type of wine do you like? selected radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Next form field",
+    ["BRAILLE LINE:  '& y radio button merlot'",
+     "     VISIBLE:  '& y radio button merlot', cursor=1",
+     "BRAILLE LINE:  '& y radio button merlot'",
+     "     VISIBLE:  '& y radio button merlot', cursor=1",
+     "SPEECH OUTPUT: 'merlot not selected radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Next form field",
+    ["BRAILLE LINE:  '& y radio button nebbiolo'",
+     "     VISIBLE:  '& y radio button nebbiolo', cursor=1",
+     "BRAILLE LINE:  '& y radio button nebbiolo'",
+     "     VISIBLE:  '& y radio button nebbiolo', cursor=1",
+     "SPEECH OUTPUT: 'nebbiolo not selected radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Next form field",
+    ["BRAILLE LINE:  '& y radio button pinot noir'",
+     "     VISIBLE:  '& y radio button pinot noir', cursor=1",
+     "BRAILLE LINE:  '& y radio button pinot noir'",
+     "     VISIBLE:  '& y radio button pinot noir', cursor=1",
+     "SPEECH OUTPUT: 'pinot noir not selected radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Next form field",
+    ["BRAILLE LINE:  '& y radio button don't drink wine'",
+     "     VISIBLE:  '& y radio button don't drink win', cursor=1",
+     "BRAILLE LINE:  '& y radio button don't drink wine'",
+     "     VISIBLE:  '& y radio button don't drink win', cursor=1",
+     "SPEECH OUTPUT: 'don't drink wine not selected radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Next form field",
+    ["BRAILLE LINE:  'Wrapping to top.'",
+     "     VISIBLE:  'Wrapping to top.', cursor=0",
+     "BRAILLE LINE:  'Enter your Name: text field using default type=text $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  'Enter your Name: text field using default type=text $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Wrapping to top.' voice=system",
+     "SPEECH OUTPUT: 'Enter your Name: entry'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/label_inference_bugzilla_search.params 
b/test/keystrokes/firefox/label_inference_bugzilla_search.params
new file mode 100644
index 0000000..d82c60a
--- /dev/null
+++ b/test/keystrokes/firefox/label_inference_bugzilla_search.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bugzilla-advanced.html
diff --git a/test/keystrokes/firefox/label_inference_bugzilla_search.py 
b/test/keystrokes/firefox/label_inference_bugzilla_search.py
new file mode 100644
index 0000000..8316506
--- /dev/null
+++ b/test/keystrokes/firefox/label_inference_bugzilla_search.py
@@ -0,0 +1,653 @@
+#!/usr/bin/python
+
+"""Test of label guess for bugzilla's advanced search page."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(PauseAction(3000))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("a"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Toggle modes",
+    ["BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Top of File",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  'Home Bugzilla'",
+     "     VISIBLE:  'Home Bugzilla', cursor=1",
+     "BRAILLE LINE:  'Home Bugzilla'",
+     "     VISIBLE:  'Home Bugzilla', cursor=0",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'Bugzilla'",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Next form field",
+    ["KNOWN ISSUE: We are not displaying the current combo box item",
+     "BRAILLE LINE:  'Summary: combo box $l Search push button'",
+     "     VISIBLE:  ' combo box $l Search push button', cursor=1",
+     "BRAILLE LINE:  'Summary: combo box $l Search push button'",
+     "     VISIBLE:  ' combo box $l Search push button', cursor=1",
+     "SPEECH OUTPUT: 'Summary: contains all of the words/strings combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Next form field",
+    ["BRAILLE LINE:  'Summary: combo box $l Search push button'",
+     "     VISIBLE:  ' $l Search push button', cursor=1",
+     "BRAILLE LINE:  'Summary: combo box $l Search push button'",
+     "     VISIBLE:  ' $l Search push button', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Next form field",
+    ["BRAILLE LINE:  'Summary: combo box $l Search push button'",
+     "     VISIBLE:  'Search push button', cursor=1",
+     "BRAILLE LINE:  'Summary: combo box $l Search push button'",
+     "     VISIBLE:  'Search push button', cursor=1",
+     "SPEECH OUTPUT: 'Search push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Next form field",
+    ["BRAILLE LINE:  'Admin'",
+     "     VISIBLE:  'Admin', cursor=1",
+     "BRAILLE LINE:  'Admin'",
+     "     VISIBLE:  'Admin', cursor=1",
+     "SPEECH OUTPUT: 'Classification: multi-select List with 8 items'",
+     "SPEECH OUTPUT: 'Admin'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Next form field",
+    ["BRAILLE LINE:  'accerciser'",
+     "     VISIBLE:  'accerciser', cursor=1",
+     "BRAILLE LINE:  'accerciser'",
+     "     VISIBLE:  'accerciser', cursor=1",
+     "SPEECH OUTPUT: 'Product: multi-select List with 379 items'",
+     "SPEECH OUTPUT: 'accerciser'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Next form field",
+    ["KNOWN ISSUE: Something is causing us to switch to focus mode here",
+     "BRAILLE LINE:  'abiscan'",
+     "     VISIBLE:  'abiscan', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'Component: multi-select List with 1248 items'",
+     "SPEECH OUTPUT: 'abiscan'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("a"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Toggle modes",
+    ["BRAILLE LINE:  'Browse mode'",
+     "     VISIBLE:  'Browse mode', cursor=0",
+     "SPEECH OUTPUT: 'Browse mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Next form field",
+    ["KNOWN ISSUE: Something is causing us to switch to focus mode here",
+     "BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "BRAILLE LINE:  '0.0.1'",
+     "     VISIBLE:  '0.0.1', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'Version: multi-select List with 857 items'",
+     "SPEECH OUTPUT: '0.0.1'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(PauseAction(3000))
+
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("a"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+
+sequence.append(PauseAction(3000))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Next form field",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "BRAILLE LINE:  '---'",
+     "     VISIBLE:  '---', cursor=1",
+     "BRAILLE LINE:  '---'",
+     "     VISIBLE:  '---', cursor=1",
+     "SPEECH OUTPUT: 'Target Milestone: multi-select List with 555 items'",
+     "SPEECH OUTPUT: '---'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Next form field",
+    ["BRAILLE LINE:  'A Comment: combo box $l table cell'",
+     "     VISIBLE:  ' combo box $l table cell', cursor=1",
+     "BRAILLE LINE:  'A Comment: combo box $l table cell'",
+     "     VISIBLE:  ' combo box $l table cell', cursor=1",
+     "SPEECH OUTPUT: 'A Comment: contains the string combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Next form field",
+    ["BRAILLE LINE:  'A Comment: combo box $l table cell'",
+     "     VISIBLE:  ' $l table cell', cursor=1",
+     "BRAILLE LINE:  'A Comment: combo box $l table cell'",
+     "     VISIBLE:  ' $l table cell', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Next form field",
+    ["BRAILLE LINE:  'Whiteboard: combo box $l table cell'",
+     "     VISIBLE:  ' combo box $l table cell', cursor=1",
+     "BRAILLE LINE:  'Whiteboard: combo box $l table cell'",
+     "     VISIBLE:  ' combo box $l table cell', cursor=1",
+     "SPEECH OUTPUT: 'Whiteboard: contains all of the words/strings combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Next form field",
+    ["BRAILLE LINE:  'Whiteboard: combo box $l table cell'",
+     "     VISIBLE:  ' $l table cell', cursor=1",
+     "BRAILLE LINE:  'Whiteboard: combo box $l table cell'",
+     "     VISIBLE:  ' $l table cell', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Next form field",
+    ["BRAILLE LINE:  'Keywords:  combo box $l'",
+     "     VISIBLE:  'Keywords:  combo box $l', cursor=11",
+     "BRAILLE LINE:  'Keywords:  combo box $l'",
+     "     VISIBLE:  'Keywords:  combo box $l', cursor=11",
+     "SPEECH OUTPUT: 'Keywords: contains all of the keywords combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Next form field",
+    ["BRAILLE LINE:  'Keywords:  combo box $l'",
+     "     VISIBLE:  'Keywords:  combo box $l', cursor=21",
+     "BRAILLE LINE:  'Keywords:  combo box $l'",
+     "     VISIBLE:  'Keywords:  combo box $l', cursor=21",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Next form field",
+    ["BRAILLE LINE:  'UNCONFIRMED'",
+     "     VISIBLE:  'UNCONFIRMED', cursor=1",
+     "BRAILLE LINE:  'UNCONFIRMED'",
+     "     VISIBLE:  'UNCONFIRMED', cursor=1",
+     "SPEECH OUTPUT: 'Status: multi-select List with 8 items'",
+     "SPEECH OUTPUT: 'UNCONFIRMED'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Next form field",
+    ["BRAILLE LINE:  'FIXED'",
+     "     VISIBLE:  'FIXED', cursor=1",
+     "BRAILLE LINE:  'FIXED'",
+     "     VISIBLE:  'FIXED', cursor=1",
+     "SPEECH OUTPUT: 'Resolution: multi-select List with 12 items'",
+     "SPEECH OUTPUT: 'FIXED'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Next form field",
+    ["BRAILLE LINE:  'blocker'",
+     "     VISIBLE:  'blocker', cursor=1",
+     "BRAILLE LINE:  'blocker'",
+     "     VISIBLE:  'blocker', cursor=1",
+     "SPEECH OUTPUT: 'Severity: multi-select List with 7 items'",
+     "SPEECH OUTPUT: 'blocker'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Next form field",
+    ["BRAILLE LINE:  'Immediate'",
+     "     VISIBLE:  'Immediate', cursor=1",
+     "BRAILLE LINE:  'Immediate'",
+     "     VISIBLE:  'Immediate', cursor=1",
+     "SPEECH OUTPUT: 'Priority: multi-select List with 5 items'",
+     "SPEECH OUTPUT: 'Immediate'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Next form field",
+    ["BRAILLE LINE:  'All'",
+     "     VISIBLE:  'All', cursor=1",
+     "BRAILLE LINE:  'All'",
+     "     VISIBLE:  'All', cursor=1",
+     "SPEECH OUTPUT: 'OS: multi-select List with 21 items'",
+     "SPEECH OUTPUT: 'All'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Next form field",
+    ["BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "SPEECH OUTPUT: 'Email and Numbering panel'",
+     "SPEECH OUTPUT: 'the bug assignee check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Next form field",
+    ["BRAILLE LINE:  '< > check box the reporter'",
+     "     VISIBLE:  '< > check box the reporter', cursor=1",
+     "BRAILLE LINE:  '< > check box the reporter'",
+     "     VISIBLE:  '< > check box the reporter', cursor=1",
+     "SPEECH OUTPUT: 'the reporter check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "25. Next form field",
+    ["BRAILLE LINE:  '< > check box the QA contact'",
+     "     VISIBLE:  '< > check box the QA contact', cursor=1",
+     "BRAILLE LINE:  '< > check box the QA contact'",
+     "     VISIBLE:  '< > check box the QA contact', cursor=1",
+     "SPEECH OUTPUT: 'the QA contact check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Next form field",
+    ["BRAILLE LINE:  '< > check box a CC list member'",
+     "     VISIBLE:  '< > check box a CC list member', cursor=1",
+     "BRAILLE LINE:  '< > check box a CC list member'",
+     "     VISIBLE:  '< > check box a CC list member', cursor=1",
+     "SPEECH OUTPUT: 'a CC list member check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "27. Next form field",
+    ["BRAILLE LINE:  '< > check box a commenter'",
+     "     VISIBLE:  '< > check box a commenter', cursor=1",
+     "BRAILLE LINE:  '< > check box a commenter'",
+     "     VISIBLE:  '< > check box a commenter', cursor=1",
+     "SPEECH OUTPUT: 'a commenter check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "28. Next form field",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'contains combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Next form field",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Next form field",
+    ["BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "SPEECH OUTPUT: 'the bug assignee check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "31. Next form field",
+    ["BRAILLE LINE:  '<x> check box the reporter'",
+     "     VISIBLE:  '<x> check box the reporter', cursor=1",
+     "BRAILLE LINE:  '<x> check box the reporter'",
+     "     VISIBLE:  '<x> check box the reporter', cursor=1",
+     "SPEECH OUTPUT: 'the reporter check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "32. Next form field",
+    ["BRAILLE LINE:  '<x> check box the QA contact'",
+     "     VISIBLE:  '<x> check box the QA contact', cursor=1",
+     "BRAILLE LINE:  '<x> check box the QA contact'",
+     "     VISIBLE:  '<x> check box the QA contact', cursor=1",
+     "SPEECH OUTPUT: 'the QA contact check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "33. Next form field",
+    ["BRAILLE LINE:  '<x> check box a CC list member'",
+     "     VISIBLE:  '<x> check box a CC list member', cursor=1",
+     "BRAILLE LINE:  '<x> check box a CC list member'",
+     "     VISIBLE:  '<x> check box a CC list member', cursor=1",
+     "SPEECH OUTPUT: 'a CC list member check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "34. Next form field",
+    ["BRAILLE LINE:  '< > check box a commenter'",
+     "     VISIBLE:  '< > check box a commenter', cursor=1",
+     "BRAILLE LINE:  '< > check box a commenter'",
+     "     VISIBLE:  '< > check box a commenter', cursor=1",
+     "SPEECH OUTPUT: 'a commenter check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "35. Next form field",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'contains combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "36. Next form field",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "37. Next form field",
+    ["BRAILLE LINE:  ' combo box bugs numbered:  $l'",
+     "     VISIBLE:  ' combo box bugs numbered:  $l', cursor=1",
+     "BRAILLE LINE:  ' combo box bugs numbered:  $l'",
+     "     VISIBLE:  ' combo box bugs numbered:  $l', cursor=1",
+     "SPEECH OUTPUT: 'Only include combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "38. Next form field",
+    ["KNOWN ISSUE: We want to speak 'bugs numbered'; we're instead infering the text below.",
+     "BRAILLE LINE:  ' combo box bugs numbered:  $l'",
+     "     VISIBLE:  ' combo box bugs numbered:  $l', cursor=27",
+     "BRAILLE LINE:  ' combo box bugs numbered:  $l'",
+     "     VISIBLE:  ' combo box bugs numbered:  $l', cursor=27",
+     "SPEECH OUTPUT: '(comma-separated list) entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "39. Next form field",
+    ["KNOWN ISSUE: Another case where we want to speak 'Only bugs changed between' before the entry.",
+     "BRAILLE LINE:  ' $l and Now $l'",
+     "     VISIBLE:  ' $l and Now $l', cursor=1",
+     "BRAILLE LINE:  ' $l and Now $l'",
+     "     VISIBLE:  ' $l and Now $l', cursor=1",
+     "SPEECH OUTPUT: 'Bug Changes panel'",
+     "SPEECH OUTPUT: '(YYYY-MM-DD or relative dates) entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "40. Next form field",
+    ["KNOWN ISSUE: Another case of infering the text below rather than text before, i.e. 'and'.",
+     "BRAILLE LINE:  ' $l and Now $l'",
+     "     VISIBLE:  ' $l and Now $l', cursor=9",
+     "BRAILLE LINE:  ' $l and Now $l'",
+     "     VISIBLE:  ' $l and Now $l', cursor=9",
+     "SPEECH OUTPUT: '(YYYY-MM-DD or relative dates) entry Now'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "41. Next form field",
+    ["BRAILLE LINE:  '[Bug creation]'",
+     "     VISIBLE:  '[Bug creation]', cursor=1",
+     "BRAILLE LINE:  '[Bug creation]'",
+     "     VISIBLE:  '[Bug creation]', cursor=1",
+     "SPEECH OUTPUT: 'where one or more of the following changed: multi-select List with 26 items'",
+     "SPEECH OUTPUT: '[Bug creation]'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "42. Next form field",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'and the new value was: entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "43. Next form field",
+    ["BRAILLE LINE:  'Unspecified'",
+     "     VISIBLE:  'Unspecified', cursor=1",
+     "BRAILLE LINE:  'Unspecified'",
+     "     VISIBLE:  'Unspecified', cursor=1",
+     "SPEECH OUTPUT: 'GNOME version: multi-select List with 14 items'",
+     "SPEECH OUTPUT: 'Unspecified'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "44. Next form field",
+    ["BRAILLE LINE:  'Unspecified'",
+     "     VISIBLE:  'Unspecified', cursor=1",
+     "BRAILLE LINE:  'Unspecified'",
+     "     VISIBLE:  'Unspecified', cursor=1",
+     "SPEECH OUTPUT: 'GNOME target: multi-select List with 12 items'",
+     "SPEECH OUTPUT: 'Unspecified'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(PauseAction(1000))
+sequence.append(utils.AssertPresentationAction(
+    "45. Next form field",
+    ["BRAILLE LINE:  'Sort results by:  combo box'",
+     "     VISIBLE:  'Sort results by:  combo box', cursor=18",
+     "BRAILLE LINE:  'Sort results by:  combo box'",
+     "     VISIBLE:  'Sort results by:  combo box', cursor=18",
+     "SPEECH OUTPUT: 'Sort results by: Reuse same sort as last time combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "46. Next form field",
+    ["BRAILLE LINE:  'Search push button'",
+     "     VISIBLE:  'Search push button', cursor=1",
+     "BRAILLE LINE:  'Search push button'",
+     "     VISIBLE:  'Search push button', cursor=1",
+     "SPEECH OUTPUT: 'Search push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "47. Next form field",
+    ["KNOWN ISSUE: Should the checkbox indicator be where it is physically or by the role?",
+     "BRAILLE LINE:  '     and remember these as my default search options < > check box'",
+     "     VISIBLE:  '< > check box', cursor=1",
+     "BRAILLE LINE:  '     and remember these as my default search options < > check box'",
+     "     VISIBLE:  '< > check box', cursor=1",
+     "SPEECH OUTPUT: 'and remember these as my default search options check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "48. Next form field",
+    ["BRAILLE LINE:  '< > check box Not (negate this whole chart)'",
+     "     VISIBLE:  '< > check box Not (negate this w', cursor=1",
+     "BRAILLE LINE:  '< > check box Not (negate this whole chart)'",
+     "     VISIBLE:  '< > check box Not (negate this w', cursor=1",
+     "SPEECH OUTPUT: 'Not (negate this whole chart) check box not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "49. Next form field",
+    ["BRAILLE LINE:  ' combo box  combo box  $l Or push button'",
+     "     VISIBLE:  ' combo box  combo box  $l Or pus', cursor=1",
+     "BRAILLE LINE:  ' combo box  combo box  $l Or push button'",
+     "     VISIBLE:  ' combo box  combo box  $l Or pus', cursor=1",
+     "SPEECH OUTPUT: '--- combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(utils.AssertPresentationAction(
+    "50. Next form field",
+    ["BRAILLE LINE:  ' combo box   $l combo box'",
+     "     VISIBLE:  ' combo box   $l combo box', cursor=16",
+     "BRAILLE LINE:  ' combo box   $l combo box'",
+     "     VISIBLE:  ' combo box   $l combo box', cursor=16",
+     "SPEECH OUTPUT: '--- combo box'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/label_inference_entries.params 
b/test/keystrokes/firefox/label_inference_entries.params
new file mode 100644
index 0000000..2ff0b54
--- /dev/null
+++ b/test/keystrokes/firefox/label_inference_entries.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/entries.html
diff --git a/test/keystrokes/firefox/label_guess_entries.py 
b/test/keystrokes/firefox/label_inference_entries.py
similarity index 65%
rename from test/keystrokes/firefox/label_guess_entries.py
rename to test/keystrokes/firefox/label_inference_entries.py
index 64d10a6..957da6b 100644
--- a/test/keystrokes/firefox/label_guess_entries.py
+++ b/test/keystrokes/firefox/label_inference_entries.py
@@ -1,481 +1,504 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of entries test page.  Note that not
-all of these are "right"/ideal. But this is the current status quo for
-regression testing.  We can revisit/refine the guessing heuristics over
-time and based upon feedback.
-"""
-
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "entries.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file",
-    ["BRAILLE LINE:  'Here are some entries h2'",
-     "     VISIBLE:  'Here are some entries h2', cursor=1",
-     "SPEECH OUTPUT: 'Here are some entries heading level 2'"]))
 
-########################################################################
-# Press Insert+Tab to move from form field to form field.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "1. Next form field",
     ["BRAILLE LINE:  'Type something rather amusing here:  $l'",
      "     VISIBLE:  ' $l', cursor=1",
-     "SPEECH OUTPUT: 'Type something rather amusing here: text'"]))
+     "BRAILLE LINE:  'Type something rather amusing here:  $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Type something rather amusing here: entry'"]))
+
+sequence.append(PauseAction(3000))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  'Amusing numbers fall between  $l and  $l .'",
-     "     VISIBLE:  ' $l and  $l .', cursor=1",
-     "SPEECH OUTPUT: 'Amusing numbers fall between text'"]))
+    "2. Next form field",
+    ["KNOWN ISSUE: Something odd is going on regarding the placement of the entries.",
+     "BRAILLE LINE:  'Amusing numbers fall between  and  $l . $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  'Amusing numbers fall between  and  $l . $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Amusing numbers fall between entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  'Amusing numbers fall between  $l and  $l .'",
-     "     VISIBLE:  ' $l .', cursor=1",
-     "SPEECH OUTPUT: 'and text'"]))
+    "3. Next form field",
+    ["BRAILLE LINE:  'Amusing numbers fall between  and  $l . $l'",
+     "     VISIBLE:  ' $l . $l', cursor=1",
+     "BRAILLE LINE:  'Amusing numbers fall between  and  $l . $l'",
+     "     VISIBLE:  ' $l . $l', cursor=1",
+     "SPEECH OUTPUT: 'and entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "4. Next form field",
     ["BRAILLE LINE:  ' $l I'm a label'",
      "     VISIBLE:  ' $l I'm a label', cursor=1",
-     "SPEECH OUTPUT: 'I'm a label text'"]))
+     "BRAILLE LINE:  ' $l I'm a label'",
+     "     VISIBLE:  ' $l I'm a label', cursor=1",
+     "SPEECH OUTPUT: 'I'm a label entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "5. Next form field",
     ["BRAILLE LINE:  ' $l Am I a label as well?'",
      "     VISIBLE:  ' $l Am I a label as well?', cursor=1",
-     "SPEECH OUTPUT: 'Am I a label as well? text'"]))
+     "BRAILLE LINE:  ' $l Am I a label as well?'",
+     "     VISIBLE:  ' $l Am I a label as well?', cursor=1",
+     "SPEECH OUTPUT: 'Am I a label as well? entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  ' $l Too far away to be a label.'",
+    "6. Next form field",
+    ["KNOWN ISSUE: As the text suggests, we probably shouldn't be guessing this.",
+     "BRAILLE LINE:  ' $l Too far away to be a label.'",
      "     VISIBLE:  ' $l Too far away to be a label.', cursor=1",
-     "SPEECH OUTPUT: 'text'"]))
+     "BRAILLE LINE:  ' $l Too far away to be a label.'",
+     "     VISIBLE:  ' $l Too far away to be a label.', cursor=1",
+     "SPEECH OUTPUT: 'Too far away to be a label. entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "7. Next form field",
     ["BRAILLE LINE:  'Distance doesn't count on the left $l'",
      "     VISIBLE:  ' $l', cursor=1",
-     "SPEECH OUTPUT: 'Distance doesn't count on the left text'"]))
+     "BRAILLE LINE:  'Distance doesn't count on the left $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Distance doesn't count on the left entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "8. Next form field",
     ["BRAILLE LINE:  ' $l'",
      "     VISIBLE:  ' $l', cursor=1",
-     "SPEECH OUTPUT: 'First Name text'"]))
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'First Name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "9. Next form field",
     ["BRAILLE LINE:  ' $l'",
      "     VISIBLE:  ' $l', cursor=1",
-     "SPEECH OUTPUT: 'M.I. text'"]))
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'M.I. entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "10. Next form field",
     ["BRAILLE LINE:  ' $l'",
      "     VISIBLE:  ' $l', cursor=1",
-     "SPEECH OUTPUT: 'Last Name text'"]))
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Last Name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "11. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=1",
-     "SPEECH OUTPUT: 'First name text'"]))
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=1",
+     "SPEECH OUTPUT: 'First name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "12. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=4",
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=4",
      "SPEECH OUTPUT: 'Middle",
-     "initial text'"]))
+     "initial entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "13. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=7",
-     "SPEECH OUTPUT: 'Last name text'"]))
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=7",
+     "SPEECH OUTPUT: 'Last name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "14. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=1",
-     "SPEECH OUTPUT: 'First Name text'"]))
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=1",
+     "SPEECH OUTPUT: 'First Name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "15. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=4",
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=4",
      "SPEECH OUTPUT: 'Middle",
-     "initial text'"]))
+     "initial entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "16. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=7",
-     "SPEECH OUTPUT: 'Last name text'"]))
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=7",
+     "SPEECH OUTPUT: 'Last name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "17. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=1",
-     "SPEECH OUTPUT: 'Given name text'"]))
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=1",
+     "SPEECH OUTPUT: 'Given name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "18. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=4",
-     "SPEECH OUTPUT: 'initial text'"]))
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=4",
+     "SPEECH OUTPUT: 'initial entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "19. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=7",
-     "SPEECH OUTPUT: 'Surname text'"]))
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=7",
+     "SPEECH OUTPUT: 'Surname entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "20. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=1",
-     "SPEECH OUTPUT: 'First name text'"]))
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=1",
+     "SPEECH OUTPUT: 'First name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "21. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=4",
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=4",
      "SPEECH OUTPUT: 'Middle",
-     "initial text'"]))
+     "initial entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "22. Next form field",
     ["BRAILLE LINE:  ' $l $l $l'",
      "     VISIBLE:  ' $l $l $l', cursor=7",
-     "SPEECH OUTPUT: 'Last name text'"]))
+     "BRAILLE LINE:  ' $l $l $l'",
+     "     VISIBLE:  ' $l $l $l', cursor=7",
+     "SPEECH OUTPUT: 'Last name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "23. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=1",
-     "SPEECH OUTPUT: 'First name text'"]))
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=1",
+     "SPEECH OUTPUT: 'First name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "24. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=4",
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=4",
      "SPEECH OUTPUT: 'Middle",
-     "initial text'"]))
+     "initial entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "25. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=7",
-     "SPEECH OUTPUT: 'Last name text'"]))
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=7",
+     "SPEECH OUTPUT: 'Last name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "26. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=10",
-     "SPEECH OUTPUT: 'patched image text'"]))
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=10",
+     "SPEECH OUTPUT: 'patched image entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "27. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=1",
-     "SPEECH OUTPUT: 'First name text'"]))
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=1",
+     "SPEECH OUTPUT: 'First name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "28. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=4",
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=4",
      "SPEECH OUTPUT: 'Middle",
-     "initial text'"]))
+     "initial entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "29. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=7",
-     "SPEECH OUTPUT: 'Last name text'"]))
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=7",
+     "SPEECH OUTPUT: 'Last name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "30. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=10",
-     "SPEECH OUTPUT: 'patched image text'"]))
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=10",
+     "SPEECH OUTPUT: 'patched image entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "31. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=1",
-     "SPEECH OUTPUT: 'First name text'"]))
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=1",
+     "SPEECH OUTPUT: 'First name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "32. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=4",
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=4",
      "SPEECH OUTPUT: 'Middle",
-     "initial text'"]))
+     "initial entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "33. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=7",
-     "SPEECH OUTPUT: 'Last name text'"]))
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=7",
+     "SPEECH OUTPUT: 'Last name entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "34. Next form field",
     ["BRAILLE LINE:  ' $l $l $l $l'",
      "     VISIBLE:  ' $l $l $l $l', cursor=10",
-     "SPEECH OUTPUT: 'patched image text'"]))
+     "BRAILLE LINE:  ' $l $l $l $l'",
+     "     VISIBLE:  ' $l $l $l $l', cursor=10",
+     "SPEECH OUTPUT: 'patched image entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  'bandaid graphic Image $l'",
-     "     VISIBLE:  'bandaid graphic Image $l', cursor=22",
-     "SPEECH OUTPUT: 'bandaid graphic text'"]))
+    "35. Next form field",
+    ["BRAILLE LINE:  'bandaid graphic $l'",
+     "     VISIBLE:  'bandaid graphic $l', cursor=16",
+     "BRAILLE LINE:  'bandaid graphic $l'",
+     "     VISIBLE:  'bandaid graphic $l', cursor=16",
+     "SPEECH OUTPUT: 'bandaid graphic entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  ' $l bandaid graphic redux Image'",
-     "     VISIBLE:  ' $l bandaid graphic redux Image', cursor=1",
-     "SPEECH OUTPUT: 'bandaid graphic redux text'"]))
+    "36. Next form field",
+    ["BRAILLE LINE:  ' $l bandaid graphic redux'",
+     "     VISIBLE:  ' $l bandaid graphic redux', cursor=1",
+     "BRAILLE LINE:  ' $l bandaid graphic redux'",
+     "     VISIBLE:  ' $l bandaid graphic redux', cursor=1",
+     "SPEECH OUTPUT: 'bandaid graphic redux entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "37. Next form field",
     ["BRAILLE LINE:  'Magic disappearing text trick:  $l'",
      "     VISIBLE:  ' $l', cursor=1",
      "BRAILLE LINE:  'Magic disappearing text trick:  $l'",
      "     VISIBLE:  ' $l', cursor=1",
-     "SPEECH OUTPUT: 'Magic disappearing text trick: text'"]))
+     "SPEECH OUTPUT: 'Magic disappearing text trick: entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "38. Next form field",
     ["BRAILLE LINE:  'Tell me a secret:  $l'",
      "     VISIBLE:  'Tell me a secret:  $l', cursor=19",
-     "SPEECH OUTPUT: 'Tell me a secret: password'"]))
+     "BRAILLE LINE:  'Tell me a secret:  $l'",
+     "     VISIBLE:  'Tell me a secret:  $l', cursor=19",
+     "SPEECH OUTPUT: 'Tell me a secret: password text'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "39. Next form field",
     ["BRAILLE LINE:  'I $l'",
      "     VISIBLE:  'I $l', cursor=1",
-     "SPEECH OUTPUT: 'Tell me a little more about yourself: text'",
-     "SPEECH OUTPUT: 'I' voice=uppercase"]))
+     "BRAILLE LINE:  'I $l'",
+     "     VISIBLE:  'I $l', cursor=1",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself: entry I'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "40. Next form field",
     ["BRAILLE LINE:  'Wrapping to top.'",
      "     VISIBLE:  'Wrapping to top.', cursor=0",
      "BRAILLE LINE:  'Type something rather amusing here:  $l'",
      "     VISIBLE:  ' $l', cursor=1",
-     "SPEECH OUTPUT: 'Wrapping to top.'",
-     "SPEECH OUTPUT: 'Type something rather amusing here: text'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "BRAILLE LINE:  'Type something rather amusing here:  $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Wrapping to top.' voice=system",
+     "SPEECH OUTPUT: 'Type something rather amusing here: entry'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/label_inference_mailman.params 
b/test/keystrokes/firefox/label_inference_mailman.params
new file mode 100644
index 0000000..78856dc
--- /dev/null
+++ b/test/keystrokes/firefox/label_inference_mailman.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/dev-accessibility.html
diff --git a/test/keystrokes/firefox/label_guess_bug_509809.py 
b/test/keystrokes/firefox/label_inference_mailman.py
similarity index 50%
rename from test/keystrokes/firefox/label_guess_bug_509809.py
rename to test/keystrokes/firefox/label_inference_mailman.py
index 87660c5..a24a04b 100644
--- a/test/keystrokes/firefox/label_guess_bug_509809.py
+++ b/test/keystrokes/firefox/label_inference_mailman.py
@@ -1,114 +1,98 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of label guess functionality, primarily by line."""
+"""Test of label guess functionality."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "dev-accessibility.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file",
-    ["BRAILLE LINE:  'Mozilla h1'",
-     "     VISIBLE:  'Mozilla h1', cursor=1",
-     "SPEECH OUTPUT: 'Mozilla link heading level 1'"]))
-
-########################################################################
-# Press Insert+Tab to move from form field to form field.
-#
+
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  'search mozilla: search mozilla:  $l Go Button'",
-     "     VISIBLE:  'search mozilla:  $l Go Button', cursor=17",
-     "SPEECH OUTPUT: 'search mozilla: text'"]))
+    "1. Next form field",
+    ["KNOWN ISSUE: The braille line seems broken",
+     "BRAILLE LINE:  'search mozilla:  Go push button search mozilla:  $l'",
+     "     VISIBLE:  'search mozilla:  $l', cursor=17",
+     "BRAILLE LINE:  'search mozilla:  Go push button search mozilla:  $l'",
+     "     VISIBLE:  'search mozilla:  $l', cursor=17",
+     "SPEECH OUTPUT: 'search mozilla: entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  'search mozilla: search mozilla:  $l Go Button'",
-     "     VISIBLE:  'Go Button', cursor=1",
-     "SPEECH OUTPUT: 'Go button'"]))
+    "2. Next form field",
+    ["KNOWN ISSUE: We are double-presenting the label in braille",
+     "BRAILLE LINE:  'search mozilla: search mozilla:  $l Go push button'",
+     "     VISIBLE:  'Go push button', cursor=1",
+     "BRAILLE LINE:  'search mozilla: search mozilla:  $l Go push button'",
+     "     VISIBLE:  'Go push button', cursor=1",
+     "SPEECH OUTPUT: 'Go push button'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field",
+    "3. Next form field",
     ["BRAILLE LINE:  'Your email address: $l '",
      "     VISIBLE:  'Your email address: $l ', cursor=20",
-     "SPEECH OUTPUT: 'Your email address: text'"]))
+     "BRAILLE LINE:  'Your email address: $l '",
+     "     VISIBLE:  'Your email address: $l ', cursor=20",
+     "SPEECH OUTPUT: 'Your email address: entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "4. Next form field",
     ["BRAILLE LINE:  'Your name (optional): $l '",
      "     VISIBLE:  'Your name (optional): $l ', cursor=22",
-     "SPEECH OUTPUT: 'Your name (optional): text'"]))
+     "BRAILLE LINE:  'Your name (optional): $l '",
+     "     VISIBLE:  'Your name (optional): $l ', cursor=22",
+     "SPEECH OUTPUT: 'Your name (optional): entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
+    "5. Next form field",
     ["BRAILLE LINE:  'Pick a password: $l '",
      "     VISIBLE:  'Pick a password: $l ', cursor=17",
-     "SPEECH OUTPUT: 'Pick a password: password'"]))
+     "BRAILLE LINE:  'Pick a password: $l '",
+     "     VISIBLE:  'Pick a password: $l ', cursor=17",
+     "SPEECH OUTPUT: 'Pick a password: password text'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field",
+    "6. Next form field",
     ["BRAILLE LINE:  'Reenter password to confirm: $l '",
      "     VISIBLE:  'Reenter password to confirm: $l ', cursor=29",
-     "SPEECH OUTPUT: 'Reenter password to confirm: password'"]))
+     "BRAILLE LINE:  'Reenter password to confirm: $l '",
+     "     VISIBLE:  'Reenter password to confirm: $l ', cursor=29",
+     "SPEECH OUTPUT: 'Reenter password to confirm: password text'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  'batched in a daily digest? &=y RadioButton No & y RadioButton Yes'",
-     "     VISIBLE:  '&=y RadioButton No & y RadioButt', cursor=1",
+    "7. Next form field",
+    ["BRAILLE LINE:  '&=y radio button No & y radio button Yes'",
+     "     VISIBLE:  '&=y radio button No & y radio bu', cursor=1",
+     "BRAILLE LINE:  '&=y radio button No & y radio button Yes'",
+     "     VISIBLE:  '&=y radio button No & y radio bu', cursor=1",
      "SPEECH OUTPUT: 'No selected radio button'"]))
 
 sequence.append(utils.StartRecordingAction())
@@ -116,9 +100,12 @@ sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  'batched in a daily digest? &=y RadioButton No & y RadioButton Yes'",
-     "     VISIBLE:  '& y RadioButton Yes', cursor=1",
+    "8. Next form field",
+    ["KNOWN ISSUE: Where 'Yes' appears seems to be impacted by its state",
+     "BRAILLE LINE:  '&=y radio button No  Yes & y radio button'",
+     "     VISIBLE:  '& y radio button', cursor=1",
+     "BRAILLE LINE:  '&=y radio button No  Yes & y radio button'",
+     "     VISIBLE:  '& y radio button', cursor=1",
      "SPEECH OUTPUT: 'Yes not selected radio button'"]))
 
 sequence.append(utils.StartRecordingAction())
@@ -126,78 +113,72 @@ sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field",
-    ["BRAILLE LINE:  'Subscribe Button'",
-     "     VISIBLE:  'Subscribe Button', cursor=1",
-     "SPEECH OUTPUT: 'Subscribe button'"]))
+    "9. Next form field",
+    ["BRAILLE LINE:  'Subscribe push button'",
+     "     VISIBLE:  'Subscribe push button', cursor=1",
+     "BRAILLE LINE:  'Subscribe push button'",
+     "     VISIBLE:  'Subscribe push button', cursor=1",
+     "SPEECH OUTPUT: 'Subscribe push button'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  'Admin address:  $l Password:  $l  Visit Subscriber List Button'",
-     "     VISIBLE:  ' $l Password:  $l  Visit Subscri', cursor=1",
-     "SPEECH OUTPUT: 'Admin address: text'"]))
+    "10. Next form field",
+    ["BRAILLE LINE:  'Admin address: Password:  $l  Visit Subscriber List push button $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  'Admin address: Password:  $l  Visit Subscriber List push button $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Admin address: entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field", 
-    ["BRAILLE LINE:  'Admin address:  $l Password:  $l  Visit Subscriber List Button'",
-     "     VISIBLE:  ' $l  Visit Subscriber List Butto', cursor=1",
-     "SPEECH OUTPUT: 'Password: password'"]))
+    "11. Next form field",
+    ["BRAILLE LINE:  'Admin address:  $l Password:   Visit Subscriber List push button $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  'Admin address:  $l Password:   Visit Subscriber List push button $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Password: password text'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field",
-    ["BRAILLE LINE:  'Admin address:  $l Password:  $l  Visit Subscriber List Button'",
-     "     VISIBLE:  'Visit Subscriber List Button', cursor=1",
-     "SPEECH OUTPUT: 'Visit Subscriber List button'"]))
+    "12. Next form field",
+    ["BRAILLE LINE:  'Admin address:  $l Password:  $l  Visit Subscriber List push button'",
+     "     VISIBLE:  'Visit Subscriber List push butto', cursor=1",
+     "BRAILLE LINE:  'Admin address:  $l Password:  $l  Visit Subscriber List push button'",
+     "     VISIBLE:  'Visit Subscriber List push butto', cursor=1",
+     "SPEECH OUTPUT: 'Visit Subscriber List push button'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field",
-    ["BRAILLE LINE:  ' $l Unsubscribe or edit options Button'",
+    "13. Next form field",
+    ["BRAILLE LINE:  ' $l Unsubscribe or edit options push button'",
      "     VISIBLE:  ' $l Unsubscribe or edit options ', cursor=1",
-     "SPEECH OUTPUT: 'text'"]))
+     "BRAILLE LINE:  ' $l Unsubscribe or edit options push button'",
+     "     VISIBLE:  ' $l Unsubscribe or edit options ', cursor=1",
+     "SPEECH OUTPUT: 'Unsubscribe or edit options entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Next form field",
-    ["BRAILLE LINE:  ' $l Unsubscribe or edit options Button'",
-     "     VISIBLE:  'Unsubscribe or edit options Butt', cursor=1",
-     "SPEECH OUTPUT: 'Unsubscribe or edit options button'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+    "14. Next form field",
+    ["BRAILLE LINE:  ' $l Unsubscribe or edit options push button'",
+     "     VISIBLE:  'Unsubscribe or edit options push', cursor=1",
+     "BRAILLE LINE:  ' $l Unsubscribe or edit options push button'",
+     "     VISIBLE:  'Unsubscribe or edit options push', cursor=1",
+     "SPEECH OUTPUT: 'Unsubscribe or edit options push button'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bug_546815.params 
b/test/keystrokes/firefox/line_nav_bug_546815.params
new file mode 100644
index 0000000..c9c621b
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_546815.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-546815.html
diff --git a/test/keystrokes/firefox/line_nav_bug_546815.py b/test/keystrokes/firefox/line_nav_bug_546815.py
new file mode 100644
index 0000000..2e644bd
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_546815.py
@@ -0,0 +1,553 @@
+#!/usr/bin/python
+
+"""Test of line navigation output of Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["BRAILLE LINE:  'HTML Form and Widgets'",
+     "     VISIBLE:  'HTML Form and Widgets', cursor=1",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'HTML Form and Widgets",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["BRAILLE LINE:  '",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  'Textfield :'",
+     "     VISIBLE:  'Textfield :', cursor=1",
+     "SPEECH OUTPUT: 'Textfield :'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Down",
+    ["BRAILLE LINE:  'Enter your Name:\xa0 $l text field using default type=text'",
+     "     VISIBLE:  'Enter your Name:\xa0 $l text field ', cursor=1",
+     "SPEECH OUTPUT: 'Enter your Name:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'text field using default type=text'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Down",
+    ["BRAILLE LINE:  '1. Enter your Address:\xa0 $l text field using SIZE and'",
+     "     VISIBLE:  '1. Enter your Address:\xa0 $l text ', cursor=1",
+     "SPEECH OUTPUT: '1. Enter your Address:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'text field using SIZE and '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
+    ["BRAILLE LINE:  'MAXLENGTH'",
+     "     VISIBLE:  'MAXLENGTH', cursor=1",
+     "SPEECH OUTPUT: 'MAXLENGTH'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Down",
+    ["KNOWN ISSUE: Sometimes we display the 'US'; other times we do not. Seems to be test flakiness.",
+     "BRAILLE LINE:  '2. Enter your City:\xa0 $l 3. Enter your State:\xa0 $l 4. Enter your Country:\xa0US $l 
image text field using'",
+     "     VISIBLE:  '2. Enter your City:\xa0 $l 3. Enter', cursor=1",
+     "SPEECH OUTPUT: '2. Enter your City:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: '3. Enter your State:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: '4. Enter your Country:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'US'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'text field using '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Down",
+    ["BRAILLE LINE:  'value'",
+     "     VISIBLE:  'value', cursor=1",
+     "SPEECH OUTPUT: 'value'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Down",
+    ["BRAILLE LINE:  '5. Enter your Zip:\xa0 $l'",
+     "     VISIBLE:  '5. Enter your Zip:\xa0 $l', cursor=1",
+     "SPEECH OUTPUT: '5. Enter your Zip:\xa0'",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Down",
+    ["BRAILLE LINE:  '6. What happens when a fixed-width font(the default) is used for a one-byte text input 
area, let's try it.. Enter one'",
+     "     VISIBLE:  '6. What happens when a fixed-wid', cursor=1",
+     "SPEECH OUTPUT: '6. What happens when a fixed-width font(the default) is used for a one-byte text input 
area, let's try it.. Enter one '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Line Down",
+    ["BRAILLE LINE:  'character:\xa0 $l'",
+     "     VISIBLE:  'character:\xa0 $l', cursor=1",
+     "SPEECH OUTPUT: 'character:\xa0'",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Line Down",
+    ["KNOWN ISSUE: Why is the checkbox all by itself?",
+     "BRAILLE LINE:  '\xa0CheckBox:'",
+     "     VISIBLE:  '\xa0CheckBox:', cursor=1",
+     "SPEECH OUTPUT: '\xa0CheckBox:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Down",
+    ["BRAILLE LINE:  'What are your favorite pets? h2'",
+     "     VISIBLE:  'What are your favorite pets? h2', cursor=1",
+     "SPEECH OUTPUT: 'What are your favorite pets?'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Line Down",
+    ["BRAILLE LINE:  '< > check box bird'",
+     "     VISIBLE:  '< > check box bird', cursor=1",
+     "BRAILLE LINE:  '< > check box bird'",
+     "     VISIBLE:  '< > check box bird', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: 'bird ",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Line Down",
+    ["BRAILLE LINE:  '< > check box fish'",
+     "     VISIBLE:  '< > check box fish', cursor=1",
+     "BRAILLE LINE:  '< > check box fish'",
+     "     VISIBLE:  '< > check box fish', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: 'fish ",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Line Down",
+    ["KNOWN ISSUE: We're treating the separator as if it were on this line",
+     "BRAILLE LINE:  '< > check box wild animal separator'",
+     "     VISIBLE:  '< > check box wild animal separa', cursor=1",
+     "BRAILLE LINE:  '< > check box wild animal separator'",
+     "     VISIBLE:  '< > check box wild animal separa', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: 'wild animal ",
+     "'",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Line Down",
+    ["KNOWN ISSUE: Braille doesn't match the speech",
+     "BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=0",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Line Down",
+    ["BRAILLE LINE:  'Radio Buttons:'",
+     "     VISIBLE:  'Radio Buttons:', cursor=1",
+     "SPEECH OUTPUT: 'Radio Buttons:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Line Down",
+    ["BRAILLE LINE:  'Would type of wine do you like? h2'",
+     "     VISIBLE:  'Would type of wine do you like? ', cursor=1",
+     "SPEECH OUTPUT: 'Would type of wine do you like?'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Line Down",
+    ["KNOWN ISSUE: We are combining lines here.",
+     "BRAILLE LINE:  '&=y radio button cabernet sauvignon'",
+     "     VISIBLE:  '&=y radio button cabernet sauvig', cursor=1",
+     "BRAILLE LINE:  '&=y radio button cabernet sauvignon'",
+     "     VISIBLE:  '&=y radio button cabernet sauvig', cursor=1",
+     "SPEECH OUTPUT: 'selected'",
+     "SPEECH OUTPUT: 'radio button'",
+     "SPEECH OUTPUT: 'cabernet sauvignon ",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Line Down",
+    ["BRAILLE LINE:  '& y radio button merlot'",
+     "     VISIBLE:  '& y radio button merlot', cursor=1",
+     "BRAILLE LINE:  '& y radio button merlot'",
+     "     VISIBLE:  '& y radio button merlot', cursor=1",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'",
+     "SPEECH OUTPUT: 'merlot ",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "25. Line Down",
+    ["BRAILLE LINE:  '& y radio button nebbiolo'",
+     "     VISIBLE:  '& y radio button nebbiolo', cursor=1",
+     "BRAILLE LINE:  '& y radio button nebbiolo'",
+     "     VISIBLE:  '& y radio button nebbiolo', cursor=1",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'",
+     "SPEECH OUTPUT: 'nebbiolo ",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Line Down",
+    ["BRAILLE LINE:  '& y radio button pinot noir'",
+     "     VISIBLE:  '& y radio button pinot noir', cursor=1",
+     "BRAILLE LINE:  '& y radio button pinot noir'",
+     "     VISIBLE:  '& y radio button pinot noir', cursor=1",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'",
+     "SPEECH OUTPUT: 'pinot noir ",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "27. Line Down",
+    ["BRAILLE LINE:  '& y radio button don't drink wine'",
+     "     VISIBLE:  '& y radio button don't drink win', cursor=1",
+     "BRAILLE LINE:  '& y radio button don't drink wine'",
+     "     VISIBLE:  '& y radio button don't drink win', cursor=1",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'",
+     "SPEECH OUTPUT: 'don't drink wine '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "28. Line Up",
+    ["BRAILLE LINE:  '& y radio button pinot noir'",
+     "     VISIBLE:  '& y radio button pinot noir', cursor=1",
+     "BRAILLE LINE:  '& y radio button pinot noir'",
+     "     VISIBLE:  '& y radio button pinot noir', cursor=1",
+     "SPEECH OUTPUT: 'pinot noir'",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Line Up",
+    ["BRAILLE LINE:  '& y radio button nebbiolo'",
+     "     VISIBLE:  '& y radio button nebbiolo', cursor=1",
+     "BRAILLE LINE:  '& y radio button nebbiolo'",
+     "     VISIBLE:  '& y radio button nebbiolo', cursor=1",
+     "SPEECH OUTPUT: 'nebbiolo'",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Line Up",
+    ["BRAILLE LINE:  '& y radio button merlot'",
+     "     VISIBLE:  '& y radio button merlot', cursor=1",
+     "BRAILLE LINE:  '& y radio button merlot'",
+     "     VISIBLE:  '& y radio button merlot', cursor=1",
+     "SPEECH OUTPUT: 'merlot'",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "31. Line Up",
+    ["BRAILLE LINE:  '&=y radio button cabernet sauvignon'",
+     "     VISIBLE:  '&=y radio button cabernet sauvig', cursor=1",
+     "BRAILLE LINE:  '&=y radio button cabernet sauvignon'",
+     "     VISIBLE:  '&=y radio button cabernet sauvig', cursor=1",
+     "SPEECH OUTPUT: 'Would type of wine do you like?'",
+     "SPEECH OUTPUT: 'selected'",
+     "SPEECH OUTPUT: 'radio button'",
+     "SPEECH OUTPUT: 'cabernet sauvignon ",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "32. Line Up",
+    ["BRAILLE LINE:  'Would type of wine do you like? h2'",
+     "     VISIBLE:  'Would type of wine do you like? ', cursor=1",
+     "SPEECH OUTPUT: 'Would type of wine do you like?'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "33. Line Up",
+    ["BRAILLE LINE:  'Radio Buttons:'",
+     "     VISIBLE:  'Radio Buttons:', cursor=1",
+     "SPEECH OUTPUT: 'Radio Buttons:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "34. Line Up",
+    ["KNOWN ISSUE: Braille doesn't match the speech",
+     "BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=0",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "35. Line Up",
+    ["BRAILLE LINE:  'separator",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "36. Line Up",
+    ["KNOWN ISSUE: We're treating the separator as if it were on this line",
+     "BRAILLE LINE:  '< > check box wild animal separator'",
+     "     VISIBLE:  '< > check box wild animal separa', cursor=1",
+     "BRAILLE LINE:  '< > check box wild animal separator'",
+     "     VISIBLE:  '< > check box wild animal separa', cursor=1",
+     "SPEECH OUTPUT: 'wild animal'",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "37. Line Up",
+    ["BRAILLE LINE:  '< > check box fish'",
+     "     VISIBLE:  '< > check box fish', cursor=1",
+     "BRAILLE LINE:  '< > check box fish'",
+     "     VISIBLE:  '< > check box fish', cursor=1",
+     "SPEECH OUTPUT: 'fish'",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "38. Line Up",
+    ["KNOWN ISSUE: This isn't quite right",
+     "BRAILLE LINE:  '< > check box bird'",
+     "     VISIBLE:  '< > check box bird', cursor=1",
+     "BRAILLE LINE:  '< > check box bird'",
+     "     VISIBLE:  '< > check box bird', cursor=1",
+     "SPEECH OUTPUT: 'What are your favorite pets?'",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: 'bird ",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "39. Line Up",
+    ["BRAILLE LINE:  'What are your favorite pets? h2'",
+     "     VISIBLE:  'What are your favorite pets? h2', cursor=1",
+     "SPEECH OUTPUT: 'What are your favorite pets?'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "40. Line Up",
+    ["KNOWN ISSUE: Why is the checkbox all by itself?",
+     "BRAILLE LINE:  '\xa0CheckBox:'",
+     "     VISIBLE:  '\xa0CheckBox:', cursor=1",
+     "SPEECH OUTPUT: '\xa0CheckBox:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "41. Line Up",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "42. Line Up",
+    ["BRAILLE LINE:  'character:\xa0 $l'",
+     "     VISIBLE:  'character:\xa0 $l', cursor=1",
+     "SPEECH OUTPUT: 'character:\xa0'",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "43. Line Up",
+    ["BRAILLE LINE:  '6. What happens when a fixed-width font(the default) is used for a one-byte text input 
area, let's try it.. Enter one'",
+     "     VISIBLE:  '6. What happens when a fixed-wid', cursor=1",
+     "SPEECH OUTPUT: '6. What happens when a fixed-width font(the default) is used for a one-byte text input 
area, let's try it.. Enter one '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "44. Line Up",
+    ["BRAILLE LINE:  '5. Enter your Zip:\xa0 $l'",
+     "     VISIBLE:  '5. Enter your Zip:\xa0 $l', cursor=1",
+     "SPEECH OUTPUT: '5. Enter your Zip:\xa0'",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "45. Line Up",
+    ["BRAILLE LINE:  'value'",
+     "     VISIBLE:  'value', cursor=1",
+     "SPEECH OUTPUT: 'value'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "46. Line Up",
+    ["BRAILLE LINE:  '2. Enter your City:\xa0 $l 3. Enter your State:\xa0 $l 4. Enter your Country:\xa0US $l 
image text field using'",
+     "     VISIBLE:  '2. Enter your City:\xa0 $l 3. Enter', cursor=1",
+     "SPEECH OUTPUT: '2. Enter your City:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: '3. Enter your State:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: '4. Enter your Country:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'US'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'text field using '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "47. Line Up",
+    ["BRAILLE LINE:  'MAXLENGTH'",
+     "     VISIBLE:  'MAXLENGTH', cursor=1",
+     "SPEECH OUTPUT: 'MAXLENGTH'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "48. Line Up",
+    ["BRAILLE LINE:  '1. Enter your Address:\xa0 $l text field using SIZE and'",
+     "     VISIBLE:  '1. Enter your Address:\xa0 $l text ', cursor=1",
+     "SPEECH OUTPUT: '1. Enter your Address:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'text field using SIZE and '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "49. Line Up",
+    ["BRAILLE LINE:  'Enter your Name:\xa0 $l text field using default type=text'",
+     "     VISIBLE:  'Enter your Name:\xa0 $l text field ', cursor=1",
+     "SPEECH OUTPUT: 'Enter your Name:\xa0'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'text field using default type=text'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "50. Line Up",
+    ["BRAILLE LINE:  'Textfield :'",
+     "     VISIBLE:  'Textfield :', cursor=1",
+     "SPEECH OUTPUT: 'Textfield :'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "51. Line Up",
+    ["BRAILLE LINE:  '",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "52. Line Up",
+    ["BRAILLE LINE:  'HTML Form and Widgets'",
+     "     VISIBLE:  'HTML Form and Widgets', cursor=1",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'HTML Form and Widgets",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "53. Line Up",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bug_549128.params 
b/test/keystrokes/firefox/line_nav_bug_549128.params
new file mode 100644
index 0000000..d2ccda9
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_549128.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/steaks.html
diff --git a/test/keystrokes/firefox/line_nav_bug_549128.py b/test/keystrokes/firefox/line_nav_bug_549128.py
index 1823eca..5856cf6 100644
--- a/test/keystrokes/firefox/line_nav_bug_549128.py
+++ b/test/keystrokes/firefox/line_nav_bug_549128.py
@@ -1,237 +1,178 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox. 
-"""
+"""Test of line navigation output of Firefox."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "steaks.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'Holiday Gift Giving'",
      "     VISIBLE:  'Holiday Gift Giving', cursor=1",
      "SPEECH OUTPUT: 'Holiday Gift Giving'"]))
 
-########################################################################
-# Down Arrow.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
-sequence.append(utils.AssertPresentationAction(
-    "1. Line Down",
-    ["BRAILLE LINE:  'Shop Early - Deliver Later'",
-     "     VISIBLE:  'Shop Early - Deliver Later', cursor=1",
-     "SPEECH OUTPUT: 'Shop Early - Deliver Later",
-     "'"]))
-
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "2. Line Down",
-    ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=0",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "3. Line Down",
-    ["BRAILLE LINE:  'The Ideal Gift Collection'",
-     "     VISIBLE:  'The Ideal Gift Collection', cursor=1",
-     "SPEECH OUTPUT: 'The Ideal Gift Collection link ",
+    ["BRAILLE LINE:  'Shop Early - Deliver Later'",
+     "     VISIBLE:  'Shop Early - Deliver Later', cursor=1",
+     "SPEECH OUTPUT: 'Shop Early - Deliver Later",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "4. Line Down",
-    ["BRAILLE LINE:  '  2 \(5 oz.\) Filet Mignons'",
-     "     VISIBLE:  '  2 \(5 oz.\) Filet Mignons', cursor=1",
-     "SPEECH OUTPUT: '  2 \(5 oz.\) Filet Mignons",
-     "'"]))
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "5. Line Down",
-    ["BRAILLE LINE:  '  2 \(5 oz.\) Top Sirloins'",
-     "     VISIBLE:  '  2 \(5 oz.\) Top Sirloins', cursor=2",
-     "SPEECH OUTPUT: '  2 \(5 oz.\) Top Sirloins",
+    ["BRAILLE LINE:  'The Ideal Gift Collection'",
+     "     VISIBLE:  'The Ideal Gift Collection', cursor=1",
+     "SPEECH OUTPUT: 'The Ideal Gift Collection'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "6. Line Down",
-    ["BRAILLE LINE:  '  4 \(4 oz.\) Foobar Steaks Burgers'",
-     "     VISIBLE:  '  4 \(4 oz.\) Foobar Steaks Burger', cursor=2",
-     "SPEECH OUTPUT: '  4 \(4 oz.\) Foobar Steaks Burgers",
-     "'"]))
+    ["KNOWN ISSUE: There is currently a Gecko bug or two that make the results get odd/off around here.",
+     "BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=0",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "7. Line Down",
-    ["BRAILLE LINE:  '  6 \(5.75 oz.\) Stuffed Baked Potatoes'",
-     "     VISIBLE:  '  6 \(5.75 oz.\) Stuffed Baked Pot', cursor=2",
-     "SPEECH OUTPUT: '  6 \(5.75 oz.\) Stuffed Baked Potatoes",
+    ["BRAILLE LINE:  '  2 (5 oz.) Filet Mignons'",
+     "     VISIBLE:  '  2 (5 oz.) Filet Mignons', cursor=0",
+     "SPEECH OUTPUT: '  2 (5 oz.) Filet Mignons",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "8. Line Down",
-    ["BRAILLE LINE:  '  2 \(4.5 oz.\) Stuffed Sole with Scallops and Crab'",
-     "     VISIBLE:  '  2 \(4.5 oz.\) Stuffed Sole with ', cursor=2",
-     "SPEECH OUTPUT: '  2 \(4.5 oz.\) Stuffed Sole with Scallops and Crab",
+    ["BRAILLE LINE:  '  2 (5 oz.) Top Sirloins'",
+     "     VISIBLE:  '  2 (5 oz.) Top Sirloins', cursor=0",
+     "SPEECH OUTPUT: '  2 (5 oz.) Top Sirloins",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "9. Line Down",
-    ["BRAILLE LINE:  '  1 \(6 in.\) Chocolate Lover's Cake'",
-     "     VISIBLE:  '  1 \(6 in.\) Chocolate Lover's Ca', cursor=2",
-     "SPEECH OUTPUT: '  1 \(6 in.\) Chocolate Lover's Cake",
+    ["BRAILLE LINE:  '  4 (4 oz.) Foobar Steaks Burgers'",
+     "     VISIBLE:  '  4 (4 oz.) Foobar Steaks Burger', cursor=0",
+     "SPEECH OUTPUT: '  4 (4 oz.) Foobar Steaks Burgers",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "10. Line Down",
-    ["BRAILLE LINE:  'Regular $133.00, Now $59.99'",
-     "     VISIBLE:  'Regular $133.00, Now $59.99', cursor=2",
-     "SPEECH OUTPUT: 'Regular $133.00, Now $59.99",
+    ["BRAILLE LINE:  '  6 (5.75 oz.) Stuffed Baked Potatoes'",
+     "     VISIBLE:  '  6 (5.75 oz.) Stuffed Baked Pot', cursor=0",
+     "SPEECH OUTPUT: '  6 (5.75 oz.) Stuffed Baked Potatoes",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "11. Line Down",
-    ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    ["BRAILLE LINE:  '  2 (4.5 oz.) Stuffed Sole with Scallops and Crab'",
+     "     VISIBLE:  '  2 (4.5 oz.) Stuffed Sole with ', cursor=0",
+     "SPEECH OUTPUT: '  2 (4.5 oz.) Stuffed Sole with Scallops and Crab",
+     "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "12. Line Down",
-    [""]))
-
-########################################################################
-# Up Arrow.
-#
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Up"))
-sequence.append(utils.AssertPresentationAction(
-    "1. Line Up",
-    ["BRAILLE LINE:  'Regular $133.00, Now $59.99'",
-     "     VISIBLE:  'Regular $133.00, Now $59.99', cursor=1",
-     "SPEECH OUTPUT: 'Regular $133.00, Now $59.99",
-     "'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Up"))
-sequence.append(utils.AssertPresentationAction(
-    "2. Line Up",
-    ["BRAILLE LINE:  '  1 \(6 in.\) Chocolate Lover's Cake'",
-     "     VISIBLE:  '  1 \(6 in.\) Chocolate Lover's Ca', cursor=1",
-     "SPEECH OUTPUT: '  1 \(6 in.\) Chocolate Lover's Cake",
+    ["BRAILLE LINE:  '  1 (6 in.) Chocolate Lover's Cake",
+     "Regular $133.00, Now $59.99'",
+     "     VISIBLE:  '(6 in.) Chocolate Lover's Cake",
+     "R', cursor=32",
+     "SPEECH OUTPUT: '  1 (6 in.) Chocolate Lover's Cake",
+     "Regular $133.00, Now $59.99",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Up"))
-sequence.append(utils.AssertPresentationAction(
-    "3. Line Up",
-    ["BRAILLE LINE:  '  2 \(4.5 oz.\) Stuffed Sole with Scallops and Crab'",
-     "     VISIBLE:  '  2 \(4.5 oz.\) Stuffed Sole with ', cursor=1",
-     "SPEECH OUTPUT: '  2 \(4.5 oz.\) Stuffed Sole with Scallops and Crab",
-     "'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Up"))
+sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Line Up",
-    ["BRAILLE LINE:  '  6 \(5.75 oz.\) Stuffed Baked Potatoes'",
-     "     VISIBLE:  '  6 \(5.75 oz.\) Stuffed Baked Pot', cursor=1",
-     "SPEECH OUTPUT: '  6 \(5.75 oz.\) Stuffed Baked Potatoes",
-     "'"]))
+    "13. Line Down",
+    [""]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Line Up",
-    ["BRAILLE LINE:  '  4 \(4 oz.\) Foobar Steaks Burgers'",
-     "     VISIBLE:  '  4 \(4 oz.\) Foobar Steaks Burger', cursor=1",
-     "SPEECH OUTPUT: '  4 \(4 oz.\) Foobar Steaks Burgers",
+    "14. Line Up",
+    ["KNOWN ISSUE: We skip lines on the way up so the results which follow are broken.",
+     "BRAILLE LINE:  '  6 (5.75 oz.) Stuffed Baked Potatoes'",
+     "     VISIBLE:  '  6 (5.75 oz.) Stuffed Baked Pot', cursor=0",
+     "SPEECH OUTPUT: '  6 (5.75 oz.) Stuffed Baked Potatoes",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "6. Line Up",
-    ["BRAILLE LINE:  '  2 \(5 oz.\) Top Sirloins'",
-     "     VISIBLE:  '  2 \(5 oz.\) Top Sirloins', cursor=1",
-     "SPEECH OUTPUT: '  2 \(5 oz.\) Top Sirloins",
+    "15. Line Up",
+    ["BRAILLE LINE:  '  2 (5 oz.) Top Sirloins'",
+     "     VISIBLE:  '  2 (5 oz.) Top Sirloins', cursor=0",
+     "SPEECH OUTPUT: '  2 (5 oz.) Top Sirloins",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "7. Line Up",
-    ["BRAILLE LINE:  '  2 \(5 oz.\) Filet Mignons'",
-     "     VISIBLE:  '  2 \(5 oz.\) Filet Mignons', cursor=1",
-     "SPEECH OUTPUT: '  2 \(5 oz.\) Filet Mignons",
-     "'"]))
+    "16. Line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=0",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "8. Line Up",
+    "17. Line Up",
     ["BRAILLE LINE:  'The Ideal Gift Collection'",
      "     VISIBLE:  'The Ideal Gift Collection', cursor=1",
-     "SPEECH OUTPUT: 'The Ideal Gift Collection link ",
+     "SPEECH OUTPUT: 'The Ideal Gift Collection'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "9. Line Up",
-    ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=0",
-     "SPEECH OUTPUT: 'blank'"]))
+    "18. Line Up",
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "10. Line Up",
+    "19. Line Up",
     ["BRAILLE LINE:  'Shop Early - Deliver Later'",
      "     VISIBLE:  'Shop Early - Deliver Later', cursor=1",
      "SPEECH OUTPUT: 'Shop Early - Deliver Later",
@@ -240,34 +181,18 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "11. Line Up",
-    ["BRAILLE LINE:  'Holiday Gift Giving'",
-     "     VISIBLE:  'Holiday Gift Giving', cursor=1",
-     "SPEECH OUTPUT: 'Holiday Gift Giving'"]))
+    "20. Line Up",
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "12. Line Up",
-    [""]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+    "21. Line Up",
+    ["BRAILLE LINE:  'Holiday Gift Giving'",
+     "     VISIBLE:  'Holiday Gift Giving', cursor=1",
+     "SPEECH OUTPUT: 'Holiday Gift Giving'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bug_552887a.params 
b/test/keystrokes/firefox/line_nav_bug_552887a.params
new file mode 100644
index 0000000..0972a1c
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_552887a.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-552887a.html
diff --git a/test/keystrokes/firefox/line_nav_bug_552887a.py b/test/keystrokes/firefox/line_nav_bug_552887a.py
new file mode 100644
index 0000000..aac99ca
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_552887a.py
@@ -0,0 +1,228 @@
+#!/usr/bin/python
+
+"""Test of the fix for one of the two issues in bug 552887."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["BRAILLE LINE:  'Line 1'",
+     "     VISIBLE:  'Line 1', cursor=1",
+     "SPEECH OUTPUT: 'Line 1",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["BRAILLE LINE:  'Line 1 Line 2 h2'",
+     "     VISIBLE:  'Line 1 Line 2 h2', cursor=8",
+     "SPEECH OUTPUT: 'Line 1",
+     "'",
+     "SPEECH OUTPUT: 'Line 2'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  'Line 3'",
+     "     VISIBLE:  'Line 3', cursor=1",
+     "SPEECH OUTPUT: 'Line 3",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Down",
+    ["BRAILLE LINE:  'The Orca logo image'",
+     "     VISIBLE:  'The Orca logo image', cursor=1",
+     "SPEECH OUTPUT: 'The Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Hey, look, it's our logo!'",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Down",
+    ["KNOWN ISSUE: We seem to be combining quite a bit here. Why?",
+     "BRAILLE LINE:  'Can an Orca really'",
+     "     VISIBLE:  'Can an Orca really', cursor=1",
+     "BRAILLE LINE:  'The Orca logo imageCan an Orca really'",
+     "     VISIBLE:  'The Orca logo imageCan an Orca r', cursor=0",
+     "SPEECH OUTPUT: 'Can an Orca really '",
+     "SPEECH OUTPUT: 'The Orca logo Can an Orca really hold a white cane? (And why aren't we speaking this 
text?'",
+     "SPEECH OUTPUT: 'link image' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
+    ["KNOWN ISSUE: We seem to be combining quite a bit here. Why?",
+     "BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=0",
+     "SPEECH OUTPUT: 'The Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Hey, look, it's our logo!'",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: '",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Down",
+    ["BRAILLE LINE:  'This text comes before the box section'",
+     "     VISIBLE:  'This text comes before the box s', cursor=1",
+     "SPEECH OUTPUT: 'This text comes before the box section",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Down",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Down",
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Down",
+    ["BRAILLE LINE:  'Here's a box'",
+     "     VISIBLE:  'Here's a box', cursor=1",
+     "SPEECH OUTPUT: 'Here's a box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Line Down",
+    ["BRAILLE LINE:  'Here's some box text.'",
+     "     VISIBLE:  'Here's some box text.', cursor=1",
+     "SPEECH OUTPUT: 'Here's some box text.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Line Down",
+    ["BRAILLE LINE:  'The end of the box'",
+     "     VISIBLE:  'The end of the box', cursor=1",
+     "SPEECH OUTPUT: 'The end of the box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Line Down",
+    ["BRAILLE LINE:  'image This text comes after'",
+     "     VISIBLE:  'image This text comes after', cursor=7",\
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'This text comes after '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Down",
+    ["BRAILLE LINE:  'the box section.'",
+     "     VISIBLE:  'the box section.', cursor=1",
+     "SPEECH OUTPUT: 'the box section.",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Line Up",
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Line Up",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Line Up",
+    ["BRAILLE LINE:  'This text comes before the box section'",
+     "     VISIBLE:  'This text comes before the box s', cursor=1",
+     "SPEECH OUTPUT: 'This text comes before the box section",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Up",
+    ["BRAILLE LINE:  'The Orca logo image'",
+     "     VISIBLE:  'The Orca logo image', cursor=1",
+     "SPEECH OUTPUT: 'The Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Hey, look, it's our logo!'",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Line Up",
+    ["BRAILLE LINE:  'Line 3'",
+     "     VISIBLE:  'Line 3', cursor=1",
+     "SPEECH OUTPUT: 'Line 3",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Line Up",
+    ["KNOWN ISSUE: On the way up, we skip the 'Line 2' text.",
+     "BRAILLE LINE:  'Line 1'",
+     "     VISIBLE:  'Line 1', cursor=1",
+     "SPEECH OUTPUT: 'Line 1",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Line Up",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bug_554616.params 
b/test/keystrokes/firefox/line_nav_bug_554616.params
new file mode 100644
index 0000000..df67797
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_554616.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-554616.html
diff --git a/test/keystrokes/firefox/line_nav_bug_554616.py b/test/keystrokes/firefox/line_nav_bug_554616.py
index 871eb56..d3700e7 100644
--- a/test/keystrokes/firefox/line_nav_bug_554616.py
+++ b/test/keystrokes/firefox/line_nav_bug_554616.py
@@ -1,129 +1,115 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox. 
-"""
+"""Test of line navigation output."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-554616.html"))
-sequence.append(KeyComboAction("Return"))
+sequence.append(KeyComboAction("<Control>Home"))
 
-sequence.append(WaitForDocLoad())
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Line Down",
+    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=1",
+     "SPEECH OUTPUT: 'r2477'",
+     "SPEECH OUTPUT: 'Wed Nov 5 16:39:00 2008'"]))
 
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["BRAILLE LINE:  'installer (10190 KB)'",
+     "     VISIBLE:  'installer (10190 KB)', cursor=1",
+     "SPEECH OUTPUT: 'installer'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (10190 KB)",
+     "'"]))
 
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
-    ["BRAILLE LINE:  'Snapshot version Date (UTC) Download'",
-     "     VISIBLE:  'Snapshot version Date (UTC) Down', cursor=1",
-     "SPEECH OUTPUT: 'Snapshot version column header Date (UTC) column header Download column header'"]))
+    "3. Line Down",
+    ["BRAILLE LINE:  'portable archive (9154 KB)'",
+     "     VISIBLE:  'portable archive (9154 KB)', cursor=1",
+     "SPEECH OUTPUT: 'portable archive'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (9154 KB)'"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Down",
-    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)portable archive (9154 KB)'",
-     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008 in', cursor=1",
-     "SPEECH OUTPUT: 'r2477 Wed Nov 5 16:39:00 2008 installer link  (10190 KB)",
-     " portable archive link  (9154 KB)'"]))
+    "4. Line Down",
+    ["BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008'",
+     "     VISIBLE:  'r2468 Tue Nov 4 16:39:02 2008', cursor=1",
+     "SPEECH OUTPUT: 'r2468'",
+     "SPEECH OUTPUT: 'Tue Nov 4 16:39:02 2008'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Down",
-    ["BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008 installer (10193 KB)portable archive (9149 KB)'",
-     "     VISIBLE:  'r2468 Tue Nov 4 16:39:02 2008 in', cursor=1",
-     "SPEECH OUTPUT: 'r2468 Tue Nov 4 16:39:02 2008 installer link  (10193 KB)",
-     " portable archive link  (9149 KB)'"]))
+    "5. Line Down",
+    ["BRAILLE LINE:  'installer (10193 KB)'",
+     "     VISIBLE:  'installer (10193 KB)', cursor=1",
+     "SPEECH OUTPUT: 'installer'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (10193 KB)",
+     "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Down",
-    ["BRAILLE LINE:  'r2464 Mon Nov 3 16:39:48 2008 installer (10186 KB)portable archive (9146 KB)'",
-     "     VISIBLE:  'r2464 Mon Nov 3 16:39:48 2008 in', cursor=1",
-     "SPEECH OUTPUT: 'r2464 Mon Nov 3 16:39:48 2008 installer link  (10186 KB)",
-     " portable archive link  (9146 KB)'"]))
+    "6. Line Down",
+    ["BRAILLE LINE:  'portable archive (9149 KB)'",
+     "     VISIBLE:  'portable archive (9149 KB)', cursor=1",
+     "SPEECH OUTPUT: 'portable archive'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (9149 KB)'"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Up",
-    ["BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008 installer (10193 KB)portable archive (9149 KB)'",
-     "     VISIBLE:  'r2468 Tue Nov 4 16:39:02 2008 in', cursor=1",
-     "SPEECH OUTPUT: 'r2468 Tue Nov 4 16:39:02 2008 installer link  (10193 KB)",
-     " portable archive link  (9149 KB)'"]))
+    "7. Line Up",
+    ["KNOWN ISSUE: We are skipping bits on the way up",
+     "BRAILLE LINE:  'r2468 Tue Nov 4 16:39:02 2008'",
+     "     VISIBLE:  'r2468 Tue Nov 4 16:39:02 2008', cursor=1",
+     "SPEECH OUTPUT: 'r2468'",
+     "SPEECH OUTPUT: 'Tue Nov 4 16:39:02 2008'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Up",
-    ["BUG? - On the way down, we treat this as one line; on the way up, as two.",
-     "BRAILLE LINE:  'portable archive (9154 KB)'",
+    "8. Line Up",
+    ["BRAILLE LINE:  'portable archive (9154 KB)'",
      "     VISIBLE:  'portable archive (9154 KB)', cursor=1",
-     "SPEECH OUTPUT: 'portable archive link  (9154 KB)'"]))
+     "SPEECH OUTPUT: 'portable archive'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (9154 KB)'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Up",
-    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008 installer (10190 KB)'",
-     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008 in', cursor=1",
-     "SPEECH OUTPUT: 'r2477 Wed Nov 5 16:39:00 2008 installer link  (10190 KB)",
-     "'"]))
+    "9. Line Up",
+    ["BRAILLE LINE:  'r2477 Wed Nov 5 16:39:00 2008'",
+     "     VISIBLE:  'r2477 Wed Nov 5 16:39:00 2008', cursor=1",
+     "SPEECH OUTPUT: 'r2477'",
+     "SPEECH OUTPUT: 'Wed Nov 5 16:39:00 2008'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Line Up",
+    "10. Line Up",
     ["BRAILLE LINE:  'Snapshot version Date (UTC) Download'",
      "     VISIBLE:  'Snapshot version Date (UTC) Down', cursor=1",
-     "SPEECH OUTPUT: 'Snapshot version column header Date (UTC) column header Download column header'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'Snapshot version'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Date (UTC)'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Download'",
+     "SPEECH OUTPUT: 'column header'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bug_555055.params 
b/test/keystrokes/firefox/line_nav_bug_555055.params
new file mode 100644
index 0000000..1bee03b
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_555055.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-555055.html
diff --git a/test/keystrokes/firefox/line_nav_bug_555055.py b/test/keystrokes/firefox/line_nav_bug_555055.py
index 80ebc62..bfe47bb 100644
--- a/test/keystrokes/firefox/line_nav_bug_555055.py
+++ b/test/keystrokes/firefox/line_nav_bug_555055.py
@@ -1,54 +1,21 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox. 
-"""
+"""Test of line navigation output of Firefox. """
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-555055.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file",
-    ["BRAILLE LINE:  'Image'",
-     "     VISIBLE:  'Image', cursor=1",
-     "SPEECH OUTPUT: 'image'"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "1. Line Down",
     ["BRAILLE LINE:  'Hello world!'",
      "     VISIBLE:  'Hello world!', cursor=1",
-     "SPEECH OUTPUT: 'Hello world!'"]))
+     "SPEECH OUTPUT: 'Hello world! '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -62,23 +29,56 @@ sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "3. Line Down",
-    ["BRAILLE LINE:  'hi Image'",
-     "     VISIBLE:  'hi Image', cursor=1",
-     "SPEECH OUTPUT: 'hi image'"]))
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "4. Line Down",
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Down",
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Down",
+    ["BRAILLE LINE:  'hi'",
+     "     VISIBLE:  'hi', cursor=1",
+     "SPEECH OUTPUT: 'hi'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' ",
-     "'"]))
+     "SPEECH OUTPUT: ' '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Line Down",
+    "8. Line Down",
+    ["BRAILLE LINE:  ' '",
+     "     VISIBLE:  ' ', cursor=1",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: '  '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Down",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
      "SPEECH OUTPUT: ' '"]))
@@ -86,7 +86,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "6. Line Down",
+    "10. Line Down",
     ["BRAILLE LINE:  'Item 1'",
      "     VISIBLE:  'Item 1', cursor=1",
      "SPEECH OUTPUT: 'Item 1'"]))
@@ -94,7 +94,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "7. Line Down",
+    "11. Line Down",
     ["BRAILLE LINE:  'Item 2'",
      "     VISIBLE:  'Item 2', cursor=1",
      "SPEECH OUTPUT: 'Item 2'"]))
@@ -102,58 +102,83 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "8. Line Down",
+    "12. Line Down",
     ["BRAILLE LINE:  'Item 3'",
      "     VISIBLE:  'Item 3', cursor=1",
-     "SPEECH OUTPUT: 'Item 3 ",
-     "'"]))
+     "SPEECH OUTPUT: 'Item 3'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "9. Line Down",
+    "13. Line Down",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: '  ",
-     " ",
-     " ",
-     "'"]))
+     "SPEECH OUTPUT: '  '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "10. Line Down",
+    "14. Line Down",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=0",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Down",
+    ["BRAILLE LINE:  'This table is messed up.'",
+     "     VISIBLE:  'This table is messed up.', cursor=1",
+     "SPEECH OUTPUT: 'This table is messed up.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Line Down",
+    ["BRAILLE LINE:  'Here's a cell'",
+     "     VISIBLE:  'Here's a cell', cursor=1",
+     "SPEECH OUTPUT: 'Here's a cell'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Line Up",
     ["BRAILLE LINE:  'This table is messed up.'",
      "     VISIBLE:  'This table is messed up.', cursor=1",
      "SPEECH OUTPUT: 'This table is messed up.'"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Up",
+    "18. Line Up",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=0",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: '  ",
-     " ",
-     " ",
-     "'"]))
+     "SPEECH OUTPUT: '  '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Up",
-    ["BUG? - Speech should say 'Item 3'",
-     "BRAILLE LINE:  'Item 3'",
-     "     VISIBLE:  'Item 3', cursor=0",
-     "SPEECH OUTPUT: 'blank'"]))
+    "20. Line Up",
+    ["BRAILLE LINE:  'Item 3'",
+     "     VISIBLE:  'Item 3', cursor=1",
+     "SPEECH OUTPUT: 'Item 3'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Up",
+    "21. Line Up",
     ["BRAILLE LINE:  'Item 2'",
      "     VISIBLE:  'Item 2', cursor=1",
      "SPEECH OUTPUT: 'Item 2'"]))
@@ -161,7 +186,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Line Up",
+    "22. Line Up",
     ["BRAILLE LINE:  'Item 1'",
      "     VISIBLE:  'Item 1', cursor=1",
      "SPEECH OUTPUT: 'Item 1'"]))
@@ -169,7 +194,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Line Up",
+    "23. Line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
      "SPEECH OUTPUT: ' '"]))
@@ -177,32 +202,57 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "6. Line Up",
-    ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    "24. Line Up",
+    ["BRAILLE LINE:  ' '",
+     "     VISIBLE:  ' ', cursor=1",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: '  '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "7. Line Up",
+    "25. Line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: '  ",
-     "'"]))
+     "SPEECH OUTPUT: ' '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Line Up",
+    ["BRAILLE LINE:  'hi'",
+     "     VISIBLE:  'hi', cursor=1",
+     "SPEECH OUTPUT: 'hi'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "8. Line Up",
-    ["BRAILLE LINE:  'hi Image'",
-     "     VISIBLE:  'hi Image', cursor=1",
-     "SPEECH OUTPUT: 'hi image'"]))
+    "27. Line Up",
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "9. Line Up",
+    "28. Line Up",
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Line Up",
+    ["BRAILLE LINE:  'image'",
+     "     VISIBLE:  'image', cursor=1",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
      "SPEECH OUTPUT: ' '"]))
@@ -210,28 +260,10 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "10. Line Up",
+    "31. Line Up",
     ["BRAILLE LINE:  'Hello world!'",
      "     VISIBLE:  'Hello world!', cursor=1",
-     "SPEECH OUTPUT: 'Hello world!'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'Hello world! '"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bug_570757.params 
b/test/keystrokes/firefox/line_nav_bug_570757.params
new file mode 100644
index 0000000..ddc59d1
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_570757.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-570757.html
diff --git a/test/keystrokes/firefox/line_nav_bug_570757.py b/test/keystrokes/firefox/line_nav_bug_570757.py
index ca19ef8..94412e5 100644
--- a/test/keystrokes/firefox/line_nav_bug_570757.py
+++ b/test/keystrokes/firefox/line_nav_bug_570757.py
@@ -1,51 +1,24 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox. 
-"""
+"""Test of line navigation output of Firefox."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-570757.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'This is a test.'",
      "     VISIBLE:  'This is a test.', cursor=1",
      "SPEECH OUTPUT: 'This is a test.'"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Down",
+    "2. Line Down",
     ["BRAILLE LINE:  'Solution'",
      "     VISIBLE:  'Solution', cursor=1",
      "SPEECH OUTPUT: 'Solution'"]))
@@ -53,52 +26,58 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Down",
-    ["BRAILLE LINE:  'Here is a step-by-step tutorial:'",
+    "3. Line Down",
+    ["KNOWN ISSUE: We seem to be combining list items",
+     "BRAILLE LINE:  'Here is a step-by-step tutorial: •Do this thing'",
      "     VISIBLE:  'Here is a step-by-step tutorial:', cursor=1",
      "SPEECH OUTPUT: 'Here is a step-by-step tutorial: ",
-     " panel'"]))
+     "'",
+     "SPEECH OUTPUT: 'panel'",
+     "SPEECH OUTPUT: '•Do this thing'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Down",
-    ["BRAILLE LINE:  '•Do this thing'",
-     "     VISIBLE:  '•Do this thing', cursor=1",
+    "4. Line Down",
+    ["KNOWN ISSUE: Are we getting stuck here?",
+     "BRAILLE LINE:  'Here is a step-by-step tutorial: •Do this thing'",
+     "     VISIBLE:  '•Do this thing', cursor=2",
+     "SPEECH OUTPUT: 'Here is a step-by-step tutorial: ",
+     "'",
+     "SPEECH OUTPUT: 'panel'",
      "SPEECH OUTPUT: '•Do this thing'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Line Down",
+    "5. Line Down",
     ["BRAILLE LINE:  '•Do this other thing'",
-     "     VISIBLE:  '•Do this other thing', cursor=1",
+     "     VISIBLE:  '•Do this other thing', cursor=2",
      "SPEECH OUTPUT: '•Do this other thing'"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Up",
+    "6. Line Up",
     ["BRAILLE LINE:  '•Do this thing'",
-     "     VISIBLE:  '•Do this thing', cursor=1",
+     "     VISIBLE:  '•Do this thing', cursor=2",
      "SPEECH OUTPUT: '•Do this thing'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Up",
-    ["BRAILLE LINE:  'Here is a step-by-step tutorial:'",
+    "7. Line Up",
+    ["BRAILLE LINE:  'Here is a step-by-step tutorial: •Do this thing'",
      "     VISIBLE:  'Here is a step-by-step tutorial:', cursor=1",
      "SPEECH OUTPUT: 'Here is a step-by-step tutorial: ",
-     " panel'"]))
+     "'",
+     "SPEECH OUTPUT: 'panel'",
+     "SPEECH OUTPUT: '•Do this thing'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Up",
+    "8. Line Up",
     ["BRAILLE LINE:  'Solution'",
      "     VISIBLE:  'Solution', cursor=1",
      "SPEECH OUTPUT: 'Solution'"]))
@@ -106,28 +85,10 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Line Up",
+    "8. Line Up",
     ["BRAILLE LINE:  'This is a test.'",
      "     VISIBLE:  'This is a test.', cursor=1",
      "SPEECH OUTPUT: 'This is a test.'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bug_577239.params 
b/test/keystrokes/firefox/line_nav_bug_577239.params
new file mode 100644
index 0000000..c8ba5dc
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_577239.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-577239.html
diff --git a/test/keystrokes/firefox/line_nav_bug_577239.py b/test/keystrokes/firefox/line_nav_bug_577239.py
index 370e24a..9e6a0d8 100644
--- a/test/keystrokes/firefox/line_nav_bug_577239.py
+++ b/test/keystrokes/firefox/line_nav_bug_577239.py
@@ -1,195 +1,157 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox. 
-"""
+"""Test of line navigation output of Firefox."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-577239.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'this is a page to test how well Orca works with list items.'",
      "     VISIBLE:  'this is a page to test how well ', cursor=1",
-     "SPEECH OUTPUT: 'this is a page to test how well Orca works with list items.'"]))
+     "SPEECH OUTPUT: 'this is a page to test how well Orca works with list items. '"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Down",
+    "2. Line Down",
     ["BRAILLE LINE:  'this is an ordered list:'",
      "     VISIBLE:  'this is an ordered list:', cursor=1",
-     "SPEECH OUTPUT: 'this is an ordered list:'"]))
+     "SPEECH OUTPUT: 'this is an ordered list: '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Down",
+    "3. Line Down",
     ["BRAILLE LINE:  '1.This is a short list item.'",
-     "     VISIBLE:  '1.This is a short list item.', cursor=1",
-     "SPEECH OUTPUT: '1.This is a short list item.'"]))
+     "     VISIBLE:  '1.This is a short list item.', cursor=3",
+     "SPEECH OUTPUT: '1.This is a short list item. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Down",
-    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'",
-     "     VISIBLE:  '2.This is a list item that spans', cursor=1",
-     "SPEECH OUTPUT: '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'"]))
+    "4. Line Down",
+    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
+     "     VISIBLE:  '2.This is a list item that spans', cursor=3",
+     "SPEECH OUTPUT: '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Line Down",
-    ["BRAILLE LINE:  'single item. And, yes, I realize that this is not deathless prose. In fact, it is 
prose that should probably be put out of its misery.'",
-     "     VISIBLE:  'single item. And, yes, I realize', cursor=1",
-     "SPEECH OUTPUT: 'single item. And, yes, I realize that this is not deathless prose. In fact, it is 
prose that should probably be put out of its misery.'"]))
+    "5. Line Down",
+    ["BRAILLE LINE:  'read several lines of text within this single item. And, yes, I realize that this is 
not deathless prose. In fact, it is'",
+     "     VISIBLE:  'read several lines of text withi', cursor=1",
+     "SPEECH OUTPUT: 'read several lines of text within this single item. And, yes, I realize that this is 
not deathless prose. In fact, it is '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Line Down",
+    "6. Line Down",
+    ["BRAILLE LINE:  'prose that should probably be put out of its misery.'",
+     "     VISIBLE:  'prose that should probably be pu', cursor=1",
+     "SPEECH OUTPUT: 'prose that should probably be put out of its misery. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
     ["BRAILLE LINE:  'This is an example of an unordered list:'",
-     "     VISIBLE:  'This is an example of an unorder', cursor=(1|8)",
-     "SPEECH OUTPUT: 'This is an example of an unordered list:'"]))
+     "     VISIBLE:  'This is an example of an unorder', cursor=1",
+     "SPEECH OUTPUT: 'This is an example of an unordered list: '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "6. Line Down",
+    "8. Line Down",
     ["BRAILLE LINE:  '•This is a short list item.'",
-     "     VISIBLE:  '•This is a short list item.', cursor=1",
-     "SPEECH OUTPUT: '•This is a short list item.'"]))
+     "     VISIBLE:  '•This is a short list item.', cursor=2",
+     "SPEECH OUTPUT: '•This is a short list item. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "7. Line Down",
-    ["BRAILLE LINE:  '•This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'",
-     "     VISIBLE:  '•This is a list item that spans ', cursor=1",
-     "SPEECH OUTPUT: '•This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'"]))
+    "9. Line Down",
+    ["BRAILLE LINE:  '•This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
+     "     VISIBLE:  '•This is a list item that spans ', cursor=2",
+     "SPEECH OUTPUT: '•This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "8. Line Down",
-    ["BRAILLE LINE:  'single item. And, yes, I realize that this is not deathless prose. In fact, it is 
prose that should probably be put out of its misery.'",
-     "     VISIBLE:  'single item. And, yes, I realize', cursor=1",
-     "SPEECH OUTPUT: 'single item. And, yes, I realize that this is not deathless prose. In fact, it is 
prose that should probably be put out of its misery.'"]))
+    "10. Line Down",
+    ["BRAILLE LINE:  'read several lines of text within this single item. And, yes, I realize that this is 
not deathless prose. In fact, it is'",
+     "     VISIBLE:  'read several lines of text withi', cursor=1",
+     "SPEECH OUTPUT: 'read several lines of text within this single item. And, yes, I realize that this is 
not deathless prose. In fact, it is '"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Up",
-    ["BRAILLE LINE:  '•This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'",
-     "     VISIBLE:  '•This is a list item that spans ', cursor=1",
-     "SPEECH OUTPUT: '•This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'"]))
+    "11. Line Up",
+    ["BRAILLE LINE:  '•This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
+     "     VISIBLE:  '•This is a list item that spans ', cursor=2",
+     "SPEECH OUTPUT: '•This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Up",
+    "12. Line Up",
     ["BRAILLE LINE:  '•This is a short list item.'",
-     "     VISIBLE:  '•This is a short list item.', cursor=1",
-     "SPEECH OUTPUT: '•This is a short list item.'"]))
+     "     VISIBLE:  '•This is a short list item.', cursor=2",
+     "SPEECH OUTPUT: '•This is a short list item. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Up",
+    "13. Line Up",
     ["BRAILLE LINE:  'This is an example of an unordered list:'",
      "     VISIBLE:  'This is an example of an unorder', cursor=1",
-     "SPEECH OUTPUT: 'This is an example of an unordered list:'"]))
+     "SPEECH OUTPUT: 'This is an example of an unordered list: '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Line Up",
-    ["BRAILLE LINE:  'single item. And, yes, I realize that this is not deathless prose. In fact, it is 
prose that should probably be put out of its misery.'",
-     "     VISIBLE:  'single item. And, yes, I realize', cursor=1",
-     "SPEECH OUTPUT: 'single item. And, yes, I realize that this is not deathless prose. In fact, it is 
prose that should probably be put out of its misery.'"]))
+    "14. Line Up",
+    ["BRAILLE LINE:  'prose that should probably be put out of its misery.'",
+     "     VISIBLE:  'prose that should probably be pu', cursor=1",
+     "SPEECH OUTPUT: 'prose that should probably be put out of its misery. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Line Up",
-    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'",
-     "     VISIBLE:  '2.This is a list item that spans', cursor=1",
-     "SPEECH OUTPUT: '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'"]))
+    "15. Line Up",
+    ["BRAILLE LINE:  'read several lines of text within this single item. And, yes, I realize that this is 
not deathless prose. In fact, it is'",
+     "     VISIBLE:  'read several lines of text withi', cursor=1",
+     "SPEECH OUTPUT: 'read several lines of text within this single item. And, yes, I realize that this is 
not deathless prose. In fact, it is '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "6. Line Up",
-    ["BRAILLE LINE:  '1.This is a short list item.'",
-     "     VISIBLE:  '1.This is a short list item.', cursor=1",
-     "SPEECH OUTPUT: '1.This is a short list item.'"]))
+    "16. Line Up",
+    ["KNOWN ISSUE: The list item marker has gone missing.",
+     "BRAILLE LINE:  'This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
+     "     VISIBLE:  'This is a list item that spans m', cursor=1",
+     "SPEECH OUTPUT: 'This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "7. Line Up",
-    ["BRAILLE LINE:  'this is an ordered list:'",
-     "     VISIBLE:  'this is an ordered list:', cursor=1",
-     "SPEECH OUTPUT: 'this is an ordered list:'"]))
+    "17. Line Up",
+    ["KNOWN ISSUE: The list item marker has gone missing.",
+     "BRAILLE LINE:  'This is a short list item.'",
+     "     VISIBLE:  'This is a short list item.', cursor=1",
+     "SPEECH OUTPUT: 'This is a short list item. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "8. Line Up",
-    ["BRAILLE LINE:  'this is a page to test how well Orca works with list items.'",
-     "     VISIBLE:  'this is a page to test how well ', cursor=1",
-     "SPEECH OUTPUT: 'this is a page to test how well Orca works with list items.'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+    "18. Line Up",
+    ["BRAILLE LINE:  'this is an ordered list:'",
+     "     VISIBLE:  'this is an ordered list:', cursor=1",
+     "SPEECH OUTPUT: 'this is an ordered list: '"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bug_577979.params 
b/test/keystrokes/firefox/line_nav_bug_577979.params
new file mode 100644
index 0000000..c8ba5dc
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_577979.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-577239.html
diff --git a/test/keystrokes/firefox/line_nav_bug_577979.py b/test/keystrokes/firefox/line_nav_bug_577979.py
index e2c3082..ee6c8f2 100644
--- a/test/keystrokes/firefox/line_nav_bug_577979.py
+++ b/test/keystrokes/firefox/line_nav_bug_577979.py
@@ -1,142 +1,83 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox. 
-"""
+"""Test of line navigation output of Firefox."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-577239.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'this is a page to test how well Orca works with list items.'",
      "     VISIBLE:  'this is a page to test how well ', cursor=1",
-     "SPEECH OUTPUT: 'this is a page to test how well Orca works with list items.'"]))
+     "SPEECH OUTPUT: 'this is a page to test how well Orca works with list items. '"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Down",
+    "2. Line Down",
     ["BRAILLE LINE:  'this is an ordered list:'",
      "     VISIBLE:  'this is an ordered list:', cursor=1",
-     "SPEECH OUTPUT: 'this is an ordered list:'"]))
+     "SPEECH OUTPUT: 'this is an ordered list: '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Down",
+    "3. Line Down",
     ["BRAILLE LINE:  '1.This is a short list item.'",
-     "     VISIBLE:  '1.This is a short list item.', cursor=1",
-     "SPEECH OUTPUT: '1.This is a short list item.'"]))
+     "     VISIBLE:  '1.This is a short list item.', cursor=3",
+     "SPEECH OUTPUT: '1.This is a short list item. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Down",
-    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'",
-     "     VISIBLE:  '2.This is a list item that spans', cursor=1",
-     "SPEECH OUTPUT: '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'"]))
+    "4. Line Down",
+    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
+     "     VISIBLE:  '2.This is a list item that spans', cursor=3",
+     "SPEECH OUTPUT: '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have '"]))
 
-########################################################################
-# Control + Right Arrow to move several words into the line.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Next Word",
-    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'",
+    "5. Next Word",
+    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
      "     VISIBLE:  '2.This is a list item that spans', cursor=7",
-     "SPEECH OUTPUT: '.This'"]))
+     "SPEECH OUTPUT: 'This '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Next Word",
-    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'",
+    "6. Next Word",
+    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
      "     VISIBLE:  '2.This is a list item that spans', cursor=10",
-     "SPEECH OUTPUT: ' is'"]))
+     "SPEECH OUTPUT: 'is '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Next Word",
-    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'",
+    "7. Next Word",
+    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
      "     VISIBLE:  '2.This is a list item that spans', cursor=12",
-     "SPEECH OUTPUT: ' a'"]))
+     "SPEECH OUTPUT: 'a '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Next Word",
-    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have read several lines of text within this'",
+    "8. Next Word",
+    ["BRAILLE LINE:  '2.This is a list item that spans multiple lines. If Orca can successfully read to the 
end of this list item, it will have'",
      "     VISIBLE:  '2.This is a list item that spans', cursor=17",
-     "SPEECH OUTPUT: ' list'"]))
+     "SPEECH OUTPUT: 'list '"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Line Down",
-    ["BRAILLE LINE:  'single item. And, yes, I realize that this is not deathless prose. In fact, it is 
prose that should probably be put out of its misery.'",
-     "     VISIBLE:  'single item. And, yes, I realize', cursor=1",
-     "SPEECH OUTPUT: 'single item. And, yes, I realize that this is not deathless prose. In fact, it is 
prose that should probably be put out of its misery.'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
-sequence.append(utils.AssertPresentationAction(
-    "5. Line Down",
-    ["BRAILLE LINE:  'This is an example of an unordered list:'",
-     "     VISIBLE:  'This is an example of an unorder', cursor=(1|8)",
-     "SPEECH OUTPUT: 'This is an example of an unordered list:'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+    "9. Line Down",
+    ["BRAILLE LINE:  'read several lines of text within this single item. And, yes, I realize that this is 
not deathless prose. In fact, it is'",
+     "     VISIBLE:  'read several lines of text withi', cursor=1",
+     "SPEECH OUTPUT: 'read several lines of text within this single item. And, yes, I realize that this is 
not deathless prose. In fact, it is '"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bug_592383.params 
b/test/keystrokes/firefox/line_nav_bug_592383.params
new file mode 100644
index 0000000..cd35594
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bug_592383.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-592383.html
diff --git a/test/keystrokes/firefox/line_nav_bug_592383.py b/test/keystrokes/firefox/line_nav_bug_592383.py
index e932768..12ba2df 100644
--- a/test/keystrokes/firefox/line_nav_bug_592383.py
+++ b/test/keystrokes/firefox/line_nav_bug_592383.py
@@ -1,51 +1,24 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of navigation around a paragraph with a multi-line-high
-initial character.
-"""
+"""Test of navigation given a paragraph with a multi-line-high initial char."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local blockquote test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-592383.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("Test",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'This is a normal paragraph.'",
      "     VISIBLE:  'This is a normal paragraph.', cursor=1",
      "SPEECH OUTPUT: 'This is a normal paragraph.'"]))
 
-########################################################################
-# Press Down Arrow to move line by line to the end.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Down",
+    "2. Down",
     ["BRAILLE LINE:  'So is this one, but the next one will not be.'",
      "     VISIBLE:  'So is this one, but the next one', cursor=1",
      "SPEECH OUTPUT: 'So is this one, but the next one will not be.'"]))
@@ -53,77 +26,65 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Down",
+    "3. Down",
     ["BRAILLE LINE:  'W'",
      "     VISIBLE:  'W', cursor=1",
-     "SPEECH OUTPUT: 'W' voice=uppercase"]))
+     "SPEECH OUTPUT: 'W'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Down",
-    ["BRAILLE LINE:  '   hy did the chicken cross the road? Give up? It was to escape from the enormous 
capital letter at the beginning of this paragraph. These are the'",
+    "4. Down",
+    ["BRAILLE LINE:  'W   hy did the chicken cross the road? Give up? It was to escape from the enormous 
capital letter at the'",
      "     VISIBLE:  '   hy did the chicken cross the ', cursor=1",
-     "SPEECH OUTPUT: '   hy did the chicken cross the road? Give up? It was to escape from the enormous 
capital letter at the beginning of this paragraph. These are the'"]))
+     "SPEECH OUTPUT: 'W'",
+     "SPEECH OUTPUT: '   hy did the chicken cross the road? Give up? It was to escape from the enormous 
capital letter at the '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Down",
-    ["BRAILLE LINE:  'things that keep chickens up at night. No. Really.They are.'",
-     "     VISIBLE:  'things that keep chickens up at ', cursor=1",
-     "SPEECH OUTPUT: 'things that keep chickens up at night. No. Really.They are.'"]))
+    "5. Down",
+    ["BRAILLE LINE:  'beginning of this paragraph. These are the things that keep chickens up at night. No. 
Really.They are.'",
+     "     VISIBLE:  'beginning of this paragraph. The', cursor=1",
+     "SPEECH OUTPUT: 'beginning of this paragraph. These are the things that keep chickens up at night. No. 
Really.They are. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Down",
+    "6. Down",
     ["BRAILLE LINE:  'Here's another normal paragraph.'",
      "     VISIBLE:  'Here's another normal paragraph.', cursor=1",
      "SPEECH OUTPUT: 'Here's another normal paragraph.'"]))
 
-########################################################################
-# Press Control+End to move to the end.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>End"))
 sequence.append(utils.AssertPresentationAction(
-    "End of file", 
+    "7. End of file", 
     ["BRAILLE LINE:  'Here's another normal paragraph.'",
      "     VISIBLE:  'Here's another normal paragraph.', cursor=32",
      "SPEECH OUTPUT: 'Here's another normal paragraph.'"]))
 
-########################################################################
-# Press Up Arrow to move line by line to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Up",
-    ["BRAILLE LINE:  'things that keep chickens up at night. No. Really.They are.'",
-     "     VISIBLE:  'things that keep chickens up at ', cursor=1",
-     "SPEECH OUTPUT: 'things that keep chickens up at night. No. Really.They are.'"]))
+    "8. Up",
+    ["BRAILLE LINE:  'beginning of this paragraph. These are the things that keep chickens up at night. No. 
Really.They are.'",
+     "     VISIBLE:  'beginning of this paragraph. The', cursor=1",
+     "SPEECH OUTPUT: 'beginning of this paragraph. These are the things that keep chickens up at night. No. 
Really.They are. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Up",
-    ["BRAILLE LINE:  '   hy did the chicken cross the road? Give up? It was to escape from the enormous 
capital letter at the beginning of this paragraph. These are the'",
-     "     VISIBLE:  '   hy did the chicken cross the ', cursor=1",
-     "SPEECH OUTPUT: '   hy did the chicken cross the road? Give up? It was to escape from the enormous 
capital letter at the beginning of this paragraph. These are the'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Up"))
-sequence.append(utils.AssertPresentationAction(
-    "3. Up",
-    ["BRAILLE LINE:  'W'",
+    "9. Up",
+    ["KNOWN ISSUE: We are not combining the W with the non-huge text that follows",
+     "BRAILLE LINE:  'W'",
      "     VISIBLE:  'W', cursor=1",
-     "SPEECH OUTPUT: 'W' voice=uppercase"]))
+     "SPEECH OUTPUT: 'W'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Up",
+    "10. Up",
     ["BRAILLE LINE:  'So is this one, but the next one will not be.'",
      "     VISIBLE:  'So is this one, but the next one', cursor=1",
      "SPEECH OUTPUT: 'So is this one, but the next one will not be.'"]))
@@ -131,28 +92,10 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Up",
+    "11. Up",
     ["BRAILLE LINE:  'This is a normal paragraph.'",
      "     VISIBLE:  'This is a normal paragraph.', cursor=1",
      "SPEECH OUTPUT: 'This is a normal paragraph.'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bugzilla_search_down.params 
b/test/keystrokes/firefox/line_nav_bugzilla_search_down.params
new file mode 100644
index 0000000..d82c60a
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bugzilla_search_down.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bugzilla-advanced.html
diff --git a/test/keystrokes/firefox/line_nav_bugzilla_search_down.py 
b/test/keystrokes/firefox/line_nav_bugzilla_search_down.py
new file mode 100644
index 0000000..1949244
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bugzilla_search_down.py
@@ -0,0 +1,815 @@
+#!/usr/bin/python
+
+"""Test of line navigation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(PauseAction(3000))
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("a"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Line Down",
+    ["BRAILLE LINE:  'New bug · Browse · Search · Reports · Account · Admin · Help Logged In joanmarie diggs 
gmail com | Log Out'",
+     "     VISIBLE:  'New bug · Browse · Search · Repo', cursor=1",
+     "SPEECH OUTPUT: 'New bug'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Browse'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Reports'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Account'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Admin'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Help'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Logged In joanmarie diggs gmail com | '",
+     "SPEECH OUTPUT: 'Log Out'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["BRAILLE LINE:  ' Short Bug Search Form Complicated Bug Search Form  '",
+     "     VISIBLE:  ' Short Bug Search Form Complicat', cursor=1",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'Short Bug Search Form '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Complicated Bug Search Form '",
+     "SPEECH OUTPUT: ' '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["BRAILLE LINE:  'Give me some help (reloads page.)'",
+     "     VISIBLE:  'Give me some help (reloads page.', cursor=1",
+     "SPEECH OUTPUT: 'Give me some help'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (reloads page.)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  'Summary: combo box $l Search push button'",
+     "     VISIBLE:  'Summary: combo box $l Search pus', cursor=1",
+     "SPEECH OUTPUT: 'Summary:'",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains all of the words/strings'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Down",
+    ["BRAILLE LINE:  'Classification:'",
+     "     VISIBLE:  'Classification:', cursor=1",
+     "SPEECH OUTPUT: 'Classification:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Down",
+    ["BRAILLE LINE:  'Admin list box'",
+     "     VISIBLE:  'Admin list box', cursor=1",
+     "BRAILLE LINE:  'Admin list box'",
+     "     VISIBLE:  'Admin list box', cursor=1",
+     "SPEECH OUTPUT: 'Classification:'",
+     "SPEECH OUTPUT: 'Admin'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 8 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
+    ["BRAILLE LINE:  'Product:'",
+     "     VISIBLE:  'Product:', cursor=1",
+     "SPEECH OUTPUT: 'Product:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Down",
+    ["BRAILLE LINE:  'accerciser list box'",
+     "     VISIBLE:  'accerciser list box', cursor=1",
+     "BRAILLE LINE:  'accerciser list box'",
+     "     VISIBLE:  'accerciser list box', cursor=1",
+     "SPEECH OUTPUT: 'Product:'",
+     "SPEECH OUTPUT: 'accerciser'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 379 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Down",
+    ["BRAILLE LINE:  'Component:'",
+     "     VISIBLE:  'Component:', cursor=1",
+     "SPEECH OUTPUT: 'Component'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Down",
+    ["BRAILLE LINE:  'abiscan list box'",
+     "     VISIBLE:  'abiscan list box', cursor=1",
+     "BRAILLE LINE:  'abiscan list box'",
+     "     VISIBLE:  'abiscan list box', cursor=1",
+     "SPEECH OUTPUT: 'Component:'",
+     "SPEECH OUTPUT: 'abiscan'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 1248 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Down",
+    ["BRAILLE LINE:  'Version:'",
+     "     VISIBLE:  'Version:', cursor=1",
+     "SPEECH OUTPUT: 'Version:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Line Down",
+    ["BRAILLE LINE:  '0.0.1 list box'",
+     "     VISIBLE:  '0.0.1 list box', cursor=1",
+     "BRAILLE LINE:  '0.0.1 list box'",
+     "     VISIBLE:  '0.0.1 list box', cursor=1",
+     "SPEECH OUTPUT: 'Version:'",
+     "SPEECH OUTPUT: '0.0.1'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 857 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Line Down",
+    ["BRAILLE LINE:  'Target Milestone:'",
+     "     VISIBLE:  'Target Milestone:', cursor=1",
+     "SPEECH OUTPUT: 'Target Milestone:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Line Down",
+    ["BRAILLE LINE:  '--- list box'",
+     "     VISIBLE:  '--- list box', cursor=1",
+     "BRAILLE LINE:  '--- list box'",
+     "     VISIBLE:  '--- list box', cursor=1",
+     "SPEECH OUTPUT: 'Target Milestone:'",
+     "SPEECH OUTPUT: '---'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 555 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Down",
+    ["BRAILLE LINE:  'A Comment: combo box $l table cell'",
+     "     VISIBLE:  'A Comment: combo box $l table ce', cursor=1",
+     "SPEECH OUTPUT: 'A Comment:'",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains the string'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Line Down",
+    ["BRAILLE LINE:  'Whiteboard: combo box $l table cell'",
+     "     VISIBLE:  'Whiteboard: combo box $l table c', cursor=1",
+     "SPEECH OUTPUT: 'Whiteboard:'",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains all of the words/strings'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Line Down",
+    ["BRAILLE LINE:  'Keywords:  combo box $l'",
+     "     VISIBLE:  'Keywords:  combo box $l', cursor=1",
+     "SPEECH OUTPUT: 'Keywords'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains all of the keywords'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Down",
+    ["BRAILLE LINE:  'Status:'",
+     "     VISIBLE:  'Status:', cursor=1",
+     "SPEECH OUTPUT: 'Status:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Line Down",
+    ["KNOWN ISSUE: Should we be doing a different presentation of these selected children?",
+     "BRAILLE LINE:  'UNCONFIRMED NEW ASSIGNED REOPENED NEEDINFO list box'",
+     "     VISIBLE:  'UNCONFIRMED NEW ASSIGNED REOPENE', cursor=1",
+     "BRAILLE LINE:  'UNCONFIRMED NEW ASSIGNED REOPENED NEEDINFO list box'",
+     "     VISIBLE:  'UNCONFIRMED NEW ASSIGNED REOPENE', cursor=1",
+     "SPEECH OUTPUT: 'Status:'",
+     "SPEECH OUTPUT: 'UNCONFIRMED'",
+     "SPEECH OUTPUT: 'NEW'",
+     "SPEECH OUTPUT: 'ASSIGNED'",
+     "SPEECH OUTPUT: 'REOPENED'",
+     "SPEECH OUTPUT: 'NEEDINFO'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 8 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Line Down",
+    ["BRAILLE LINE:  'Resolution:'",
+     "     VISIBLE:  'Resolution:', cursor=1",
+     "SPEECH OUTPUT: 'Resolution: '",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Line Down",
+    ["BRAILLE LINE:  'FIXED list box'",
+     "     VISIBLE:  'FIXED list box', cursor=1",
+     "BRAILLE LINE:  'FIXED list box'",
+     "     VISIBLE:  'FIXED list box', cursor=1",
+     "SPEECH OUTPUT: 'Resolution:'",
+     "SPEECH OUTPUT: 'FIXED'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 12 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Line Down",
+    ["BRAILLE LINE:  'Severity:'",
+     "     VISIBLE:  'Severity:', cursor=1",
+     "SPEECH OUTPUT: 'Severity:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Line Down",
+    ["BRAILLE LINE:  'blocker list box'",
+     "     VISIBLE:  'blocker list box', cursor=1",
+     "BRAILLE LINE:  'blocker list box'",
+     "     VISIBLE:  'blocker list box', cursor=1",
+     "SPEECH OUTPUT: 'Severity:'",
+     "SPEECH OUTPUT: 'blocker'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 7 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "25. Line Down",
+    ["BRAILLE LINE:  'Priority:'",
+     "     VISIBLE:  'Priority:', cursor=1",
+     "SPEECH OUTPUT: 'Priority:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Line Down",
+    ["BRAILLE LINE:  'Immediate list box'",
+     "     VISIBLE:  'Immediate list box', cursor=1",
+     "BRAILLE LINE:  'Immediate list box'",
+     "     VISIBLE:  'Immediate list box', cursor=1",
+     "SPEECH OUTPUT: 'Priority:'",
+     "SPEECH OUTPUT: 'Immediate'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 5 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "27. Line Down",
+    ["BRAILLE LINE:  'OS:'",
+     "     VISIBLE:  'OS:', cursor=1",
+     "SPEECH OUTPUT: 'OS:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "28. Line Down",
+    ["BRAILLE LINE:  'All list box'",
+     "     VISIBLE:  'All list box', cursor=1",
+     "BRAILLE LINE:  'All list box'",
+     "     VISIBLE:  'All list box', cursor=1",
+     "SPEECH OUTPUT: 'OS:'",
+     "SPEECH OUTPUT: 'All'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 21 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Line Down",
+    ["BRAILLE LINE:  'Email and Numbering'",
+     "     VISIBLE:  'Email and Numbering', cursor=1",
+     "SPEECH OUTPUT: 'Email and Numbering '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Line Down",
+    ["BRAILLE LINE:  'Any one of:'",
+     "     VISIBLE:  'Any one of:', cursor=1",
+     "SPEECH OUTPUT: 'Any one of: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "31. Line Down",
+    ["BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' the bug assignee '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "32. Line Down",
+    ["BRAILLE LINE:  '< > check box the reporter'",
+     "     VISIBLE:  '< > check box the reporter', cursor=1",
+     "BRAILLE LINE:  '< > check box the reporter'",
+     "     VISIBLE:  '< > check box the reporter', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' the reporter '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "33. Line Down",
+    ["BRAILLE LINE:  '< > check box the QA contact'",
+     "     VISIBLE:  '< > check box the QA contact', cursor=1",
+     "BRAILLE LINE:  '< > check box the QA contact'",
+     "     VISIBLE:  '< > check box the QA contact', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' the QA contact '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "34. Line Down",
+    ["BRAILLE LINE:  '< > check box a CC list member'",
+     "     VISIBLE:  '< > check box a CC list member', cursor=1",
+     "BRAILLE LINE:  '< > check box a CC list member'",
+     "     VISIBLE:  '< > check box a CC list member', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' a CC list member '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "35. Line Down",
+    ["BRAILLE LINE:  '< > check box a commenter'",
+     "     VISIBLE:  '< > check box a commenter', cursor=1",
+     "BRAILLE LINE:  '< > check box a commenter'",
+     "     VISIBLE:  '< > check box a commenter', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' a commenter '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "36. Line Down",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'contains'",
+     "SPEECH OUTPUT: 'combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "37. Line Down",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "38. Line Down",
+    ["BRAILLE LINE:  'Any one of:'",
+     "     VISIBLE:  'Any one of:', cursor=1",
+     "SPEECH OUTPUT: 'Any one of: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "39. Line Down",
+    ["BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' the bug assignee '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "40. Line Down",
+    ["BRAILLE LINE:  '<x> check box the reporter'",
+     "     VISIBLE:  '<x> check box the reporter', cursor=1",
+     "BRAILLE LINE:  '<x> check box the reporter'",
+     "     VISIBLE:  '<x> check box the reporter', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' the reporter '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "41. Line Down",
+    ["BRAILLE LINE:  '<x> check box the QA contact'",
+     "     VISIBLE:  '<x> check box the QA contact', cursor=1",
+     "BRAILLE LINE:  '<x> check box the QA contact'",
+     "     VISIBLE:  '<x> check box the QA contact', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' the QA contact '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "42. Line Down",
+    ["BRAILLE LINE:  '<x> check box a CC list member'",
+     "     VISIBLE:  '<x> check box a CC list member', cursor=1",
+     "BRAILLE LINE:  '<x> check box a CC list member'",
+     "     VISIBLE:  '<x> check box a CC list member', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' a CC list member '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "43. Line Down",
+    ["BRAILLE LINE:  '< > check box a commenter'",
+     "     VISIBLE:  '< > check box a commenter', cursor=1",
+     "BRAILLE LINE:  '< > check box a commenter'",
+     "     VISIBLE:  '< > check box a commenter', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' a commenter '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "44. Line Down",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'contains'",
+     "SPEECH OUTPUT: 'combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "45. Line Down",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "46. Line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "47. Line Down",
+    ["BRAILLE LINE:  ' combo box bugs numbered:  $l'",
+     "     VISIBLE:  ' combo box bugs numbered:  $l', cursor=1",
+     "BRAILLE LINE:  ' combo box bugs numbered:  $l'",
+     "     VISIBLE:  ' combo box bugs numbered:  $l', cursor=1",
+     "SPEECH OUTPUT: 'Only include'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'bugs numbered: '",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "48. Line Down",
+    ["BRAILLE LINE:  'table cell (comma-separated list)'",
+     "     VISIBLE:  'table cell (comma-separated list', cursor=1",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: '(comma-separated list)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "49. Line Down",
+    ["BRAILLE LINE:  'Bug Changes'",
+     "     VISIBLE:  'Bug Changes', cursor=1",
+     "SPEECH OUTPUT: 'Bug Changes'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "50. Line Down",
+    ["KNOWN ISSUE: On the way down the cursor is at offset 5; on the way up, at offset 0",
+     "BRAILLE LINE:  'Only bugs changed between:'",
+     "     VISIBLE:  'Only bugs changed between:', cursor=5",
+     "SPEECH OUTPUT: 'Only bugs changed between:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "51. Line Down",
+    ["BRAILLE LINE:  ' $l and  $l'",
+     "     VISIBLE:  ' $l and  $l', cursor=1",
+     "BRAILLE LINE:  ' $l and Now $l'",
+     "     VISIBLE:  ' $l and Now $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: ' and '",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Now'",
+     "SPEECH OUTPUT: '",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "52. Line Down",
+    ["BRAILLE LINE:  '(YYYY-MM-DD or relative dates)'",
+     "     VISIBLE:  '(YYYY-MM-DD or relative dates)', cursor=1",
+     "SPEECH OUTPUT: '(YYYY-MM-DD or relative dates) '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "53. Line Down",
+    ["BRAILLE LINE:  'where one or more of the following changed:'",
+    "     VISIBLE:  'where one or more of the followi', cursor=6",
+    "SPEECH OUTPUT: 'where one or more of the following changed:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "54. Line Down",
+    ["BRAILLE LINE:  '[Bug creation] list box'",
+     "     VISIBLE:  '[Bug creation] list box', cursor=1",
+     "BRAILLE LINE:  '[Bug creation] list box'",
+     "     VISIBLE:  '[Bug creation] list box', cursor=1",
+     "SPEECH OUTPUT: 'where one or more of the following changed:'",
+     "SPEECH OUTPUT: '[Bug creation]'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 26 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "55. Line Down",
+    ["KNOWN ISSUE: On the way down the cursor is at offset 4; on the way up, at offset 0",
+     "BRAILLE LINE:  'and the new value was:'",
+     "     VISIBLE:  'and the new value was:', cursor=4",
+     "SPEECH OUTPUT: 'and the new value was:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "56. Line Down",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "57. Line Down",
+    ["BRAILLE LINE:  'GNOME version:'",
+     "     VISIBLE:  'GNOME version:', cursor=1",
+     "SPEECH OUTPUT: 'GNOME version:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "58. Line Down",
+    ["BRAILLE LINE:  'Unspecified list box'",
+     "     VISIBLE:  'Unspecified list box', cursor=1",
+     "BRAILLE LINE:  'Unspecified list box'",
+     "     VISIBLE:  'Unspecified list box', cursor=1",
+     "SPEECH OUTPUT: 'GNOME version:'",
+     "SPEECH OUTPUT: 'Unspecified'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 14 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "59. Line Down",
+    ["BRAILLE LINE:  'GNOME target:'",
+     "     VISIBLE:  'GNOME target:', cursor=1",
+     "SPEECH OUTPUT: 'GNOME target:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "60. Line Down",
+    ["BRAILLE LINE:  'Unspecified list box'",
+     "     VISIBLE:  'Unspecified list box', cursor=1",
+     "BRAILLE LINE:  'Unspecified list box'",
+     "     VISIBLE:  'Unspecified list box', cursor=1",
+     "SPEECH OUTPUT: 'GNOME target:'",
+     "SPEECH OUTPUT: 'Unspecified'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 12 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "61. Line Down",
+    ["BRAILLE LINE:  'Sort results by:  combo box'",
+     "     VISIBLE:  'Sort results by:  combo box', cursor=1",
+     "SPEECH OUTPUT: 'Sort results by: '",
+     "SPEECH OUTPUT: 'Reuse same sort as last time'",
+     "SPEECH OUTPUT: 'combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "62. Line Down",
+    ["BRAILLE LINE:  'Search push button'",
+     "     VISIBLE:  'Search push button', cursor=1",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "63. Line Down",
+    ["BRAILLE LINE:  '    < > check box and remember these as my default search options'",
+     "     VISIBLE:  '    < > check box and remember t', cursor=1",
+     "SPEECH OUTPUT: '    '",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' and remember these as my default search options '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "64. Line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "65. Line Down",
+    ["BRAILLE LINE:  'Advanced Searching Using Boolean Charts:'",
+     "     VISIBLE:  'Advanced Searching Using Boolean', cursor=1",
+     "SPEECH OUTPUT: 'Advanced Searching Using Boolean Charts: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "66. Line Down",
+    ["BRAILLE LINE:  '< > check box Not (negate this whole chart)'",
+     "     VISIBLE:  '< > check box Not (negate this w', cursor=1",
+     "BRAILLE LINE:  '< > check box Not (negate this whole chart)'",
+     "     VISIBLE:  '< > check box Not (negate this w', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' Not (negate this whole chart) '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "67. Line Down",
+    ["BRAILLE LINE:  ' combo box  combo box  $l Or push button'",
+     "     VISIBLE:  ' combo box  combo box  $l Or pus', cursor=1",
+     "BRAILLE LINE:  ' combo box  combo box  $l Or push button'",
+     "     VISIBLE:  ' combo box  combo box  $l Or pus', cursor=1",
+     "SPEECH OUTPUT: '---'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: '---'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Or'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "68. Line Down",
+    ["BRAILLE LINE:  'And push button       Add another boolean chart push button      '",
+     "     VISIBLE:  'And push button       Add anothe', cursor=1",
+     "SPEECH OUTPUT: 'And'",
+     "SPEECH OUTPUT: 'push button'",
+     "SPEECH OUTPUT: '       '",
+     "SPEECH OUTPUT: 'Add another boolean chart'",
+     "SPEECH OUTPUT: 'push button'",
+     "SPEECH OUTPUT: '       '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "69. Line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "70. Line Down",
+    ["BRAILLE LINE:  'Saved Searches: My Bugs and Patches | All Orca | Firefox | open orca | Open RFEs'",
+     "     VISIBLE:  'Saved Searches: My Bugs and Patc', cursor=1",
+     "SPEECH OUTPUT: 'Saved Searches: '",
+     "SPEECH OUTPUT: 'My Bugs and Patches'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'All Orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Firefox'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'open orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Open RFEs'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_bugzilla_search_up.params 
b/test/keystrokes/firefox/line_nav_bugzilla_search_up.params
new file mode 100644
index 0000000..d82c60a
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bugzilla_search_up.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bugzilla-advanced.html
diff --git a/test/keystrokes/firefox/line_nav_bugzilla_search_up.py 
b/test/keystrokes/firefox/line_nav_bugzilla_search_up.py
new file mode 100644
index 0000000..3896088
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_bugzilla_search_up.py
@@ -0,0 +1,791 @@
+#!/usr/bin/python
+
+"""Test of line navigation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(PauseAction(3000))
+sequence.append(KeyPressAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("a"))
+sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
+sequence.append(KeyComboAction("<Control>End"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Line Up",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Up",
+    ["BRAILLE LINE:  'And push button       Add another boolean chart push button      '",
+     "     VISIBLE:  'And push button       Add anothe', cursor=1",
+     "SPEECH OUTPUT: 'And'",
+     "SPEECH OUTPUT: 'push button'",
+     "SPEECH OUTPUT: '       '",
+     "SPEECH OUTPUT: 'Add another boolean chart'",
+     "SPEECH OUTPUT: 'push button'",
+     "SPEECH OUTPUT: '       '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Up",
+    ["BRAILLE LINE:  ' combo box  combo box  $l Or push button'",
+     "     VISIBLE:  ' combo box  combo box  $l Or pus', cursor=1",
+     "BRAILLE LINE:  ' combo box  combo box  $l Or push button'",
+     "     VISIBLE:  ' combo box  combo box  $l Or pus', cursor=1",
+     "SPEECH OUTPUT: '---'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: '---'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Or'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Up",
+    ["BRAILLE LINE:  '< > check box Not (negate this whole chart)'",
+     "     VISIBLE:  '< > check box Not (negate this w', cursor=1",
+     "BRAILLE LINE:  '< > check box Not (negate this whole chart)'",
+     "     VISIBLE:  '< > check box Not (negate this w', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' Not (negate this whole chart) '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Up",
+    ["BRAILLE LINE:  'Advanced Searching Using Boolean Charts:'",
+     "     VISIBLE:  'Advanced Searching Using Boolean', cursor=1",
+     "SPEECH OUTPUT: 'Advanced Searching Using Boolean Charts: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Up",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Up",
+    ["BRAILLE LINE:  '    < > check box and remember these as my default search options'",
+     "     VISIBLE:  '    < > check box and remember t', cursor=1",
+     "SPEECH OUTPUT: '    '",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' and remember these as my default search options '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Up",
+    ["BRAILLE LINE:  'Search push button'",
+     "     VISIBLE:  'Search push button', cursor=1",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Up",
+    ["BRAILLE LINE:  'Sort results by:  combo box'",
+     "     VISIBLE:  'Sort results by:  combo box', cursor=1",
+     "SPEECH OUTPUT: 'Sort results by: '",
+     "SPEECH OUTPUT: 'Reuse same sort as last time'",
+     "SPEECH OUTPUT: 'combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Up",
+    ["BRAILLE LINE:  'Unspecified list box'",
+     "     VISIBLE:  'Unspecified list box', cursor=1",
+     "BRAILLE LINE:  'Unspecified list box'",
+     "     VISIBLE:  'Unspecified list box', cursor=1",
+     "SPEECH OUTPUT: 'GNOME target:'",
+     "SPEECH OUTPUT: 'Unspecified'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 12 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Up",
+    ["BRAILLE LINE:  'GNOME target:'",
+     "     VISIBLE:  'GNOME target:', cursor=1",
+     "SPEECH OUTPUT: 'GNOME target:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Line Up",
+    ["BRAILLE LINE:  'Unspecified list box'",
+     "     VISIBLE:  'Unspecified list box', cursor=1",
+     "BRAILLE LINE:  'Unspecified list box'",
+     "     VISIBLE:  'Unspecified list box', cursor=1",
+     "SPEECH OUTPUT: 'GNOME version:'",
+     "SPEECH OUTPUT: 'Unspecified'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 14 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Line Up",
+    ["BRAILLE LINE:  'GNOME version:'",
+     "     VISIBLE:  'GNOME version:', cursor=1",
+     "SPEECH OUTPUT: 'GNOME version:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Line Up",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Up",
+    ["KNOWN ISSUE: On the way down the cursor is at offset 4; on the way up, at offset 0",
+     "BRAILLE LINE:  'and the new value was:'",
+     "     VISIBLE:  'and the new value was:', cursor=0",
+     "SPEECH OUTPUT: 'and the new value was:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Line Up",
+    ["BRAILLE LINE:  '[Bug creation] list box'",
+     "     VISIBLE:  '[Bug creation] list box', cursor=1",
+     "BRAILLE LINE:  '[Bug creation] list box'",
+     "     VISIBLE:  '[Bug creation] list box', cursor=1",
+     "SPEECH OUTPUT: 'where one or more of the following changed:'",
+     "SPEECH OUTPUT: '[Bug creation]'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 26 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Line Up",
+    ["BRAILLE LINE:  'where one or more of the following changed:'",
+    "     VISIBLE:  'where one or more of the followi', cursor=6",
+    "SPEECH OUTPUT: 'where one or more of the following changed:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Line Up",
+    ["BRAILLE LINE:  '(YYYY-MM-DD or relative dates)'",
+     "     VISIBLE:  '(YYYY-MM-DD or relative dates)', cursor=1",
+     "SPEECH OUTPUT: '(YYYY-MM-DD or relative dates) '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Up",
+    ["BRAILLE LINE:  ' $l and  $l'",
+     "     VISIBLE:  ' $l and  $l', cursor=1",
+     "BRAILLE LINE:  ' $l and Now $l'",
+     "     VISIBLE:  ' $l and Now $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: ' and '",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Now'",
+     "SPEECH OUTPUT: '",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Line Up",
+    ["KNOWN ISSUE: On the way down the cursor is at offset 5; on the way up, at offset 0",
+     "BRAILLE LINE:  'Only bugs changed between:'",
+     "     VISIBLE:  'Only bugs changed between:', cursor=0",
+     "SPEECH OUTPUT: 'Only bugs changed between:'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Line Up",
+    ["BRAILLE LINE:  'Bug Changes'",
+     "     VISIBLE:  'Bug Changes', cursor=1",
+     "SPEECH OUTPUT: 'Bug Changes'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Line Up",
+    ["BRAILLE LINE:  'table cell (comma-separated list)'",
+     "     VISIBLE:  'table cell (comma-separated list', cursor=1",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: '(comma-separated list)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Line Up",
+    ["BRAILLE LINE:  ' combo box bugs numbered:  $l'",
+     "     VISIBLE:  ' combo box bugs numbered:  $l', cursor=1",
+     "BRAILLE LINE:  ' combo box bugs numbered:  $l'",
+     "     VISIBLE:  ' combo box bugs numbered:  $l', cursor=1",
+     "SPEECH OUTPUT: 'Only include'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'bugs numbered: '",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Line Up",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "25. Line Up",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Line Up",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'contains'",
+     "SPEECH OUTPUT: 'combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "27. Line Up",
+    ["KNOWN ISSUE: This is different from the Down version. Down includes 'a commenter'.",
+     "BRAILLE LINE:  '< > check box table cell'",
+     "     VISIBLE:  '< > check box table cell', cursor=1",
+     "BRAILLE LINE:  '< > check box table cell'",
+     "     VISIBLE:  '< > check box table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "28. Line Up",
+    ["BRAILLE LINE:  '<x> check box a CC list member'",
+     "     VISIBLE:  '<x> check box a CC list member', cursor=1",
+     "BRAILLE LINE:  '<x> check box a CC list member'",
+     "     VISIBLE:  '<x> check box a CC list member', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' a CC list member '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Line Up",
+    ["BRAILLE LINE:  '<x> check box the QA contact'",
+     "     VISIBLE:  '<x> check box the QA contact', cursor=1",
+     "BRAILLE LINE:  '<x> check box the QA contact'",
+     "     VISIBLE:  '<x> check box the QA contact', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' the QA contact '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Line Up",
+    ["BRAILLE LINE:  '<x> check box the reporter'",
+     "     VISIBLE:  '<x> check box the reporter', cursor=1",
+     "BRAILLE LINE:  '<x> check box the reporter'",
+     "     VISIBLE:  '<x> check box the reporter', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' the reporter '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "31. Line Up",
+    ["BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' the bug assignee '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "32. Line Up",
+    ["BRAILLE LINE:  'Any one of:'",
+     "     VISIBLE:  'Any one of:', cursor=1",
+     "SPEECH OUTPUT: 'Any one of: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "33. Line Up",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "34. Line Up",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'contains'",
+     "SPEECH OUTPUT: 'combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "35. Line Up",
+    ["KNOWN ISSUE: This is different from the Down version. Down includes 'a commenter'.",
+     "BRAILLE LINE:  '< > check box table cell'",
+     "     VISIBLE:  '< > check box table cell', cursor=1",
+     "BRAILLE LINE:  '< > check box table cell'",
+     "     VISIBLE:  '< > check box table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "36. Line Up",
+    ["BRAILLE LINE:  '< > check box a CC list member'",
+     "     VISIBLE:  '< > check box a CC list member', cursor=1",
+     "BRAILLE LINE:  '< > check box a CC list member'",
+     "     VISIBLE:  '< > check box a CC list member', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' a CC list member '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "37. Line Up",
+    ["BRAILLE LINE:  '< > check box the QA contact'",
+     "     VISIBLE:  '< > check box the QA contact', cursor=1",
+     "BRAILLE LINE:  '< > check box the QA contact'",
+     "     VISIBLE:  '< > check box the QA contact', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' the QA contact '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "38. Line Up",
+    ["BRAILLE LINE:  '< > check box the reporter'",
+     "     VISIBLE:  '< > check box the reporter', cursor=1",
+     "BRAILLE LINE:  '< > check box the reporter'",
+     "     VISIBLE:  '< > check box the reporter', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: ' the reporter '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "39. Line Up",
+    ["BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "BRAILLE LINE:  '<x> check box the bug assignee'",
+     "     VISIBLE:  '<x> check box the bug assignee', cursor=1",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'checked'",
+     "SPEECH OUTPUT: ' the bug assignee '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "40. Line Up",
+    ["BRAILLE LINE:  'Any one of:'",
+     "     VISIBLE:  'Any one of:', cursor=1",
+     "SPEECH OUTPUT: 'Any one of: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "41. Line Up",
+    ["BRAILLE LINE:  'Email and Numbering'",
+     "     VISIBLE:  'Email and Numbering', cursor=1",
+     "SPEECH OUTPUT: 'Email and Numbering '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "42. Line Up",
+    ["BRAILLE LINE:  'All list box'",
+     "     VISIBLE:  'All list box', cursor=1",
+     "BRAILLE LINE:  'All list box'",
+     "     VISIBLE:  'All list box', cursor=1",
+     "SPEECH OUTPUT: 'OS:'",
+     "SPEECH OUTPUT: 'All'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 21 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "43. Line Up",
+    ["BRAILLE LINE:  'OS:'",
+     "     VISIBLE:  'OS:', cursor=1",
+     "SPEECH OUTPUT: 'OS:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "44. Line Up",
+    ["BRAILLE LINE:  'Immediate list box'",
+     "     VISIBLE:  'Immediate list box', cursor=1",
+     "BRAILLE LINE:  'Immediate list box'",
+     "     VISIBLE:  'Immediate list box', cursor=1",
+     "SPEECH OUTPUT: 'Priority:'",
+     "SPEECH OUTPUT: 'Immediate'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 5 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "45. Line Up",
+    ["BRAILLE LINE:  'Priority:'",
+     "     VISIBLE:  'Priority:', cursor=1",
+     "SPEECH OUTPUT: 'Priority:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "46. Line Up",
+    ["BRAILLE LINE:  'blocker list box'",
+     "     VISIBLE:  'blocker list box', cursor=1",
+     "BRAILLE LINE:  'blocker list box'",
+     "     VISIBLE:  'blocker list box', cursor=1",
+     "SPEECH OUTPUT: 'Severity:'",
+     "SPEECH OUTPUT: 'blocker'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 7 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "47. Line Up",
+    ["BRAILLE LINE:  'Severity:'",
+     "     VISIBLE:  'Severity:', cursor=1",
+     "SPEECH OUTPUT: 'Severity:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "48. Line Up",
+    ["BRAILLE LINE:  'FIXED list box'",
+     "     VISIBLE:  'FIXED list box', cursor=1",
+     "BRAILLE LINE:  'FIXED list box'",
+     "     VISIBLE:  'FIXED list box', cursor=1",
+     "SPEECH OUTPUT: 'Resolution:'",
+     "SPEECH OUTPUT: 'FIXED'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 12 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "49. Line Up",
+    ["BRAILLE LINE:  'Resolution:'",
+     "     VISIBLE:  'Resolution:', cursor=1",
+     "SPEECH OUTPUT: 'Resolution: '",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "50. Line Up",
+    ["KNOWN ISSUE: Should we be doing a different presentation of these selected children?",
+     "BRAILLE LINE:  'UNCONFIRMED NEW ASSIGNED REOPENED NEEDINFO list box'",
+     "     VISIBLE:  'UNCONFIRMED NEW ASSIGNED REOPENE', cursor=1",
+     "BRAILLE LINE:  'UNCONFIRMED NEW ASSIGNED REOPENED NEEDINFO list box'",
+     "     VISIBLE:  'UNCONFIRMED NEW ASSIGNED REOPENE', cursor=1",
+     "SPEECH OUTPUT: 'Status:'",
+     "SPEECH OUTPUT: 'UNCONFIRMED'",
+     "SPEECH OUTPUT: 'NEW'",
+     "SPEECH OUTPUT: 'ASSIGNED'",
+     "SPEECH OUTPUT: 'REOPENED'",
+     "SPEECH OUTPUT: 'NEEDINFO'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 8 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "51. Line Up",
+    ["BRAILLE LINE:  'Status:'",
+     "     VISIBLE:  'Status:', cursor=1",
+     "SPEECH OUTPUT: 'Status:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "52. Line Up",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "53. Line Up",
+    ["BRAILLE LINE:  'Keywords:  combo box $l'",
+     "     VISIBLE:  'Keywords:  combo box $l', cursor=1",
+     "SPEECH OUTPUT: 'Keywords'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains all of the keywords'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "54. Line Up",
+    ["BRAILLE LINE:  'Whiteboard: combo box $l table cell'",
+     "     VISIBLE:  'Whiteboard: combo box $l table c', cursor=1",
+     "SPEECH OUTPUT: 'Whiteboard:'",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains all of the words/strings'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "55. Line Up",
+    ["BRAILLE LINE:  'A Comment: combo box $l table cell'",
+     "     VISIBLE:  'A Comment: combo box $l table ce', cursor=1",
+     "SPEECH OUTPUT: 'A Comment:'",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains the string'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "56. Line Up",
+    ["BRAILLE LINE:  '--- list box'",
+     "     VISIBLE:  '--- list box', cursor=1",
+     "BRAILLE LINE:  '--- list box'",
+     "     VISIBLE:  '--- list box', cursor=1",
+     "SPEECH OUTPUT: 'Target Milestone:'",
+     "SPEECH OUTPUT: '---'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 555 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "57. Line Up",
+    ["BRAILLE LINE:  'Target Milestone:'",
+     "     VISIBLE:  'Target Milestone:', cursor=1",
+     "SPEECH OUTPUT: 'Target Milestone:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "58. Line Up",
+    ["BRAILLE LINE:  '0.0.1 list box'",
+     "     VISIBLE:  '0.0.1 list box', cursor=1",
+     "BRAILLE LINE:  '0.0.1 list box'",
+     "     VISIBLE:  '0.0.1 list box', cursor=1",
+     "SPEECH OUTPUT: 'Version:'",
+     "SPEECH OUTPUT: '0.0.1'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 857 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "59. Line Up",
+    ["BRAILLE LINE:  'Version:'",
+     "     VISIBLE:  'Version:', cursor=1",
+     "SPEECH OUTPUT: 'Version:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "60. Line Up",
+    ["BRAILLE LINE:  'abiscan list box'",
+     "     VISIBLE:  'abiscan list box', cursor=1",
+     "BRAILLE LINE:  'abiscan list box'",
+     "     VISIBLE:  'abiscan list box', cursor=1",
+     "SPEECH OUTPUT: 'Component:'",
+     "SPEECH OUTPUT: 'abiscan'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 1248 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "61. Line Up",
+    ["BRAILLE LINE:  'Component:'",
+     "     VISIBLE:  'Component:', cursor=1",
+     "SPEECH OUTPUT: 'Component'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "62. Line Up",
+    ["BRAILLE LINE:  'accerciser list box'",
+     "     VISIBLE:  'accerciser list box', cursor=1",
+     "BRAILLE LINE:  'accerciser list box'",
+     "     VISIBLE:  'accerciser list box', cursor=1",
+     "SPEECH OUTPUT: 'Product:'",
+     "SPEECH OUTPUT: 'accerciser'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 379 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "63. Line Up",
+    ["BRAILLE LINE:  'Product:'",
+     "     VISIBLE:  'Product:', cursor=1",
+     "SPEECH OUTPUT: 'Product:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "64. Line Up",
+    ["BRAILLE LINE:  'Admin list box'",
+     "     VISIBLE:  'Admin list box', cursor=1",
+     "BRAILLE LINE:  'Admin list box'",
+     "     VISIBLE:  'Admin list box', cursor=1",
+     "SPEECH OUTPUT: 'Classification:'",
+     "SPEECH OUTPUT: 'Admin'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 8 items'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "65. Line Up",
+    ["BRAILLE LINE:  'Classification:'",
+     "     VISIBLE:  'Classification:', cursor=1",
+     "SPEECH OUTPUT: 'Classification:'",
+     "SPEECH OUTPUT: 'column header'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "66. Line Up",
+    ["BRAILLE LINE:  'Summary: combo box $l Search push button'",
+     "     VISIBLE:  'Summary: combo box $l Search pus', cursor=1",
+     "SPEECH OUTPUT: 'Summary:'",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains all of the words/strings'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "67. Line Up",
+    ["BRAILLE LINE:  'Give me some help (reloads page.)'",
+     "     VISIBLE:  'Give me some help (reloads page.', cursor=1",
+     "SPEECH OUTPUT: 'Give me some help'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (reloads page.)'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "68. Line Up",
+    ["BRAILLE LINE:  ' Short Bug Search Form Complicated Bug Search Form  '",
+     "     VISIBLE:  ' Short Bug Search Form Complicat', cursor=1",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'Short Bug Search Form '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Complicated Bug Search Form '",
+     "SPEECH OUTPUT: ' '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "69. Line Up",
+    ["BRAILLE LINE:  'New bug · Browse · Search · Reports · Account · Admin · Help Logged In joanmarie diggs 
gmail com | Log Out'",
+     "     VISIBLE:  'New bug · Browse · Search · Repo', cursor=1",
+     "SPEECH OUTPUT: 'New bug'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Browse'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Reports'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Account'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Admin'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Help'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Logged In joanmarie diggs gmail com | '",
+     "SPEECH OUTPUT: 'Log Out'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_clickables.params 
b/test/keystrokes/firefox/line_nav_clickables.params
new file mode 100644
index 0000000..1d9feb2
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_clickables.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/clickable.html
diff --git a/test/keystrokes/firefox/line_nav_clickables.py b/test/keystrokes/firefox/line_nav_clickables.py
new file mode 100644
index 0000000..94ab3ef
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_clickables.py
@@ -0,0 +1,125 @@
+#!/usr/bin/python
+
+"""Test of line navigation output of Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  'Clickable image: Orca Logo More text.'",
+     "     VISIBLE:  'Clickable image: Orca Logo More ', cursor=1",
+     "SPEECH OUTPUT: 'Clickable image: '",
+     "SPEECH OUTPUT: 'Orca Logo'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'clickable'",
+     "SPEECH OUTPUT: 'More text.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["KNOWN ISSUE: We presented this on the previous line",
+     "BRAILLE LINE:  'Orca Logo'",
+     "     VISIBLE:  'Orca Logo', cursor=1",
+     "SPEECH OUTPUT: 'Orca Logo'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'clickable'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["KNOWN ISSUE: We presented this on the previous lines",
+     "BRAILLE LINE:  'Clickable image: Orca Logo More text.'",
+     "     VISIBLE:  'More text.', cursor=1",
+     "SPEECH OUTPUT: 'Clickable image: '",
+     "SPEECH OUTPUT: 'Orca Logo'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'clickable'",
+     "SPEECH OUTPUT: 'More text.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  'Clickable span: Click Me. More text.'",
+     "     VISIBLE:  'Clickable span: Click Me. More t', cursor=1",
+     "SPEECH OUTPUT: 'Clickable span: '",
+     "SPEECH OUTPUT: 'text'",
+     "SPEECH OUTPUT: 'Click Me.'",
+     "SPEECH OUTPUT: 'clickable'",
+     "SPEECH OUTPUT: ' More text.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Down",
+    ["BRAILLE LINE:  'Clickable div:'",
+     "     VISIBLE:  'Clickable div:', cursor=1",
+     "SPEECH OUTPUT: 'Clickable div: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Down",
+    ["BRAILLE LINE:  'Click Me.'",
+     "     VISIBLE:  'Click Me.', cursor=1",
+     "SPEECH OUTPUT: 'Click Me.'",
+     "SPEECH OUTPUT: 'clickable'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
+    ["BRAILLE LINE:  'More text.'",
+     "     VISIBLE:  'More text.', cursor=1",
+     "SPEECH OUTPUT: 'More text.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Up",
+    ["BRAILLE LINE:  'Click Me.'",
+     "     VISIBLE:  'Click Me.', cursor=1",
+     "SPEECH OUTPUT: 'Click Me.'",
+     "SPEECH OUTPUT: 'clickable'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Up",
+    ["BRAILLE LINE:  'Clickable div:'",
+     "     VISIBLE:  'Clickable div:', cursor=1",
+     "SPEECH OUTPUT: 'Clickable div: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Up",
+    ["BRAILLE LINE:  'Clickable span: Click Me. More text.'",
+     "     VISIBLE:  'Clickable span: Click Me. More t', cursor=1",
+     "SPEECH OUTPUT: 'Clickable span: '",
+     "SPEECH OUTPUT: 'text'",
+     "SPEECH OUTPUT: 'Click Me.'",
+     "SPEECH OUTPUT: 'clickable'",
+     "SPEECH OUTPUT: ' More text.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Up",
+    ["BRAILLE LINE:  'Clickable image: Orca Logo More text.'",
+     "     VISIBLE:  'Clickable image: Orca Logo More ', cursor=1",
+     "SPEECH OUTPUT: 'Clickable image: '",
+     "SPEECH OUTPUT: 'Orca Logo'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'clickable'",
+     "SPEECH OUTPUT: 'More text.'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_empty_anchor.params 
b/test/keystrokes/firefox/line_nav_empty_anchor.params
new file mode 100644
index 0000000..f97125a
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_empty_anchor.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-517371.html
diff --git a/test/keystrokes/firefox/line_nav_empty_anchor.py 
b/test/keystrokes/firefox/line_nav_empty_anchor.py
index 81e7652..875ad1a 100644
--- a/test/keystrokes/firefox/line_nav_empty_anchor.py
+++ b/test/keystrokes/firefox/line_nav_empty_anchor.py
@@ -1,88 +1,70 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox on a page with empty
-anchors.
-"""
+"""Test of line navigation on a page with empty anchors."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "bug-517371" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bug-517371.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("Testing",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'FAQ h1'",
      "     VISIBLE:  'FAQ h1', cursor=1",
-     "SPEECH OUTPUT: 'FAQ ' voice=uppercase",
+     "SPEECH OUTPUT: 'FAQ '",
      "SPEECH OUTPUT: 'heading level 1'"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "2. Line Down",
     ["BRAILLE LINE:  'Battery h2'",
      "     VISIBLE:  'Battery h2', cursor=1",
-     "SPEECH OUTPUT: 'Battery heading level 2'"]))
+     "SPEECH OUTPUT: 'Battery'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "3. Line Down",
     ["BRAILLE LINE:  'Q. What's a battery?'",
      "     VISIBLE:  'Q. What's a battery?', cursor=1",
-     "SPEECH OUTPUT: 'Q. What's a battery? link'"]))
+     "SPEECH OUTPUT: 'Q. What's a battery?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "4. Line Down",
     ["BRAILLE LINE:  'Q. Which way is up?'",
      "     VISIBLE:  'Q. Which way is up?', cursor=1",
-     "SPEECH OUTPUT: 'Q. Which way is up? link ",
-     "'"]))
+     "SPEECH OUTPUT: 'Q. Which way is up?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Q. Why did Orca used to get stuck on this page? h2'",
+    "5. Line Down",
+    ["BRAILLE LINE:  'Q. Why did Orca used to get stuck on this page?'",
      "     VISIBLE:  'Q. Why did Orca used to get stuc', cursor=1",
-     "SPEECH OUTPUT: 'Q. Why did Orca used to get stuck on this page? link ",
-     " ",
-     " heading level 2'"]))
+     "SPEECH OUTPUT: 'Q. Why did Orca used to get stuck on this page?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "6. Line Down",
+    ["BRAILLE LINE:  ' h2'",
+     "     VISIBLE:  ' h2', cursor=1",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
     ["BRAILLE LINE:  'FOO h2'",
      "     VISIBLE:  'FOO h2', cursor=1",
      "SPEECH OUTPUT: 'FOO'",
@@ -91,43 +73,53 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "8. Line Down",
     ["BRAILLE LINE:  'Q. Why would someone put a line break in a heading?'",
      "     VISIBLE:  'Q. Why would someone put a line ', cursor=1",
-     "SPEECH OUTPUT: 'Q. Why would someone put a line break in a heading? link ",
-     "'"]))
+     "SPEECH OUTPUT: 'Q. Why would someone put a line break in a heading?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Q. What is the airspeed velocity of an unladen swallow? h2'",
+    "9. Line Down",
+    ["BRAILLE LINE:  'Q. What is the airspeed velocity of an unladen swallow?'",
      "     VISIBLE:  'Q. What is the airspeed velocity', cursor=1",
-     "SPEECH OUTPUT: 'Q. What is the airspeed velocity of an unladen swallow? link ",
-     " ",
-     " heading level 2'"]))
+     "SPEECH OUTPUT: 'Q. What is the airspeed velocity of an unladen swallow?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "10. Line Down",
+    ["BRAILLE LINE:  ' h2'",
+     "     VISIBLE:  ' h2', cursor=1",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Down",
     ["BRAILLE LINE:  'Battery h2'",
      "     VISIBLE:  'Battery h2', cursor=1",
-     "SPEECH OUTPUT: 'Battery heading level 2'"]))
+     "SPEECH OUTPUT: 'Battery'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "12. Line Down",
     ["BRAILLE LINE:  'Q. What is a battery?'",
      "     VISIBLE:  'Q. What is a battery?', cursor=1",
+     "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: 'Q. What is a battery?",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "13. Line Down",
     ["BRAILLE LINE:  'A. Look it up.'",
      "     VISIBLE:  'A. Look it up.', cursor=1",
      "SPEECH OUTPUT: 'A. Look it up.'"]))
@@ -135,70 +127,71 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "14. Line Down",
     ["BRAILLE LINE:  'Q. Which way is up?'",
      "     VISIBLE:  'Q. Which way is up?', cursor=1",
+     "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: 'Q. Which way is up?",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "15. Line Down",
     ["BRAILLE LINE:  'A. That way.'",
      "     VISIBLE:  'A. That way.', cursor=1",
-     "SPEECH OUTPUT: 'A. That way.'"]))
+     "SPEECH OUTPUT: 'A. That way. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "16. Line Down",
     ["BRAILLE LINE:  'Q. Why did Orca used to get stuck on this page?'",
      "     VISIBLE:  'Q. Why did Orca used to get stuc', cursor=1",
+     "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: 'Q. Why did Orca used to get stuck on this page?",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "17. Line Down",
     ["BRAILLE LINE:  'A. Empty anchors.'",
      "     VISIBLE:  'A. Empty anchors.', cursor=1",
      "SPEECH OUTPUT: 'A. Empty anchors.'"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "18. Line Up",
     ["BRAILLE LINE:  'Q. Why did Orca used to get stuck on this page?'",
      "     VISIBLE:  'Q. Why did Orca used to get stuc', cursor=1",
+     "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: 'Q. Why did Orca used to get stuck on this page?",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "19. Line Up",
     ["BRAILLE LINE:  'A. That way.'",
      "     VISIBLE:  'A. That way.', cursor=1",
-     "SPEECH OUTPUT: 'A. That way.'"]))
+     "SPEECH OUTPUT: 'A. That way. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "20. Line Up",
     ["BRAILLE LINE:  'Q. Which way is up?'",
      "     VISIBLE:  'Q. Which way is up?', cursor=1",
+     "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: 'Q. Which way is up?",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "21. Line Up",
     ["BRAILLE LINE:  'A. Look it up.'",
      "     VISIBLE:  'A. Look it up.', cursor=1",
      "SPEECH OUTPUT: 'A. Look it up.'"]))
@@ -206,52 +199,53 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "22. Line Up",
     ["BRAILLE LINE:  'Q. What is a battery?'",
      "     VISIBLE:  'Q. What is a battery?', cursor=1",
+     "SPEECH OUTPUT: 'link'",
      "SPEECH OUTPUT: 'Q. What is a battery?",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "23. Line Up",
     ["BRAILLE LINE:  'Battery h2'",
      "     VISIBLE:  'Battery h2', cursor=1",
-     "SPEECH OUTPUT: 'Battery heading level 2'"]))
+     "SPEECH OUTPUT: 'Battery'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "24. Line Up",
     ["BRAILLE LINE:  ' h2'",
      "     VISIBLE:  ' h2', cursor=1",
-     "SPEECH OUTPUT: '",
-     " heading level 2'"]))
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Q. What is the airspeed velocity of an unladen swallow? h2'",
+    "25. Line Up",
+    ["BRAILLE LINE:  'Q. What is the airspeed velocity of an unladen swallow?'",
      "     VISIBLE:  'Q. What is the airspeed velocity', cursor=1",
-     "SPEECH OUTPUT: 'Q. What is the airspeed velocity of an unladen swallow? link ",
-     "",
-     " heading level 2'"]))
+     "SPEECH OUTPUT: 'Q. What is the airspeed velocity of an unladen swallow?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "26. Line Up",
     ["BRAILLE LINE:  'Q. Why would someone put a line break in a heading?'",
      "     VISIBLE:  'Q. Why would someone put a line ', cursor=1",
-     "SPEECH OUTPUT: 'Q. Why would someone put a line break in a heading? link ",
-     "'"]))
+     "SPEECH OUTPUT: 'Q. Why would someone put a line break in a heading?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "27. Line Up",
     ["BRAILLE LINE:  'FOO h2'",
      "     VISIBLE:  'FOO h2', cursor=1",
      "SPEECH OUTPUT: 'FOO'",
@@ -260,73 +254,56 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "28. Line Up",
     ["BRAILLE LINE:  ' h2'",
      "     VISIBLE:  ' h2', cursor=1",
-     "SPEECH OUTPUT: '",
-     " heading level 2'"]))
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Q. Why did Orca used to get stuck on this page? h2'",
+    "29. Line Up",
+    ["BRAILLE LINE:  'Q. Why did Orca used to get stuck on this page?'",
      "     VISIBLE:  'Q. Why did Orca used to get stuc', cursor=1",
-     "SPEECH OUTPUT: 'Q. Why did Orca used to get stuck on this page? link ",
-     " ",
-     " heading level 2'"]))
+     "SPEECH OUTPUT: 'Q. Why did Orca used to get stuck on this page?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "30. Line Up",
     ["BRAILLE LINE:  'Q. Which way is up?'",
      "     VISIBLE:  'Q. Which way is up?', cursor=1",
-     "SPEECH OUTPUT: 'Q. Which way is up? link ",
-     "'"]))
+     "SPEECH OUTPUT: 'Q. Which way is up?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "31. Line Up",
     ["BRAILLE LINE:  'Q. What's a battery?'",
      "     VISIBLE:  'Q. What's a battery?', cursor=1",
-     "SPEECH OUTPUT: 'Q. What's a battery? link'"]))
+     "SPEECH OUTPUT: 'Q. What's a battery?'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "32. Line Up",
     ["BRAILLE LINE:  'Battery h2'",
      "     VISIBLE:  'Battery h2', cursor=1",
-     "SPEECH OUTPUT: 'Battery heading level 2'"]))
+     "SPEECH OUTPUT: 'Battery'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "33. Line Up",
     ["BRAILLE LINE:  'FAQ h1'",
      "     VISIBLE:  'FAQ h1', cursor=1",
      "SPEECH OUTPUT: 'FAQ '",
      "SPEECH OUTPUT: 'heading level 1'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_enter_bug.params 
b/test/keystrokes/firefox/line_nav_enter_bug.params
new file mode 100644
index 0000000..95128f2
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_enter_bug.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/enter-bug-form.html
diff --git a/test/keystrokes/firefox/line_nav_enter_bug.py b/test/keystrokes/firefox/line_nav_enter_bug.py
index d93c3eb..5131121 100644
--- a/test/keystrokes/firefox/line_nav_enter_bug.py
+++ b/test/keystrokes/firefox/line_nav_enter_bug.py
@@ -1,490 +1,633 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox on GNOME bugzilla's form
-for entering bugs. 
-"""
+"""Test of line navigation."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  'Home Bugzilla'",
+     "     VISIBLE:  'Home Bugzilla', cursor=1",
+     "BRAILLE LINE:  'Home Bugzilla'",
+     "     VISIBLE:  'Home Bugzilla', cursor=0",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'Bugzilla'",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-sequence.append(TypeAction(utils.htmlURLPrefix + "enter-bug-form.html"))
-sequence.append(KeyComboAction("Return"))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["BRAILLE LINE:  'New bug · Browse · Search · Reports · Account · Admin · Help Logged In joanmarie diggs 
gmail com | Log Out'",
+     "     VISIBLE:  'New bug · Browse · Search · Repo', cursor=1",
+     "SPEECH OUTPUT: 'New bug'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Browse'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Reports'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Account'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Admin'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Help'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Logged In joanmarie diggs gmail com | '",
+     "SPEECH OUTPUT: 'Log Out'",
+     "SPEECH OUTPUT: 'link'"]))
 
-sequence.append(WaitForDocLoad())
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["BRAILLE LINE:  'Enter Bug: orca – This page lets you enter a new bug h1'",
+     "     VISIBLE:  'Enter Bug: orca – This page lets', cursor=1",
+     "SPEECH OUTPUT: 'Enter Bug: orca – This page lets you enter a new bug '",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
-sequence.append(WaitForFocus("Enter Bug: orca",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  'into Bugzilla. h1'",
+     "     VISIBLE:  'into Bugzilla. h1', cursor=1",
+     "SPEECH OUTPUT: 'into Bugzilla.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
-    ["BRAILLE LINE:  'Home Image Bugzilla New bug · Browse · Search · Reports · Account · Admin · Help 
Logged In joanmarie diggs gmail com | Log Out'",
-     "     VISIBLE:  'Home Image Bugzilla New bug · Br', cursor=1",
-     "BRAILLE LINE:  'Home Image Bugzilla New bug · Browse · Search · Reports · Account · Admin · Help 
Logged In joanmarie diggs gmail com | Log Out'",
-     "     VISIBLE:  'Home Image Bugzilla New bug · Br', cursor=1",
-     "SPEECH OUTPUT: 'Home link image Bugzilla New bug link  · Browse link  · Search link  · Reports link  · 
Account link  · Admin link  · Help link Logged In joanmarie diggs gmail com | Log Out link'",
-     "SPEECH OUTPUT: 'Home link image'"]))
+    "5. Line Down",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Enter Bug: orca – This page lets you enter a new bug into Bugzilla. h1 '",
-     "     VISIBLE:  'Enter Bug: orca – This page lets', cursor=1",
-     "SPEECH OUTPUT: 'Enter Bug: orca – This page lets you enter a new bug into Bugzilla. heading level 1 ",
-     "'"]))
+    "6. Line Down",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Before reporting a bug, please read the bug writing guidelines, please look at the 
list of most'",
+    "7. Line Down",
+    ["BRAILLE LINE:  'Before reporting a bug, please read the bug writing guidelines,'",
      "     VISIBLE:  'Before reporting a bug, please r', cursor=1",
-     "SPEECH OUTPUT: 'Before reporting a bug, please read the bug writing guidelines link , please look at 
the list of most link'"]))
+     "SPEECH OUTPUT: 'Before reporting a bug, please read the '",
+     "SPEECH OUTPUT: 'bug writing guidelines'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Down",
+    ["BRAILLE LINE:  'please look at the list of most frequently reported bugs, and please'",
+     "     VISIBLE:  'please look at the list of most ', cursor=1",
+     "SPEECH OUTPUT: 'please look at the list of '",
+     "SPEECH OUTPUT: 'most frequently reported bugs'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', and please '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'frequently reported bugs, and please search or browse for the bug. '",
-     "     VISIBLE:  'frequently reported bugs, and pl', cursor=1",
-     "SPEECH OUTPUT: 'frequently reported bugs link , and please search link  or browse link  for the bug. ",
-     "'"]))
+    "9. Line Down",
+    ["BRAILLE LINE:  'search or browse for the bug.'",
+     "     VISIBLE:  'search or browse for the bug.', cursor=1",
+     "SPEECH OUTPUT: 'search'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' or '",
+     "SPEECH OUTPUT: 'browse'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for the bug. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "10. Line Down",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Down",
     ["BRAILLE LINE:  'Reporter: joanmarie diggs gmail com Product: orca'",
      "     VISIBLE:  'Reporter: joanmarie diggs gmail ', cursor=1",
-     "SPEECH OUTPUT: 'Reporter: joanmarie diggs gmail com Product: orca'"]))
+     "SPEECH OUTPUT: 'Reporter:'",
+     "SPEECH OUTPUT: 'joanmarie diggs gmail com'",
+     "SPEECH OUTPUT: 'Product:'",
+     "SPEECH OUTPUT: 'orca'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Version: 2.21.x List Component: braille List'",
-     "     VISIBLE:  'Version: 2.21.x List Component: ', cursor=1",
-     "SPEECH OUTPUT: 'Version: 2.21.x List with 9 items Component link : braille List with 5 items'"]))
+    "12. Line Down",
+    ["BRAILLE LINE:  'Version:'",
+     "     VISIBLE:  'Version:', cursor=1",
+     "SPEECH OUTPUT: 'Version:'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  ' '",
-     "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+    "13. Line Down",
+    ["BRAILLE LINE:  '2.21.x list box'",
+     "     VISIBLE:  '2.21.x list box', cursor=1",
+     "BRAILLE LINE:  '2.21.x list box'",
+     "     VISIBLE:  '2.21.x list box', cursor=1",
+     "SPEECH OUTPUT: 'Version:'",
+     "SPEECH OUTPUT: '2.21.x'",
+     "SPEECH OUTPUT: 'List with 9 items'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'GNOME'",
-     "     VISIBLE:  'GNOME', cursor=1",
-     "SPEECH OUTPUT: 'GNOME link'"]))
+    "14. Line Down",
+    ["BRAILLE LINE:  'Component:'",
+     "     VISIBLE:  'Component:', cursor=1",
+     "SPEECH OUTPUT: 'Component'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'version:'",
-     "     VISIBLE:  'version:', cursor=1",
-     "SPEECH OUTPUT: 'version link :'"]))
+    "15. Line Down",
+    ["BRAILLE LINE:  'braille list box'",
+     "     VISIBLE:  'braille list box', cursor=1",
+     "BRAILLE LINE:  'braille list box'",
+     "     VISIBLE:  'braille list box', cursor=1",
+     "SPEECH OUTPUT: 'Component:'",
+     "SPEECH OUTPUT: 'braille'",
+     "SPEECH OUTPUT: 'List with 5 items'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'GNOME Unspecified Combo'",
-     "     VISIBLE:  'GNOME Unspecified Combo', cursor=7",
-     "SPEECH OUTPUT: 'GNOME link Unspecified combo box'"]))
+    "16. Line Down",
+    ["BRAILLE LINE:  ' table cell'",
+     "     VISIBLE:  ' table cell', cursor=1",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'OS: Linux Combo'",
-     "     VISIBLE:  'OS: Linux Combo', cursor=1",
-     "SPEECH OUTPUT: 'OS link : Linux combo box'"]))
+    "17. Line Down",
+    ["BRAILLE LINE:  'GNOME'",
+     "     VISIBLE:  'GNOME', cursor=1",
+     "SPEECH OUTPUT: 'GNOME '",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Severity: normal Combo'",
-     "     VISIBLE:  'Severity: normal Combo', cursor=1",
-     "SPEECH OUTPUT: 'Severity link : normal combo box'"]))
+    "18. Line Down",
+    ["KNOWN ISSUE: Double presentation?",
+     "BRAILLE LINE:  'version version:'",
+     "     VISIBLE:  'version version:', cursor=1",
+     "SPEECH OUTPUT: 'version'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'GNOME '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  ' '",
-     "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+    "19. Line Down",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'Unspecified'",
+     "SPEECH OUTPUT: 'combo box'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Summary: $l'",
-     "     VISIBLE:  'Summary: $l', cursor=1",
-     "SPEECH OUTPUT: 'Summary: text'"]))
+    "20. Line Down",
+    ["BRAILLE LINE:  'OS:  combo box'",
+     "     VISIBLE:  'OS:  combo box', cursor=1",
+     "SPEECH OUTPUT: 'OS'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'Linux'",
+     "SPEECH OUTPUT: 'combo box'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Description: $l'",
-     "     VISIBLE:  'Description: $l', cursor=1",
-     "SPEECH OUTPUT: 'Description: text ",
-     "'"]))
+    "21. Line Down",
+    ["BRAILLE LINE:  'Severity:  combo box'",
+     "     VISIBLE:  'Severity:  combo box', cursor=1",
+     "SPEECH OUTPUT: 'Severity'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'normal'",
+     "SPEECH OUTPUT: 'combo box'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  ' '",
-     "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+    "22. Line Down",
+    ["BRAILLE LINE:  ' table cell'",
+     "     VISIBLE:  ' table cell', cursor=1",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Optional Fields'",
-     "     VISIBLE:  'Optional Fields', cursor=1",
-     "SPEECH OUTPUT: 'Optional Fields'"]))
+    "23. Line Down",
+    ["BRAILLE LINE:  'Summary: $l'",
+     "     VISIBLE:  'Summary: $l', cursor=1",
+     "SPEECH OUTPUT: 'Summary:'",
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Cc: $l'",
-     "     VISIBLE:  'Cc: $l', cursor=1",
-     "SPEECH OUTPUT: 'Cc: text'"]))
+    "24. Line Down",
+    ["BRAILLE LINE:  'Description:'",
+     "     VISIBLE:  'Description:', cursor=1",
+     "SPEECH OUTPUT: 'Description:'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Keywords:  $l'",
-     "     VISIBLE:  'Keywords:  $l', cursor=1",
-     "SPEECH OUTPUT: 'Keywords link : text'"]))
+    "25. Line Down",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Depends on: $l'",
-     "     VISIBLE:  'Depends on: $l', cursor=1",
-     "SPEECH OUTPUT: 'Depends on: text'"]))
+    "26. Line Down",
+    ["BRAILLE LINE:  ' table cell'",
+     "     VISIBLE:  ' table cell', cursor=1",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Blocks: $l'",
-     "     VISIBLE:  'Blocks: $l', cursor=1",
-     "SPEECH OUTPUT: 'Blocks: text'"]))
+    "27. Line Down",
+    ["BRAILLE LINE:  'Optional Fields'",
+     "     VISIBLE:  'Optional Fields', cursor=1",
+     "SPEECH OUTPUT: 'Optional Fields'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Commit Button      Remember values as bookmarkable template Button'",
-     "     VISIBLE:  'Commit Button      Remember valu', cursor=1",
-     "SPEECH OUTPUT: '   Commit button       Remember values as bookmarkable template button ",
-     "'"]))
+    "28. Line Down",
+    ["BRAILLE LINE:  'Cc: $l'",
+     "     VISIBLE:  'Cc: $l', cursor=1",
+     "SPEECH OUTPUT: 'Cc:'",
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'We've made a guess at your operating system. Please check it and, if we got it wrong, 
email'",
-     "     VISIBLE:  'We've made a guess at your opera', cursor=1",
-     "SPEECH OUTPUT: 'We've made a guess at your operating system. Please check it and, if we got it wrong, 
email'"]))
+    "29. Line Down",
+    ["BRAILLE LINE:  'Keywords:'",
+     "     VISIBLE:  'Keywords:', cursor=1",
+     "SPEECH OUTPUT: 'Keywords'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'bugmaster gnome org '",
-     "     VISIBLE:  'bugmaster gnome org ', cursor=1",
-     "SPEECH OUTPUT: 'bugmaster gnome org '"]))
+    "30. Line Down",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  'Saved Searches: All Orca | Firefox | open orca | Open RFEs'",
-     "     VISIBLE:  'Saved Searches: All Orca | Firef', cursor=1",
-     "SPEECH OUTPUT: 'Saved Searches: All Orca link  | Firefox link  | open orca link  | Open RFEs link'"]))
+    "31. Line Up",
+    ["BRAILLE LINE:  'Keywords:'",
+     "     VISIBLE:  'Keywords:', cursor=1",
+     "SPEECH OUTPUT: 'Keywords'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'bugmaster gnome org '",
-     "     VISIBLE:  'bugmaster gnome org ', cursor=1",
-     "SPEECH OUTPUT: 'bugmaster gnome org '"]))
+    "32. Line Up",
+    ["BRAILLE LINE:  'Cc: $l'",
+     "     VISIBLE:  'Cc: $l', cursor=1",
+     "SPEECH OUTPUT: 'Cc:'",
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'We've made a guess at your operating system. Please check it and, if we got it wrong, 
email'",
-     "     VISIBLE:  'We've made a guess at your opera', cursor=1",
-     "SPEECH OUTPUT: 'We've made a guess at your operating system. Please check it and, if we got it wrong, 
email'"]))
+    "33. Line Up",
+    ["BRAILLE LINE:  'Optional Fields'",
+     "     VISIBLE:  'Optional Fields', cursor=1",
+     "SPEECH OUTPUT: 'Optional Fields'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=1",
+    "34. Line Up",
+    ["BRAILLE LINE:  ' table cell'",
+     "     VISIBLE:  ' table cell', cursor=1",
+     "SPEECH OUTPUT: ' '",
      "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Commit Button      Remember values as bookmarkable template Button'",
-     "     VISIBLE:  'Commit Button      Remember valu', cursor=1",
-     "SPEECH OUTPUT: '   Commit button       Remember values as bookmarkable template button ",
-     "'"]))
+    "35. Line Up",
+    ["BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "BRAILLE LINE:  ' $l'",
+     "     VISIBLE:  ' $l', cursor=1",
+     "SPEECH OUTPUT: 'Description:'",
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Blocks: $l'",
-     "     VISIBLE:  'Blocks: $l', cursor=1",
-     "SPEECH OUTPUT: 'Blocks: text'"]))
+    "36. Line Up",
+    ["BRAILLE LINE:  'Description:'",
+     "     VISIBLE:  'Description:', cursor=1",
+     "SPEECH OUTPUT: 'Description:'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Depends on: $l'",
-     "     VISIBLE:  'Depends on: $l', cursor=1",
-     "SPEECH OUTPUT: 'Depends on: text'"]))
+    "37. Line Up",
+    ["BRAILLE LINE:  'Summary: $l'",
+     "     VISIBLE:  'Summary: $l', cursor=1",
+     "SPEECH OUTPUT: 'Summary:'",
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Keywords:  $l'",
-     "     VISIBLE:  'Keywords:  $l', cursor=1",
-     "SPEECH OUTPUT: 'Keywords link : text'"]))
+    "38. Line Up",
+    ["BRAILLE LINE:  ' table cell'",
+     "     VISIBLE:  ' table cell', cursor=1",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Cc: $l'",
-     "     VISIBLE:  'Cc: $l', cursor=1",
-     "SPEECH OUTPUT: 'Cc: text'"]))
+    "39. Line Up",
+    ["BRAILLE LINE:  'Severity:  combo box'",
+     "     VISIBLE:  'Severity:  combo box', cursor=1",
+     "SPEECH OUTPUT: 'Severity'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'normal'",
+     "SPEECH OUTPUT: 'combo box'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Optional Fields'",
-     "     VISIBLE:  'Optional Fields', cursor=1",
-     "SPEECH OUTPUT: 'Optional Fields'"]))
+    "40. Line Up",
+    ["BRAILLE LINE:  'OS:  combo box'",
+     "     VISIBLE:  'OS:  combo box', cursor=1",
+     "SPEECH OUTPUT: 'OS'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'Linux'",
+     "SPEECH OUTPUT: 'combo box'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  ' '",
-     "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+    "41. Line Up",
+    ["KNOWN ISSUE: On the way down we split this into two.",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'GNOME version:'",
+     "SPEECH OUTPUT: 'Unspecified'",
+     "SPEECH OUTPUT: 'combo box'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=0",
-     "SPEECH OUTPUT: 'blank'"]))
+    "42. Line Up",
+    ["BRAILLE LINE:  'GNOME'",
+     "     VISIBLE:  'GNOME', cursor=1",
+     "SPEECH OUTPUT: 'GNOME '",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Description: $l'",
-     "     VISIBLE:  'Description: $l', cursor=1",
-     "SPEECH OUTPUT: 'Description: text ",
-     "'"]))
+    "43. Line Up",
+    ["BRAILLE LINE:  ' table cell'",
+     "     VISIBLE:  ' table cell', cursor=1",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Summary: $l'",
-     "     VISIBLE:  'Summary: $l', cursor=1",
-     "SPEECH OUTPUT: 'Summary: text'"]))
+    "44. Line Up",
+    ["BRAILLE LINE:  'braille list box'",
+     "     VISIBLE:  'braille list box', cursor=1",
+     "BRAILLE LINE:  'braille list box'",
+     "     VISIBLE:  'braille list box', cursor=1",
+     "SPEECH OUTPUT: 'Component:'",
+     "SPEECH OUTPUT: 'braille'",
+     "SPEECH OUTPUT: 'List with 5 items'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  ' '",
-     "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+    "45. Line Up",
+    ["BRAILLE LINE:  'Component:'",
+     "     VISIBLE:  'Component:', cursor=1",
+     "SPEECH OUTPUT: 'Component'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Severity: normal Combo'",
-     "     VISIBLE:  'Severity: normal Combo', cursor=1",
-     "SPEECH OUTPUT: 'Severity link : normal combo box'"]))
+    "46. Line Up",
+    ["BRAILLE LINE:  '2.21.x list box'",
+     "     VISIBLE:  '2.21.x list box', cursor=1",
+     "BRAILLE LINE:  '2.21.x list box'",
+     "     VISIBLE:  '2.21.x list box', cursor=1",
+     "SPEECH OUTPUT: 'Version:'",
+     "SPEECH OUTPUT: '2.21.x'",
+     "SPEECH OUTPUT: 'List with 9 items'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'OS: Linux Combo'",
-     "     VISIBLE:  'OS: Linux Combo', cursor=1",
-     "SPEECH OUTPUT: 'OS link : Linux combo box'"]))
+    "47. Line Up",
+    ["BRAILLE LINE:  'Version:'",
+     "     VISIBLE:  'Version:', cursor=1",
+     "SPEECH OUTPUT: 'Version:'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'GNOME Unspecified Combo'",
-     "     VISIBLE:  'GNOME Unspecified Combo', cursor=1",
-     "SPEECH OUTPUT: 'GNOME link Unspecified combo box'"]))
+    "48. Line Up",
+    ["BRAILLE LINE:  'Reporter: joanmarie diggs gmail com Product: orca'",
+     "     VISIBLE:  'Reporter: joanmarie diggs gmail ', cursor=1",
+     "SPEECH OUTPUT: 'Reporter:'",
+     "SPEECH OUTPUT: 'joanmarie diggs gmail com'",
+     "SPEECH OUTPUT: 'Product:'",
+     "SPEECH OUTPUT: 'orca'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  ' '",
-     "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+    "49. Line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Version: 2.21.x List Component: braille List'",
-     "     VISIBLE:  'Version: 2.21.x List Component: ', cursor=1",
-     "SPEECH OUTPUT: 'Version: 2.21.x List with 9 items Component link : braille List with 5 items'"]))
+    "50. Line Up",
+    ["BRAILLE LINE:  'search or browse for the bug.'",
+     "     VISIBLE:  'search or browse for the bug.', cursor=1",
+     "SPEECH OUTPUT: 'search'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' or '",
+     "SPEECH OUTPUT: 'browse'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for the bug. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Reporter: joanmarie diggs gmail com Product: orca'",
-     "     VISIBLE:  'Reporter: joanmarie diggs gmail ', cursor=1",
-     "SPEECH OUTPUT: 'Reporter: joanmarie diggs gmail com Product: orca'"]))
+    "51. Line Up",
+    ["BRAILLE LINE:  'please look at the list of most frequently reported bugs, and please'",
+     "     VISIBLE:  'please look at the list of most ', cursor=1",
+     "SPEECH OUTPUT: 'please look at the list of '",
+     "SPEECH OUTPUT: 'most frequently reported bugs'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', and please '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    "52. Line Up",
+    ["BRAILLE LINE:  'Before reporting a bug, please read the bug writing guidelines,'",
+     "     VISIBLE:  'Before reporting a bug, please r', cursor=1",
+     "SPEECH OUTPUT: 'Before reporting a bug, please read the '",
+     "SPEECH OUTPUT: 'bug writing guidelines'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'frequently reported bugs, and please search or browse for the bug. '",
-     "     VISIBLE:  'frequently reported bugs, and pl', cursor=1",
-     "SPEECH OUTPUT: 'frequently reported bugs link , and please search link  or browse link  for the bug. ",
-     "'"]))
+    "53. Line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Before reporting a bug, please read the bug writing guidelines, please look at the 
list of most'",
-     "     VISIBLE:  'Before reporting a bug, please r', cursor=1",
-     "SPEECH OUTPUT: 'Before reporting a bug, please read the bug writing guidelines link , please look at 
the list of most link'"]))
+    "54. Line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  ''",
-     "     VISIBLE:  '', cursor=1",
-     "SPEECH OUTPUT: 'blank'"]))
+    "55. Line Up",
+    ["BRAILLE LINE:  'into Bugzilla. h1'",
+     "     VISIBLE:  'into Bugzilla. h1', cursor=1",
+     "SPEECH OUTPUT: 'into Bugzilla.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Enter Bug: orca – This page lets you enter a new bug into Bugzilla. h1 '",
+    "56. Line Up",
+    ["BRAILLE LINE:  'Enter Bug: orca – This page lets you enter a new bug h1'",
      "     VISIBLE:  'Enter Bug: orca – This page lets', cursor=1",
-     "SPEECH OUTPUT: 'Enter Bug: orca – This page lets you enter a new bug into Bugzilla. heading level 1 ",
-     "'"]))
+     "SPEECH OUTPUT: 'Enter Bug: orca – This page lets you enter a new bug '",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "57. Line Up",
     ["BRAILLE LINE:  'New bug · Browse · Search · Reports · Account · Admin · Help Logged In joanmarie diggs 
gmail com | Log Out'",
      "     VISIBLE:  'New bug · Browse · Search · Repo', cursor=1",
-     "SPEECH OUTPUT: 'New bug link  · Browse link  · Search link  · Reports link  · Account link  · Admin 
link  · Help link Logged In joanmarie diggs gmail com | Log Out link'"]))
+     "SPEECH OUTPUT: 'New bug'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Browse'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Reports'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Account'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Admin'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Help'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Logged In joanmarie diggs gmail com | '",
+     "SPEECH OUTPUT: 'Log Out'",
+     "SPEECH OUTPUT: 'link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
-    ["BRAILLE LINE:  'Home Image Bugzilla'",
-     "     VISIBLE:  'Home Image Bugzilla', cursor=1",
-     "BRAILLE LINE:  'Home Image Bugzilla New bug · Browse · Search · Reports · Account · Admin · Help 
Logged In joanmarie diggs gmail com | Log Out'",
-     "     VISIBLE:  'Home Image Bugzilla New bug · Br', cursor=1",
-     "SPEECH OUTPUT: 'Home link image Bugzilla'",
-     "SPEECH OUTPUT: 'Home link image'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+    "58. Line Up",
+    ["BRAILLE LINE:  'Home Bugzilla'",
+     "     VISIBLE:  'Home Bugzilla', cursor=1",
+     "BRAILLE LINE:  'Home Bugzilla'",
+     "     VISIBLE:  'Home Bugzilla', cursor=0",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'Bugzilla'",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_follow_same_page_link.params 
b/test/keystrokes/firefox/line_nav_follow_same_page_link.params
new file mode 100644
index 0000000..0a3c6b4
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_follow_same_page_link.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-544771.html
diff --git a/test/keystrokes/firefox/line_nav_follow_same_page_link.py 
b/test/keystrokes/firefox/line_nav_follow_same_page_link.py
new file mode 100644
index 0000000..34d5881
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_follow_same_page_link.py
@@ -0,0 +1,61 @@
+#!/usr/bin/python
+
+"""Test of navigation to same page links."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  'Contents h1'",
+     "     VISIBLE:  'Contents h1', cursor=1",
+     "SPEECH OUTPUT: 'Contents'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Tab",
+    ["BRAILLE LINE:  '•First item'",
+     "     VISIBLE:  '•First item', cursor=2",
+     "BRAILLE LINE:  '•First item'",
+     "     VISIBLE:  '•First item', cursor=2",
+     "SPEECH OUTPUT: 'First item'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab",
+    ["BRAILLE LINE:  '•Second item'",
+     "     VISIBLE:  '•Second item', cursor=2",
+     "BRAILLE LINE:  '•Second item'",
+     "     VISIBLE:  '•Second item', cursor=2",
+     "SPEECH OUTPUT: 'Second item'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Return",
+    ["BRAILLE LINE:  '•Second item'",
+     "     VISIBLE:  '•Second item', cursor=2",
+     "BRAILLE LINE:  'seas. '",
+     "     VISIBLE:  'seas. ', cursor=7",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Down",
+    ["BRAILLE LINE:  'Second h2'",
+     "     VISIBLE:  'Second h2', cursor=1",
+     "SPEECH OUTPUT: 'Second'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_follow_same_page_link_2.params 
b/test/keystrokes/firefox/line_nav_follow_same_page_link_2.params
new file mode 100644
index 0000000..0dafc37
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_follow_same_page_link_2.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/orca-wiki.html
diff --git a/test/keystrokes/firefox/line_nav_follow_same_page_link_2.py 
b/test/keystrokes/firefox/line_nav_follow_same_page_link_2.py
new file mode 100644
index 0000000..fcad316
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_follow_same_page_link_2.py
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+
+"""Test of navigation by same-page links on the Orca wiki."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Control>Home"))
+for i in range(25):
+    sequence.append(KeyComboAction("Tab"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "Return to activate the same-page link for the About heading",
+    ["KNOWN ISSUE: We are not speaking this.",
+     "BRAILLE LINE:  '2.About'",
+     "     VISIBLE:  '2.About', cursor=3"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "Line Down to read the text under the About heading",
+    ["BRAILLE LINE:  'Orca is a free, open source, flexible, extensible, and'",
+     "     VISIBLE:  'Orca is a free, open source, fle', cursor=1",
+     "SPEECH OUTPUT: 'Orca is a free, open source, flexible, extensible, and '"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_follow_same_page_link_3.params 
b/test/keystrokes/firefox/line_nav_follow_same_page_link_3.params
new file mode 100644
index 0000000..fcc66fb
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_follow_same_page_link_3.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/orca-wiki.html#head-a269540f0f3a25d25e08216f0438ee743a3ebe88
diff --git a/test/keystrokes/firefox/line_nav_follow_same_page_link_3.py 
b/test/keystrokes/firefox/line_nav_follow_same_page_link_3.py
new file mode 100644
index 0000000..21bcbbf
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_follow_same_page_link_3.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+
+"""Test of line nav after loading a same-page link."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Line Down to what should be the text below the About heading",
+    ["BRAILLE LINE:  'Orca is a free, open source, flexible, extensible, and'",
+     "     VISIBLE:  'Orca is a free, open source, fle', cursor=1",
+     "SPEECH OUTPUT: 'Orca is a free, open source, flexible, extensible, and '"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_heading_section.params 
b/test/keystrokes/firefox/line_nav_heading_section.params
new file mode 100644
index 0000000..dcde9da
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_heading_section.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/heading-section.html
diff --git a/test/keystrokes/firefox/line_nav_heading_section.py 
b/test/keystrokes/firefox/line_nav_heading_section.py
index 4d06e15..6e50f22 100644
--- a/test/keystrokes/firefox/line_nav_heading_section.py
+++ b/test/keystrokes/firefox/line_nav_heading_section.py
@@ -1,60 +1,34 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox on a page with headings
-in sections.
-"""
+"""Test of line navigation on a page with headings in sections."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "heading-section.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("HTML test page",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'Heading 1. h1'",
      "     VISIBLE:  'Heading 1. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 1. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 1.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "2. Line Down",
     ["BRAILLE LINE:  'Heading 2. h1'",
      "     VISIBLE:  'Heading 2. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 2. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 2.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "3. Line Down",
     ["BRAILLE LINE:  'sect 1'",
      "     VISIBLE:  'sect 1', cursor=1",
      "SPEECH OUTPUT: 'sect 1'"]))
@@ -62,15 +36,16 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "4. Line Down",
     ["BRAILLE LINE:  'Heading 3. h1'",
      "     VISIBLE:  'Heading 3. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 3. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 3.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "5. Line Down",
     ["BRAILLE LINE:  'sect 2'",
      "     VISIBLE:  'sect 2', cursor=1",
      "SPEECH OUTPUT: 'sect 2'"]))
@@ -78,15 +53,16 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "6. Line Down",
     ["BRAILLE LINE:  'Heading 4. h1'",
      "     VISIBLE:  'Heading 4. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 4. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 4.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "7. Line Down",
     ["BRAILLE LINE:  'sect 3'",
      "     VISIBLE:  'sect 3', cursor=1",
      "SPEECH OUTPUT: 'sect 3'"]))
@@ -94,34 +70,34 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "8. Line Down",
     ["BRAILLE LINE:  'Heading 5. h1'",
      "     VISIBLE:  'Heading 5. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 5. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 5.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "9. Line Down",
     ["BRAILLE LINE:  'Heading 6. h1'",
      "     VISIBLE:  'Heading 6. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 6. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 6.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "10. Line Up",
     ["BRAILLE LINE:  'Heading 5. h1'",
      "     VISIBLE:  'Heading 5. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 5. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 5.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "11. Line Up",
     ["BRAILLE LINE:  'sect 3'",
      "     VISIBLE:  'sect 3', cursor=1",
      "SPEECH OUTPUT: 'sect 3'"]))
@@ -129,15 +105,16 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "12. Line Up",
     ["BRAILLE LINE:  'Heading 4. h1'",
      "     VISIBLE:  'Heading 4. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 4. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 4.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "13. Line Up",
     ["BRAILLE LINE:  'sect 2'",
      "     VISIBLE:  'sect 2', cursor=1",
      "SPEECH OUTPUT: 'sect 2'"]))
@@ -145,15 +122,16 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "14. Line Up",
     ["BRAILLE LINE:  'Heading 3. h1'",
      "     VISIBLE:  'Heading 3. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 3. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 3.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "15. Line Up",
     ["BRAILLE LINE:  'sect 1'",
      "     VISIBLE:  'sect 1', cursor=1",
      "SPEECH OUTPUT: 'sect 1'"]))
@@ -161,36 +139,20 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "16. Line Up",
     ["BRAILLE LINE:  'Heading 2. h1'",
      "     VISIBLE:  'Heading 2. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 2. heading level 1'"]))
+     "SPEECH OUTPUT: 'Heading 2.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "17. Line Up",
     ["BRAILLE LINE:  'Heading 1. h1'",
      "     VISIBLE:  'Heading 1. h1', cursor=1",
-     "SPEECH OUTPUT: 'Heading 1. heading level 1'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'Heading 1.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_hidden_buttons.params 
b/test/keystrokes/firefox/line_nav_hidden_buttons.params
new file mode 100644
index 0000000..da3ac62
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_hidden_buttons.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/fb-stuck.html
diff --git a/test/keystrokes/firefox/line_nav_hidden_buttons.py 
b/test/keystrokes/firefox/line_nav_hidden_buttons.py
new file mode 100644
index 0000000..ccdd836
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_hidden_buttons.py
@@ -0,0 +1,73 @@
+#!/usr/bin/python
+
+"""Test of line navigation output of Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  'The start'",
+     "     VISIBLE:  'The start', cursor=1",
+     "SPEECH OUTPUT: 'The start'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["KNOWN ISSUE: We're losing a space in the button name.",
+     "BRAILLE LINE:  'Button1 push button'",
+     "     VISIBLE:  'Button1 push button', cursor=1",
+     "SPEECH OUTPUT: 'Button1'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["BRAILLE LINE:  'Button 2 push button'",
+     "     VISIBLE:  'Button 2 push button', cursor=1",
+     "SPEECH OUTPUT: 'Button 2'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  'The end'",
+     "     VISIBLE:  'The end', cursor=1",
+     "SPEECH OUTPUT: 'The end'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Up",
+    ["BRAILLE LINE:  'Button 2 push button'",
+     "     VISIBLE:  'Button 2 push button', cursor=1",
+     "SPEECH OUTPUT: 'Button 2'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Up",
+    ["KNOWN ISSUE: We're losing a space in the button name.",
+     "BRAILLE LINE:  'Button1 push button'",
+     "     VISIBLE:  'Button1 push button', cursor=1",
+     "SPEECH OUTPUT: 'Button1'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Up",
+    ["BRAILLE LINE:  'The start'",
+     "     VISIBLE:  'The start', cursor=1",
+     "SPEECH OUTPUT: 'The start'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_hidden_links.params 
b/test/keystrokes/firefox/line_nav_hidden_links.params
new file mode 100644
index 0000000..d7fd70e
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_hidden_links.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/so.html
diff --git a/test/keystrokes/firefox/line_nav_hidden_links.py 
b/test/keystrokes/firefox/line_nav_hidden_links.py
new file mode 100644
index 0000000..4fcb50a
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_hidden_links.py
@@ -0,0 +1,144 @@
+#!/usr/bin/python
+
+"""Test of line navigation output of Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  'Start'",
+     "     VISIBLE:  'Start', cursor=1",
+     "SPEECH OUTPUT: 'Start'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["BRAILLE LINE:  'up vote'",
+     "     VISIBLE:  'up vote', cursor=1",
+     "SPEECH OUTPUT: 'up vote'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["KNOWN ISSUE: It currently takes us several down arrows to move past this link",
+     "BRAILLE LINE:  'up vote'",
+     "     VISIBLE:  'up vote', cursor=1",
+     "SPEECH OUTPUT: 'up vote'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["KNOWN ISSUE: It currently takes us several down arrows to move past this link",
+     "BRAILLE LINE:  'up vote'",
+     "     VISIBLE:  'up vote', cursor=1",
+     "SPEECH OUTPUT: 'up vote'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Down",
+    ["BRAILLE LINE:  '74'",
+     "     VISIBLE:  '74', cursor=1",
+     "SPEECH OUTPUT: '74'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Down",
+    ["BRAILLE LINE:  'down vote'",
+     "     VISIBLE:  'down vote', cursor=1",
+     "SPEECH OUTPUT: 'down vote'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
+    ["KNOWN ISSUE: It currently takes us several down arrows to move past this link",
+     "BRAILLE LINE:  'down vote'",
+     "     VISIBLE:  'down vote', cursor=1",
+     "SPEECH OUTPUT: 'down vote'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Down",
+    ["KNOWN ISSUE: It currently takes us several down arrows to move past this link",
+     "BRAILLE LINE:  'down vote'",
+     "     VISIBLE:  'down vote', cursor=1",
+     "SPEECH OUTPUT: 'down vote'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Down",
+    ["BRAILLE LINE:  'accepted'",
+     "     VISIBLE:  'accepted', cursor=1",
+     "SPEECH OUTPUT: 'accepted'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Down",
+    ["KNOWN ISSUE: It currently takes us several down arrows to move past this object",
+     "BRAILLE LINE:  'accepted'",
+     "     VISIBLE:  'accepted', cursor=7",
+     "SPEECH OUTPUT: 'accepted'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Up",
+    ["BRAILLE LINE:  'accepted'",
+     "     VISIBLE:  'accepted', cursor=1",
+     "SPEECH OUTPUT: 'accepted'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Line Up",
+    ["BRAILLE LINE:  'down vote'",
+     "     VISIBLE:  'down vote', cursor=1",
+     "SPEECH OUTPUT: 'down vote'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Line Up",
+    ["BRAILLE LINE:  '74'",
+     "     VISIBLE:  '74', cursor=1",
+     "SPEECH OUTPUT: '74'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Line Up",
+    ["BRAILLE LINE:  'up vote'",
+     "     VISIBLE:  'up vote', cursor=1",
+     "SPEECH OUTPUT: 'up vote'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Up",
+    ["BRAILLE LINE:  'Start'",
+     "     VISIBLE:  'Start', cursor=1",
+     "SPEECH OUTPUT: 'Start'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_home_end_on_blank_line.params 
b/test/keystrokes/firefox/line_nav_home_end_on_blank_line.params
new file mode 100644
index 0000000..c22ece4
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_home_end_on_blank_line.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-591807.html
diff --git a/test/keystrokes/firefox/line_nav_home_end_on_blank_line.py 
b/test/keystrokes/firefox/line_nav_home_end_on_blank_line.py
new file mode 100644
index 0000000..b99cc63
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_home_end_on_blank_line.py
@@ -0,0 +1,61 @@
+#!/usr/bin/python
+
+"""Test of navigation by Home/End on a blank line."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file", 
+    ["BRAILLE LINE:  'This is a test.'",
+     "     VISIBLE:  'This is a test.', cursor=1",
+     "SPEECH OUTPUT: 'This is a test.",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Home"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Home",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'newline'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Top of file",
+    ["BRAILLE LINE:  'This is a test.'",
+     "     VISIBLE:  'This is a test.', cursor=1",
+     "SPEECH OUTPUT: 'This is a test.",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Down",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("End"))
+sequence.append(utils.AssertPresentationAction(
+    "6. End",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1",
+     "SPEECH OUTPUT: 'newline'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_imagemap.params 
b/test/keystrokes/firefox/line_nav_imagemap.params
new file mode 100644
index 0000000..1fce9a7
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_imagemap.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/backwards.html
diff --git a/test/keystrokes/firefox/line_nav_imagemap.py b/test/keystrokes/firefox/line_nav_imagemap.py
index e9417fd..f33c288 100644
--- a/test/keystrokes/firefox/line_nav_imagemap.py
+++ b/test/keystrokes/firefox/line_nav_imagemap.py
@@ -1,100 +1,259 @@
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox on a page with an
-imagemap.
-"""
+"""Test of line navigation on a page with an imagemap."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "backwards" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "backwards.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("Backwards Stuff",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'This looks like A to Z, but it's really Z to A.'",
      "     VISIBLE:  'This looks like A to Z, but it's', cursor=1",
      "SPEECH OUTPUT: 'This looks like A to Z, but it's really Z to A.'"]))
 
-########################################################################
-# Down Arrow to the End.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
-sequence.append(PauseAction(1000))
 sequence.append(utils.AssertPresentationAction(
-    "1. line Down",
+    "2. line Down",
     ["BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
      "     VISIBLE:  'Test: z y x w v u t s r q p o n ', cursor=1",
-     "SPEECH OUTPUT: 'Test: z link y link x link w link v link u link t link s link r link q link p link o 
link n link m link l link k link j link i link h link g link f link e link d link c link b link a link'"]))
+     "SPEECH OUTPUT: 'Test:'",
+     "SPEECH OUTPUT: 'z'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'z'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'y'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'y'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'x'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'x'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'w'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'w'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'v'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'v'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'u'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'u'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 't'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 't'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 's'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 's'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'r'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'r'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'q'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'q'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'p'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'p'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'o'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'o'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'n'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'n'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'm'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'm'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'l'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'l'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'k'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'k'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'j'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'j'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'i'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'i'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'h'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'h'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'g'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'g'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'f'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'f'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'e'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'e'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'd'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'd'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'c'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'c'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'b'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'b'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'a'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'a'",
+     "SPEECH OUTPUT: 'image map link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "2. line Down",
+    "3. line Down",
     ["BRAILLE LINE:  'Here is some text.'",
      "     VISIBLE:  'Here is some text.', cursor=1",
      "SPEECH OUTPUT: 'Here is some text.'"]))
 
-########################################################################
-# Up Arrow to the Top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. line Up",
+    "4. line Up",
     ["BRAILLE LINE:  'Test: z y x w v u t s r q p o n m l k j i h g f e d c b a'",
      "     VISIBLE:  'Test: z y x w v u t s r q p o n ', cursor=1",
-     "SPEECH OUTPUT: 'Test: z link y link x link w link v link u link t link s link r link q link p link o 
link n link m link l link k link j link i link h link g link f link e link d link c link b link a link'"]))
+     "SPEECH OUTPUT: 'Test:'",
+     "SPEECH OUTPUT: 'z'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'z'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'y'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'y'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'x'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'x'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'w'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'w'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'v'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'v'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'u'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'u'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 't'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 't'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 's'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 's'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'r'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'r'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'q'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'q'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'p'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'p'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'o'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'o'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'n'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'n'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'm'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'm'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'l'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'l'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'k'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'k'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'j'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'j'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'i'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'i'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'h'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'h'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'g'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'g'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'f'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'f'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'e'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'e'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'd'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'd'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'c'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'c'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'b'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'b'",
+     "SPEECH OUTPUT: 'image map link'",
+     "SPEECH OUTPUT: 'a'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'a'",
+     "SPEECH OUTPUT: 'image map link'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. line Up",
+    "5. line Up",
     ["BRAILLE LINE:  'This looks like A to Z, but it's really Z to A.'",
      "     VISIBLE:  'This looks like A to Z, but it's', cursor=1",
      "SPEECH OUTPUT: 'This looks like A to Z, but it's really Z to A.'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_images_in_links.params 
b/test/keystrokes/firefox/line_nav_images_in_links.params
new file mode 100644
index 0000000..1c71712
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_images_in_links.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/images-in-links.html
diff --git a/test/keystrokes/firefox/line_nav_images_in_links.py 
b/test/keystrokes/firefox/line_nav_images_in_links.py
new file mode 100644
index 0000000..4991df6
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_images_in_links.py
@@ -0,0 +1,641 @@
+#!/usr/bin/python
+
+"""Test of presentation of links that contain images."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  'One image with alt text in a link: Orca logo image'",
+     "     VISIBLE:  'One image with alt text in a lin', cursor=1",
+     "SPEECH OUTPUT: 'One image with alt text in a link: '",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["BRAILLE LINE:  'Orca logo image'",
+     "     VISIBLE:  'Orca logo image', cursor=1",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["BRAILLE LINE:  'One image with title attribute in a link: Orca logo showing a whale holding a white 
cane image'",
+     "     VISIBLE:  'One image with title attribute i', cursor=1",
+     "SPEECH OUTPUT: 'One image with title attribute in a link: '",
+     "SPEECH OUTPUT: 'Orca logo showing a whale holding a white cane'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  'Orca logo showing a whale holding a white cane image'",
+     "     VISIBLE:  'Orca logo showing a whale holdin', cursor=1",
+     "SPEECH OUTPUT: 'Orca logo showing a whale holding a white cane'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Down",
+    ["BRAILLE LINE:  'One image with both alt text and title attribute in a link: Orca logo image'",
+     "     VISIBLE:  'One image with both alt text and', cursor=1",
+     "SPEECH OUTPUT: 'One image with both alt text and title attribute in a link: '",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Orca logo showing a whale holding a white cane'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Down",
+    ["BRAILLE LINE:  'Orca logo image'",
+     "     VISIBLE:  'Orca logo image', cursor=1",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Orca logo showing a whale holding a white cane'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
+    ["BRAILLE LINE:  'One \"useless\" image in a link: foo image'",
+     "     VISIBLE:  'One \"useless\" image in a link: f', cursor=1",
+     "SPEECH OUTPUT: 'One \"useless\" image in a link: '",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Down",
+    ["BRAILLE LINE:  'foo image'",
+     "     VISIBLE:  'foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Down",
+    ["BRAILLE LINE:  'Two \"useless\" images in a link: foo image foo image'",
+     "     VISIBLE:  'Two \"useless\" images in a link: ', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images in a link: '",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Down",
+    ["BRAILLE LINE:  'foo image foo image'",
+     "     VISIBLE:  'foo image foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Down",
+    ["BRAILLE LINE:  'Two \"useless\" images in a paragraph that is inside of a link: foo'",
+     "     VISIBLE:  'Two \"useless\" images in a paragr', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images in a paragraph that is inside of a link: '",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Line Down",
+    ["BRAILLE LINE:  'foo image foo image'",
+     "     VISIBLE:  'foo image foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Line Down",
+    ["BRAILLE LINE:  'One \"useless\" image and one \"useful\" image in a link: Orca logo image foo image'",
+     "     VISIBLE:  'One \"useless\" image and one \"use', cursor=1",
+     "SPEECH OUTPUT: 'One \"useless\" image and one \"useful\" image in a link: '",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Line Down",
+    ["BRAILLE LINE:  'Orca logo image foo image'",
+     "     VISIBLE:  'Orca logo image foo image', cursor=1",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Down",
+    ["BRAILLE LINE:  'Two \"useless\" images along with some text in a link: foo image silly link foo 
image'",
+     "     VISIBLE:  'Two \"useless\" images along with ', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images along with some text in a link: '",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'silly link'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Line Down",
+    ["BRAILLE LINE:  'foo image'",
+     "     VISIBLE:  'foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Line Down",
+    ["BRAILLE LINE:  'Two \"useless\" images along with some text in a link: foo image silly link foo 
image'",
+     "     VISIBLE:  'silly link foo image', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images along with some text in a link: '",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'silly link'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Line Down",
+    ["BRAILLE LINE:  'foo image'",
+     "     VISIBLE:  'foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Down",
+    ["BRAILLE LINE:  'Two \"useless\" images in a paragraph that is inside of a link along with text that is 
not in the paragraph: Before'",
+     "     VISIBLE:  'Two \"useless\" images in a paragr', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images in a paragraph that is inside of a link along with text that is 
not in the paragraph: '",
+     "SPEECH OUTPUT: 'Before '",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Line Down",
+    ["BRAILLE LINE:  'the paragraph'",
+     "     VISIBLE:  'the paragraph', cursor=1",
+     "SPEECH OUTPUT: 'the paragraph'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Line Down",
+    ["BRAILLE LINE:  'foo image foo image'",
+     "     VISIBLE:  'foo image foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Line Down",
+    ["BRAILLE LINE:  'After the paragraph'",
+     "     VISIBLE:  'After the paragraph', cursor=1",
+     "SPEECH OUTPUT: 'After the paragraph'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Line Down",
+    ["BRAILLE LINE:  'Two \"useless\" images and some additional text in a paragraph that is inside of a 
link along with text that is not in'",
+     "     VISIBLE:  'Two \"useless\" images and some ad', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images and some additional text in a paragraph that is inside of a 
link along with text that is not in '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Line Down",
+    ["BRAILLE LINE:  'the paragraph: Before the paragraph'",
+     "     VISIBLE:  'the paragraph: Before the paragr', cursor=1",
+     "SPEECH OUTPUT: 'the paragraph: '",
+     "SPEECH OUTPUT: 'Before the paragraph'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "25. Line Down",
+    ["BRAILLE LINE:  'foo image'",
+     "     VISIBLE:  'foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Line Down",
+    ["BRAILLE LINE:  'foo image silly link foo image'",
+     "     VISIBLE:  'foo image silly link foo image', cursor=11",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'silly link'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "27. Line Down",
+    ["BRAILLE LINE:  'foo image'",
+     "     VISIBLE:  'foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "28. Line Down",
+    ["BRAILLE LINE:  'After the paragraph'",
+     "     VISIBLE:  'After the paragraph', cursor=1",
+     "SPEECH OUTPUT: 'After the paragraph'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Line Up",
+    ["BRAILLE LINE:  'foo image'",
+     "     VISIBLE:  'foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Line Up",
+    ["KNOWN ISSUE: We seem to be skipping over some things when arrowing up.",
+     "BRAILLE LINE:  'foo image'",
+     "     VISIBLE:  'foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+#    ["BRAILLE LINE:  'foo image silly link foo image'",
+#     "     VISIBLE:  'foo image silly link foo image', cursor=11",
+#     "SPEECH OUTPUT: 'foo'",
+#     "SPEECH OUTPUT: 'link'",
+#     "SPEECH OUTPUT: 'image'",
+#     "SPEECH OUTPUT: 'silly link'",
+#     "SPEECH OUTPUT: 'link'",
+#     "SPEECH OUTPUT: 'image'",
+#     "SPEECH OUTPUT: 'foo'",
+#     "SPEECH OUTPUT: 'link'",
+#     "SPEECH OUTPUT: 'image'"]))
+#
+#sequence.append(utils.StartRecordingAction())
+#sequence.append(KeyComboAction("Up"))
+#sequence.append(utils.AssertPresentationAction(
+#    "31. Line Up",
+#    ["BRAILLE LINE:  'foo image'",
+#     "     VISIBLE:  'foo image', cursor=1",
+#     "SPEECH OUTPUT: 'foo'",
+#     "SPEECH OUTPUT: 'link'",
+#     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "31. Line Up",
+    ["BRAILLE LINE:  'the paragraph: Before the paragraph'",
+     "     VISIBLE:  'the paragraph: Before the paragr', cursor=1",
+     "SPEECH OUTPUT: 'the paragraph: '",
+     "SPEECH OUTPUT: 'Before the paragraph'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "32. Line Up",
+    ["BRAILLE LINE:  'Two \"useless\" images and some additional text in a paragraph that is inside of a 
link along with text that is not in'",
+     "     VISIBLE:  'Two \"useless\" images and some ad', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images and some additional text in a paragraph that is inside of a 
link along with text that is not in '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "33. Line Up",
+    ["BRAILLE LINE:  'After the paragraph'",
+     "     VISIBLE:  'After the paragraph', cursor=1",
+     "SPEECH OUTPUT: 'After the paragraph'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "34. Line Up",
+    ["BRAILLE LINE:  'foo image foo image'",
+     "     VISIBLE:  'foo image foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "35. Line Up",
+    ["BRAILLE LINE:  'the paragraph'",
+     "     VISIBLE:  'the paragraph', cursor=1",
+     "SPEECH OUTPUT: 'the paragraph'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "36. Line Up",
+    ["BRAILLE LINE:  'Two \"useless\" images in a paragraph that is inside of a link along with text that is 
not in the paragraph: Before'",
+     "     VISIBLE:  'Two \"useless\" images in a paragr', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images in a paragraph that is inside of a link along with text that is 
not in the paragraph: '",
+     "SPEECH OUTPUT: 'Before '",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "37. Line Up",
+    ["BRAILLE LINE:  'foo image'",
+     "     VISIBLE:  'foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "38. Line Up",
+    ["BRAILLE LINE:  'Two \"useless\" images along with some text in a link: foo image silly link foo 
image'",
+     "     VISIBLE:  'Two \"useless\" images along with ', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images along with some text in a link: '",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'silly link'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+#sequence.append(utils.StartRecordingAction())
+#sequence.append(KeyComboAction("Up"))
+#sequence.append(utils.AssertPresentationAction(
+#    "39. Line Up",
+#    ["BRAILLE LINE:  'foo image'",
+#     "     VISIBLE:  'foo image', cursor=1",
+#     "SPEECH OUTPUT: 'foo'",
+#     "SPEECH OUTPUT: 'link'",
+#     "SPEECH OUTPUT: 'image'"]))
+#
+#sequence.append(utils.StartRecordingAction())
+#sequence.append(KeyComboAction("Up"))
+#sequence.append(utils.AssertPresentationAction(
+#    "40. Line Up",
+#    ["BRAILLE LINE:  'Two \"useless\" images along with some text in a link: foo image silly link foo 
image'",
+#     "     VISIBLE:  'Two \"useless\" images along with ', cursor=1",
+#     "SPEECH OUTPUT: 'Two \"useless\" images along with some text in a link: '",
+#     "SPEECH OUTPUT: 'foo'",
+#     "SPEECH OUTPUT: 'link'",
+#     "SPEECH OUTPUT: 'image'",
+#     "SPEECH OUTPUT: 'silly link'",
+#     "SPEECH OUTPUT: 'link'",
+#     "SPEECH OUTPUT: 'image'",
+#     "SPEECH OUTPUT: 'foo'",
+#     "SPEECH OUTPUT: 'link'",
+#     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "39. Line Up",
+    ["KNOWN ISSUE: Another case where we just skipped over something",
+     "BRAILLE LINE:  'Orca logo image foo image'",
+     "     VISIBLE:  'Orca logo image foo image', cursor=1",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "40. Line Up",
+    ["BRAILLE LINE:  'One \"useless\" image and one \"useful\" image in a link: Orca logo image foo image'",
+     "     VISIBLE:  'One \"useless\" image and one \"use', cursor=1",
+     "SPEECH OUTPUT: 'One \"useless\" image and one \"useful\" image in a link: '",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "41. Line Up",
+    ["BRAILLE LINE:  'foo image foo image'",
+     "     VISIBLE:  'foo image foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "42. Line Up",
+    ["BRAILLE LINE:  'Two \"useless\" images in a paragraph that is inside of a link: foo'",
+     "     VISIBLE:  'Two \"useless\" images in a paragr', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images in a paragraph that is inside of a link: '",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "43. Line Up",
+    ["BRAILLE LINE:  'foo image foo image'",
+     "     VISIBLE:  'foo image foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "44. Line Up",
+    ["BRAILLE LINE:  'Two \"useless\" images in a link: foo image foo image'",
+     "     VISIBLE:  'Two \"useless\" images in a link: ', cursor=1",
+     "SPEECH OUTPUT: 'Two \"useless\" images in a link: '",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "45. Line Up",
+    ["BRAILLE LINE:  'foo image'",
+     "     VISIBLE:  'foo image', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "46. Line Up",
+    ["BRAILLE LINE:  'One \"useless\" image in a link: foo image'",
+     "     VISIBLE:  'One \"useless\" image in a link: f', cursor=1",
+     "SPEECH OUTPUT: 'One \"useless\" image in a link: '",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "47. Line Up",
+    ["BRAILLE LINE:  'Orca logo image'",
+     "     VISIBLE:  'Orca logo image', cursor=1",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Orca logo showing a whale holding a white cane'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "48. Line Up",
+    ["BRAILLE LINE:  'One image with both alt text and title attribute in a link: Orca logo image'",
+     "     VISIBLE:  'One image with both alt text and', cursor=1",
+     "SPEECH OUTPUT: 'One image with both alt text and title attribute in a link: '",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Orca logo showing a whale holding a white cane'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "49. Line Up",
+    ["BRAILLE LINE:  'Orca logo showing a whale holding a white cane image'",
+     "     VISIBLE:  'Orca logo showing a whale holdin', cursor=1",
+     "SPEECH OUTPUT: 'Orca logo showing a whale holding a white cane'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "50. Line Up",
+    ["BRAILLE LINE:  'One image with title attribute in a link: Orca logo showing a whale holding a white 
cane image'",
+     "     VISIBLE:  'One image with title attribute i', cursor=1",
+     "SPEECH OUTPUT: 'One image with title attribute in a link: '",
+     "SPEECH OUTPUT: 'Orca logo showing a whale holding a white cane'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "51. Line Up",
+    ["BRAILLE LINE:  'Orca logo image'",
+     "     VISIBLE:  'Orca logo image', cursor=1",
+     "SPEECH OUTPUT: 'Orca logo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_multi_line_text.params 
b/test/keystrokes/firefox/line_nav_multi_line_text.params
new file mode 100644
index 0000000..815c992
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_multi_line_text.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/multi-line.html
diff --git a/test/keystrokes/firefox/line_nav_multi_line_text.py 
b/test/keystrokes/firefox/line_nav_multi_line_text.py
index c790fbd..aadd7e1 100644
--- a/test/keystrokes/firefox/line_nav_multi_line_text.py
+++ b/test/keystrokes/firefox/line_nav_multi_line_text.py
@@ -1,60 +1,33 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox on a page with multi-
-line table cells and sections.
-"""
+"""Test of line navigation on a page with multi-line cells and sections."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "multi-line.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("Mutli-Line Test",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'Table test'",
      "     VISIBLE:  'Table test', cursor=1",
-     "SPEECH OUTPUT: 'Table test'"]))
+     "SPEECH OUTPUT: 'Table test '"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "2. Line Down",
     ["BRAILLE LINE:  'foo bar'",
      "     VISIBLE:  'foo bar', cursor=1",
-     "SPEECH OUTPUT: 'foo bar'"]))
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'bar'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "3. Line Down",
     ["BRAILLE LINE:  'foo'",
      "     VISIBLE:  'foo', cursor=1",
      "SPEECH OUTPUT: 'foo",
@@ -63,7 +36,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "4. Line Down",
     ["BRAILLE LINE:  'foo'",
      "     VISIBLE:  'foo', cursor=1",
      "SPEECH OUTPUT: 'foo'"]))
@@ -71,7 +44,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "5. Line Down",
     ["BRAILLE LINE:  'bar'",
      "     VISIBLE:  'bar', cursor=1",
      "SPEECH OUTPUT: 'bar",
@@ -80,7 +53,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "6. Line Down",
     ["BRAILLE LINE:  'bar'",
      "     VISIBLE:  'bar', cursor=1",
      "SPEECH OUTPUT: 'bar'"]))
@@ -88,162 +61,208 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "7. Line Down",
     ["BRAILLE LINE:  'Hello h3'",
      "     VISIBLE:  'Hello h3', cursor=1",
-     "SPEECH OUTPUT: 'Hello heading level 3'"]))
+     "SPEECH OUTPUT: 'Hello'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "8. Line Down",
     ["BRAILLE LINE:  '•This is a test that is not very interesting.'",
-     "     VISIBLE:  '•This is a test that is not very', cursor=1",
-     "SPEECH OUTPUT: '• This is a test link  that is not very interesting.'"]))
+     "     VISIBLE:  'This is a test that is not very ', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'This is a test'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' that is not very interesting.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "9. Line Down",
     ["BRAILLE LINE:  '•But it looks like a real-world example.'",
-     "     VISIBLE:  '•But it looks like a real-world ', cursor=1",
-     "SPEECH OUTPUT: '• But it looks like link  a real-world example.'"]))
+     "     VISIBLE:  'But it looks like a real-world e', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'But it looks like'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' a real-world example.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "10. Line Down",
     ["BRAILLE LINE:  '•And that's why this silly test is here.'",
-     "     VISIBLE:  '•And that's why this silly test ', cursor=1",
-     "SPEECH OUTPUT: '• And that's link  why this silly test is here.'"]))
+     "     VISIBLE:  'And that's why this silly test i', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'And that's'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' why this silly test is here.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "11. Line Down",
     ["BRAILLE LINE:  'So it's far more interesting than it looks.'",
      "     VISIBLE:  'So it's far more interesting tha', cursor=1",
-     "SPEECH OUTPUT: 'So it's far more interesting link  than it looks.'"]))
+     "SPEECH OUTPUT: 'So it's '",
+     "SPEECH OUTPUT: 'far more interesting'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' than it looks.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "12. Line Down",
     ["BRAILLE LINE:  'World h3'",
      "     VISIBLE:  'World h3', cursor=1",
-     "SPEECH OUTPUT: 'World heading level 3'"]))
+     "SPEECH OUTPUT: 'World'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "13. Line Down",
     ["BRAILLE LINE:  '•The thing is we can't copy content.'",
-     "     VISIBLE:  '•The thing is we can't copy cont', cursor=1",
-     "SPEECH OUTPUT: '• The thing is link  we can't copy content.'"]))
+     "     VISIBLE:  'The thing is we can't copy conte', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'The thing is'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' we can't copy content.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "14. Line Down",
     ["BRAILLE LINE:  '•So we must create silly tests.'",
-     "     VISIBLE:  '•So we must create silly tests.', cursor=1",
-     "SPEECH OUTPUT: '• So we must link  create silly tests.'"]))
+     "     VISIBLE:  '•So we must create silly tests.', cursor=2",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'So we must'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' create silly tests.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "15. Line Down",
     ["BRAILLE LINE:  '•Oh well.'",
-     "     VISIBLE:  '•Oh well.', cursor=1",
-     "SPEECH OUTPUT: '• Oh link  well.'"]))
+     "     VISIBLE:  '•Oh well.', cursor=2",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Oh'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' well.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "16. Line Down",
     ["BRAILLE LINE:  'At least it's over.'",
      "     VISIBLE:  'At least it's over.', cursor=1",
-     "SPEECH OUTPUT: 'At least it's over link .'"]))
+     "SPEECH OUTPUT: 'At least it's",
+     "SPEECH OUTPUT: 'over'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '.'"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "17. Line Up",
     ["BRAILLE LINE:  '•Oh well.'",
-     "     VISIBLE:  '•Oh well.', cursor=1",
-     "SPEECH OUTPUT: '• Oh link  well.'"]))
+     "     VISIBLE:  '•Oh well.', cursor=2",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Oh'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' well.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "18. Line Up",
     ["BRAILLE LINE:  '•So we must create silly tests.'",
-     "     VISIBLE:  '•So we must create silly tests.', cursor=1",
-     "SPEECH OUTPUT: '• So we must link  create silly tests.'"]))
+     "     VISIBLE:  '•So we must create silly tests.', cursor=2",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'So we must'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' create silly tests.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "19. Line Up",
     ["BRAILLE LINE:  '•The thing is we can't copy content.'",
-     "     VISIBLE:  '•The thing is we can't copy cont', cursor=1",
-     "SPEECH OUTPUT: '• The thing is link  we can't copy content.'"]))
+     "     VISIBLE:  'The thing is we can't copy conte', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'The thing is'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' we can't copy content.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "20. Line Up",
     ["BRAILLE LINE:  'World h3'",
      "     VISIBLE:  'World h3', cursor=1",
-     "SPEECH OUTPUT: 'World heading level 3'"]))
+     "SPEECH OUTPUT: 'World'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "21. Line Up",
     ["BRAILLE LINE:  'So it's far more interesting than it looks.'",
      "     VISIBLE:  'So it's far more interesting tha', cursor=1",
-     "SPEECH OUTPUT: 'So it's far more interesting link  than it looks.'"]))
+     "SPEECH OUTPUT: 'So it's '",
+     "SPEECH OUTPUT: 'far more interesting'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' than it looks.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "22. Line Up",
     ["BRAILLE LINE:  '•And that's why this silly test is here.'",
-     "     VISIBLE:  '•And that's why this silly test ', cursor=1",
-     "SPEECH OUTPUT: '• And that's link  why this silly test is here.'"]))
+     "     VISIBLE:  'And that's why this silly test i', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'And that's'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' why this silly test is here.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "23. Line Up",
     ["BRAILLE LINE:  '•But it looks like a real-world example.'",
-     "     VISIBLE:  '•But it looks like a real-world ', cursor=1",
-     "SPEECH OUTPUT: '• But it looks like link  a real-world example.'"]))
+     "     VISIBLE:  'But it looks like a real-world e', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'But it looks like'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' a real-world example.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "24. Line Up",
     ["BRAILLE LINE:  '•This is a test that is not very interesting.'",
-     "     VISIBLE:  '•This is a test that is not very', cursor=1",
-     "SPEECH OUTPUT: '• This is a test link  that is not very interesting.'"]))
+     "     VISIBLE:  'This is a test that is not very ', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'This is a test'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' that is not very interesting.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "25. Line Up",
     ["BRAILLE LINE:  'Hello h3'",
      "     VISIBLE:  'Hello h3', cursor=1",
-     "SPEECH OUTPUT: 'Hello heading level 3'"]))
+     "SPEECH OUTPUT: 'Hello'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "26. Line Up",
     ["BRAILLE LINE:  'bar'",
      "     VISIBLE:  'bar', cursor=1",
      "SPEECH OUTPUT: 'bar'"]))
@@ -251,7 +270,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "27. Line Up",
     ["BRAILLE LINE:  'bar'",
      "     VISIBLE:  'bar', cursor=1",
      "SPEECH OUTPUT: 'bar",
@@ -260,7 +279,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "28. Line Up",
     ["BRAILLE LINE:  'foo'",
      "     VISIBLE:  'foo', cursor=1",
      "SPEECH OUTPUT: 'foo'"]))
@@ -268,7 +287,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "29. Line Up",
     ["BRAILLE LINE:  'foo'",
      "     VISIBLE:  'foo', cursor=1",
      "SPEECH OUTPUT: 'foo",
@@ -277,36 +296,19 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "30. Line Up",
     ["BRAILLE LINE:  'foo bar'",
      "     VISIBLE:  'foo bar', cursor=1",
-     "SPEECH OUTPUT: 'foo bar'"]))
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'bar'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "31. Line Up",
     ["BRAILLE LINE:  'Table test'",
      "     VISIBLE:  'Table test', cursor=1",
-     "SPEECH OUTPUT: 'Table test'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'Table test '"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_nested_tables.params 
b/test/keystrokes/firefox/line_nav_nested_tables.params
new file mode 100644
index 0000000..feec66e
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_nested_tables.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/nested-tables.html
diff --git a/test/keystrokes/firefox/line_nav_nested_tables.py 
b/test/keystrokes/firefox/line_nav_nested_tables.py
index e327ced..7c82af8 100644
--- a/test/keystrokes/firefox/line_nav_nested_tables.py
+++ b/test/keystrokes/firefox/line_nav_nested_tables.py
@@ -1,62 +1,45 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox on a page with nested
-layout tables. 
-"""
+"""Test of line navigation on a page with nested layout tables. """
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "nested-tables.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("Nested Tables",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-sequence.append(PauseAction(3000))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
-    ["BRAILLE LINE:  'nested-tables Image'",
-     "     VISIBLE:  'nested-tables Image', cursor=1",
-     "SPEECH OUTPUT: 'nested-tables link image'"]))
+    "1. Top of file",
+    ["BRAILLE LINE:  'nested-tables image'",
+     "     VISIBLE:  'nested-tables image', cursor=1",
+     "SPEECH OUTPUT: 'nested-tables'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
 
-########################################################################
-# Down Arrow to the End.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "0. line Down",
+    "2. line Down",
     ["BRAILLE LINE:  'Campus  .  Classroom  .  Communicate  .  Reports '",
      "     VISIBLE:  'Campus  .  Classroom  .  Communi', cursor=1",
-     "SPEECH OUTPUT: 'Campus link   .   Classroom link   .   Communicate link   .   Reports link  '"]))
+     "SPEECH OUTPUT: 'Campus'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '  .  '",
+     "SPEECH OUTPUT: 'Classroom'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '  .  '",
+     "SPEECH OUTPUT: 'Communicate'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '  .  '",
+     "SPEECH OUTPUT: 'Reports'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "1. line Down",
+    "3. line Down",
     ["BRAILLE LINE:  'Your Learning Plan'",
      "     VISIBLE:  'Your Learning Plan', cursor=1",
      "SPEECH OUTPUT: 'Your Learning Plan'"]))
@@ -64,23 +47,23 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "2. line Down",
+    "4. line Down",
     ["BRAILLE LINE:  'Below is a list of the courses that make up your learning plan.'",
      "     VISIBLE:  'Below is a list of the courses t', cursor=1",
-     "SPEECH OUTPUT: 'Below is a list of the courses that make up your learning plan.'"]))
+     "SPEECH OUTPUT: 'Below is a list of the courses that make up your learning plan. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "3. line Down",
+    "5. line Down",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: '  '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "4. line Down",
+    "6. line Down",
     ["BRAILLE LINE:  'UNIX 2007'",
      "     VISIBLE:  'UNIX 2007', cursor=1",
      "SPEECH OUTPUT: 'UNIX 2007'"]))
@@ -88,15 +71,49 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "5. line Down",
-    ["BRAILLE LINE:  ' Take Course'",
-     "     VISIBLE:  ' Take Course', cursor=1",
-     "SPEECH OUTPUT: '  Take Course link'"]))
+    "7. line Down",
+    ["BRAILLE LINE:  ' '",
+     "     VISIBLE:  ' ', cursor=1",
+     "SPEECH OUTPUT: ' '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "6. line Down",
+    "8. line Down",
+    ["KNOWN ISSUE: We are now finding and moving to useless table cells.",
+     "BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. line Down",
+    ["BRAILLE LINE:  'Take Course'",
+     "     VISIBLE:  'Take Course', cursor=1",
+     "SPEECH OUTPUT: 'Take Course'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. line Down",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. line Down",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. line Down",
     ["BRAILLE LINE:  'You have completed 87 of the 87 modules in this course.'",
      "     VISIBLE:  'You have completed 87 of the 87 ', cursor=1",
      "SPEECH OUTPUT: 'You have completed 87 of the 87 modules in this course.'"]))
@@ -104,15 +121,15 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "7. line Down",
-    ["BRAILLE LINE:  'Separator'",
-     "     VISIBLE:  'Separator', cursor=1",
+    "13. line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
      "SPEECH OUTPUT: 'separator'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "8. line Down",
+    "14. line Down",
     ["BRAILLE LINE:  'SQL Plus'",
      "     VISIBLE:  'SQL Plus', cursor=1",
      "SPEECH OUTPUT: 'SQL Plus'"]))
@@ -120,15 +137,48 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "9. line Down",
-    ["BRAILLE LINE:  ' Take Course'",
-     "     VISIBLE:  ' Take Course', cursor=1",
-     "SPEECH OUTPUT: '  Take Course link'"]))
+    "15. line Down",
+    ["BRAILLE LINE:  ' '",
+     "     VISIBLE:  ' ', cursor=1",
+     "SPEECH OUTPUT: ' '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "10. line Down",
+    "16. line Down",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "17. line Down",
+    ["BRAILLE LINE:  'Take Course'",
+     "     VISIBLE:  'Take Course', cursor=1",
+     "SPEECH OUTPUT: 'Take Course'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "18. line Down",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "19. line Down",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "20. line Down",
     ["BRAILLE LINE:  'You have completed 59 of the 184 modules in this course.'",
      "     VISIBLE:  'You have completed 59 of the 184', cursor=1",
      "SPEECH OUTPUT: 'You have completed 59 of the 184 modules in this course.'"]))
@@ -136,18 +186,15 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "11. line Down",
-    ["BRAILLE LINE:  'Separator'",
-     "     VISIBLE:  'Separator', cursor=1",
+    "21. line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
      "SPEECH OUTPUT: 'separator'"]))
 
-########################################################################
-# Up Arrow to the Top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. line Up",
+    "22. line Up",
     ["BRAILLE LINE:  'You have completed 59 of the 184 modules in this course.'",
      "     VISIBLE:  'You have completed 59 of the 184', cursor=1",
      "SPEECH OUTPUT: 'You have completed 59 of the 184 modules in this course.'"]))
@@ -155,15 +202,48 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. line Up",
-    ["BRAILLE LINE:  ' Take Course'",
-     "     VISIBLE:  ' Take Course', cursor=1",
-     "SPEECH OUTPUT: '  Take Course link'"]))
+    "23. line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "24. line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "25. line Up",
+    ["BRAILLE LINE:  'Take Course'",
+     "     VISIBLE:  'Take Course', cursor=1",
+     "SPEECH OUTPUT: 'Take Course'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "26. line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "27. line Up",
+    ["BRAILLE LINE:  ' '",
+     "     VISIBLE:  ' ', cursor=1",
+     "SPEECH OUTPUT: ' '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "3. line Up",
+    "28. line Up",
     ["BRAILLE LINE:  'SQL Plus'",
      "     VISIBLE:  'SQL Plus', cursor=1",
      "SPEECH OUTPUT: 'SQL Plus'"]))
@@ -171,15 +251,15 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "4. line Up",
-    ["BRAILLE LINE:  'Separator'",
-     "     VISIBLE:  'Separator', cursor=1",
+    "29. line Up",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
      "SPEECH OUTPUT: 'separator'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "5. line Up",
+    "30. line Up",
     ["BRAILLE LINE:  'You have completed 87 of the 87 modules in this course.'",
      "     VISIBLE:  'You have completed 87 of the 87 ', cursor=1",
      "SPEECH OUTPUT: 'You have completed 87 of the 87 modules in this course.'"]))
@@ -187,15 +267,48 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "6. line Up",
-    ["BRAILLE LINE:  ' Take Course'",
-     "     VISIBLE:  ' Take Course', cursor=1",
-     "SPEECH OUTPUT: '  Take Course link'"]))
+    "31. line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "7. line Up",
+    "32. line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "33. line Up",
+    ["BRAILLE LINE:  'Take Course'",
+     "     VISIBLE:  'Take Course', cursor=1",
+     "SPEECH OUTPUT: 'Take Course'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "34. line Up",
+    ["BRAILLE LINE:  'table cell'",
+     "     VISIBLE:  'table cell', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "35. line Up",
+    ["BRAILLE LINE:  ' '",
+     "     VISIBLE:  ' ', cursor=1",
+     "SPEECH OUTPUT: ' '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "36. line Up",
     ["BRAILLE LINE:  'UNIX 2007'",
      "     VISIBLE:  'UNIX 2007', cursor=1",
      "SPEECH OUTPUT: 'UNIX 2007'"]))
@@ -203,23 +316,23 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "8. line Up",
+    "37. line Up",
     ["BRAILLE LINE:  ' '",
      "     VISIBLE:  ' ', cursor=1",
-     "SPEECH OUTPUT: ' '"]))
+     "SPEECH OUTPUT: '  '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "9. line Up",
+    "38. line Up",
     ["BRAILLE LINE:  'Below is a list of the courses that make up your learning plan.'",
      "     VISIBLE:  'Below is a list of the courses t', cursor=1",
-     "SPEECH OUTPUT: 'Below is a list of the courses that make up your learning plan.'"]))
+     "SPEECH OUTPUT: 'Below is a list of the courses that make up your learning plan. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "10. line Up",
+    "39. line Up",
     ["BRAILLE LINE:  'Your Learning Plan'",
      "     VISIBLE:  'Your Learning Plan', cursor=1",
      "SPEECH OUTPUT: 'Your Learning Plan'"]))
@@ -227,28 +340,31 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "11. line Up",
+    "40. line Up",
     ["BRAILLE LINE:  'Campus  .  Classroom  .  Communicate  .  Reports '",
      "     VISIBLE:  'Campus  .  Classroom  .  Communi', cursor=1",
-     "SPEECH OUTPUT: 'Campus link   .   Classroom link   .   Communicate link   .   Reports link  '"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
+     "SPEECH OUTPUT: 'Campus'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '  .  '",
+     "SPEECH OUTPUT: 'Classroom'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '  .  '",
+     "SPEECH OUTPUT: 'Communicate'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '  .  '",
+     "SPEECH OUTPUT: 'Reports'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' '"]))
 
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "41. line Up",
+    ["BRAILLE LINE:  'nested-tables image'",
+     "     VISIBLE:  'nested-tables image', cursor=1",
+     "SPEECH OUTPUT: 'nested-tables'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_simple_form.params 
b/test/keystrokes/firefox/line_nav_simple_form.params
new file mode 100644
index 0000000..c5f2f6b
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_simple_form.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/simpleform.html
diff --git a/test/keystrokes/firefox/line_nav_simple_form.py b/test/keystrokes/firefox/line_nav_simple_form.py
index 133a694..07b5d44 100644
--- a/test/keystrokes/firefox/line_nav_simple_form.py
+++ b/test/keystrokes/firefox/line_nav_simple_form.py
@@ -1,54 +1,23 @@
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox on a page with a simple
-form.  
-"""
+"""Test of line navigation on a page with a simple form."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "simpleform.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus(utils.htmlURLPrefix + "simpleform.html",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file",
-    ["BRAILLE LINE:  'Type something here:  $l'",
-     "     VISIBLE:  'Type something here:  $l', cursor=1",
-     "SPEECH OUTPUT: 'Type something here: text'"]))
 
-########################################################################
-# Down Arrow to the End.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "1. line Down",
     ["BRAILLE LINE:  'Magic disappearing text trick: tab to me and I disappear $l'",
      "     VISIBLE:  'Magic disappearing text trick: t', cursor=1",
-     "SPEECH OUTPUT: 'Magic disappearing text trick: text tab to me and I disappear'"]))
+     "SPEECH OUTPUT: 'Magic disappearing text trick: '",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'tab to me and I disappear'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -56,250 +25,304 @@ sequence.append(utils.AssertPresentationAction(
     "2. line Down",
     ["BRAILLE LINE:  'Tell me a secret:  $l'",
      "     VISIBLE:  'Tell me a secret:  $l', cursor=1",
-     "SPEECH OUTPUT: 'Tell me a secret: password'"]))
+     "SPEECH OUTPUT: 'Tell me a secret: '",
+     "SPEECH OUTPUT: 'password text'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "3. line Down",
-    ["BRAILLE LINE:  'Tell me a little more about yourself:'",
+    ["BRAILLE LINE:  'Tell me a little more about yourself:      $l'",
      "     VISIBLE:  'Tell me a little more about your', cursor=1",
      "SPEECH OUTPUT: 'Tell me a little more about yourself:",
-     "'"]))
+     "'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: '     '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "4. line Down",
-    ["BRAILLE LINE:  'I am a monkey with a long tail.  I like  $l'",
+    ["KNOWN ISSUE: Something is causing us to keep presenting the field",
+     "BRAILLE LINE:  'Tell me a little more about yourself: I am a monkey with a long tail.  I like  $l'",
+     "     VISIBLE:  'I am a monkey with a long tail. ', cursor=1",
+     "BRAILLE LINE:  'Tell me a little more about yourself: I am a monkey with a long tail.  I like  $l'",
      "     VISIBLE:  'I am a monkey with a long tail. ', cursor=1",
-     "SPEECH OUTPUT: 'Tell me a little more about yourself: text I am a monkey with a long tail.  I like'"]))
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:",
+     "'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'I am a monkey with a long tail.  I like '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "5. line Down",
-    ["BRAILLE LINE:  'to swing from trees and eat bananas.   $l'",
+    ["BRAILLE LINE:  'Tell me a little more about yourself: to swing from trees and eat bananas.   $l'",
      "     VISIBLE:  'to swing from trees and eat bana', cursor=1",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:",
+     "'",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:'",
+     "SPEECH OUTPUT: 'entry'",
      "SPEECH OUTPUT: 'to swing from trees and eat bananas.  '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "6. line Down",
-    ["BRAILLE LINE:  'I've recently taken up typing and plan to  $l'",
+    ["BRAILLE LINE:  'Tell me a little more about yourself: I've recently taken up typing and plan  $l'",
      "     VISIBLE:  'I've recently taken up typing an', cursor=1",
-     "SPEECH OUTPUT: 'I've recently taken up typing and plan to '"]))
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:",
+     "'",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'I've recently taken up typing and plan '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "7. line Down",
-    ["BRAILLE LINE:  'write my memoirs. $l'",
-     "     VISIBLE:  'write my memoirs. $l', cursor=1",
-     "SPEECH OUTPUT: 'write my memoirs.'"]))
+    ["BRAILLE LINE:  'Tell me a little more about yourself: to write my memoirs. $l'",
+     "     VISIBLE:  'to write my memoirs. $l', cursor=1",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:",
+     "'",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'to write my memoirs.'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "8. line Down",
-    ["BRAILLE LINE:  '      $l'",
+    ["BRAILLE LINE:  'Tell me a little more about yourself:      $l'",
      "     VISIBLE:  '      $l', cursor=1",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:",
+     "'",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:'",
+     "SPEECH OUTPUT: 'entry'",
      "SPEECH OUTPUT: '     '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "9. line Down",
-    ["BRAILLE LINE:  '      $l'",
-     "     VISIBLE:  '      $l', cursor=6",
-     "SPEECH OUTPUT: '     '"]))
+    ["KNOWN ISSUE: We're double brailling the checkbox labels",
+     "BRAILLE LINE:  'Check one or more: < > Red Red check box Red < > Blue Blue check box Blue < > Green 
Green check box Green'",
+     "     VISIBLE:  'Check one or more: < > Red Red c', cursor=1",
+     "SPEECH OUTPUT: 'Check one or more: '",
+     "SPEECH OUTPUT: 'Red'",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: 'Blue'",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: 'Green'",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "10. line Down",
-    ["BRAILLE LINE:  'Check one or more: < > CheckBox Red < > CheckBox Blue < > CheckBox Green'",
-     "     VISIBLE:  'Check one or more: < > CheckBox ', cursor=1",
-     "SPEECH OUTPUT: 'Check one or more: Red check box not checked Blue check box not checked Green check 
box not checked'"]))
+    ["BRAILLE LINE:  'Make a selection:  combo box'",
+     "     VISIBLE:  'Make a selection:  combo box', cursor=1",
+     "SPEECH OUTPUT: 'Make a selection: '",
+     "SPEECH OUTPUT: 'Water'",
+     "SPEECH OUTPUT: 'combo box'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "11. line Down",
-    ["BRAILLE LINE:  'Make a selection: Water Combo'",
-     "     VISIBLE:  'Make a selection: Water Combo', cursor=1",
-     "SPEECH OUTPUT: 'Make a selection: Water combo box'"]))
+    ["KNOWN ISSUE: It seems that we're repeating this widget.",
+     "BRAILLE LINE:  'Which sports do you like?Hockey list box'",
+     "     VISIBLE:  'Which sports do you like?Hockey ', cursor=1",
+     "SPEECH OUTPUT: 'Which sports do you like?",
+     "'",
+     "SPEECH OUTPUT: 'Which sports do you like?'",
+     "SPEECH OUTPUT: 'Hockey'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 4 items'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "12. line Down",
-    ["BRAILLE LINE:  'Which sports do you like?'",
-     "     VISIBLE:  'Which sports do you like?', cursor=1",
-     "SPEECH OUTPUT: 'Which sports do you like?",
-     "'"]))
+    ["BRAILLE LINE:  'Hockey list box'",
+     "     VISIBLE:  'Hockey list box', cursor=1",
+     "BRAILLE LINE:  'Hockey list box'",
+     "     VISIBLE:  'Hockey list box', cursor=1",
+     "SPEECH OUTPUT: 'Which sports do you like?'",
+     "SPEECH OUTPUT: 'Hockey'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 4 items'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "13. line Down",
-    ["BRAILLE LINE:  'Hockey List'",
-     "     VISIBLE:  'Hockey List', cursor=1",
-     "SPEECH OUTPUT: 'Hockey multi-select List with 4 items'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Down"))
-sequence.append(utils.AssertPresentationAction(
-    "14. line Down",
-    ["BRAILLE LINE:  'Dashing picture of Willie Walker Image'",
+    ["BRAILLE LINE:  'Dashing picture of Willie Walker image'",
      "     VISIBLE:  'Dashing picture of Willie Walker', cursor=1",
-     "SPEECH OUTPUT: 'Dashing picture of Willie Walker image ",
+     "SPEECH OUTPUT: 'Dashing picture of Willie Walker'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "15. line Down",
-    ["BRAILLE LINE:  'Ain't he handsome (please say yes)? & y RadioButton Yes & y RadioButton No'",
+    "14. line Down",
+    ["BRAILLE LINE:  'Ain't he handsome (please say yes)? & y radio button Yes & y radio button No'",
      "     VISIBLE:  'Ain't he handsome (please say ye', cursor=1",
-     "SPEECH OUTPUT: 'Ain't he handsome (please say yes)? not selected radio button Yes not selected radio 
button No'"]))
+     "SPEECH OUTPUT: 'Ain't he handsome (please say yes)? '",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'",
+     "SPEECH OUTPUT: 'Yes '",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'",
+     "SPEECH OUTPUT: 'No '"]))
 
-########################################################################
-# Up Arrow to the Top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. line Up",
-    ["BRAILLE LINE:  'Dashing picture of Willie Walker Image'",
+    "15. line Up",
+    ["BRAILLE LINE:  'Dashing picture of Willie Walker image'",
      "     VISIBLE:  'Dashing picture of Willie Walker', cursor=1",
-     "SPEECH OUTPUT: 'Dashing picture of Willie Walker image ",
+     "SPEECH OUTPUT: 'Dashing picture of Willie Walker'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. line Up",
-    ["BRAILLE LINE:  'Hockey List'",
-     "     VISIBLE:  'Hockey List', cursor=1",
-     "SPEECH OUTPUT: 'Hockey multi-select List with 4 items'"]))
+    "16. line Up",
+    ["BRAILLE LINE:  'Hockey list box'",
+     "     VISIBLE:  'Hockey list box', cursor=1",
+     "BRAILLE LINE:  'Hockey list box'",
+     "     VISIBLE:  'Hockey list box', cursor=1",
+     "SPEECH OUTPUT: 'Which sports do you like?'",
+     "SPEECH OUTPUT: 'Hockey'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 4 items'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "3. line Up",
-    ["BRAILLE LINE:  'Which sports do you like?'",
-     "     VISIBLE:  'Which sports do you like?', cursor=1",
+    "17. line Up",
+    ["BRAILLE LINE:  'Which sports do you like?Hockey list box'",
+     "     VISIBLE:  'Which sports do you like?Hockey ', cursor=1",
      "SPEECH OUTPUT: 'Which sports do you like?",
-     "'"]))
+     "'",
+     "SPEECH OUTPUT: 'Which sports do you like?'",
+     "SPEECH OUTPUT: 'Hockey'",
+     "SPEECH OUTPUT: 'multi-select'",
+     "SPEECH OUTPUT: 'List with 4 items'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "4. line Up",
-    ["BRAILLE LINE:  'Make a selection: Water Combo'",
-     "     VISIBLE:  'Make a selection: Water Combo', cursor=1",
-     "SPEECH OUTPUT: 'Make a selection: Water combo box'"]))
+    "18. line Up",
+    ["BRAILLE LINE:  'Make a selection:  combo box'",
+     "     VISIBLE:  'Make a selection:  combo box', cursor=1",
+     "SPEECH OUTPUT: 'Make a selection: '",
+     "SPEECH OUTPUT: 'Water'",
+     "SPEECH OUTPUT: 'combo box'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "5. line Up",
-    ["BRAILLE LINE:  'Check one or more: < > CheckBox Red < > CheckBox Blue < > CheckBox Green'",
-     "     VISIBLE:  'Check one or more: < > CheckBox ', cursor=1",
-     "SPEECH OUTPUT: 'Check one or more: Red check box not checked Blue check box not checked Green check 
box not checked'"]))
+    "19. line Up",
+    ["KNOWN ISSUE: We're double brailling the checkbox labels",
+     "BRAILLE LINE:  'Check one or more: < > Red Red check box Red < > Blue Blue check box Blue < > Green 
Green check box Green'",
+     "     VISIBLE:  'Check one or more: < > Red Red c', cursor=1",
+     "SPEECH OUTPUT: 'Check one or more: '",
+     "SPEECH OUTPUT: 'Red'",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: 'Blue'",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'",
+     "SPEECH OUTPUT: 'Green'",
+     "SPEECH OUTPUT: 'check box'",
+     "SPEECH OUTPUT: 'not checked'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "6. line Up",
-    ["BRAILLE LINE:  '      $l'",
+    "20. line Up",
+    ["KNOWN ISSUE: Why aren't we speaking this? Ditto for the next few items.",
+     "BRAILLE LINE:  '      $l'",
      "     VISIBLE:  '      $l', cursor=1",
-     "SPEECH OUTPUT: 'Tell me a little more about yourself: text'"]))
+     "BRAILLE LINE:  '      $l'",
+     "     VISIBLE:  '      $l', cursor=1"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "7. line Up",
-    ["BRAILLE LINE:  'write my memoirs. $l'",
-     "     VISIBLE:  'write my memoirs. $l', cursor=1",
-     "SPEECH OUTPUT: 'write my memoirs.'"]))
+    "21. line Up",
+    ["BRAILLE LINE:  'to write my memoirs. $l'",
+     "     VISIBLE:  'to write my memoirs. $l', cursor=1"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "8. line Up",
-    ["BRAILLE LINE:  'I've recently taken up typing and plan to  $l'",
-     "     VISIBLE:  'I've recently taken up typing an', cursor=1",
-     "SPEECH OUTPUT: 'I've recently taken up typing and plan to '"]))
+    "22. line Up",
+    ["BRAILLE LINE:  'I've recently taken up typing and plan  $l'",
+     "     VISIBLE:  'I've recently taken up typing an', cursor=1"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "9. line Up",
+    "23. line Up",
     ["BRAILLE LINE:  'to swing from trees and eat bananas.   $l'",
-     "     VISIBLE:  'to swing from trees and eat bana', cursor=1",
-     "SPEECH OUTPUT: 'to swing from trees and eat bananas.  '"]))
+     "     VISIBLE:  'to swing from trees and eat bana', cursor=1"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "10. line Up",
+    "24. line Up",
     ["BRAILLE LINE:  'I am a monkey with a long tail.  I like  $l'",
-     "     VISIBLE:  'I am a monkey with a long tail. ', cursor=1",
-     "SPEECH OUTPUT: 'I am a monkey with a long tail.  I like '"]))
+     "     VISIBLE:  'I am a monkey with a long tail. ', cursor=1"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "11. line Up",
-    ["BRAILLE LINE:  'Tell me a little more about yourself:'",
+    "25. line Up",
+    ["BRAILLE LINE:  'Tell me a little more about yourself:      $l'",
      "     VISIBLE:  'Tell me a little more about your', cursor=1",
      "SPEECH OUTPUT: 'Tell me a little more about yourself:",
-     "'"]))
+     "'",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: '     '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "12. line Up",
+    "26. line Up",
     ["BRAILLE LINE:  'Tell me a secret:  $l'",
      "     VISIBLE:  'Tell me a secret:  $l', cursor=1",
-     "SPEECH OUTPUT: 'Tell me a secret: password'"]))
+     "SPEECH OUTPUT: 'Tell me a secret: '",
+     "SPEECH OUTPUT: 'password text'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "13. line Up",
+    "27. line Up",
     ["BRAILLE LINE:  'Magic disappearing text trick: tab to me and I disappear $l'",
      "     VISIBLE:  'Magic disappearing text trick: t', cursor=1",
-     "SPEECH OUTPUT: 'Magic disappearing text trick: text tab to me and I disappear'"]))
+     "SPEECH OUTPUT: 'Magic disappearing text trick: '",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'tab to me and I disappear'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "14. line Up",
+    "28. line Up",
     ["BRAILLE LINE:  'Type something here:  $l'",
      "     VISIBLE:  'Type something here:  $l', cursor=1",
-     "SPEECH OUTPUT: 'Type something here: text'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'Type something here: '",
+     "SPEECH OUTPUT: 'entry'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_slash_test.params 
b/test/keystrokes/firefox/line_nav_slash_test.params
new file mode 100644
index 0000000..d0b931f
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_slash_test.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/slash-test.html
diff --git a/test/keystrokes/firefox/line_nav_slash_test.py b/test/keystrokes/firefox/line_nav_slash_test.py
index 8c1f01c..4d8e4b8 100644
--- a/test/keystrokes/firefox/line_nav_slash_test.py
+++ b/test/keystrokes/firefox/line_nav_slash_test.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
 """Test of line navigation output of Firefox."""
@@ -8,46 +7,16 @@ import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "slash-test.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file",
-    ["BRAILLE LINE:  'Stories h4'",
-     "     VISIBLE:  'Stories h4', cursor=1",
-     "SPEECH OUTPUT: 'Stories heading level 4'"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "1. Line Down",
     ["BRAILLE LINE:  'About h4'",
      "     VISIBLE:  'About h4', cursor=1",
-     "SPEECH OUTPUT: 'About heading level 4'"]))
+     "SPEECH OUTPUT: 'About'",
+     "SPEECH OUTPUT: 'heading level 4'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -55,15 +24,23 @@ sequence.append(utils.AssertPresentationAction(
     "2. Line Down",
     ["BRAILLE LINE:  'Services h4'",
      "     VISIBLE:  'Services h4', cursor=1",
-     "SPEECH OUTPUT: 'Services heading level 4'"]))
+     "SPEECH OUTPUT: 'Services'",
+     "SPEECH OUTPUT: 'heading level 4'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "3. Line Down",
-    ["BRAILLE LINE:  'Science h4'",
+    ["KNOWN ISSUE: There is all sorts of crazy updating here which we need to stop",
+     "BRAILLE LINE:  'Science h4'",
+     "     VISIBLE:  'Science h4', cursor=1",
+     "BRAILLE LINE:  'Science h4'",
      "     VISIBLE:  'Science h4', cursor=1",
-     "SPEECH OUTPUT: 'Science link heading level 4'"]))
+     "SPEECH OUTPUT: 'Science'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 4'",
+     "SPEECH OUTPUT: 'Science'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -71,7 +48,13 @@ sequence.append(utils.AssertPresentationAction(
     "4. Line Down",
     ["BRAILLE LINE:  'Recent Tags h4'",
      "     VISIBLE:  'Recent Tags h4', cursor=1",
-     "SPEECH OUTPUT: 'Recent Tags link heading level 4'"]))
+     "BRAILLE LINE:  'Recent Tags h4'",
+     "     VISIBLE:  'Recent Tags h4', cursor=1",
+     "SPEECH OUTPUT: 'Recent Tags'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 4'",
+     "SPEECH OUTPUT: 'Recent Tags'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -79,15 +62,21 @@ sequence.append(utils.AssertPresentationAction(
     "5. Line Down",
     ["BRAILLE LINE:  'Slashdot Login h4'",
      "     VISIBLE:  'Slashdot Login h4', cursor=1",
-     "SPEECH OUTPUT: 'Slashdot Login heading level 4'"]))
+     "SPEECH OUTPUT: 'Slashdot Login'",
+     "SPEECH OUTPUT: 'heading level 4'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "6. Line Down",
-    ["BRAILLE LINE:  'Nickname  $l Password  $l Log in Button'",
+    ["BRAILLE LINE:  'Nickname  $l Password  $l Log in push button'",
      "     VISIBLE:  'Nickname  $l Password  $l Log in', cursor=1",
-     "SPEECH OUTPUT: 'Nickname text Password password Log in button'"]))
+     "SPEECH OUTPUT: 'Nickname'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Password'",
+     "SPEECH OUTPUT: 'password text'",
+     "SPEECH OUTPUT: 'Log in'",
+     "SPEECH OUTPUT: 'push button'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -95,7 +84,8 @@ sequence.append(utils.AssertPresentationAction(
     "7. Line Down",
     ["BRAILLE LINE:  'Some Poll h4'",
      "     VISIBLE:  'Some Poll h4', cursor=1",
-     "SPEECH OUTPUT: 'Some Poll heading level 4'"]))
+     "SPEECH OUTPUT: 'Some Poll'",
+     "SPEECH OUTPUT: 'heading level 4'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
@@ -104,127 +94,146 @@ sequence.append(utils.AssertPresentationAction(
     ["BRAILLE LINE:  'What is your favorite poison?'",
      "     VISIBLE:  'What is your favorite poison?', cursor=1",
      "SPEECH OUTPUT: 'What is your favorite poison?",
-     " panel'"]))
+     "'",
+     "SPEECH OUTPUT: 'panel'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "9. Line Down",
-    ["KNOWN ISSUE - Sometimes we also say 'Recent Tags'. Might be a timing issue.",
-     "BRAILLE LINE:  '& y RadioButton Some polls'",
-     "     VISIBLE:  '& y RadioButton Some polls', cursor=1",
-     "SPEECH OUTPUT: 'Some polls not selected radio button'",
-     "SPEECH OUTPUT: 'Recent Tags'"]))
+    ["KNOWN ISSUE - Sometimes we also say 'Recent Tags'. Might be a timing issue. And the presentation is 
wrong regardless.",
+     "BRAILLE LINE:  '& y radio button Some polls'",
+     "     VISIBLE:  '& y radio button Some polls', cursor=1",
+     "BRAILLE LINE:  '& y radio button Some polls'",
+     "     VISIBLE:  '& y radio button Some polls', cursor=1",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'",
+     "SPEECH OUTPUT: 'Some polls '",
+     "SPEECH OUTPUT: 'panel'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
     "10. Line Down",
-    ["BRAILLE LINE:  'Book Reviews h4'",
+    ["KNOWN ISSUE: There is all sorts of crazy updating here which we need to stop",
+     "BRAILLE LINE:  'Book Reviews h4'",
+     "     VISIBLE:  'Book Reviews h4', cursor=1",
+     "BRAILLE LINE:  'Book Reviews h4'",
      "     VISIBLE:  'Book Reviews h4', cursor=1",
-     "SPEECH OUTPUT: 'Book Reviews link heading level 4'"]))
+     "SPEECH OUTPUT: 'Book Reviews'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 4'",
+     "SPEECH OUTPUT: 'Book Reviews'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Up",
-    ["BRAILLE LINE:  '& y RadioButton Some polls'",
-     "     VISIBLE:  '& y RadioButton Some polls', cursor=1",
-     "SPEECH OUTPUT: 'Some polls not selected radio button'"]))
+    "11. Line Up",
+    ["BRAILLE LINE:  '& y radio button Some polls'",
+     "     VISIBLE:  '& y radio button Some polls', cursor=1",
+     "BRAILLE LINE:  '& y radio button Some polls'",
+     "     VISIBLE:  '& y radio button Some polls', cursor=1",
+     "SPEECH OUTPUT: 'Some polls'",
+     "SPEECH OUTPUT: 'not selected'",
+     "SPEECH OUTPUT: 'radio button'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Up",
+    "12. Line Up",
     ["BRAILLE LINE:  'What is your favorite poison?'",
      "     VISIBLE:  'What is your favorite poison?', cursor=1",
      "SPEECH OUTPUT: 'What is your favorite poison?",
-     " panel'"]))
+     "'",
+     "SPEECH OUTPUT: 'panel'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Up",
+    "13. Line Up",
     ["BRAILLE LINE:  'Some Poll h4'",
      "     VISIBLE:  'Some Poll h4', cursor=1",
-     "SPEECH OUTPUT: 'Some Poll heading level 4'"]))
+     "SPEECH OUTPUT: 'Some Poll'",
+     "SPEECH OUTPUT: 'heading level 4'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Line Up",
-    ["BRAILLE LINE:  'Nickname  $l Password  $l Log in Button'",
+    "14. Line Up",
+    ["BRAILLE LINE:  'Nickname  $l Password  $l Log in push button'",
      "     VISIBLE:  'Nickname  $l Password  $l Log in', cursor=1",
-     "SPEECH OUTPUT: 'Nickname text Password password Log in button'"]))
+     "SPEECH OUTPUT: 'Nickname'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Password'",
+     "SPEECH OUTPUT: 'password text'",
+     "SPEECH OUTPUT: 'Log in'",
+     "SPEECH OUTPUT: 'push button'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Line Up",
+    "15. Line Up",
     ["BRAILLE LINE:  'Slashdot Login h4'",
      "     VISIBLE:  'Slashdot Login h4', cursor=1",
-     "SPEECH OUTPUT: 'Slashdot Login heading level 4'"]))
+     "SPEECH OUTPUT: 'Slashdot Login'",
+     "SPEECH OUTPUT: 'heading level 4'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "6. Line Up",
-    ["BRAILLE LINE:  'Recent Tags h4'",
+    "16. Line Up",
+    ["KNOWN ISSUE: There is all sorts of crazy updating here which we need to stop",
+     "BRAILLE LINE:  'Recent Tags h4'",
      "     VISIBLE:  'Recent Tags h4', cursor=1",
-     "SPEECH OUTPUT: 'Recent Tags link heading level 4'"]))
+     "BRAILLE LINE:  'Recent Tags h4'",
+     "     VISIBLE:  'Recent Tags h4', cursor=1",
+     "SPEECH OUTPUT: 'Recent Tags'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 4'",
+     "SPEECH OUTPUT: 'Recent Tags'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "7. Line Up",
+    "17. Line Up",
     ["BRAILLE LINE:  'Science h4'",
      "     VISIBLE:  'Science h4', cursor=1",
-     "SPEECH OUTPUT: 'Science link heading level 4'"]))
+     "BRAILLE LINE:  'Science h4'",
+     "     VISIBLE:  'Science h4', cursor=1",
+     "SPEECH OUTPUT: 'Science'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'heading level 4'",
+     "SPEECH OUTPUT: 'Science'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "8. Line Up",
+    "18. Line Up",
     ["BRAILLE LINE:  'Services h4'",
      "     VISIBLE:  'Services h4', cursor=1",
-     "SPEECH OUTPUT: 'Services heading level 4'"]))
+     "SPEECH OUTPUT: 'Services'",
+     "SPEECH OUTPUT: 'heading level 4'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "9. Line Up",
+    "19. Line Up",
     ["BRAILLE LINE:  'About h4'",
      "     VISIBLE:  'About h4', cursor=1",
-     "SPEECH OUTPUT: 'About heading level 4'"]))
+     "SPEECH OUTPUT: 'About'",
+     "SPEECH OUTPUT: 'heading level 4'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "10. Line Up",
+    "20. Line Up",
     ["BRAILLE LINE:  'Stories h4'",
      "     VISIBLE:  'Stories h4', cursor=1",
-     "SPEECH OUTPUT: 'Stories heading level 4'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+     "SPEECH OUTPUT: 'Stories'",
+     "SPEECH OUTPUT: 'heading level 4'"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_sun_java.params 
b/test/keystrokes/firefox/line_nav_sun_java.params
new file mode 100644
index 0000000..9bd33b6
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_sun_java.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/java-sun-com.html
diff --git a/test/keystrokes/firefox/line_nav_sun_java.py b/test/keystrokes/firefox/line_nav_sun_java.py
new file mode 100644
index 0000000..091b11c
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_sun_java.py
@@ -0,0 +1,471 @@
+#!/usr/bin/python
+
+"""Test of line navigation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(PauseAction(3000))
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(KeyComboAction("Down"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Line Down",
+    ["BRAILLE LINE:  '\xbb\xa0search tips\xa0  $l Submit Search push button'",
+     "     VISIBLE:  '\xbb\xa0search tips\xa0  $l Submit Search', cursor=1",
+     "SPEECH OUTPUT: '\xbb\xa0'",
+     "SPEECH OUTPUT: 'search tips'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '\xa0 '",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'Submit Search'",
+     "SPEECH OUTPUT: 'push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["BRAILLE LINE:  'Home Page'",
+     "     VISIBLE:  'Home Page', cursor=1",
+     "BRAILLE LINE:  'Home Page'",
+     "     VISIBLE:  'Home Page', cursor=0",
+     "SPEECH OUTPUT: 'Home Page'",
+     "SPEECH OUTPUT: 'Sun Developer Network'",
+     "SPEECH OUTPUT: 'Home Page'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["BRAILLE LINE:  'APIs Downloads Products Support Training Participate'",
+     "     VISIBLE:  'APIs Downloads Products Support ', cursor=1",
+     "SPEECH OUTPUT: 'APIs'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Downloads'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Products'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Support'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Training'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Participate'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Down",
+    ["BRAILLE LINE:  'Installation Notes document frame'",
+     "     VISIBLE:  'Installation Notes document fram', cursor=1",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Down",
+    ["BRAILLE LINE:  'JavaTM SE 6 Release Notes'",
+     "     VISIBLE:  'JavaTM SE 6 Release Notes', cursor=1",
+     "SPEECH OUTPUT: 'JavaTM SE 6 Release Notes'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
+    ["BRAILLE LINE:  'JavaTM SE 6 Release Notes'",
+     "     VISIBLE:  'JavaTM SE 6 Release Notes', cursor=5",
+     "SPEECH OUTPUT: 'JavaTM SE 6 Release Notes'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Down",
+    ["BRAILLE LINE:  'JavaTM SE 6 Release Notes'",
+     "     VISIBLE:  'JavaTM SE 6 Release Notes', cursor=7",
+     "SPEECH OUTPUT: 'JavaTM SE 6 Release Notes'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Down",
+    ["BRAILLE LINE:  'Linux Installation (32-bit) h1'",
+     "     VISIBLE:  'Linux Installation (32-bit) h1', cursor=1",
+     "SPEECH OUTPUT: 'Linux Installation (32-bit)'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Down",
+    ["BRAILLE LINE:  'JDK Documentation'",
+     "     VISIBLE:  'JDK Documentation', cursor=1",
+     "SPEECH OUTPUT: 'JDK Documentation'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Line Down",
+    ["BRAILLE LINE:  'Contents h2'",
+     "     VISIBLE:  'Contents h2', cursor=1",
+     "SPEECH OUTPUT: 'Contents'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Line Down",
+    ["BRAILLE LINE:  'System Requirements'",
+     "     VISIBLE:  'System Requirements', cursor=1",
+     "SPEECH OUTPUT: 'System Requirements'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Line Down",
+    ["BRAILLE LINE:  'JDK Installation Instructions'",
+     "     VISIBLE:  'JDK Installation Instructions', cursor=1",
+     "SPEECH OUTPUT: 'JDK Installation Instructions'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Down",
+    ["BRAILLE LINE:  'System RequirementsJDK Installation Instructions\xa0\xa0\xa0Installation of 
Self-Extracting Binary'",
+     "     VISIBLE:  '\xa0\xa0\xa0Installation of Self-Extracti', cursor=2",
+     "SPEECH OUTPUT: 'System Requirements'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: 'JDK Installation Instructions'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "\xa0\xa0\xa0'",
+     "SPEECH OUTPUT: 'Installation of Self-Extracting Binary'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Line Down",
+    ["BRAILLE LINE:  '\xa0\xa0\xa0Installation of RPM File'",
+     "     VISIBLE:  '\xa0\xa0\xa0Installation of RPM File', cursor=1",
+     "SPEECH OUTPUT: '\xa0\xa0\xa0'",
+     "SPEECH OUTPUT: 'Installation of RPM File'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Line Down",
+    ["BRAILLE LINE:  'Java Plugin Browser Registration Instructions'",
+     "     VISIBLE:  'Java Plugin Browser Registration', cursor=1",
+     "SPEECH OUTPUT: 'Java Plugin Browser Registration Instructions'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Line Down",
+    ["BRAILLE LINE:  'Java Web Start Installation Notes'",
+     "     VISIBLE:  'Java Web Start Installation Note', cursor=1",
+     "SPEECH OUTPUT: 'Java Web Start Installation Notes'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Down",
+    ["BRAILLE LINE:  'Troubleshooting'",
+     "     VISIBLE:  'Troubleshooting', cursor=1",
+     "SPEECH OUTPUT: 'Troubleshooting'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Line Down",
+    ["BRAILLE LINE:  'System Requirements h2'",
+     "     VISIBLE:  'System Requirements h2', cursor=1",
+     "SPEECH OUTPUT: 'System Requirements'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Line Down",
+    ["BRAILLE LINE:  'See supported System Configurations for information about supported platforms, 
operating systems, desktop managers, and browsers.'",
+     "     VISIBLE:  'See supported System Configurati', cursor=1",
+     "SPEECH OUTPUT: 'See supported '",
+     "SPEECH OUTPUT: 'System Configurations'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for information about supported platforms, operating systems, desktop managers, and 
browsers. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Line Down",
+    ["BRAILLE LINE:  'For issues, see the Troubleshooting section below.'",
+     "     VISIBLE:  'For issues, see the Troubleshoot', cursor=1",
+     "SPEECH OUTPUT: 'For issues, see the '",
+     "SPEECH OUTPUT: 'Troubleshooting'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' section below. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Line Down",
+    ["BRAILLE LINE:  'Installation Instructions h2'",
+     "     VISIBLE:  'Installation Instructions h2', cursor=1",
+     "SPEECH OUTPUT: 'Installation Instructions'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
+
+# There's some crazy bug here that makes us treat the lines that follow as a single line
+# I think it's a Gecko bug. But for now, we'll skip past it as this seems an edge case.
+sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Down"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Line Down",
+    ["BRAILLE LINE:  '\u2022Java Web Start Installation Notes'",
+     "     VISIBLE:  'Java Web Start Installation Note', cursor=1",
+     "SPEECH OUTPUT: '\u2022'",
+     "SPEECH OUTPUT: 'Java Web Start Installation Notes'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "25. Line Down",
+    ["BRAILLE LINE:  'Install formats - This version of the JDK is available in two installation formats. 
\u2022Self-extracting Binary File - This file can be used to install the JDK in a location chosen by the 
user. This one can be installed by anyone (not only root users), and it can'",
+     "     VISIBLE:  'Install formats - This version o', cursor=1",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Install formats - This version of the JDK is available in two installation formats. '",
+     "SPEECH OUTPUT: '\u2022Self-extracting Binary File - This file can be used to install the JDK in a 
location chosen by the user. This one can be installed by anyone (not only root users), and it can '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Line Down",
+    ["BRAILLE LINE:  'Install formats - This version of the JDK is available in two installation formats. 
\u2022Self-extracting Binary File - This file can be used to install the JDK in a location chosen by the 
user. This one can be installed by anyone (not only root users), and it can'",
+     "     VISIBLE:  '\u2022Self-extracting Binary File - T', cursor=2",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Install formats - This version of the JDK is available in two installation formats. '",
+     "SPEECH OUTPUT: '\u2022Self-extracting Binary File - This file can be used to install the JDK in a 
location chosen by the user. This one can be installed by anyone (not only root users), and it can '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "27. Line Down",
+    ["BRAILLE LINE:  'easily be installed in any location. As long as you are not root user, it cannot 
displace the system version of the Java platform suppled by Linux. To use this file, see'",
+     "     VISIBLE:  'easily be installed in any locat', cursor=1",
+     "SPEECH OUTPUT: 'easily be installed in any location. As long as you are not root user, it cannot 
displace the system version of the Java platform suppled by Linux. To use this file, see '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "28. Line Down",
+    ["BRAILLE LINE:  'Installation of Self-Extracting Binary below. '",
+     "     VISIBLE:  'Installation of Self-Extracting ', cursor=1",
+     "SPEECH OUTPUT: 'Installation of Self-Extracting Binary'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' below. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Line Down",
+    ["BRAILLE LINE:  '\u2022RPM Packages - A rpm.bin file containing RPM packages, installed with the rpm 
utility. Requires root access to install. RPM packages are the recommended method for'",
+     "     VISIBLE:  '\u2022RPM Packages - A rpm.bin file c', cursor=2",
+     "SPEECH OUTPUT: '\u2022RPM Packages - A rpm.bin file containing RPM packages, installed with the rpm 
utility. Requires root access to install. RPM packages are the recommended method for '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Line Down",
+    ["BRAILLE LINE:  'installation on Linux. To use this bundle, see Installation of RPM File below.'",
+     "     VISIBLE:  'installation on Linux. To use th', cursor=1",
+     "SPEECH OUTPUT: 'installation on Linux. To use this bundle, see '",
+     "SPEECH OUTPUT: 'Installation of RPM File'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' below. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "31. Line Down",
+    ["BRAILLE LINE:  'Choose the install format that is most suitable to your needs. table cell'",
+     "     VISIBLE:  'Choose the install format that i', cursor=1",
+     "SPEECH OUTPUT: 'Choose the install format that is most suitable to your needs. '",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "32. Line Down",
+    ["BRAILLE LINE:  'Note: For any text on this page containing the following notation, you must substitute 
the appropriate JDK update version number for the notation.'",
+     "     VISIBLE:  'Note: For any text on this page ', cursor=1",
+     "SPEECH OUTPUT: 'Note: For any text on this page containing the following notation, you must substitute 
the appropriate JDK update version number for the notation. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "33. Line Down",
+    ["BRAILLE LINE:  '<version>'",
+     "     VISIBLE:  '<version>', cursor=1",
+     "SPEECH OUTPUT: '<version>",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "34. Line Down",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "35. Line Down",
+    ["BRAILLE LINE:  'For example, if you were downloading update 6_01, the following command:'",
+     "     VISIBLE:  'For example, if you were downloa', cursor=1",
+     "SPEECH OUTPUT: 'For example, if you were downloading update 6_01, the following command: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "36. Line Down",
+    ["BRAILLE LINE:  './jdk-6<version>-linux-i586.bin'",
+     "     VISIBLE:  './jdk-6<version>-linux-i586.bin', cursor=1",
+     "SPEECH OUTPUT: './jdk-6<version>-linux-i586.bin",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "37. Line Down",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "38. Line Down",
+    ["BRAILLE LINE:  'would become:'",
+     "     VISIBLE:  'would become:', cursor=1",
+     "SPEECH OUTPUT: 'would become: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "39. Line Down",
+    ["BRAILLE LINE:  './jdk-6u1-linux-i586.bin'",
+     "     VISIBLE:  './jdk-6u1-linux-i586.bin', cursor=1",
+     "SPEECH OUTPUT: './jdk-6u1-linux-i586.bin",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "40. Line Down",
+    ["BRAILLE LINE:  ''",
+     "     VISIBLE:  '', cursor=1"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "41. Line Down",
+    ["BRAILLE LINE:  'Installation of Self-Extracting Binary h3'",
+     "     VISIBLE:  'Installation of Self-Extracting ', cursor=1",
+     "SPEECH OUTPUT: 'Installation of Self-Extracting Binary'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "42. Line Down",
+    ["BRAILLE LINE:  'Use these instructions if you want to use the self-extracting binary file to install 
the JDK. If you want to install RPM packages instead, see Installation of RPM File. '",
+     "     VISIBLE:  'Use these instructions if you wa', cursor=1",
+     "SPEECH OUTPUT: 'Use these instructions if you want to use the self-extracting binary file to install 
the JDK. If you want to install RPM packages instead, see '",
+     "SPEECH OUTPUT: 'Installation of RPM File'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "43. Line Down",
+    ["BRAILLE LINE:  '1. Download and check the download file size to ensure that you have downloaded the 
full, uncorrupted software bundle.'",
+     "     VISIBLE:  '1. Download and check the downlo', cursor=1",
+     "SPEECH OUTPUT: '1. Download and check the download file size to ensure that you have downloaded the 
full, uncorrupted software bundle.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "44. Line Down",
+    ["BRAILLE LINE:  'You can download to any directory you choose; it does not have to be the directory 
where you want to install the JDK.'",
+     "     VISIBLE:  'You can download to any director', cursor=1",
+     "SPEECH OUTPUT: 'You can download to any directory you choose; it does not have to be the directory 
where you want to install the JDK. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "45. Line Down",
+    ["BRAILLE LINE:  'Before you download the file, notice its byte size provided on the download page on 
the web site. Once the download has completed, compare that file size to the'",
+     "     VISIBLE:  'Before you download the file, no', cursor=1",
+     "SPEECH OUTPUT: 'Before you download the file, notice its byte size provided on the download page on 
the web site. Once the download has completed, compare that file size to the '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "46. Line Down",
+    ["BRAILLE LINE:  'size of the downloaded file to make sure they are equal.'",
+     "     VISIBLE:  'size of the downloaded file to m', cursor=1",
+     "SPEECH OUTPUT: 'size of the downloaded file to make sure they are equal. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "47. Line Down",
+    ["BRAILLE LINE:  '2. Make sure that execute permissions are set on the self-extracting binary.'",
+     "     VISIBLE:  '2. Make sure that execute permis', cursor=1",
+     "SPEECH OUTPUT: '2. Make sure that execute permissions are set on the self-extracting binary. '"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_table_captions.params 
b/test/keystrokes/firefox/line_nav_table_captions.params
new file mode 100644
index 0000000..71b25db
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_table_captions.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/table-caption.html
diff --git a/test/keystrokes/firefox/bug_512303.py b/test/keystrokes/firefox/line_nav_table_captions.py
similarity index 77%
rename from test/keystrokes/firefox/bug_512303.py
rename to test/keystrokes/firefox/line_nav_table_captions.py
index a9a29cc..4fb00f0 100644
--- a/test/keystrokes/firefox/bug_512303.py
+++ b/test/keystrokes/firefox/line_nav_table_captions.py
@@ -1,39 +1,24 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of the fix for bug 512303."""
+"""Test of line navigation in a table with a caption."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# Load the local test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(TypeAction(utils.htmlURLPrefix + "table-caption.html"))
-sequence.append(KeyComboAction("Return"))
-sequence.append(WaitForDocLoad())
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'Below is a table, with some sample table data'",
      "     VISIBLE:  'Below is a table, with some samp', cursor=1",
      "SPEECH OUTPUT: 'Below is a table, with some sample table data'"]))
 
-########################################################################
-# Down Arrow to the bottom.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "2. Line Down into the caption",
     ["BRAILLE LINE:  'this is a caption for this table caption'",
      "     VISIBLE:  'this is a caption for this table', cursor=1",
      "SPEECH OUTPUT: 'this is a caption for this table'",
@@ -42,7 +27,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "3. Line Down to headers row",
     ["BRAILLE LINE:  'col1 col2 col3'",
      "     VISIBLE:  'col1 col2 col3', cursor=1",
      "SPEECH OUTPUT: 'col1'",
@@ -55,7 +40,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "4. Line Down to first data row",
     ["BRAILLE LINE:  '1 2 3'",
      "     VISIBLE:  '1 2 3', cursor=1",
      "SPEECH OUTPUT: '1'",
@@ -65,7 +50,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "5. Line Down to second data row",
     ["BRAILLE LINE:  '4 5 6'",
      "     VISIBLE:  '4 5 6', cursor=1",
      "SPEECH OUTPUT: '4'",
@@ -75,7 +60,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "6. Line Down to third data row",
     ["BRAILLE LINE:  '7 8 9'",
      "     VISIBLE:  '7 8 9', cursor=1",
      "SPEECH OUTPUT: '7'",
@@ -85,18 +70,15 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "7. Line Down out of the table",
     ["BRAILLE LINE:  'hope the table looks pretty'",
      "     VISIBLE:  'hope the table looks pretty', cursor=1",
      "SPEECH OUTPUT: 'hope the table looks pretty'"]))
 
-########################################################################
-# Up Arrow to the bottom.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "8. Line Up into table's third data row",
     ["BRAILLE LINE:  '7 8 9'",
      "     VISIBLE:  '7 8 9', cursor=1",
      "SPEECH OUTPUT: '7'",
@@ -106,7 +88,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "9. Line Up to second data row",
     ["BRAILLE LINE:  '4 5 6'",
      "     VISIBLE:  '4 5 6', cursor=1",
      "SPEECH OUTPUT: '4'",
@@ -116,7 +98,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "10. Line Up to first data row",
     ["BRAILLE LINE:  '1 2 3'",
      "     VISIBLE:  '1 2 3', cursor=1",
      "SPEECH OUTPUT: '1'",
@@ -126,7 +108,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "11. Line Up to headers row",
     ["BRAILLE LINE:  'col1 col2 col3'",
      "     VISIBLE:  'col1 col2 col3', cursor=1",
      "SPEECH OUTPUT: 'col1'",
@@ -139,7 +121,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "12. Line Up to the caption",
     ["BRAILLE LINE:  'this is a caption for this table caption'",
      "     VISIBLE:  'this is a caption for this table', cursor=1",
      "SPEECH OUTPUT: 'this is a caption for this table'",
@@ -148,18 +130,10 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "13. Line Up to the first line of text",
     ["BRAILLE LINE:  'Below is a table, with some sample table data'",
      "     VISIBLE:  'Below is a table, with some samp', cursor=1",
      "SPEECH OUTPUT: 'Below is a table, with some sample table data'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
 sequence.append(utils.AssertionSummaryAction())
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_table_cell_links.params 
b/test/keystrokes/firefox/line_nav_table_cell_links.params
new file mode 100644
index 0000000..367ac98
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_table_cell_links.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/table-cell-links.html
diff --git a/test/keystrokes/firefox/line_nav_table_cell_links.py 
b/test/keystrokes/firefox/line_nav_table_cell_links.py
index fe81c32..3a1df16 100644
--- a/test/keystrokes/firefox/line_nav_table_cell_links.py
+++ b/test/keystrokes/firefox/line_nav_table_cell_links.py
@@ -1,52 +1,24 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox on a page with links
-in a table cell with line breaks.
-"""
+"""Test of line navigation with links in a cell with line breaks."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "table-cell-links.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("Table Cells",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'Here are some links'",
      "     VISIBLE:  'Here are some links', cursor=1",
      "SPEECH OUTPUT: 'Here are some links'"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "2. Line Down",
     ["BRAILLE LINE:  'HTML Tags'",
      "     VISIBLE:  'HTML Tags', cursor=1",
      "SPEECH OUTPUT: 'HTML Tags",
@@ -55,7 +27,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "3. Line Down",
     ["BRAILLE LINE:  ''",
      "     VISIBLE:  '', cursor=1",
      "SPEECH OUTPUT: 'blank'"]))
@@ -63,91 +35,104 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
-    ["BRAILLE LINE:  '<!-->",
+    "4. Line Down",
+    ["BRAILLE LINE:  '<!-->'",
      "     VISIBLE:  '<!-->', cursor=1",
-     "SPEECH OUTPUT: '<!--> link ",
+     "SPEECH OUTPUT: '<!-->'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "5. Line Down",
     ["BRAILLE LINE:  '<!DOCTYPE>'",
      "     VISIBLE:  '<!DOCTYPE>', cursor=1",
-     "SPEECH OUTPUT: '<!DOCTYPE> link ",
+     "SPEECH OUTPUT: '<!DOCTYPE>'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "6. Line Down",
     ["BRAILLE LINE:  '<a>'",
      "     VISIBLE:  '<a>', cursor=1",
-     "SPEECH OUTPUT: '<a> link ",
+     "SPEECH OUTPUT: '<a>'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "7. Line Down",
     ["BRAILLE LINE:  '<abbr>'",
      "     VISIBLE:  '<abbr>', cursor=1",
-     "SPEECH OUTPUT: '<abbr> link ",
+     "SPEECH OUTPUT: '<abbr>'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Down",
+    "8. Line Down",
     ["BRAILLE LINE:  '<acronym>'",
      "     VISIBLE:  '<acronym>', cursor=1",
-     "SPEECH OUTPUT: '<acronym> link ",
-     "'"]))
+     "SPEECH OUTPUT: '<acronym>'",
+     "SPEECH OUTPUT: 'link'"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "9. Line Up",
     ["BRAILLE LINE:  '<abbr>'",
      "     VISIBLE:  '<abbr>', cursor=1",
-     "SPEECH OUTPUT: '<abbr> link ",
+     "SPEECH OUTPUT: '<abbr>'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "10. Line Up",
     ["BRAILLE LINE:  '<a>'",
      "     VISIBLE:  '<a>', cursor=1",
-     "SPEECH OUTPUT: '<a> link ",
+     "SPEECH OUTPUT: '<a>'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "11. Line Up",
     ["BRAILLE LINE:  '<!DOCTYPE>'",
      "     VISIBLE:  '<!DOCTYPE>', cursor=1",
-     "SPEECH OUTPUT: '<!DOCTYPE> link ",
+     "SPEECH OUTPUT: '<!DOCTYPE>'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "12. Line Up",
     ["BRAILLE LINE:  '<!-->'",
      "     VISIBLE:  '<!-->', cursor=1",
-     "SPEECH OUTPUT: '<!--> link ",
+     "SPEECH OUTPUT: '<!-->'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
      "'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "13. Line Up",
     ["BRAILLE LINE:  ''",
      "     VISIBLE:  '', cursor=1",
      "SPEECH OUTPUT: 'blank'"]))
@@ -155,7 +140,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "14. Line Up",
     ["BRAILLE LINE:  'HTML Tags'",
      "     VISIBLE:  'HTML Tags', cursor=1",
      "SPEECH OUTPUT: 'HTML Tags",
@@ -164,28 +149,10 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "Line Up",
+    "15. Line Up",
     ["BRAILLE LINE:  'Here are some links'",
      "     VISIBLE:  'Here are some links', cursor=1",
      "SPEECH OUTPUT: 'Here are some links'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_twitter_bug.params 
b/test/keystrokes/firefox/line_nav_twitter_bug.params
new file mode 100644
index 0000000..6efaa52
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_twitter_bug.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/twitter-bug.html
diff --git a/test/keystrokes/firefox/line_nav_twitter_bug.py b/test/keystrokes/firefox/line_nav_twitter_bug.py
index f76abcb..ca15037 100644
--- a/test/keystrokes/firefox/line_nav_twitter_bug.py
+++ b/test/keystrokes/firefox/line_nav_twitter_bug.py
@@ -1,117 +1,71 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox."""
+"""Test of line navigation."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "twitter-bug.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus("Test",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
 sequence.append(utils.AssertPresentationAction(
-    "Top of file",
+    "1. Top of file",
     ["BRAILLE LINE:  'This is a test.'",
      "     VISIBLE:  'This is a test.', cursor=1",
      "SPEECH OUTPUT: 'This is a test.'"]))
 
-########################################################################
-# Down Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Down",
-    ["BRAILLE LINE:  'foo Image h2'",
-     "     VISIBLE:  'foo Image h2', cursor=1",
-     "BRAILLE LINE:  'foo Image h2'",
-     "     VISIBLE:  'foo Image h2', cursor=1",
-     "SPEECH OUTPUT: 'foo link image heading level 2'",
-     "SPEECH OUTPUT: 'foo link image'"]))
+    "2. Line Down",
+    ["BRAILLE LINE:  'foo image h2'",
+     "     VISIBLE:  'foo image h2', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Down",
-    ["BRAILLE LINE:  'Joanmarie h2'",
-     "     VISIBLE:  'Joanmarie h2', cursor=1",
-     "SPEECH OUTPUT: 'Joanmarie heading level 2'"]))
+    "3. Line Down",
+    ["KNOWN ISSUE: We either need to treat this as one line or two, but not both.",
+     "BRAILLE LINE:  'foo image Joanmarie h2'",
+     "     VISIBLE:  'foo image Joanmarie h2', cursor=11",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Joanmarie'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Line Down",
+    "4. Line Down",
     ["BRAILLE LINE:  'Another test'",
      "     VISIBLE:  'Another test', cursor=1",
      "SPEECH OUTPUT: 'Another test'"]))
 
-########################################################################
-# Up Arrow.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Line Up",
-    ["BRAILLE LINE:  'Joanmarie h2'",
-     "     VISIBLE:  'Joanmarie h2', cursor=1",
-     "SPEECH OUTPUT: 'Joanmarie heading level 2'"]))
+    "5. Line Up",
+    ["KNOWN ISSUE: We're skipping the text to the right of the image",
+     "BRAILLE LINE:  'foo image h2'",
+     "     VISIBLE:  'foo image h2', cursor=1",
+     "SPEECH OUTPUT: 'foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'heading level 2'"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Up"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Line Up",
-    ["BRAILLE LINE:  'foo Image h2'",
-     "     VISIBLE:  'foo Image h2', cursor=1",
-     "SPEECH OUTPUT: 'foo link image heading level 2'"]))
-
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("Up"))
-sequence.append(utils.AssertPresentationAction(
-    "3. Line Up",
+    "6. Line Up",
     ["BRAILLE LINE:  'This is a test.'",
      "     VISIBLE:  'This is a test.', cursor=1",
      "SPEECH OUTPUT: 'This is a test.'"]))
 
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_wiki_down.params 
b/test/keystrokes/firefox/line_nav_wiki_down.params
new file mode 100644
index 0000000..0dafc37
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_wiki_down.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/orca-wiki.html
diff --git a/test/keystrokes/firefox/line_nav_wiki_down.py b/test/keystrokes/firefox/line_nav_wiki_down.py
new file mode 100644
index 0000000..ffe8878
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_wiki_down.py
@@ -0,0 +1,1110 @@
+#!/usr/bin/python
+
+"""Test of line navigation."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Home"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Top of file",
+    ["BRAILLE LINE:  'Home News Projects Art Support Development Community'",
+     "     VISIBLE:  'Home News Projects Art Support D', cursor=1",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'News'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Projects'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Art'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Support'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Development'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Community'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Down",
+    ["BRAILLE LINE:  'live.gnome.org h1  $l Titles push button Text push button'",
+     "     VISIBLE:  'live.gnome.org h1  $l Titles pus', cursor=1",
+     "SPEECH OUTPUT: 'live.gnome.org '",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'Titles'",
+     "SPEECH OUTPUT: 'push button'",
+     "SPEECH OUTPUT: 'grayed'",
+     "SPEECH OUTPUT: 'Text'",
+     "SPEECH OUTPUT: 'push button'",
+     "SPEECH OUTPUT: 'grayed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Down",
+    ["BRAILLE LINE:  'Home RecentChanges FindPage HelpContents Orca'",
+     "     VISIBLE:  'Home RecentChanges FindPage Help', cursor=1",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'RecentChanges'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'FindPage'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'HelpContents'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Orca'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Down",
+    ["BRAILLE LINE:  'en Español'",
+     "     VISIBLE:  'en Español', cursor=1",
+     "SPEECH OUTPUT: 'en Español'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Down",
+    ["BRAILLE LINE:  'Home | Download/Installation | Configuration/Use | Accessible Applications | orca-list 
image Mailing List ('",
+     "     VISIBLE:  'Home | Download/Installation | C', cursor=1",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Download/Installation'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Configuration/Use'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Accessible Applications'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Mailing List'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' ('"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Down",
+    ["BRAILLE LINE:  'Archives orca-list image ) | FAQ | DocIndex'",
+     "     VISIBLE:  'Archives orca-list image ) | FAQ', cursor=1",
+     "SPEECH OUTPUT: 'Archives'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ') | '",
+     "SPEECH OUTPUT: 'FAQ'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'DocIndex'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Down",
+    ["BRAILLE LINE:  'Welcome to Orca! h1'",
+     "     VISIBLE:  'Welcome to Orca! h1', cursor=1",
+     "SPEECH OUTPUT: 'Welcome to Orca!'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Down",
+    ["BUG? - Why are we presenting this twice?",
+     "BRAILLE LINE:  'Orca Logo'",
+     "     VISIBLE:  'Orca Logo', cursor=1",
+     "BRAILLE LINE:  'Orca Logo'",
+     "     VISIBLE:  'Orca Logo', cursor=0",
+     "SPEECH OUTPUT: 'Orca Logo'",
+     "SPEECH OUTPUT: 'Orca Logo'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Down",
+    ["BRAILLE LINE:  'HOT HOT HOT: Notes on access to Firefox 3.0'",
+     "     VISIBLE:  'HOT HOT HOT: Notes on access to ', cursor=1",
+     "SPEECH OUTPUT: 'HOT HOT HOT: Notes on '",
+     "SPEECH OUTPUT: 'access to Firefox 3.0'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Down",
+    ["BRAILLE LINE:  'Contents'",
+     "     VISIBLE:  'Contents', cursor=1",
+     "SPEECH OUTPUT: 'Contents'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Down",
+    ["BRAILLE LINE:  '1.Welcome to Orca!'",
+     "     VISIBLE:  '1.Welcome to Orca!', cursor=3",
+     "SPEECH OUTPUT: '1.'",
+     "SPEECH OUTPUT: 'Welcome to Orca!'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Line Down",
+    ["BRAILLE LINE:  '2.About'",
+     "     VISIBLE:  '2.About', cursor=3",
+     "SPEECH OUTPUT: '2.'",
+     "SPEECH OUTPUT: 'About'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Line Down",
+    ["BRAILLE LINE:  '3.Audio Guides'",
+     "     VISIBLE:  '3.Audio Guides', cursor=3",
+     "SPEECH OUTPUT: '3.'",
+     "SPEECH OUTPUT: 'Audio Guides'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Line Down",
+    ["BRAILLE LINE:  '4.Download/Installation'",
+     "     VISIBLE:  '4.Download/Installation', cursor=3",
+     "SPEECH OUTPUT: '4.'",
+     "SPEECH OUTPUT: 'Download/Installation'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Down",
+    ["BRAILLE LINE:  '5.Configuration/Use'",
+     "     VISIBLE:  '5.Configuration/Use', cursor=3",
+     "SPEECH OUTPUT: '5.'",
+     "SPEECH OUTPUT: 'Configuration/Use'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Line Down",
+    ["BRAILLE LINE:  '6.Accessible Applications'",
+     "     VISIBLE:  '6.Accessible Applications', cursor=3",
+     "SPEECH OUTPUT: '6.'",
+     "SPEECH OUTPUT: 'Accessible Applications'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Line Down",
+    ["BRAILLE LINE:  '7.How Can I Help?'",
+     "     VISIBLE:  '7.How Can I Help?', cursor=3",
+     "SPEECH OUTPUT: '7.'",
+     "SPEECH OUTPUT: 'How Can I Help?'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Line Down",
+    ["BRAILLE LINE:  '8.More Information'",
+     "     VISIBLE:  '8.More Information', cursor=3",
+     "SPEECH OUTPUT: '8.'",
+     "SPEECH OUTPUT: 'More Information'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Down",
+    ["BRAILLE LINE:  'About h1'",
+     "     VISIBLE:  'About h1', cursor=1",
+     "SPEECH OUTPUT: 'About'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Line Down",
+    ["BRAILLE LINE:  'Orca is a free, open source, flexible, extensible, and'",
+     "     VISIBLE:  'Orca is a free, open source, fle', cursor=1",
+     "SPEECH OUTPUT: 'Orca is a free, open source, flexible, extensible, and '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Line Down",
+    ["BRAILLE LINE:  'powerful assistive technology for people with visual'",
+     "     VISIBLE:  'powerful assistive technology fo', cursor=1",
+     "SPEECH OUTPUT: 'powerful assistive technology for people with visual '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Line Down",
+    ["BRAILLE LINE:  'impairments. Using various combinations of speech'",
+     "     VISIBLE:  'impairments. Using various combi', cursor=1",
+     "SPEECH OUTPUT: 'impairments. Using various combinations of speech '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Line Down",
+    ["BRAILLE LINE:  'synthesis, braille, and magnification, Orca helps provide'",
+     "     VISIBLE:  'synthesis, braille, and magnific', cursor=1",
+     "SPEECH OUTPUT: 'synthesis, braille, and magnification, Orca helps provide '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Line Down",
+    ["BRAILLE LINE:  'access to applications and toolkits that support the AT-SPI'",
+     "     VISIBLE:  'access to applications and toolk', cursor=1",
+     "SPEECH OUTPUT: 'access to applications and toolkits that support the AT-SPI '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "25. Line Down",
+    ["BRAILLE LINE:  '(e.g., the GNOME desktop). The development of Orca has'",
+     "     VISIBLE:  '(e.g., the GNOME desktop). The d', cursor=1",
+     "SPEECH OUTPUT: '(e.g., the GNOME desktop). The development of Orca has '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Line Down",
+    ["KNOWN ISSUE: Part of the line is missing.",
+     "BRAILLE LINE:  'been led by the'",
+     "     VISIBLE:  'been led by the', cursor=1",
+     "SPEECH OUTPUT: 'been led by the '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "27. Line Down",
+    ["BRAILLE LINE:  'Microsystems, Inc. access image Microsystems, Inc. with'",
+     "     VISIBLE:  'Microsystems, Inc. access image ', cursor=1",
+     "SPEECH OUTPUT: 'Microsystems, Inc.'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'access'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Accessibility Program Office of Sun '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' with '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "28. Line Down",
+    ["KNOWN ISSUE: Why the double braille?",
+     "BRAILLE LINE:  'community members community members.'",
+     "     VISIBLE:  'community members community memb', cursor=1",
+     "SPEECH OUTPUT: 'community members'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'contributions from many '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Line Down",
+    ["BRAILLE LINE:  'The complete list of work to do, including bugs and feature requests, along with 
known'",
+     "     VISIBLE:  'The complete list of work to do,', cursor=1",
+     "SPEECH OUTPUT: 'The complete list of work to do, including bugs and feature requests, along with known 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Line Down",
+    ["KNOWN ISSUE: Part of the line is missing.",
+     "BRAILLE LINE:  'problems in other components, is maintained in buglist image Bugzilla (please see 
our'",
+     "     VISIBLE:  'problems in other components, is', cursor=1",
+     "SPEECH OUTPUT: 'problems in other components, is maintained in '",
+     "SPEECH OUTPUT: 'buglist'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Bugzilla'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' (please see our '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "31. Line Down",
+    ["KNOWN ISSUE: Why the double braille?",
+     "BRAILLE LINE:  'use Bugzilla use Bugzilla).'",
+     "     VISIBLE:  'use Bugzilla use Bugzilla).', cursor=1",
+     "SPEECH OUTPUT: 'use Bugzilla'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'notes on how we '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '). '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "32. Line Down",
+    ["BRAILLE LINE:  'Please join and participate on the orca-list image Orca mailing list ( orca-list image 
archives): it's a helpful, kind, and'",
+     "     VISIBLE:  'Please join and participate on t', cursor=1",
+     "SPEECH OUTPUT: 'Please join and participate on the '",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Orca mailing list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' ('",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'archives'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: '): it's a helpful, kind, and '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "33. Line Down",
+    ["BRAILLE LINE:  'productive environment composed of users and developers.'",
+     "     VISIBLE:  'productive environment composed ', cursor=1",
+     "SPEECH OUTPUT: 'productive environment composed of users and developers. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "34. Line Down",
+    ["BRAILLE LINE:  'Audio Guides h1'",
+     "     VISIBLE:  'Audio Guides h1', cursor=1",
+     "SPEECH OUTPUT: 'Audio Guides'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "35. Line Down",
+    ["BRAILLE LINE:  'Darragh Ó Héiligh has created several audio guides for Orca. This is a fantastic'",
+     "     VISIBLE:  'Darragh Ó Héiligh has created se', cursor=1",
+     "SPEECH OUTPUT: 'Darragh Ó Héiligh'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' has created several audio guides for Orca. This is a fantastic '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "36. Line Down",
+    ["BRAILLE LINE:  'contribution (THANKS!)!!! The audio guides can be found at'",
+     "     VISIBLE:  'contribution (THANKS!)!!! The au', cursor=1",
+     "SPEECH OUTPUT: 'contribution (THANKS!)!!! The audio guides can be found at '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "37. Line Down",
+    ["BRAILLE LINE:  '/linuxat.asp linuxat image /linuxat.asp and include the following:'",
+     "     VISIBLE:  '/linuxat.asp linuxat image /linu', cursor=1",
+     "SPEECH OUTPUT: '/linuxat.asp'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'linuxat'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'http://www.digitaldarragh.com'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' and include the following: '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "38. Line Down",
+    ["BRAILLE LINE:  '•Walk through of the installation of Ubuntu 7.4. Very helpful tutorial 
ubuntu-7-4-install-walk-through image'",
+     "     VISIBLE:  'ubuntu-7-4-install-walk-through ', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Walk through of the installation of Ubuntu 7.4. Very helpful tutorial'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "39. Line Down",
+    ["BRAILLE LINE:  '•Review of Fedora 7 and the Orca screen reader for the Gnome graphical desktop 
linux-and-orca-review image'",
+     "     VISIBLE:  'linux-and-orca-review image', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Review of Fedora 7 and the Orca screen reader for the Gnome graphical desktop'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "40. Line Down",
+    ["BRAILLE LINE:  '•Guide to installing the latest versions of Firefox and Orca 
installing-firefox-and-orca image'",
+     "     VISIBLE:  'installing-firefox-and-orca imag', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Guide to installing the latest versions of Firefox and Orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "41. Line Down",
+    ["BRAILLE LINE:  'Download/Installation h1'",
+     "     VISIBLE:  'Download/Installation h1', cursor=1",
+     "SPEECH OUTPUT: 'Download/Installation'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "42. Line Down",
+    ["BRAILLE LINE:  'As of GNOME 2.16, Orca is a part of the GNOME platform. As a result, Orca is already'",
+     "     VISIBLE:  'As of GNOME 2.16, Orca is a part', cursor=1",
+     "SPEECH OUTPUT: 'As of GNOME 2.16, Orca is a part of the GNOME platform. As a result, Orca is already 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "43. Line Down",
+    ["BRAILLE LINE:  'provided by default on a number of operating system distributions, including 
www.opensolaris.org image Open Solaris'",
+     "     VISIBLE:  'provided by default on a number ', cursor=1",
+     "SPEECH OUTPUT: 'provided by default on a number of operating system distributions, including '",
+     "SPEECH OUTPUT: 'www.opensolaris.org'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Open Solaris'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "44. Line Down",
+    ["BRAILLE LINE:  'and www.ubuntu.com image Ubuntu.'",
+     "     VISIBLE:  'and www.ubuntu.com image Ubuntu.', cursor=1",
+     "SPEECH OUTPUT: 'and '",
+     "SPEECH OUTPUT: 'www.ubuntu.com'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Ubuntu'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: '. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "45. Line Down",
+    ["BRAILLE LINE:  'Please also refer to the Download/Installation page for detailed information on 
various'",
+     "     VISIBLE:  'Please also refer to the Downloa', cursor=1",
+     "SPEECH OUTPUT: 'Please also refer to the '",
+     "SPEECH OUTPUT: 'Download/Installation page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for detailed information on various '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "46. Line Down",
+    ["BRAILLE LINE:  'distributions as well as installing Orca directly from source.'",
+     "     VISIBLE:  'distributions as well as install', cursor=1",
+     "SPEECH OUTPUT: 'distributions as well as installing Orca directly from source. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "47. Line Down",
+    ["BRAILLE LINE:  'Configuration/Use h1'",
+     "     VISIBLE:  'Configuration/Use h1', cursor=1",
+     "SPEECH OUTPUT: 'Configuration/Use'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "48. Line Down",
+    ["BRAILLE LINE:  'The command to run orca is orca. You can enter this command by pressing Alt+F2 when'",
+     "     VISIBLE:  'The command to run orca is orca.', cursor=1",
+     "SPEECH OUTPUT: 'The command to run orca is orca. You can enter this command by pressing Alt+F2 when 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "49. Line Down",
+    ["BRAILLE LINE:  'logged in, waiting for a second or so, then typing orca and pressing return. Orca is'",
+     "     VISIBLE:  'logged in, waiting for a second ', cursor=1",
+     "SPEECH OUTPUT: 'logged in, waiting for a second or so, then typing orca and pressing return. Orca is 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "50. Line Down",
+    ["BRAILLE LINE:  'designed to present information as you navigate the desktop using the'",
+     "     VISIBLE:  'designed to present information ', cursor=1",
+     "SPEECH OUTPUT: 'designed to present information as you navigate the desktop using the '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "51. Line Down",
+    ["BRAILLE LINE:  'mechanisms of GNOME keynav-1 image mechanisms of GNOME. These navigation mechanisms 
are consistent across most'",
+    "     VISIBLE:  'mechanisms of GNOME keynav-1 ima', cursor=1",
+    "SPEECH OUTPUT: 'mechanisms of GNOME'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: 'image'",
+    "SPEECH OUTPUT: 'keynav-1'",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: 'image'",
+    "SPEECH OUTPUT: 'built-in navigation '",
+    "SPEECH OUTPUT: 'link'",
+    "SPEECH OUTPUT: 'image'",
+    "SPEECH OUTPUT: '. These navigation mechanisms are consistent across most '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "52. Line Down",
+    ["BRAILLE LINE:  'desktop applications.'",
+     "     VISIBLE:  'desktop applications.', cursor=1",
+     "SPEECH OUTPUT: 'desktop applications. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "53. Line Down",
+    ["BRAILLE LINE:  'You may sometimes wish to control Orca itself, such as bringing up the'",
+     "     VISIBLE:  'You may sometimes wish to contro', cursor=1",
+     "SPEECH OUTPUT: 'You may sometimes wish to control Orca itself, such as bringing up the '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "54. Line Down",
+    ["BRAILLE LINE:  'GUI GUI (accessed by pressing Insert+Space when Orca is running) and for using flat 
review'",
+     "     VISIBLE:  'GUI GUI (accessed by pressing In', cursor=1",
+     "SPEECH OUTPUT: 'GUI'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Orca Configuration '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (accessed by pressing Insert+Space when Orca is running) and for using flat review 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "55. Line Down",
+    ["BRAILLE LINE:  'mode to examine a window. Refer to Orca Keyboard Commands (Laptop Layout) for more'",
+     "     VISIBLE:  'mode to examine a window. Refer ', cursor=1",
+     "SPEECH OUTPUT: 'mode to examine a window. Refer to '",
+     "SPEECH OUTPUT: 'Orca Keyboard Commands'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '(Laptop Layout)'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for more '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "56. Line Down",
+    ["BRAILLE LINE:  'information on Orca-specific keyboard commands. The Orca Configuration GUI also'",
+     "     VISIBLE:  'information on Orca-specific key', cursor=1",
+     "SPEECH OUTPUT: 'information on Orca-specific keyboard commands. The '",
+     "SPEECH OUTPUT: 'Orca Configuration GUI'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' also '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "57. Line Down",
+    ["BRAILLE LINE:  'includes a \"Key Bindings\" tab that allows you to get a complete list of Orca key 
bindings.'",
+     "     VISIBLE:  'includes a \"Key Bindings\" tab th', cursor=1",
+     "SPEECH OUTPUT: 'includes a \"Key Bindings\" tab that allows you to get a complete list of Orca key 
bindings. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "58. Line Down",
+    ["BRAILLE LINE:  'Please also refer to the Configuration/Use page for detailed information.'",
+     "     VISIBLE:  'Please also refer to the Configu', cursor=1",
+     "SPEECH OUTPUT: 'Please also refer to the '",
+     "SPEECH OUTPUT: 'Configuration/Use page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for detailed information. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "59. Line Down",
+    ["BRAILLE LINE:  'Accessible Applications h1'",
+     "     VISIBLE:  'Accessible Applications h1', cursor=1",
+     "SPEECH OUTPUT: 'Accessible Applications'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "60. Line Down",
+    ["BRAILLE LINE:  'Orca is designed to work with applications and toolkits that support the assistive'",
+     "     VISIBLE:  'Orca is designed to work with ap', cursor=1",
+     "SPEECH OUTPUT: 'Orca is designed to work with applications and toolkits that support the assistive 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "61. Line Down",
+    ["BRAILLE LINE:  'technology service provider interface (AT-SPI). This includes the GNOME desktop and 
its'",
+     "     VISIBLE:  'technology service provider inte', cursor=1",
+     "SPEECH OUTPUT: 'technology service provider interface (AT-SPI). This includes the GNOME desktop and 
its '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "62. Line Down",
+    ["BRAILLE LINE:  'applications, OpenOffice, Firefox, and the Java platform. Some applications work 
better'",
+     "     VISIBLE:  'applications, OpenOffice, Firefo', cursor=1",
+     "SPEECH OUTPUT: 'applications, '",
+     "SPEECH OUTPUT: 'OpenOffice'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', Firefox, and the Java platform. Some applications work better '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "63. Line Down",
+    ["BRAILLE LINE:  'than others, however, and the Orca community continually works to provide compelling'",
+     "     VISIBLE:  'than others, however, and the Or', cursor=1",
+     "SPEECH OUTPUT: 'than others, however, and the Orca community continually works to provide compelling 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "64. Line Down",
+    ["BRAILLE LINE:  'access to more and more applications.'",
+     "     VISIBLE:  'access to more and more applicat', cursor=1",
+     "SPEECH OUTPUT: 'access to more and more applications. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "65. Line Down",
+    ["BRAILLE LINE:  'On the Accessible Applications page, you will find a growing list of information 
regarding'",
+     "     VISIBLE:  'On the Accessible Applications p', cursor=1",
+     "SPEECH OUTPUT: 'On the '",
+     "SPEECH OUTPUT: 'Accessible Applications page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', you will find a growing list of information regarding '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "66. Line Down",
+    ["BRAILLE LINE:  'various applications that can be accessed with Orca as well as tips and tricks for 
using'",
+     "     VISIBLE:  'various applications that can be', cursor=1",
+     "SPEECH OUTPUT: 'various applications that can be accessed with Orca as well as tips and tricks for 
using '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "67. Line Down",
+    ["BRAILLE LINE:  'them. The list is not to be a conclusive list of all applications. Rather, the goal is 
to provide a'",
+     "     VISIBLE:  'them. The list is not to be a co', cursor=1",
+     "SPEECH OUTPUT: 'them. The list is not to be a conclusive list of all applications. Rather, the goal is 
to provide a '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "68. Line Down",
+    ["BRAILLE LINE:  'repository within which users can share experiences regarding applications they have'",
+     "     VISIBLE:  'repository within which users ca', cursor=1",
+     "SPEECH OUTPUT: 'repository within which users can share experiences regarding applications they have 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "69. Line Down",
+    ["BRAILLE LINE:  'tested.'",
+     "     VISIBLE:  'tested.', cursor=1",
+     "SPEECH OUTPUT: 'tested. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "70. Line Down",
+    ["BRAILLE LINE:  'See also the Application Specific Settings page for how to configure settings specific 
to an'",
+     "     VISIBLE:  'See also the Application Specifi', cursor=1",
+     "SPEECH OUTPUT: 'See also the '",
+     "SPEECH OUTPUT: 'Application Specific Settings'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' page for how to configure settings specific to an '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "71. Line Down",
+    ["BRAILLE LINE:  'application.'",
+     "     VISIBLE:  'application.', cursor=1",
+     "SPEECH OUTPUT: 'application. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "72. Line Down",
+    ["BRAILLE LINE:  'Please also refer to the Accessible Applications page for detailed information.'",
+     "     VISIBLE:  'Please also refer to the Accessi', cursor=1",
+     "SPEECH OUTPUT: 'Please also refer to the '",
+     "SPEECH OUTPUT: 'Accessible Applications page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for detailed information. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "73. Line Down",
+    ["BRAILLE LINE:  'How Can I Help? h1'",
+     "     VISIBLE:  'How Can I Help? h1', cursor=1",
+     "SPEECH OUTPUT: 'How Can I Help?'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "74. Line Down",
+    ["BRAILLE LINE:  'There's a bunch you can do! Please refer to the How Can I Help page for detailed'",
+     "     VISIBLE:  'There's a bunch you can do! Plea', cursor=1",
+     "SPEECH OUTPUT: 'There's a bunch you can do! Please refer to the '",
+     "SPEECH OUTPUT: 'How Can I Help page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for detailed '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "75. Line Down",
+    ["BRAILLE LINE:  'information.'",
+     "     VISIBLE:  'information.', cursor=1",
+     "SPEECH OUTPUT: 'information. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "76. Line Down",
+    ["BRAILLE LINE:  'More Information h1'",
+     "     VISIBLE:  'More Information h1', cursor=1",
+     "SPEECH OUTPUT: 'More Information'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "77. Line Down",
+    ["BRAILLE LINE:  '• Frequently Asked Questions: FAQ'",
+     "     VISIBLE:  'Frequently Asked Questions: FAQ', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Frequently Asked Questions: '",
+     "SPEECH OUTPUT: 'FAQ'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "78. Line Down",
+    ["BRAILLE LINE:  '• Mailing list: orca-list image orca-list gnome org ( orca-list image Archives)'",
+     "     VISIBLE:  'Mailing list: orca-list image or', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Mailing list: '",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'orca-list gnome org'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' ('",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Archives'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ') '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "79. Line Down",
+    ["BRAILLE LINE:  '• Bug database: bugzilla.gnome.org image GNOME Bug Tracking System (Bugzilla) ( 
buglist image current bug list)'",
+     "     VISIBLE:  'Bug database: bugzilla.gnome.org', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Bug database: '",
+     "SPEECH OUTPUT: 'bugzilla.gnome.org'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'GNOME Bug Tracking System (Bugzilla)'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' ('",
+     "SPEECH OUTPUT: 'buglist'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'current bug list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ') '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "80. Line Down",
+    ["BRAILLE LINE:  '• Design documents: orca image Orca Documentation Series'",
+     "     VISIBLE:  'Design documents: orca image Orc', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Design documents: '",
+     "SPEECH OUTPUT: 'orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Orca Documentation Series'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "81. Line Down",
+    ["BRAILLE LINE:  '•Dive Into Python, Mark Pilgrim www.diveintopython.org image'",
+     "     VISIBLE:  'www.diveintopython.org image', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Dive Into Python, Mark Pilgrim'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "82. Line Down",
+    ["BRAILLE LINE:  '•Python in a Nutshell, Alex Martelli 103-6779448-2183842 image'",
+     "     VISIBLE:  '103-6779448-2183842 image', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Python in a Nutshell, Alex Martelli'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "83. Line Down",
+    ["BRAILLE LINE:  '•Python Pocket Reference, Mark Lutz 103-6779448-2183842 image'",
+     "     VISIBLE:  '103-6779448-2183842 image', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Python Pocket Reference, Mark Lutz'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "84. Line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "85. Line Down",
+    ["BRAILLE LINE:  'The information on this page and the other Orca-related pages on this site are 
distributed'",
+     "     VISIBLE:  'The information on this page and', cursor=1",
+     "SPEECH OUTPUT: 'The information on this page and the other Orca-related pages on this site are 
distributed '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "86. Line Down",
+    ["BRAILLE LINE:  'in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the 
implied'",
+     "     VISIBLE:  'in the hope that it will be usef', cursor=1",
+     "SPEECH OUTPUT: 'in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "87. Line Down",
+    ["BRAILLE LINE:  'warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.'",
+     "     VISIBLE:  'warranty of MERCHANTABILITY or F', cursor=1",
+     "SPEECH OUTPUT: 'warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "88. Line Down",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "89. Line Down",
+    ["BRAILLE LINE:  'CategoryAccessibility'",
+     "     VISIBLE:  'CategoryAccessibility', cursor=1",
+     "SPEECH OUTPUT: 'CategoryAccessibility'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "90. Line Down",
+    ["BRAILLE LINE:  'Orca (last edited 2007-12-07 22:09:22 by WillieWalker)'",
+     "     VISIBLE:  'Orca (last edited 2007-12-07 22:', cursor=1",
+     "SPEECH OUTPUT: 'Orca (last edited 2007-12-07 22:09:22 by '",
+     "SPEECH OUTPUT: 'WillieWalker'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ')'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "91. Line Down",
+    ["BRAILLE LINE:  'User h3'",
+     "     VISIBLE:  'User h3', cursor=1",
+     "SPEECH OUTPUT: 'User'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "92. Line Down",
+    ["BRAILLE LINE:  'Login'",
+     "     VISIBLE:  'Login', cursor=1",
+     "SPEECH OUTPUT: 'Login'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "93. Line Down",
+    ["BRAILLE LINE:  'Page h3'",
+     "     VISIBLE:  'Page h3', cursor=1",
+     "SPEECH OUTPUT: 'Page'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "94. Line Down",
+    ["BRAILLE LINE:  'Immutable Page'",
+     "     VISIBLE:  'Immutable Page', cursor=10",
+     "SPEECH OUTPUT: 'Immutable Page'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "95. Line Down",
+    ["BRAILLE LINE:  'Info'",
+     "     VISIBLE:  'Info', cursor=1",
+     "SPEECH OUTPUT: 'Info'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "96. Line Down",
+    ["BRAILLE LINE:  'Attachments'",
+     "     VISIBLE:  'Attachments', cursor=1",
+     "SPEECH OUTPUT: 'Attachments'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "97. Line Down",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'More Actions:'",
+     "SPEECH OUTPUT: 'combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "98. Line Down",
+    ["BRAILLE LINE:  'GNOME World h3'",
+     "     VISIBLE:  'GNOME World h3', cursor=1",
+     "SPEECH OUTPUT: 'GNOME World '",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "99. Line Down",
+    ["BRAILLE LINE:  'Wide h3'",
+     "     VISIBLE:  'Wide h3', cursor=1",
+     "SPEECH OUTPUT: 'Wide'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "100. Line Down",
+    ["BRAILLE LINE:  'GnomeWorldWide image'",
+     "     VISIBLE:  'GnomeWorldWide image', cursor=1",
+     "SPEECH OUTPUT: 'GnomeWorldWide'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "101. Line Down",
+    ["BRAILLE LINE:  'Copyright \xa9 2005, 2006, 2007 The GNOME Project.'",
+     "     VISIBLE:  'Copyright \xa9 2005, 2006, 2007 The', cursor=1",
+     "SPEECH OUTPUT: 'Copyright \xa9 2005, 2006, 2007 '",
+     "SPEECH OUTPUT: 'The GNOME Project'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '.",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "102. Line Down",
+    ["BRAILLE LINE:  'Hosted by Red Hat.'",
+     "     VISIBLE:  'Hosted by Red Hat.', cursor=1",
+     "SPEECH OUTPUT: 'Hosted by '",
+     "SPEECH OUTPUT: 'Red Hat'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '. '"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/line_nav_wiki_up.params b/test/keystrokes/firefox/line_nav_wiki_up.params
new file mode 100644
index 0000000..0dafc37
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_wiki_up.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/orca-wiki.html
diff --git a/test/keystrokes/firefox/line_nav_wiki_up.py b/test/keystrokes/firefox/line_nav_wiki_up.py
new file mode 100644
index 0000000..4e17d56
--- /dev/null
+++ b/test/keystrokes/firefox/line_nav_wiki_up.py
@@ -0,0 +1,1037 @@
+#!/usr/bin/python
+
+"""Test of line navigation output of Firefox on the Orca wiki."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>End"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Bottom of file",
+    ["BRAILLE LINE:  'Hosted by Red Hat.'",
+     "     VISIBLE:  'Hosted by Red Hat.', cursor=1",
+     "SPEECH OUTPUT: 'Hosted by '",
+     "SPEECH OUTPUT: 'Red Hat'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Line Up",
+    ["BRAILLE LINE:  'Copyright \xa9 2005, 2006, 2007 The GNOME Project.'",
+     "     VISIBLE:  'Copyright \xa9 2005, 2006, 2007 The', cursor=1",
+     "SPEECH OUTPUT: 'Copyright \xa9 2005, 2006, 2007 '",
+     "SPEECH OUTPUT: 'The GNOME Project'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '.",
+     "'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Line Up",
+    ["BRAILLE LINE:  'GnomeWorldWide image'",
+     "     VISIBLE:  'GnomeWorldWide image', cursor=1",
+     "SPEECH OUTPUT: 'GnomeWorldWide'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Line Up",
+    ["BRAILLE LINE:  'Wide h3'",
+     "     VISIBLE:  'Wide h3', cursor=1",
+     "SPEECH OUTPUT: 'Wide'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Line Up",
+    ["BRAILLE LINE:  'GNOME World h3'",
+     "     VISIBLE:  'GNOME World h3', cursor=1",
+     "SPEECH OUTPUT: 'GNOME World '",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Line Up",
+    ["BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "BRAILLE LINE:  ' combo box'",
+     "     VISIBLE:  ' combo box', cursor=1",
+     "SPEECH OUTPUT: 'More Actions:'",
+     "SPEECH OUTPUT: 'combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Line Up",
+    ["BRAILLE LINE:  'Attachments'",
+     "     VISIBLE:  'Attachments', cursor=1",
+     "SPEECH OUTPUT: 'Attachments'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Line Up",
+    ["BRAILLE LINE:  'Info'",
+     "     VISIBLE:  'Info', cursor=1",
+     "SPEECH OUTPUT: 'Info'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Line Up",
+    ["BRAILLE LINE:  'Immutable Page'",
+     "     VISIBLE:  'Immutable Page', cursor=10",
+     "SPEECH OUTPUT: 'Immutable Page'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Line Up",
+    ["BRAILLE LINE:  'Page h3'",
+     "     VISIBLE:  'Page h3', cursor=1",
+     "SPEECH OUTPUT: 'Page'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Line Up",
+    ["BRAILLE LINE:  'Login'",
+     "     VISIBLE:  'Login', cursor=1",
+     "SPEECH OUTPUT: 'Login'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Line Up",
+    ["BRAILLE LINE:  'User h3'",
+     "     VISIBLE:  'User h3', cursor=1",
+     "SPEECH OUTPUT: 'User'",
+     "SPEECH OUTPUT: 'heading level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Line Up",
+    ["BRAILLE LINE:  'Orca (last edited 2007-12-07 22:09:22 by WillieWalker)'",
+     "     VISIBLE:  'Orca (last edited 2007-12-07 22:', cursor=1",
+     "SPEECH OUTPUT: 'Orca (last edited 2007-12-07 22:09:22 by '",
+     "SPEECH OUTPUT: 'WillieWalker'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ')'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "14. Line Up",
+    ["BRAILLE LINE:  'CategoryAccessibility'",
+     "     VISIBLE:  'CategoryAccessibility', cursor=1",
+     "SPEECH OUTPUT: 'CategoryAccessibility'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "15. Line Up",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "16. Line Up",
+    ["BRAILLE LINE:  'warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.'",
+     "     VISIBLE:  'warranty of MERCHANTABILITY or F', cursor=1",
+     "SPEECH OUTPUT: 'warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "17. Line Up",
+    ["BRAILLE LINE:  'in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the 
implied'",
+     "     VISIBLE:  'in the hope that it will be usef', cursor=1",
+     "SPEECH OUTPUT: 'in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "18. Line Up",
+    ["BRAILLE LINE:  'The information on this page and the other Orca-related pages on this site are 
distributed'",
+     "     VISIBLE:  'The information on this page and', cursor=1",
+     "SPEECH OUTPUT: 'The information on this page and the other Orca-related pages on this site are 
distributed '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "19. Line Up",
+    ["BRAILLE LINE:  'separator'",
+     "     VISIBLE:  'separator', cursor=1",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "20. Line Up",
+    ["BRAILLE LINE:  '•Python Pocket Reference, Mark Lutz 103-6779448-2183842 image'",
+     "     VISIBLE:  '103-6779448-2183842 image', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Python Pocket Reference, Mark Lutz'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "21. Line Up",
+    ["BRAILLE LINE:  '•Python in a Nutshell, Alex Martelli 103-6779448-2183842 image'",
+     "     VISIBLE:  '103-6779448-2183842 image', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Python in a Nutshell, Alex Martelli'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "22. Line Up",
+    ["BRAILLE LINE:  '•Dive Into Python, Mark Pilgrim www.diveintopython.org image'",
+     "     VISIBLE:  'www.diveintopython.org image', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Dive Into Python, Mark Pilgrim'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "23. Line Up",
+    ["BRAILLE LINE:  '• Design documents: orca image Orca Documentation Series'",
+     "     VISIBLE:  'Design documents: orca image Orc', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Design documents: '",
+     "SPEECH OUTPUT: 'orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Orca Documentation Series'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "24. Line Up",
+    ["BRAILLE LINE:  '• Bug database: bugzilla.gnome.org image GNOME Bug Tracking System (Bugzilla) ( 
buglist image current bug list)'",
+     "     VISIBLE:  'Bug database: bugzilla.gnome.org', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Bug database: '",
+     "SPEECH OUTPUT: 'bugzilla.gnome.org'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'GNOME Bug Tracking System (Bugzilla)'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' ('",
+     "SPEECH OUTPUT: 'buglist'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'current bug list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ') '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "25. Line Up",
+    ["BRAILLE LINE:  '• Mailing list: orca-list image orca-list gnome org ( orca-list image Archives)'",
+     "     VISIBLE:  'Mailing list: orca-list image or', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Mailing list: '",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'orca-list gnome org'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' ('",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Archives'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ') '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "26. Line Up",
+    ["BRAILLE LINE:  '• Frequently Asked Questions: FAQ'",
+     "     VISIBLE:  'Frequently Asked Questions: FAQ', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Frequently Asked Questions: '",
+     "SPEECH OUTPUT: 'FAQ'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "27. Line Up",
+    ["BRAILLE LINE:  'More Information h1'",
+     "     VISIBLE:  'More Information h1', cursor=1",
+     "SPEECH OUTPUT: 'More Information'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "28. Line Up",
+    ["BRAILLE LINE:  'information.'",
+     "     VISIBLE:  'information.', cursor=1",
+     "SPEECH OUTPUT: 'information. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "29. Line Up",
+    ["BRAILLE LINE:  'There's a bunch you can do! Please refer to the How Can I Help page for detailed'",
+     "     VISIBLE:  'There's a bunch you can do! Plea', cursor=1",
+     "SPEECH OUTPUT: 'There's a bunch you can do! Please refer to the '",
+     "SPEECH OUTPUT: 'How Can I Help page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for detailed '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "30. Line Up",
+    ["BRAILLE LINE:  'How Can I Help? h1'",
+     "     VISIBLE:  'How Can I Help? h1', cursor=1",
+     "SPEECH OUTPUT: 'How Can I Help?'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "31. Line Up",
+    ["BRAILLE LINE:  'Please also refer to the Accessible Applications page for detailed information.'",
+     "     VISIBLE:  'Please also refer to the Accessi', cursor=1",
+     "SPEECH OUTPUT: 'Please also refer to the '",
+     "SPEECH OUTPUT: 'Accessible Applications page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for detailed information. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "32. Line Up",
+    ["BRAILLE LINE:  'application.'",
+     "     VISIBLE:  'application.', cursor=1",
+     "SPEECH OUTPUT: 'application. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "33. Line Up",
+    ["BRAILLE LINE:  'See also the Application Specific Settings page for how to configure settings specific 
to an'",
+     "     VISIBLE:  'See also the Application Specifi', cursor=1",
+     "SPEECH OUTPUT: 'See also the '",
+     "SPEECH OUTPUT: 'Application Specific Settings'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' page for how to configure settings specific to an '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "34. Line Up",
+    ["BRAILLE LINE:  'tested.'",
+     "     VISIBLE:  'tested.', cursor=1",
+     "SPEECH OUTPUT: 'tested. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "35. Line Up",
+    ["BRAILLE LINE:  'repository within which users can share experiences regarding applications they have'",
+     "     VISIBLE:  'repository within which users ca', cursor=1",
+     "SPEECH OUTPUT: 'repository within which users can share experiences regarding applications they have 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "36. Line Up",
+    ["BRAILLE LINE:  'them. The list is not to be a conclusive list of all applications. Rather, the goal is 
to provide a'",
+     "     VISIBLE:  'them. The list is not to be a co', cursor=1",
+     "SPEECH OUTPUT: 'them. The list is not to be a conclusive list of all applications. Rather, the goal is 
to provide a '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "37. Line Up",
+    ["BRAILLE LINE:  'various applications that can be accessed with Orca as well as tips and tricks for 
using'",
+     "     VISIBLE:  'various applications that can be', cursor=1",
+     "SPEECH OUTPUT: 'various applications that can be accessed with Orca as well as tips and tricks for 
using '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "38. Line Up",
+    ["BRAILLE LINE:  'On the Accessible Applications page, you will find a growing list of information 
regarding'",
+     "     VISIBLE:  'On the Accessible Applications p', cursor=1",
+     "SPEECH OUTPUT: 'On the '",
+     "SPEECH OUTPUT: 'Accessible Applications page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', you will find a growing list of information regarding '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "39. Line Up",
+    ["BRAILLE LINE:  'access to more and more applications.'",
+     "     VISIBLE:  'access to more and more applicat', cursor=1",
+     "SPEECH OUTPUT: 'access to more and more applications. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "40. Line Up",
+    ["BRAILLE LINE:  'than others, however, and the Orca community continually works to provide compelling'",
+     "     VISIBLE:  'than others, however, and the Or', cursor=1",
+     "SPEECH OUTPUT: 'than others, however, and the Orca community continually works to provide compelling 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "41. Line Up",
+    ["BRAILLE LINE:  'applications, OpenOffice, Firefox, and the Java platform. Some applications work 
better'",
+     "     VISIBLE:  'applications, OpenOffice, Firefo', cursor=1",
+     "SPEECH OUTPUT: 'applications, '",
+     "SPEECH OUTPUT: 'OpenOffice'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', Firefox, and the Java platform. Some applications work better '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "42. Line Up",
+    ["BRAILLE LINE:  'technology service provider interface (AT-SPI). This includes the GNOME desktop and 
its'",
+     "     VISIBLE:  'technology service provider inte', cursor=1",
+     "SPEECH OUTPUT: 'technology service provider interface (AT-SPI). This includes the GNOME desktop and 
its '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "43. Line Up",
+    ["BRAILLE LINE:  'Orca is designed to work with applications and toolkits that support the assistive'",
+     "     VISIBLE:  'Orca is designed to work with ap', cursor=1",
+     "SPEECH OUTPUT: 'Orca is designed to work with applications and toolkits that support the assistive 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "44. Line Up",
+    ["BRAILLE LINE:  'Accessible Applications h1'",
+     "     VISIBLE:  'Accessible Applications h1', cursor=1",
+     "SPEECH OUTPUT: 'Accessible Applications'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "45. Line Up",
+    ["BRAILLE LINE:  'Please also refer to the Configuration/Use page for detailed information.'",
+     "     VISIBLE:  'Please also refer to the Configu', cursor=1",
+     "SPEECH OUTPUT: 'Please also refer to the '",
+     "SPEECH OUTPUT: 'Configuration/Use page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for detailed information. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "46. Line Up",
+    ["BRAILLE LINE:  'includes a \"Key Bindings\" tab that allows you to get a complete list of Orca key 
bindings.'",
+     "     VISIBLE:  'includes a \"Key Bindings\" tab th', cursor=1",
+     "SPEECH OUTPUT: 'includes a \"Key Bindings\" tab that allows you to get a complete list of Orca key 
bindings. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "47. Line Up",
+    ["BRAILLE LINE:  'information on Orca-specific keyboard commands. The Orca Configuration GUI also'",
+     "     VISIBLE:  'information on Orca-specific key', cursor=1",
+     "SPEECH OUTPUT: 'information on Orca-specific keyboard commands. The '",
+     "SPEECH OUTPUT: 'Orca Configuration GUI'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' also '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "48. Line Up",
+    ["BRAILLE LINE:  'mode to examine a window. Refer to Orca Keyboard Commands (Laptop Layout) for more'",
+     "     VISIBLE:  'mode to examine a window. Refer ', cursor=1",
+     "SPEECH OUTPUT: 'mode to examine a window. Refer to '",
+     "SPEECH OUTPUT: 'Orca Keyboard Commands'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '(Laptop Layout)'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for more '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "49. Line Up",
+    ["KNOWN ISSUE: Here we are combining lines which are not being combined on the way down",
+     "BRAILLE LINE:  'You may sometimes wish to control Orca itself, such as bringing up the Orca 
Configuration'",
+     "     VISIBLE:  'Orca Configuration', cursor=1",
+     "SPEECH OUTPUT: 'You may sometimes wish to control Orca itself, such as bringing up the '",
+     "SPEECH OUTPUT: 'Orca Configuration '",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "50. Line Up",
+    ["BRAILLE LINE:  'desktop applications.'",
+     "     VISIBLE:  'desktop applications.', cursor=1",
+     "SPEECH OUTPUT: 'desktop applications. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "51. Line Up",
+    ["BRAILLE LINE:  'designed to present information as you navigate the desktop using the keynav-1 image 
built-in navigation'",
+     "     VISIBLE:  'keynav-1 image built-in navigati', cursor=1",
+     "SPEECH OUTPUT: 'designed to present information as you navigate the desktop using the '",
+     "SPEECH OUTPUT: 'keynav-1'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'built-in navigation '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "52. Line Up",
+    ["BRAILLE LINE:  'logged in, waiting for a second or so, then typing orca and pressing return. Orca is'",
+     "     VISIBLE:  'logged in, waiting for a second ', cursor=1",
+     "SPEECH OUTPUT: 'logged in, waiting for a second or so, then typing orca and pressing return. Orca is 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "53. Line Up",
+    ["BRAILLE LINE:  'The command to run orca is orca. You can enter this command by pressing Alt+F2 when'",
+     "     VISIBLE:  'The command to run orca is orca.', cursor=1",
+     "SPEECH OUTPUT: 'The command to run orca is orca. You can enter this command by pressing Alt+F2 when 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "54. Line Up",
+    ["BRAILLE LINE:  'Configuration/Use h1'",
+     "     VISIBLE:  'Configuration/Use h1', cursor=1",
+     "SPEECH OUTPUT: 'Configuration/Use'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "55. Line Up",
+    ["BRAILLE LINE:  'distributions as well as installing Orca directly from source.'",
+     "     VISIBLE:  'distributions as well as install', cursor=1",
+     "SPEECH OUTPUT: 'distributions as well as installing Orca directly from source. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "56. Line Up",
+    ["BRAILLE LINE:  'Please also refer to the Download/Installation page for detailed information on 
various'",
+     "     VISIBLE:  'Please also refer to the Downloa', cursor=1",
+     "SPEECH OUTPUT: 'Please also refer to the '",
+     "SPEECH OUTPUT: 'Download/Installation page'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for detailed information on various '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "57. Line Up",
+    ["BRAILLE LINE:  'and www.ubuntu.com image Ubuntu.'",
+     "     VISIBLE:  'and www.ubuntu.com image Ubuntu.', cursor=1",
+     "SPEECH OUTPUT: 'and '",
+     "SPEECH OUTPUT: 'www.ubuntu.com'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Ubuntu'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: '. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "58. Line Up",
+    ["BRAILLE LINE:  'provided by default on a number of operating system distributions, including 
www.opensolaris.org image Open Solaris'",
+     "     VISIBLE:  'provided by default on a number ', cursor=1",
+     "SPEECH OUTPUT: 'provided by default on a number of operating system distributions, including '",
+     "SPEECH OUTPUT: 'www.opensolaris.org'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Open Solaris'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "59. Line Up",
+    ["BRAILLE LINE:  'As of GNOME 2.16, Orca is a part of the GNOME platform. As a result, Orca is already'",
+     "     VISIBLE:  'As of GNOME 2.16, Orca is a part', cursor=1",
+     "SPEECH OUTPUT: 'As of GNOME 2.16, Orca is a part of the GNOME platform. As a result, Orca is already 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "60. Line Up",
+    ["BRAILLE LINE:  'Download/Installation h1'",
+     "     VISIBLE:  'Download/Installation h1', cursor=1",
+     "SPEECH OUTPUT: 'Download/Installation'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "61. Line Up",
+    ["BRAILLE LINE:  '•Guide to installing the latest versions of Firefox and Orca 
installing-firefox-and-orca image'",
+     "     VISIBLE:  'installing-firefox-and-orca imag', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Guide to installing the latest versions of Firefox and Orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "62. Line Up",
+    ["BRAILLE LINE:  '•Review of Fedora 7 and the Orca screen reader for the Gnome graphical desktop 
linux-and-orca-review image'",
+     "     VISIBLE:  'linux-and-orca-review image', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Review of Fedora 7 and the Orca screen reader for the Gnome graphical desktop'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "63. Line Up",
+    ["BRAILLE LINE:  '•Walk through of the installation of Ubuntu 7.4. Very helpful tutorial 
ubuntu-7-4-install-walk-through image'",
+     "     VISIBLE:  'ubuntu-7-4-install-walk-through ', cursor=1",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'Walk through of the installation of Ubuntu 7.4. Very helpful tutorial'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "64. Line Up",
+    ["BRAILLE LINE:  'contribution (THANKS!)!!! The audio guides can be found at linuxat image 
http://www.digitaldarragh.com'",
+     "     VISIBLE:  'linuxat image http://www.digital', cursor=1",
+     "SPEECH OUTPUT: 'contribution (THANKS!)!!! The audio guides can be found at '",
+     "SPEECH OUTPUT: 'linuxat'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'http://www.digitaldarragh.com'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "65. Line Up",
+    ["BRAILLE LINE:  'Darragh Ó Héiligh has created several audio guides for Orca. This is a fantastic'",
+     "     VISIBLE:  'Darragh Ó Héiligh has created se', cursor=1",
+     "SPEECH OUTPUT: 'Darragh Ó Héiligh'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' has created several audio guides for Orca. This is a fantastic '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "66. Line Up",
+    ["BRAILLE LINE:  'Audio Guides h1'",
+     "     VISIBLE:  'Audio Guides h1', cursor=1",
+     "SPEECH OUTPUT: 'Audio Guides'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "67. Line Up",
+    ["BRAILLE LINE:  'productive environment composed of users and developers.'",
+     "     VISIBLE:  'productive environment composed ', cursor=1",
+     "SPEECH OUTPUT: 'productive environment composed of users and developers. '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "68. Line Up",
+    ["BRAILLE LINE:  'Please join and participate on the orca-list image Orca mailing list ( orca-list image 
archives): it's a helpful, kind, and'",
+     "     VISIBLE:  'Please join and participate on t', cursor=1",
+     "SPEECH OUTPUT: 'Please join and participate on the '",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Orca mailing list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' ('",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'archives'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: '): it's a helpful, kind, and '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "69. Line Up",
+    ["BRAILLE LINE:  'problems in other components, is maintained in buglist image Bugzilla (please see our 
notes on how we'",
+     "     VISIBLE:  'notes on how we', cursor=1",
+     "SPEECH OUTPUT: 'problems in other components, is maintained in '",
+     "SPEECH OUTPUT: 'buglist'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Bugzilla'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' (please see our '",
+     "SPEECH OUTPUT: 'notes on how we '",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "70. Line Up",
+    ["BRAILLE LINE:  'The complete list of work to do, including bugs and feature requests, along with 
known'",
+     "     VISIBLE:  'The complete list of work to do,', cursor=1",
+     "SPEECH OUTPUT: 'The complete list of work to do, including bugs and feature requests, along with known 
'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "71. Line Up",
+    ["BRAILLE LINE:  'access image Accessibility Program Office of Sun  with contributions from many'",
+     "     VISIBLE:  'contributions from many', cursor=1",
+     "SPEECH OUTPUT: 'access'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Accessibility Program Office of Sun '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' with '",
+     "SPEECH OUTPUT: 'contributions from many '",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "72. Line Up",
+    ["KNOWN ISSUE: Part of the line is missing.",
+     "BRAILLE LINE:  'been led by the'",
+     "     VISIBLE:  'been led by the', cursor=1",
+     "SPEECH OUTPUT: 'been led by the '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "73. Line Up",
+    ["BRAILLE LINE:  '(e.g., the GNOME desktop). The development of Orca has'",
+     "     VISIBLE:  '(e.g., the GNOME desktop). The d', cursor=1",
+     "SPEECH OUTPUT: '(e.g., the GNOME desktop). The development of Orca has '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "74. Line Up",
+    ["BRAILLE LINE:  'access to applications and toolkits that support the AT-SPI'",
+     "     VISIBLE:  'access to applications and toolk', cursor=1",
+     "SPEECH OUTPUT: 'access to applications and toolkits that support the AT-SPI '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "75. Line Up",
+    ["BRAILLE LINE:  'synthesis, braille, and magnification, Orca helps provide'",
+     "     VISIBLE:  'synthesis, braille, and magnific', cursor=1",
+     "SPEECH OUTPUT: 'synthesis, braille, and magnification, Orca helps provide '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "76. Line Up",
+    ["BRAILLE LINE:  'impairments. Using various combinations of speech'",
+     "     VISIBLE:  'impairments. Using various combi', cursor=1",
+     "SPEECH OUTPUT: 'impairments. Using various combinations of speech '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "77. Line Up",
+    ["BRAILLE LINE:  'powerful assistive technology for people with visual'",
+     "     VISIBLE:  'powerful assistive technology fo', cursor=1",
+     "SPEECH OUTPUT: 'powerful assistive technology for people with visual '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "78. Line Up",
+    ["BRAILLE LINE:  'Orca is a free, open source, flexible, extensible, and'",
+     "     VISIBLE:  'Orca is a free, open source, fle', cursor=1",
+     "SPEECH OUTPUT: 'Orca is a free, open source, flexible, extensible, and '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "79. Line Up",
+    ["BRAILLE LINE:  'About h1'",
+     "     VISIBLE:  'About h1', cursor=1",
+     "SPEECH OUTPUT: 'About'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "80. Line Up",
+    ["BRAILLE LINE:  '8.More Information'",
+     "     VISIBLE:  '8.More Information', cursor=3",
+     "SPEECH OUTPUT: '8.'",
+     "SPEECH OUTPUT: 'More Information'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "81. Line Up",
+    ["BRAILLE LINE:  '7.How Can I Help?'",
+     "     VISIBLE:  '7.How Can I Help?', cursor=3",
+     "SPEECH OUTPUT: '7.'",
+     "SPEECH OUTPUT: 'How Can I Help?'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "82. Line Up",
+    ["BRAILLE LINE:  '6.Accessible Applications'",
+     "     VISIBLE:  '6.Accessible Applications', cursor=3",
+     "SPEECH OUTPUT: '6.'",
+     "SPEECH OUTPUT: 'Accessible Applications'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "83. Line Up",
+    ["BRAILLE LINE:  '5.Configuration/Use'",
+     "     VISIBLE:  '5.Configuration/Use', cursor=3",
+     "SPEECH OUTPUT: '5.'",
+     "SPEECH OUTPUT: 'Configuration/Use'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "84. Line Up",
+    ["BRAILLE LINE:  '4.Download/Installation'",
+     "     VISIBLE:  '4.Download/Installation', cursor=3",
+     "SPEECH OUTPUT: '4.'",
+     "SPEECH OUTPUT: 'Download/Installation'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "85. Line Up",
+    ["BRAILLE LINE:  '3.Audio Guides'",
+     "     VISIBLE:  '3.Audio Guides', cursor=3",
+     "SPEECH OUTPUT: '3.'",
+     "SPEECH OUTPUT: 'Audio Guides'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "86. Line Up",
+    ["BRAILLE LINE:  '2.About'",
+     "     VISIBLE:  '2.About', cursor=3",
+     "SPEECH OUTPUT: '2.'",
+     "SPEECH OUTPUT: 'About'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "87. Line Up",
+    ["BRAILLE LINE:  '1.Welcome to Orca!'",
+     "     VISIBLE:  '1.Welcome to Orca!', cursor=3",
+     "SPEECH OUTPUT: '1.'",
+     "SPEECH OUTPUT: 'Welcome to Orca!'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "88. Line Up",
+    ["BRAILLE LINE:  'Contents'",
+     "     VISIBLE:  'Contents', cursor=1",
+     "SPEECH OUTPUT: 'Contents'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "89. Line Up",
+    ["BRAILLE LINE:  'HOT HOT HOT: Notes on access to Firefox 3.0'",
+     "     VISIBLE:  'HOT HOT HOT: Notes on access to ', cursor=1",
+     "SPEECH OUTPUT: 'HOT HOT HOT: Notes on '",
+     "SPEECH OUTPUT: 'access to Firefox 3.0'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "90. Line Up",
+    ["BUG? - Why are we presenting this twice?",
+     "BRAILLE LINE:  'Orca Logo'",
+     "     VISIBLE:  'Orca Logo', cursor=1",
+     "BRAILLE LINE:  'Orca Logo'",
+     "     VISIBLE:  'Orca Logo', cursor=0",
+     "SPEECH OUTPUT: 'Orca Logo'",
+     "SPEECH OUTPUT: 'Orca Logo'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "91. Line Up",
+    ["BRAILLE LINE:  'Welcome to Orca! h1'",
+     "     VISIBLE:  'Welcome to Orca! h1', cursor=1",
+     "SPEECH OUTPUT: 'Welcome to Orca!'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "92. Line Up",
+    ["BRAILLE LINE:  'Home | Download/Installation | Configuration/Use | Accessible Applications | orca-list 
image Mailing List ( orca-list image'",
+     "     VISIBLE:  'orca-list image', cursor=1",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Download/Installation'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Configuration/Use'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Accessible Applications'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'Mailing List'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: ' ('",
+     "SPEECH OUTPUT: 'orca-list'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "93. Line Up",
+    ["BRAILLE LINE:  'en Español'",
+     "     VISIBLE:  'en Español', cursor=1",
+     "SPEECH OUTPUT: 'en Español'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'image'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "94. Line Up",
+    ["BRAILLE LINE:  'Home RecentChanges FindPage HelpContents Orca'",
+     "     VISIBLE:  'Home RecentChanges FindPage Help', cursor=1",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'RecentChanges'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'FindPage'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'HelpContents'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Orca'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "95. Line Up",
+    ["BRAILLE LINE:  'live.gnome.org h1  $l Titles push button Text push button'",
+     "     VISIBLE:  'live.gnome.org h1  $l Titles pus', cursor=1",
+     "SPEECH OUTPUT: 'live.gnome.org '",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'Titles'",
+     "SPEECH OUTPUT: 'push button'",
+     "SPEECH OUTPUT: 'grayed'",
+     "SPEECH OUTPUT: 'Text'",
+     "SPEECH OUTPUT: 'push button'",
+     "SPEECH OUTPUT: 'grayed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "96. Line Up",
+    ["BRAILLE LINE:  'Home News Projects Art Support Development Community'",
+     "     VISIBLE:  'Home News Projects Art Support D', cursor=1",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'News'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Projects'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Art'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Support'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Development'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Community'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/link_where_am_i.params b/test/keystrokes/firefox/link_where_am_i.params
new file mode 100644
index 0000000..f281582
--- /dev/null
+++ b/test/keystrokes/firefox/link_where_am_i.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bugzilla-top.html
diff --git a/test/keystrokes/firefox/link_where_am_i.py b/test/keystrokes/firefox/link_where_am_i.py
index a68c319..2a90492 100644
--- a/test/keystrokes/firefox/link_where_am_i.py
+++ b/test/keystrokes/firefox/link_where_am_i.py
@@ -1,94 +1,33 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of Where am I for HTML links in Firefox
-"""
+"""Test of Where am I for links."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local anchors test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "bugzilla_top.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-sequence.append(WaitForFocus("GNOME Bug Tracking System",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Shift+Tab to Product summary link and do a Where Am I
-#
 sequence.append(KeyComboAction("<Shift>Tab"))
-sequence.append(WaitForFocus("Product summary", acc_role=pyatspi.ROLE_LINK))
+
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "Where Am I on Product summary link", 
-    ["BRAILLE LINE:  '3.Product summary (designed for maintainers)'",
-     "     VISIBLE:  'Product summary (designed for ma', cursor=1",
+    "1. Where Am I on Product summary link", 
+    ["KNOWN ISSUE: This seems broken",
+     "BRAILLE LINE:  '3. (designed for maintainers)Product summary'",
+     "     VISIBLE:  'Product summary', cursor=1",
      "SPEECH OUTPUT: 'http link Product summary different site'"]))
 
-########################################################################
-# Go home tab and do a Where Am I
-#
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(WaitForFocus("Home", acc_role=pyatspi.ROLE_LINK))
 sequence.append(KeyComboAction("Tab"))
-sequence.append(WaitForFocus("New bug", acc_role=pyatspi.ROLE_LINK))
+
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
 sequence.append(utils.AssertPresentationAction(
-    "Where Am I on New bug link", 
+    "2. Where Am I on New bug link", 
     ["BRAILLE LINE:  'New bug · Browse · Search · Reports · Account · Admin · Help'",
      "     VISIBLE:  'New bug · Browse · Search · Repo', cursor=1",
      "SPEECH OUTPUT: 'http link New bug different site'"]))
 
-########################################################################
-# Shift+Tab back to the footprint
-#
-sequence.append(KeyComboAction("<Shift>Tab"))
-sequence.append(WaitForFocus("Home", acc_role=pyatspi.ROLE_LINK))
-sequence.append(utils.StartRecordingAction())
-sequence.append(KeyComboAction("KP_Enter"))
-sequence.append(PauseAction(3000))
-sequence.append(utils.AssertPresentationAction(
-    "Where Am I on footprint", 
-    ["BUG? - Is it redundant to speak link twice?",
-     "BRAILLE LINE:  'Home Image'",
-     "     VISIBLE:  'Home Image', cursor=1",
-     "SPEECH OUTPUT: 'http link Home link image different site'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l", 1000))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/mouseover_javascript_alert.params 
b/test/keystrokes/firefox/mouseover_javascript_alert.params
new file mode 100644
index 0000000..d41cf1c
--- /dev/null
+++ b/test/keystrokes/firefox/mouseover_javascript_alert.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/mouseover.html
diff --git a/test/keystrokes/firefox/mouseover_javascript_alert.py 
b/test/keystrokes/firefox/mouseover_javascript_alert.py
index 48259e9..b7c7c9f 100644
--- a/test/keystrokes/firefox/mouseover_javascript_alert.py
+++ b/test/keystrokes/firefox/mouseover_javascript_alert.py
@@ -1,94 +1,36 @@
-# -*- coding: utf-8 -*-
 #!/usr/bin/python
 
-"""Test of Orca's support for mouseovers.
-"""
+"""Test of Orca's support for mouseovers."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on the Firefox window as well as for focus
-# to move to the "inline: Tab Panel Example 1" frame.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the UIUC Tab Panel demo.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-sequence.append(TypeAction(utils.htmlURLPrefix + "mouseover.html"))
-sequence.append(KeyComboAction("Return"))
-sequence.append(WaitForDocLoad())
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file", 
-    ["BRAILLE LINE:  'Mouseover which will present an traditional alert:'",
-     "     VISIBLE:  'Mouseover which will present an ', cursor=1",
-     "SPEECH OUTPUT: 'Mouseover which will present an traditional alert:'"]))
-
-########################################################################
-# Down Arrow to the image.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Down"))
-sequence.append(utils.AssertPresentationAction(
-    "Down Arrow to Image",
-    ["BRAILLE LINE:  'Orca Logo Image'",
-     "     VISIBLE:  'Orca Logo Image', cursor=1",
-     "SPEECH OUTPUT: 'Orca Logo image'"]))
 
-########################################################################
-# Route the mouse pointer to the image, triggering a javascript alert.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("KP_Divide"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Route the pointer to the image",
-    ["BRAILLE LINE:  '" + utils.firefoxAppNames + " Application \[JavaScript Application\] Dialog'",
-     "     VISIBLE:  '[JavaScript Application] Dialog', cursor=1",
-     "BRAILLE LINE:  '" + utils.firefoxAppNames + " Application \[JavaScript Application\] Dialog OK 
Button'",
-     "     VISIBLE:  'OK Button', cursor=1",
-     "SPEECH OUTPUT: 'New item has been added'",
-     "SPEECH OUTPUT: '[JavaScript Application] Welcome to mouseover-enabled Orca!'",
-     "SPEECH OUTPUT: 'OK button'"]))
+    "1. Route the pointer to the image",
+    ["KNOWN ISSUE: Double speech presentation",
+     "BRAILLE LINE:  'Firefox application MouseOvers - Mozilla Firefox frame dialog'",
+     "     VISIBLE:  'dialog', cursor=1",
+     "BRAILLE LINE:  'Firefox application MouseOvers - Mozilla Firefox frame dialog OK push button'",
+     "     VISIBLE:  'OK push button', cursor=1",
+     "SPEECH OUTPUT: 'Welcome to mouseover-enabled Orca! Welcome to mouseover-enabled Orca!'",
+     "SPEECH OUTPUT: 'OK push button'"]))
 
-########################################################################
-# Dismiss the alert.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Escape"))
 sequence.append(utils.AssertPresentationAction(
-    "Escape to dismiss the dialog.",
-    ["BRAILLE LINE:  '" + utils.firefoxAppNames + " Application MouseOvers - " + utils.firefoxFrameNames + " 
Frame'",
-     "     VISIBLE:  'MouseOvers - " + utils.firefoxFrameNames + "(| Fra| Frame)', cursor=1",
-     "BRAILLE LINE:  'Orca Logo Image'",
-     "     VISIBLE:  'Orca Logo Image', cursor=1",
-     "SPEECH OUTPUT: 'MouseOvers - " + utils.firefoxFrameNames + " frame'",
+    "2. Escape to dismiss the dialog.",
+    ["BRAILLE LINE:  'Orca Logo image'",
+     "     VISIBLE:  'Orca Logo image', cursor=1",
      "SPEECH OUTPUT: 'Orca Logo image'"]))
 
-########################################################################
-# Close the demo
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-sequence.append(WaitForDocLoad())
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
-
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/say_all_blockquote.params 
b/test/keystrokes/firefox/say_all_blockquote.params
new file mode 100644
index 0000000..dad99a0
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_blockquote.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/blockquotes.html
diff --git a/test/keystrokes/firefox/say_all_blockquote.py b/test/keystrokes/firefox/say_all_blockquote.py
new file mode 100644
index 0000000..d6e749c
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_blockquote.py
@@ -0,0 +1,22 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'On weaponry:'",
+     "SPEECH OUTPUT: 'NOBODY expects the 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!'",
+     "SPEECH OUTPUT: 'On old ladies:'",
+     "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.'",
+     "SPEECH OUTPUT: 'On castle decor:'",
+     "SPEECH OUTPUT: 'Hm! She is made of harder stuff! Cardinal Fang! Fetch the COMFY CHAIR!'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_bug_511389.params 
b/test/keystrokes/firefox/say_all_bug_511389.params
new file mode 100644
index 0000000..5e35199
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_bug_511389.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-511389.html
diff --git a/test/keystrokes/firefox/say_all_bug_511389.py b/test/keystrokes/firefox/say_all_bug_511389.py
new file mode 100644
index 0000000..b453964
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_bug_511389.py
@@ -0,0 +1,27 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Hello world'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', this is a test.'",
+     "SPEECH OUTPUT: 'Foo'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: 'Bar'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "The end.'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_bug_591351_1.params 
b/test/keystrokes/firefox/say_all_bug_591351_1.params
new file mode 100644
index 0000000..b50d505
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_bug_591351_1.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-591351-1.html
diff --git a/test/keystrokes/firefox/say_all_bug_591351_1.py b/test/keystrokes/firefox/say_all_bug_591351_1.py
new file mode 100644
index 0000000..76478ea
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_bug_591351_1.py
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+
+"""Test of sayAll output."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Hello world.",
+     "",
+     "",
+     " I wonder what a bevezeto is. I should Google that. ",
+     "",
+     " Aha! It is the Hungarian word for \"Introduction\". Here is some '",
+     "SPEECH OUTPUT: 'proof link'",
+     "SPEECH OUTPUT: '. I really think we need to get Attila to teach the Orca team some Hungarian. Maybe 
one (really easy) phrase per bug comment. separator'",
+     "SPEECH OUTPUT: 'Foo link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/sayAll_bug-591351-1.settings 
b/test/keystrokes/firefox/say_all_bug_591351_1.settings
similarity index 100%
rename from test/keystrokes/firefox/sayAll_bug-591351-1.settings
rename to test/keystrokes/firefox/say_all_bug_591351_1.settings
diff --git a/test/keystrokes/firefox/say_all_bugzilla_search.params 
b/test/keystrokes/firefox/say_all_bugzilla_search.params
new file mode 100644
index 0000000..d82c60a
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_bugzilla_search.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bugzilla-advanced.html
diff --git a/test/keystrokes/firefox/say_all_bugzilla_search.py 
b/test/keystrokes/firefox/say_all_bugzilla_search.py
new file mode 100644
index 0000000..361802f
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_bugzilla_search.py
@@ -0,0 +1,187 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Shift>Tab"))
+sequence.append(KeyComboAction("<Shift>Tab"))
+sequence.append(KeyComboAction("<Control>Home"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'Bugzilla'",
+     "SPEECH OUTPUT: 'New bug'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Browse'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Reports'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Account'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Admin'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Help'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Logged In joanmarie diggs gmail com | '",
+     "SPEECH OUTPUT: 'Log Out'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'Short Bug Search Form '",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Complicated Bug Search Form'",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'Give me some help'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' (reloads page.)'",
+     "SPEECH OUTPUT: 'Summary:'",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'Summary: contains all of the words/strings combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Search push button'",
+     "SPEECH OUTPUT: 'Classification:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Classification: Admin multi-select List with 8 items'",
+     "SPEECH OUTPUT: 'Product:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Product: accerciser multi-select List with 379 items'",
+     "SPEECH OUTPUT: 'Component'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Component: abiscan multi-select List with 1248 items'",
+     "SPEECH OUTPUT: 'Version:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Version: 0.0.1 multi-select List with 857 items'",
+     "SPEECH OUTPUT: 'Target Milestone:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Target Milestone: --- multi-select List with 555 items'",
+     "SPEECH OUTPUT: 'A Comment:'",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains the string combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'Whiteboard:'",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains all of the words/strings combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'Keywords'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': '",
+     "SPEECH OUTPUT: 'row header'",
+     "SPEECH OUTPUT: 'contains all of the keywords combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'separator'",
+     "SPEECH OUTPUT: 'Status:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Status:'",
+     "SPEECH OUTPUT: 'UNCONFIRMED NEW ASSIGNED REOPENED NEEDINFO'",
+     "SPEECH OUTPUT: 'multi-select List with 8 items'",
+     "SPEECH OUTPUT: 'Resolution: '",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Resolution:'",
+     "SPEECH OUTPUT: 'FIXED'",
+     "SPEECH OUTPUT: 'multi-select List with 12 items'",
+     "SPEECH OUTPUT: 'Severity:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Severity: blocker multi-select List with 7 items'",
+     "SPEECH OUTPUT: 'Priority:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'Priority: Immediate multi-select List with 5 items'",
+     "SPEECH OUTPUT: 'OS:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'OS: All multi-select List with 21 items'",
+     "SPEECH OUTPUT: 'Email and Numbering'",
+     "SPEECH OUTPUT: 'Any one of:'",
+     "SPEECH OUTPUT: 'check box checked'",
+     "SPEECH OUTPUT: ' the bug assignee'",
+     "SPEECH OUTPUT: 'check box not checked'",
+     "SPEECH OUTPUT: ' the reporter'",
+     "SPEECH OUTPUT: 'check box not checked'",
+     "SPEECH OUTPUT: ' the QA contact'",
+     "SPEECH OUTPUT: 'check box not checked'",
+     "SPEECH OUTPUT: ' a CC list member'",
+     "SPEECH OUTPUT: 'check box not checked'",
+     "SPEECH OUTPUT: ' a commenter'",
+     "SPEECH OUTPUT: 'contains combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Any one of:'",
+     "SPEECH OUTPUT: 'check box checked'",
+     "SPEECH OUTPUT: ' the bug assignee'",
+     "SPEECH OUTPUT: 'check box checked'",
+     "SPEECH OUTPUT: ' the reporter'",
+     "SPEECH OUTPUT: 'check box checked'",
+     "SPEECH OUTPUT: ' the QA contact'",
+     "SPEECH OUTPUT: 'check box checked'",
+     "SPEECH OUTPUT: ' a CC list member'",
+     "SPEECH OUTPUT: 'check box not checked'",
+     "SPEECH OUTPUT: ' a commenter'",
+     "SPEECH OUTPUT: 'contains combo box'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'separator'",
+     "SPEECH OUTPUT: 'Only include combo box'",
+     "SPEECH OUTPUT: 'bugs numbered:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: '(comma-separated list)'",
+     "SPEECH OUTPUT: 'Bug Changes'",
+     "SPEECH OUTPUT: 'Only bugs changed between:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: ' and entry Now ",
+     "(YYYY-MM-DD or relative dates)'",
+     "SPEECH OUTPUT: 'where one or more of the following changed:'",
+     "SPEECH OUTPUT: 'where one or more of the following changed: [Bug creation] multi-select List with 26 
items'",
+     "SPEECH OUTPUT: 'and the new value was:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'GNOME version:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'GNOME version: Unspecified multi-select List with 14 items'",
+     "SPEECH OUTPUT: 'GNOME target:'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'GNOME target: Unspecified multi-select List with 12 items'",
+     "SPEECH OUTPUT: 'Sort results by: Reuse same sort as last time combo box'",
+     "SPEECH OUTPUT: 'Search push button'",
+     "SPEECH OUTPUT: '    check box not checked  and remember these as my default search options'",
+     "SPEECH OUTPUT: 'separator'",
+     "SPEECH OUTPUT: 'Advanced Searching Using Boolean Charts:'",
+     "SPEECH OUTPUT: 'check box not checked'",
+     "SPEECH OUTPUT: ' Not (negate this whole chart)'",
+     "SPEECH OUTPUT: '--- combo box'",
+     "SPEECH OUTPUT: '--- combo box entry'",
+     "SPEECH OUTPUT: 'Or push button'",
+     "SPEECH OUTPUT: 'And push button'",
+     "SPEECH OUTPUT: '       Add another boolean chart push button       '",
+     "SPEECH OUTPUT: 'separator'",
+     "SPEECH OUTPUT: 'Saved Searches: '",
+     "SPEECH OUTPUT: 'My Bugs and Patches'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'All Orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Firefox'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'open orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Open RFEs'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_empty_anchor.params 
b/test/keystrokes/firefox/say_all_empty_anchor.params
new file mode 100644
index 0000000..f97125a
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_empty_anchor.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/bug-517371.html
diff --git a/test/keystrokes/firefox/say_all_empty_anchor.py b/test/keystrokes/firefox/say_all_empty_anchor.py
new file mode 100644
index 0000000..0f7569e
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_empty_anchor.py
@@ -0,0 +1,42 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'FAQ '",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'Battery'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'Q. What's a battery?'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Q. Which way is up?'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Q. Why did Orca used to get stuck on this page?'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "FOO'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'Q. Why would someone put a line break in a heading?'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Q. What is the airspeed velocity of an unladen swallow?'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "Battery'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'Q. What is a battery?",
+     "A. Look it up.'",
+     "SPEECH OUTPUT: 'Q. Which way is up?",
+     "A. That way.'",
+     "SPEECH OUTPUT: 'Q. Why did Orca used to get stuck on this page?",
+     "A. Empty anchors.'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_enter_bug.params 
b/test/keystrokes/firefox/say_all_enter_bug.params
new file mode 100644
index 0000000..95128f2
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_enter_bug.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/enter-bug-form.html
diff --git a/test/keystrokes/firefox/say_all_enter_bug.py b/test/keystrokes/firefox/say_all_enter_bug.py
new file mode 100644
index 0000000..67997e9
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_enter_bug.py
@@ -0,0 +1,120 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'Bugzilla'",
+     "SPEECH OUTPUT: 'New bug'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Browse'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Search'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Reports'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Account'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Admin'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' · '",
+     "SPEECH OUTPUT: 'Help'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Logged In joanmarie diggs gmail com | '",
+     "SPEECH OUTPUT: 'Log Out'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Enter Bug: orca \u2013 This page lets you enter a new bug into Bugzilla.'",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'Before reporting a bug, please read the '",
+     "SPEECH OUTPUT: 'bug writing guidelines'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', please look at the list of '",
+     "SPEECH OUTPUT: 'most frequently reported bugs'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ', and please '",
+     "SPEECH OUTPUT: 'search'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' or '",
+     "SPEECH OUTPUT: 'browse'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' for the bug.'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'Reporter:'",
+     "SPEECH OUTPUT: 'joanmarie diggs gmail com'",
+     "SPEECH OUTPUT: 'Product:'",
+     "SPEECH OUTPUT: 'orca'",
+     "SPEECH OUTPUT: 'Version:'",
+     "SPEECH OUTPUT: 'Version: 2.21.x List with 9 items'",
+     "SPEECH OUTPUT: 'Component'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ':'",
+     "SPEECH OUTPUT: 'Component: braille List with 5 items'",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'GNOME version'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ':'",
+     "SPEECH OUTPUT: 'Unspecified combo box'",
+     "SPEECH OUTPUT: 'OS'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ':'",
+     "SPEECH OUTPUT: 'Linux combo box'",
+     "SPEECH OUTPUT: 'Severity'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ':'",
+     "SPEECH OUTPUT: 'normal combo box'",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'Summary:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Description:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'Optional Fields'",
+     "SPEECH OUTPUT: 'Cc:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Keywords'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ':'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Depends on:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Blocks:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'Commit push button'",
+     "SPEECH OUTPUT: '      Remember values as bookmarkable template push button'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: '",
+     "We've made a guess at your operating system. Please check it and, if we got it wrong, email bugmaster 
gnome org '",
+     "SPEECH OUTPUT: 'Saved Searches: '",
+     "SPEECH OUTPUT: 'All Orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Firefox'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'open orca'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' | '",
+     "SPEECH OUTPUT: 'Open RFEs'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_entries.params b/test/keystrokes/firefox/say_all_entries.params
new file mode 100644
index 0000000..2ff0b54
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_entries.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/entries.html
diff --git a/test/keystrokes/firefox/say_all_entries.py b/test/keystrokes/firefox/say_all_entries.py
new file mode 100644
index 0000000..2cc6f6c
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_entries.py
@@ -0,0 +1,121 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Here are some entries'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'Type '",
+     "SPEECH OUTPUT: 'something'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' rather '",
+     "SPEECH OUTPUT: 'amusing'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' here: entry'",
+     "SPEECH OUTPUT: 'Amusing numbers fall between entry  and entry .'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'I'm a label'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Am I a label as well?'",
+     "SPEECH OUTPUT: 'What the heck should we do here?'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'Looking at what follows visually, I'm not sure what I would type/i.e. what the labels 
are.'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Too far away to be a label.'",
+     "SPEECH OUTPUT: 'Distance doesn't count on the left'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Sometimes labels can be below the fields due to <br />'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: '",
+     "First Name'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: '",
+     "M.I.'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: '",
+     "Last Name'",
+     "SPEECH OUTPUT: 'Other times it's due to layout tables'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'First name'",
+     "SPEECH OUTPUT: 'Middle",
+     "initial'",
+     "SPEECH OUTPUT: 'Last '",
+     "SPEECH OUTPUT: 'name'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Second verse same as the first (only now the labels are above the fields)'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'First Name'",
+     "SPEECH OUTPUT: 'Middle",
+     "initial'",
+     "SPEECH OUTPUT: 'Last '",
+     "SPEECH OUTPUT: 'name'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Decisions, decisions.... When in doubt, closest table cell text wins'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'First name'",
+     "SPEECH OUTPUT: 'Middle",
+     "initial'",
+     "SPEECH OUTPUT: 'Last name'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Given name'",
+     "SPEECH OUTPUT: 'initial'",
+     "SPEECH OUTPUT: 'Surname'",
+     "SPEECH OUTPUT: 'First name'",
+     "SPEECH OUTPUT: 'Middle",
+     "initial'",
+     "SPEECH OUTPUT: 'Last name'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Given name'",
+     "SPEECH OUTPUT: 'initial'",
+     "SPEECH OUTPUT: 'Surname'",
+     "SPEECH OUTPUT: 'Decisions, decisions.... We should try to figure out if we're in a grid of fields.'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'First name'",
+     "SPEECH OUTPUT: 'Middle",
+     "initial'",
+     "SPEECH OUTPUT: 'Last name'",
+     "SPEECH OUTPUT: 'patched image'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'We mustn't forget images as labels -- even if that practice is lame'",
+     "SPEECH OUTPUT: 'heading level 2'",
+     "SPEECH OUTPUT: 'bandaid graphic'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'bandaid graphic redux'",
+     "SPEECH OUTPUT: 'Magic disappearing text trick: entry tab to me and I disappear'",
+     "SPEECH OUTPUT: 'Tell me a secret: password text'",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:",
+     " entry and plan to write my memoirs.'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_heading_section.params 
b/test/keystrokes/firefox/say_all_heading_section.params
new file mode 100644
index 0000000..dcde9da
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_heading_section.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/heading-section.html
diff --git a/test/keystrokes/firefox/say_all_heading_section.py 
b/test/keystrokes/firefox/say_all_heading_section.py
new file mode 100644
index 0000000..33f1319
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_heading_section.py
@@ -0,0 +1,28 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Heading 1.'",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'Heading 2.'",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'sect 1 Heading 3.'",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'sect 2 Heading 4.'",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'sect 3 Heading 5.'",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'Heading 6.'",
+     "SPEECH OUTPUT: 'heading level 1'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_imagemap.params b/test/keystrokes/firefox/say_all_imagemap.params
new file mode 100644
index 0000000..1fce9a7
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_imagemap.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/backwards.html
diff --git a/test/keystrokes/firefox/say_all_imagemap.py b/test/keystrokes/firefox/say_all_imagemap.py
new file mode 100644
index 0000000..a3a0e6c
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_imagemap.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["KNOWN ISSUE: We're not presenting the URIs for the otherwise useless imagemaps",
+     "SPEECH OUTPUT: 'This looks like A to Z, but it's really Z to A.'",
+     "SPEECH OUTPUT: 'Test:'",
+     "SPEECH OUTPUT: 'z link z image map link'",
+     "SPEECH OUTPUT: 'y link y image map link'",
+     "SPEECH OUTPUT: 'x link x image map link'",
+     "SPEECH OUTPUT: 'w link w image map link'",
+     "SPEECH OUTPUT: 'v link v image map link'",
+     "SPEECH OUTPUT: 'u link u image map link'",
+     "SPEECH OUTPUT: 't link t image map link'",
+     "SPEECH OUTPUT: 's link s image map link'",
+     "SPEECH OUTPUT: 'r link r image map link'",
+     "SPEECH OUTPUT: 'q link q image map link'",
+     "SPEECH OUTPUT: 'p link p image map link'",
+     "SPEECH OUTPUT: 'o link o image map link'",
+     "SPEECH OUTPUT: 'n link n image map link'",
+     "SPEECH OUTPUT: 'm link m image map link'",
+     "SPEECH OUTPUT: 'l link l image map link'",
+     "SPEECH OUTPUT: 'k link k image map link'",
+     "SPEECH OUTPUT: 'j link j image map link'",
+     "SPEECH OUTPUT: 'i link i image map link'",
+     "SPEECH OUTPUT: 'h link h image map link'",
+     "SPEECH OUTPUT: 'g link g image map link'",
+     "SPEECH OUTPUT: 'f link f image map link'",
+     "SPEECH OUTPUT: 'e link e image map link'",
+     "SPEECH OUTPUT: 'd link d image map link'",
+     "SPEECH OUTPUT: 'c link c image map link'",
+     "SPEECH OUTPUT: 'b link b image map link'",
+     "SPEECH OUTPUT: 'a link a image map link'",
+     "SPEECH OUTPUT: 'Here is some text.'",
+     "SPEECH OUTPUT: 'Safeway had some interesting (and problematic) image maps. I didn't steal the images, 
but if you tab and look at the status bar, you should be able to see the URI for each region. We should also 
be speaking and brailling it correctly now -- at least as best as we can given what they gave us.'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'wk09_frozenmovie link image'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'image'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'blank'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_multi_line_text.params 
b/test/keystrokes/firefox/say_all_multi_line_text.params
new file mode 100644
index 0000000..815c992
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_multi_line_text.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/multi-line.html
diff --git a/test/keystrokes/firefox/say_all_multi_line_text.py 
b/test/keystrokes/firefox/say_all_multi_line_text.py
new file mode 100644
index 0000000..fbf141b
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_multi_line_text.py
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Table test foo bar table row foo foo bar bar table row Hello'",
+     "SPEECH OUTPUT: 'heading level 3'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'This is a test'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' that is not very interesting. \u2022'",
+     "SPEECH OUTPUT: 'But it looks like'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' a real-world example. \u2022'",
+     "SPEECH OUTPUT: 'And that's'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' why this silly test is here. So it's '",
+     "SPEECH OUTPUT: 'far more interesting'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' than it looks. World'",
+     "SPEECH OUTPUT: 'heading level 3'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'The thing is'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' we can't copy content. •'",
+     "SPEECH OUTPUT: 'So we must'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' create silly tests. •'",
+     "SPEECH OUTPUT: 'Oh'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' well. At least it's '",
+     "SPEECH OUTPUT: 'over'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '.'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_nested_tables.params 
b/test/keystrokes/firefox/say_all_nested_tables.params
new file mode 100644
index 0000000..feec66e
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_nested_tables.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/nested-tables.html
diff --git a/test/keystrokes/firefox/say_all_nested_tables.py 
b/test/keystrokes/firefox/say_all_nested_tables.py
new file mode 100644
index 0000000..2254c4a
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_nested_tables.py
@@ -0,0 +1,49 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'nested-tables link image'",
+     "SPEECH OUTPUT: 'Campus'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '  .  '",
+     "SPEECH OUTPUT: 'Classroom'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '  .  '",
+     "SPEECH OUTPUT: 'Communicate'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '  .  '",
+     "SPEECH OUTPUT: 'Reports'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'Your Learning Plan'",
+     "SPEECH OUTPUT: 'Below is a list of the courses that make up your learning plan.  '",
+     "SPEECH OUTPUT: 'UNIX 2007'",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'Take Course'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'You have completed 87 of the 87 modules in this course.'",
+     "SPEECH OUTPUT: 'separator'",
+     "SPEECH OUTPUT: 'SQL Plus'",
+     "SPEECH OUTPUT: ' '",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'Take Course'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'blank'",
+     "SPEECH OUTPUT: 'You have completed 59 of the 184 modules in this course.'",
+     "SPEECH OUTPUT: 'separator'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_role_combo_box.params 
b/test/keystrokes/firefox/say_all_role_combo_box.params
new file mode 100644
index 0000000..d5d4a59
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_role_combo_box.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/combobox.html
diff --git a/test/keystrokes/firefox/say_all_role_combo_box.py 
b/test/keystrokes/firefox/say_all_role_combo_box.py
new file mode 100644
index 0000000..e1c344d
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_role_combo_box.py
@@ -0,0 +1,30 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Severity'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': Severity normal combo box'",
+     "SPEECH OUTPUT: 'Priority'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: ': Normal combo box'",
+     "SPEECH OUTPUT: 'Resolution: ",
+     "'",
+     "SPEECH OUTPUT: 'FIXED'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'Version'",
+     "SPEECH OUTPUT: '2.16 combo box'",
+     "SPEECH OUTPUT: 'Component'",
+     "SPEECH OUTPUT: 'Speech combo box'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_role_links.params 
b/test/keystrokes/firefox/say_all_role_links.params
new file mode 100644
index 0000000..6041395
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_role_links.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/anchors2.html
diff --git a/test/keystrokes/firefox/say_all_role_links.py b/test/keystrokes/firefox/say_all_role_links.py
new file mode 100644
index 0000000..0fe5a12
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_role_links.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Here are some of our local test files:'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'anchors.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'blockquotes.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'bugzilla_top.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'combobox.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'fieldset.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'htmlpage.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'image-test.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'linebreak-test.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'lists.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'samesizearea.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'simpleform.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'simpleheader.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'slash-test.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'status-bar.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'tables.html'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '•'",
+     "SPEECH OUTPUT: 'textattributes.html'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_role_lists.params 
b/test/keystrokes/firefox/say_all_role_lists.params
new file mode 100644
index 0000000..4634af5
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_role_lists.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/lists.html
diff --git a/test/keystrokes/firefox/say_all_role_lists.py b/test/keystrokes/firefox/say_all_role_lists.py
new file mode 100644
index 0000000..f143bae
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_role_lists.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Welcome to a List of Lists'",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'Lists are not only fun to make, they are fun to use. They help us: 1.remember what the 
heck we are doing each day 2.arrange long and arbitrary lines of text into ordered lists that are pleasing to 
the eye and suggest some sense of priority, even if it is artificial 3.look really cool when we carry them 
around on yellow Post-Itstm. 4.and that other thing I keep forgetting. Your ordered lists can start at a 
strange number, like: VI.And use roman numerals, g.You might try using letters as well, H.Maybe you prefer 
Big Letters, ix.or small roman numerals •But discs belong to unordered lists 50.Though you can set the value 
in a list item! Unordered list: •listing item ◦first sublevel ▪look for the bullet on ▪each sublevel ▪they 
should all be different, except here. â–ªsecond sublevel or you can specify a square â—¦if your TYPE is circle 
•or even a disc Franz Liszt ◦was a composer who was not square •would have liked the Who ◦feeling listle
 ss ▪blah, blah, blah •whine, whine, whine'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_simple_form.params 
b/test/keystrokes/firefox/say_all_simple_form.params
new file mode 100644
index 0000000..c5f2f6b
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_simple_form.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/simpleform.html
diff --git a/test/keystrokes/firefox/say_all_simple_form.py b/test/keystrokes/firefox/say_all_simple_form.py
new file mode 100644
index 0000000..a22bced
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_simple_form.py
@@ -0,0 +1,29 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["KNOWN ISSUE: We are guessing the list box label here; we should not",
+     "SPEECH OUTPUT: 'Type something here: entry'",
+     "SPEECH OUTPUT: 'Magic disappearing text trick: entry tab to me and I disappear'",
+     "SPEECH OUTPUT: 'Tell me a secret: password text'",
+     "SPEECH OUTPUT: 'Tell me a little more about yourself:",
+     " entry'",
+     "SPEECH OUTPUT: 'Check one or more: Red check box not checked Blue check box not checked Green check 
box not checked'",
+     "SPEECH OUTPUT: 'Make a selection: Water combo box'",
+     "SPEECH OUTPUT: 'Which sports do you like?",
+     " Which sports do you like? Hockey multi-select List with 4 items'",
+     "SPEECH OUTPUT: 'Dashing picture of Willie Walker image'",
+     "SPEECH OUTPUT: '",
+     "Ain't he handsome (please say yes)? not selected radio button Yes not selected radio button No'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_table_caption.params 
b/test/keystrokes/firefox/say_all_table_caption.params
new file mode 100644
index 0000000..71b25db
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_table_caption.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/table-caption.html
diff --git a/test/keystrokes/firefox/say_all_table_caption.py 
b/test/keystrokes/firefox/say_all_table_caption.py
new file mode 100644
index 0000000..39cc67a
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_table_caption.py
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Below is a table, with some sample table data'",
+     "SPEECH OUTPUT: 'this is a caption for this table'",
+     "SPEECH OUTPUT: 'caption'",
+     "SPEECH OUTPUT: 'col1'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'col2'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: 'col3'",
+     "SPEECH OUTPUT: 'column header'",
+     "SPEECH OUTPUT: '1'",
+     "SPEECH OUTPUT: '2'",
+     "SPEECH OUTPUT: '3'",
+     "SPEECH OUTPUT: '4'",
+     "SPEECH OUTPUT: '5'",
+     "SPEECH OUTPUT: '6'",
+     "SPEECH OUTPUT: '7'",
+     "SPEECH OUTPUT: '8'",
+     "SPEECH OUTPUT: '9'",
+     "SPEECH OUTPUT: 'hope the table looks pretty'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_table_cell_links.params 
b/test/keystrokes/firefox/say_all_table_cell_links.params
new file mode 100644
index 0000000..367ac98
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_table_cell_links.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/table-cell-links.html
diff --git a/test/keystrokes/firefox/say_all_table_cell_links.py 
b/test/keystrokes/firefox/say_all_table_cell_links.py
new file mode 100644
index 0000000..b028776
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_table_cell_links.py
@@ -0,0 +1,38 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["SPEECH OUTPUT: 'Here are some links'",
+     "SPEECH OUTPUT: 'HTML Tags",
+     "",
+     "'",
+     "SPEECH OUTPUT: '<!-->'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: '<!DOCTYPE>'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: '<a>'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: '<abbr>'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: '",
+     "'",
+     "SPEECH OUTPUT: '<acronym>'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/say_all_wiki.params b/test/keystrokes/firefox/say_all_wiki.params
new file mode 100644
index 0000000..0dafc37
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_wiki.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/orca-wiki.html
diff --git a/test/keystrokes/firefox/say_all_wiki.py b/test/keystrokes/firefox/say_all_wiki.py
new file mode 100644
index 0000000..5a2441c
--- /dev/null
+++ b/test/keystrokes/firefox/say_all_wiki.py
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+
+"""Test of sayAll."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Add"))
+sequence.append(utils.AssertPresentationAction(
+    "1. KP_Add to do a SayAll",
+    ["KNOWN ISSUE: Say All is not living up to its name.",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'News'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Projects'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Art'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Support'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Development'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Community'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'live.gnome.org '",
+     "SPEECH OUTPUT: 'heading level 1'",
+     "SPEECH OUTPUT: 'entry Search'",
+     "SPEECH OUTPUT: 'Titles push button grayed Text push button grayed'",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'RecentChanges'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'FindPage'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'HelpContents'",
+     "SPEECH OUTPUT: 'link'",
+     "SPEECH OUTPUT: 'Orca'",
+     "SPEECH OUTPUT: 'link'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/spelling_errors.params b/test/keystrokes/firefox/spelling_errors.params
new file mode 100644
index 0000000..c5f2f6b
--- /dev/null
+++ b/test/keystrokes/firefox/spelling_errors.params
@@ -0,0 +1 @@
+PARAMS=$TEST_DIR/../../html/simpleform.html
diff --git a/test/keystrokes/firefox/spelling_errors.py b/test/keystrokes/firefox/spelling_errors.py
index 523bdde..e5bc582 100644
--- a/test/keystrokes/firefox/spelling_errors.py
+++ b/test/keystrokes/firefox/spelling_errors.py
@@ -1,144 +1,21 @@
 #!/usr/bin/python
 
-"""Test of line navigation output of Firefox on a page with a simple
-form.
-"""
+"""Test presentation of spelling errors in text."""
 
 from macaroon.playback import *
 import utils
 
 sequence = MacroSequence()
 
-########################################################################
-# We wait for the focus to be on a blank Firefox window.
-#
-sequence.append(WaitForWindowActivate(utils.firefoxFrameNames, None))
-
-########################################################################
-# Load the local "simple form" test case.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction(utils.htmlURLPrefix + "simpleform.html"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-sequence.append(WaitForFocus(utils.htmlURLPrefix + "simpleform.html",
-                             acc_role=pyatspi.ROLE_DOCUMENT_FRAME))
-
-########################################################################
-# Press Control+Home to move to the top.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Home"))
-sequence.append(utils.AssertPresentationAction(
-    "Top of file",
-    ["BRAILLE LINE:  'Type something here:  $l'",
-     "     VISIBLE:  'Type something here:  $l', cursor=1",
-     "SPEECH OUTPUT: 'Type something here: text'"]))
-
-########################################################################
-# Press Tab to reach the multi-line entry. Then select all the text and
-# delete it.
-#
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyComboAction("Tab"))
 sequence.append(KeyComboAction("<Control>a"))
 sequence.append(KeyComboAction("Delete"))
-
-sequence.append(PauseAction(3000))
-
-########################################################################
-# Type some text with misspelled words.
-#
-sequence.append(utils.StartRecordingAction())
 sequence.append(TypeAction("Thiss is a tesst. "))
-sequence.append(utils.AssertPresentationAction(
-    "Type a sentence with mistakes",
-    ["BRAILLE LINE:  'T $l'",
-     "     VISIBLE:  'T $l', cursor=2",
-     "BRAILLE LINE:  'T $l'",
-     "     VISIBLE:  'T $l', cursor=2",
-     "BRAILLE LINE:  'T $l'",
-     "     VISIBLE:  'T $l', cursor=2",
-     "BRAILLE LINE:  'Th $l'",
-     "     VISIBLE:  'Th $l', cursor=3",
-     "BRAILLE LINE:  'Th $l'",
-     "     VISIBLE:  'Th $l', cursor=3",
-     "BRAILLE LINE:  'Thi $l'",
-     "     VISIBLE:  'Thi $l', cursor=4",
-     "BRAILLE LINE:  'Thi $l'",
-     "     VISIBLE:  'Thi $l', cursor=4",
-     "BRAILLE LINE:  'This $l'",
-     "     VISIBLE:  'This $l', cursor=5",
-     "BRAILLE LINE:  'This $l'",
-     "     VISIBLE:  'This $l', cursor=5",
-     "BRAILLE LINE:  'Thiss $l'",
-     "     VISIBLE:  'Thiss $l', cursor=6",
-     "BRAILLE LINE:  'Thiss $l'",
-     "     VISIBLE:  'Thiss $l', cursor=6",
-     "BRAILLE LINE:  'Thiss  $l'",
-     "     VISIBLE:  'Thiss  $l', cursor=7",
-     "BRAILLE LINE:  'Thiss  $l'",
-     "     VISIBLE:  'Thiss  $l', cursor=7",
-     "BRAILLE LINE:  'Thiss i $l'",
-     "     VISIBLE:  'Thiss i $l', cursor=8",
-     "BRAILLE LINE:  'Thiss i $l'",
-     "     VISIBLE:  'Thiss i $l', cursor=8",
-     "BRAILLE LINE:  'Thiss is $l'",
-     "     VISIBLE:  'Thiss is $l', cursor=9",
-     "BRAILLE LINE:  'Thiss is $l'",
-     "     VISIBLE:  'Thiss is $l', cursor=9",
-     "BRAILLE LINE:  'Thiss is  $l'",
-     "     VISIBLE:  'Thiss is  $l', cursor=10",
-     "BRAILLE LINE:  'Thiss is  $l'",
-     "     VISIBLE:  'Thiss is  $l', cursor=10",
-     "BRAILLE LINE:  'Thiss is a $l'",
-     "     VISIBLE:  'Thiss is a $l', cursor=11",
-     "BRAILLE LINE:  'Thiss is a $l'",
-     "     VISIBLE:  'Thiss is a $l', cursor=11",
-     "BRAILLE LINE:  'Thiss is a  $l'",
-     "     VISIBLE:  'Thiss is a  $l', cursor=12",
-     "BRAILLE LINE:  'Thiss is a  $l'",
-     "     VISIBLE:  'Thiss is a  $l', cursor=12",
-     "BRAILLE LINE:  'Thiss is a t $l'",
-     "     VISIBLE:  'Thiss is a t $l', cursor=13",
-     "BRAILLE LINE:  'Thiss is a t $l'",
-     "     VISIBLE:  'Thiss is a t $l', cursor=13",
-     "BRAILLE LINE:  'Thiss is a te $l'",
-     "     VISIBLE:  'Thiss is a te $l', cursor=14",
-     "BRAILLE LINE:  'Thiss is a te $l'",
-     "     VISIBLE:  'Thiss is a te $l', cursor=14",
-     "BRAILLE LINE:  'Thiss is a tes $l'",
-     "     VISIBLE:  'Thiss is a tes $l', cursor=15",
-     "BRAILLE LINE:  'Thiss is a tes $l'",
-     "     VISIBLE:  'Thiss is a tes $l', cursor=15",
-     "BRAILLE LINE:  'Thiss is a tess $l'",
-     "     VISIBLE:  'Thiss is a tess $l', cursor=16",
-     "BRAILLE LINE:  'Thiss is a tess $l'",
-     "     VISIBLE:  'Thiss is a tess $l', cursor=16",
-     "BRAILLE LINE:  'Thiss is a tesst $l'",
-     "     VISIBLE:  'Thiss is a tesst $l', cursor=17",
-     "BRAILLE LINE:  'Thiss is a tesst $l'",
-     "     VISIBLE:  'Thiss is a tesst $l', cursor=17",
-     "BRAILLE LINE:  'Thiss is a tesst. $l'",
-     "     VISIBLE:  'Thiss is a tesst. $l', cursor=18",
-     "BRAILLE LINE:  'Thiss is a tesst. $l'",
-     "     VISIBLE:  'Thiss is a tesst. $l', cursor=18",
-     "BRAILLE LINE:  'Thiss is a tesst.  $l'",
-     "     VISIBLE:  'Thiss is a tesst.  $l', cursor=19",
-     "BRAILLE LINE:  'Thiss is a tesst.  $l'",
-     "     VISIBLE:  'Thiss is a tesst.  $l', cursor=19",
-     "SPEECH OUTPUT: 'misspelled'",
-     "SPEECH OUTPUT: 'misspelled'"]))
 
-########################################################################
-# Left Arrow through the text.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Left"))
 sequence.append(utils.AssertPresentationAction(
@@ -285,13 +162,10 @@ sequence.append(utils.AssertPresentationAction(
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=1",
      "SPEECH OUTPUT: 'T'"]))
 
-########################################################################
-# Right Arrow through the text.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Right",
+    "19. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=2",
      "SPEECH OUTPUT: 'h'"]))
@@ -299,7 +173,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Right",
+    "20. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=3",
      "SPEECH OUTPUT: 'i'"]))
@@ -307,7 +181,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Right",
+    "21. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=4",
      "SPEECH OUTPUT: 's'"]))
@@ -315,7 +189,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Right",
+    "22. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=5",
      "SPEECH OUTPUT: 's'"]))
@@ -323,7 +197,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "5. Right",
+    "23. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=6",
      "SPEECH OUTPUT: 'space'"]))
@@ -331,7 +205,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "6. Right",
+    "24. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=7",
      "SPEECH OUTPUT: 'i'"]))
@@ -339,7 +213,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "7. Right",
+    "25. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=8",
      "SPEECH OUTPUT: 's'"]))
@@ -347,7 +221,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "8. Right",
+    "26. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=9",
      "SPEECH OUTPUT: 'space'"]))
@@ -355,7 +229,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "9. Right",
+    "27. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=10",
      "SPEECH OUTPUT: 'a'"]))
@@ -363,7 +237,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "10. Right",
+    "28. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=11",
      "SPEECH OUTPUT: 'space'"]))
@@ -371,7 +245,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "11. Right",
+    "29. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=12",
      "SPEECH OUTPUT: 'misspelled'",
@@ -380,7 +254,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "12. Right",
+    "30. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=13",
      "SPEECH OUTPUT: 'e'"]))
@@ -388,7 +262,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "13. Right",
+    "31. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=14",
      "SPEECH OUTPUT: 's'"]))
@@ -396,7 +270,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "14. Right",
+    "32. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=15",
      "SPEECH OUTPUT: 's'"]))
@@ -404,7 +278,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "15. Right",
+    "33. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=16",
      "SPEECH OUTPUT: 't'"]))
@@ -412,7 +286,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "16. Right",
+    "34. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=17",
      "SPEECH OUTPUT: 'dot'"]))
@@ -420,7 +294,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "17. Right",
+    "35. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=18",
      "SPEECH OUTPUT: 'space'"]))
@@ -428,28 +302,24 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("Right"))
 sequence.append(utils.AssertPresentationAction(
-    "18. Right",
+    "36. Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=19",
-     "SPEECH OUTPUT: 'blank'"]))
+     "SPEECH OUTPUT: 'blank' voice=system"]))
 
-########################################################################
-# Control+Left Arrow through the text.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Left"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Control Left",
+    "37. Control Left",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=12",
-     "SPEECH OUTPUT: 'misspelled'",
-     "SPEECH OUTPUT: 'tesst. ",
-     "'"]))
+     "SPEECH OUTPUT: 'misspelled' voice=system",
+     "SPEECH OUTPUT: 'tesst. '"]))
 
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Left"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Control Left",
+    "38. Control Left",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=10",
      "SPEECH OUTPUT: 'a '"]))
@@ -457,7 +327,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Left"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Control Left",
+    "39. Control Left",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=7",
      "SPEECH OUTPUT: 'is '"]))
@@ -465,32 +335,27 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Left"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Control Left",
+    "40. Control Left",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=1",
      "SPEECH OUTPUT: 'misspelled'",
      "SPEECH OUTPUT: 'Thiss '"]))
 
-########################################################################
-# Get the formatting of this word (which is misspelled)
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("f"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Insert+f",
-    ["SPEECH OUTPUT: 'size 9pt'",
-     "SPEECH OUTPUT: 'family name monospace'",
-     "SPEECH OUTPUT: 'mistake spelling'"]))
+    "41. Insert+f",
+    ["SPEECH OUTPUT: 'size 9pt' voice=system",
+     "SPEECH OUTPUT: 'family name DejaVu Sans Mono' voice=system",
+     "SPEECH OUTPUT: 'weight 400' voice=system",
+     "SPEECH OUTPUT: 'style normal' voice=system"]))
 
-########################################################################
-# Control+Right Arrow through the text.
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "1. Control Right",
+    "42. Control Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=6",
      "SPEECH OUTPUT: 'Thiss '"]))
@@ -498,7 +363,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "2. Control Right",
+    "43. Control Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=9",
      "SPEECH OUTPUT: 'is '"]))
@@ -506,7 +371,7 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "3. Control Right",
+    "44. Control Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=11",
      "SPEECH OUTPUT: 'a '"]))
@@ -514,42 +379,22 @@ sequence.append(utils.AssertPresentationAction(
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyComboAction("<Control>Right"))
 sequence.append(utils.AssertPresentationAction(
-    "4. Control Right",
+    "45. Control Right",
     ["BRAILLE LINE:  'Thiss is a tesst.  $l'",
      "     VISIBLE:  'Thiss is a tesst.  $l', cursor=18",
      "SPEECH OUTPUT: 'misspelled'",
-     "SPEECH OUTPUT: 'tesst. ",
-     "'"]))
+     "SPEECH OUTPUT: 'tesst. '"]))
 
-########################################################################
-# Get the formatting of this word (which is not misspelled)
-#
 sequence.append(utils.StartRecordingAction())
 sequence.append(KeyPressAction(0, None, "KP_Insert"))
 sequence.append(KeyComboAction("f"))
 sequence.append(KeyReleaseAction(0, None, "KP_Insert"))
 sequence.append(utils.AssertPresentationAction(
-    "Insert+f",
-    ["SPEECH OUTPUT: 'size 9pt'",
-     "SPEECH OUTPUT: 'family name monospace'"]))
-
-########################################################################
-# Move to the location bar by pressing Control+L.  When it has focus
-# type "about:blank" and press Return to restore the browser to the
-# conditions at the test's start.
-#
-sequence.append(KeyComboAction("<Control>l"))
-sequence.append(WaitForFocus(acc_role=pyatspi.ROLE_ENTRY))
-
-sequence.append(TypeAction("about:blank"))
-sequence.append(KeyComboAction("Return"))
-
-sequence.append(WaitForDocLoad())
-
-# Just a little extra wait to let some events get through.
-#
-sequence.append(PauseAction(3000))
+    "46. Insert+f",
+    ["SPEECH OUTPUT: 'size 9pt' voice=system",
+     "SPEECH OUTPUT: 'family name DejaVu Sans Mono' voice=system",
+     "SPEECH OUTPUT: 'weight 400' voice=system",
+     "SPEECH OUTPUT: 'style normal' voice=system"]))
 
 sequence.append(utils.AssertionSummaryAction())
-
 sequence.start()
diff --git a/test/keystrokes/firefox/ui_doc_tabs.params b/test/keystrokes/firefox/ui_doc_tabs.params
new file mode 100644
index 0000000..8927e95
--- /dev/null
+++ b/test/keystrokes/firefox/ui_doc_tabs.params
@@ -0,0 +1 @@
+PARAMS="$TEST_DIR/../../html/htmlpage.html $TEST_DIR/../../html/orca-wiki.html 
$TEST_DIR/../../html/bugzilla-top.html"
diff --git a/test/keystrokes/firefox/ui_doc_tabs.py b/test/keystrokes/firefox/ui_doc_tabs.py
new file mode 100644
index 0000000..626b6bf
--- /dev/null
+++ b/test/keystrokes/firefox/ui_doc_tabs.py
@@ -0,0 +1,63 @@
+#!/usr/bin/python
+
+"""Test of document tabs"""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>2"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Switch to second page tab - Orca wiki",
+    ["BRAILLE LINE:  'Firefox application Orca - GNOME Live! - Mozilla Firefox frame Browser tabs tool bar 
Orca - GNOME Live! page tab'",
+     "     VISIBLE:  'Orca - GNOME Live! page tab', cursor=1",
+     "BRAILLE LINE:  'Home News Projects Art Support Development Community'",
+     "     VISIBLE:  'Home News Projects Art Support D', cursor=1",
+     "SPEECH OUTPUT: 'Orca - GNOME Live! page tab'",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>1"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Switch to first page tab - Test page",
+    ["BRAILLE LINE:  'Firefox application HTML test page - Mozilla Firefox frame Browser tabs tool bar HTML 
test page page tab'",
+     "     VISIBLE:  'HTML test page page tab', cursor=1",
+     "BRAILLE LINE:  'Test Formats'",
+     "     VISIBLE:  'Test Formats', cursor=1",
+     "SPEECH OUTPUT: 'HTML test page page tab'",
+     "SPEECH OUTPUT: 'Test Formats'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>3"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Switch to third page tab - Bugzilla",
+    ["BRAILLE LINE:  'Firefox application GNOME Bug Tracking System - Mozilla Firefox frame Browser tabs 
tool bar GNOME Bug Tracking System page tab'",
+     "     VISIBLE:  'GNOME Bug Tracking System page t', cursor=1",
+     "BRAILLE LINE:  ' $l Show push button [Help]'",
+     "     VISIBLE:  ' $l Show push button [Help]', cursor=1",
+     "BRAILLE LINE:  'Focus mode'",
+     "     VISIBLE:  'Focus mode', cursor=0",
+     "SPEECH OUTPUT: 'GNOME Bug Tracking System page tab'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Focus mode' voice=system"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Ctrl>w"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Close third page tab - land in second page",
+    ["BRAILLE LINE:  ' $l Show push button [Help]'",
+     "     VISIBLE:  ' $l Show push button [Help]', cursor=1",
+     "BRAILLE LINE:  'Firefox application Orca - GNOME Live! - Mozilla Firefox frame Browser tabs tool bar 
Orca - GNOME Live! page tab'",
+     "     VISIBLE:  'Orca - GNOME Live! page tab', cursor=1",
+     "BRAILLE LINE:  'Home News Projects Art Support Development Community'",
+     "     VISIBLE:  'Home News Projects Art Support D', cursor=1",
+     "SPEECH OUTPUT: 'Orca - GNOME Live! page tab'",
+     "SPEECH OUTPUT: 'Home'",
+     "SPEECH OUTPUT: 'link' voice=hyperlink"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_accel_label.py b/test/keystrokes/firefox/ui_role_accel_label.py
new file mode 100644
index 0000000..5e11502
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_accel_label.py
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+
+"""Test of menu accelerator label output of Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>f"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Down Arrow in File menu",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar New 
Window(Ctrl+N)'",
+     "     VISIBLE:  'New Window(Ctrl+N)', cursor=1",
+     "SPEECH OUTPUT: 'New Window Ctrl+N'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down Arrow in File menu",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar New 
Private Window(Shift+Ctrl+P)'",
+     "     VISIBLE:  'New Private Window(Shift+Ctrl+P)', cursor=1",
+     "SPEECH OUTPUT: 'New Private Window Shift+Ctrl+P'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar New 
Private Window(Shift+Ctrl+P)'",
+     "     VISIBLE:  'New Private Window(Shift+Ctrl+P)', cursor=1",
+     "SPEECH OUTPUT: 'Menu Bar'",
+     "SPEECH OUTPUT: 'File'",
+     "SPEECH OUTPUT: 'menu'",
+     "SPEECH OUTPUT: 'tool bar'",
+     "SPEECH OUTPUT: 'New Private Window'",
+     "SPEECH OUTPUT: 'Shift+Ctrl+P 3 of 12.'",
+     "SPEECH OUTPUT: 'W'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_check_box.py b/test/keystrokes/firefox/ui_role_check_box.py
new file mode 100644
index 0000000..cad84ac
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_check_box.py
@@ -0,0 +1,77 @@
+#!/usr/bin/python
+
+"""Test of gtk+ checkbox output from within Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>f"))
+sequence.append(KeyComboAction("p"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Right Arrow to Page Setup",
+    ["BRAILLE LINE:  'Firefox application Print dialog Page Setup page tab'",
+     "     VISIBLE:  'Page Setup page tab', cursor=1",
+     "SPEECH OUTPUT: 'Page Setup page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Right Arrow to Options",
+    ["BRAILLE LINE:  'Firefox application Print dialog Options page tab'",
+     "     VISIBLE:  'Options page tab', cursor=1",
+     "SPEECH OUTPUT: 'Options page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Tab to checkbox",
+    ["BRAILLE LINE:  'Firefox application Print dialog Options page tab <x> Ignore Scaling and Shrink To Fit 
Page Width check box'",
+     "     VISIBLE:  '<x> Ignore Scaling and Shrink To', cursor=1",
+     "SPEECH OUTPUT: 'Ignore Scaling and Shrink To Fit Page Width check box checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Print dialog Options page tab <x> Ignore Scaling and Shrink To Fit 
Page Width check box'",
+     "     VISIBLE:  '<x> Ignore Scaling and Shrink To', cursor=1",
+     "SPEECH OUTPUT: 'Ignore Scaling and Shrink To Fit Page Width'",
+     "SPEECH OUTPUT: 'check box checked.'",
+     "SPEECH OUTPUT: 'Alt+H'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "5. Toggle the state with space",
+    ["BRAILLE LINE:  'Firefox application Print dialog Options page tab < > Ignore Scaling and Shrink To Fit 
Page Width check box'",
+     "     VISIBLE:  '< > Ignore Scaling and Shrink To', cursor=1",
+     "SPEECH OUTPUT: 'not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Print dialog Options page tab < > Ignore Scaling and Shrink To Fit 
Page Width check box'",
+     "     VISIBLE:  '< > Ignore Scaling and Shrink To', cursor=1",
+     "SPEECH OUTPUT: 'Ignore Scaling and Shrink To Fit Page Width'",
+     "SPEECH OUTPUT: 'check box not checked.'",
+     "SPEECH OUTPUT: 'Alt+H'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction(" "))
+sequence.append(utils.AssertPresentationAction(
+    "7. Toggle the state with space",
+    ["BRAILLE LINE:  'Firefox application Print dialog Options page tab <x> Ignore Scaling and Shrink To Fit 
Page Width check box'",
+     "     VISIBLE:  '<x> Ignore Scaling and Shrink To', cursor=1",
+     "SPEECH OUTPUT: 'checked'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_check_menu_item.py 
b/test/keystrokes/firefox/ui_role_check_menu_item.py
new file mode 100644
index 0000000..c070336
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_check_menu_item.py
@@ -0,0 +1,37 @@
+#!/usr/bin/python
+
+"""Test of menu checkbox output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>v"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Up Arrow in View menu",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar < > 
Full Screen check menu item'",
+     "     VISIBLE:  '< > Full Screen check menu item', cursor=1",
+     "SPEECH OUTPUT: 'Full Screen check menu item not checked'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar < > 
Full Screen check menu item'",
+     "     VISIBLE:  '< > Full Screen check menu item', cursor=1",
+     "SPEECH OUTPUT: 'Menu Bar'",
+     "SPEECH OUTPUT: 'View'",
+     "SPEECH OUTPUT: 'menu'",
+     "SPEECH OUTPUT: 'tool bar'",
+     "SPEECH OUTPUT: 'Full Screen'",
+     "SPEECH OUTPUT: 'check menu item not checked 6 of 6.'",
+     "SPEECH OUTPUT: 'F'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_combo_box.py b/test/keystrokes/firefox/ui_role_combo_box.py
new file mode 100644
index 0000000..90fef44
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_combo_box.py
@@ -0,0 +1,111 @@
+#!/usr/bin/python
+
+"""Test of combo box output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>e"))
+sequence.append(KeyComboAction("Up"))
+sequence.append(KeyComboAction("Return"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Tab to combobox",
+    ["KNOWN ISSUE: The braille isn't right here and in the tests that follow",
+     "BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup When Firefox starts: When 
Firefox starts: combo box'",
+     "     VISIBLE:  'When Firefox starts: When Firefo', cursor=22",
+     "SPEECH OUTPUT: 'Startup panel'",
+     "SPEECH OUTPUT: 'When Firefox starts: Show a blank page combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down Arrow in combobox",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup When Firefox starts: When 
Firefox starts: combo box'",
+     "     VISIBLE:  'When Firefox starts: When Firefo', cursor=22",
+     "SPEECH OUTPUT: 'Show my windows and tabs from last time'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Up Arrow in combobox",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup When Firefox starts: When 
Firefox starts: combo box'",
+     "     VISIBLE:  'When Firefox starts: When Firefo', cursor=22",
+     "SPEECH OUTPUT: 'Show a blank page'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>Down"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Alt Down Arrow to expand combobox",
+    ["KNOWN ISSUE: We should present something here.",
+     ""]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Down Arrow in expanded combobox",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup  combo boxWhen Firefox starts: 
When Firefox starts: Show my windows and tabs from last time'",
+     "     VISIBLE:  'Show my windows and tabs from la', cursor=1",
+     "SPEECH OUTPUT: 'Show my windows and tabs from last time'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Up Arrow in expanded combobox",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup  combo boxWhen Firefox starts: 
When Firefox starts: Show a blank page'",
+     "     VISIBLE:  'Show a blank page', cursor=1",
+     "SPEECH OUTPUT: 'Show a blank page'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Return"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Return to collapse combobox",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup When Firefox starts: When 
Firefox starts: combo box'",
+     "     VISIBLE:  'When Firefox starts: When Firefo', cursor=22",
+     "BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup When Firefox starts: When 
Firefox starts: combo box'",
+     "     VISIBLE:  'When Firefox starts: When Firefo', cursor=22",
+     "SPEECH OUTPUT: 'When Firefox starts: Show a blank page combo box'",
+     "SPEECH OUTPUT: 'Show a blank page'",
+     "SPEECH OUTPUT: 'combo box'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction("s"))
+sequence.append(utils.AssertPresentationAction(
+    "8. First letter navigation with s",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup When Firefox starts: When 
Firefox starts: combo box'",
+     "     VISIBLE:  'When Firefox starts: When Firefo', cursor=22",
+     "SPEECH OUTPUT: 'Show my home page'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(TypeAction("s"))
+sequence.append(utils.AssertPresentationAction(
+    "9. First letter navigation with s",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup When Firefox starts: When 
Firefox starts: combo box'",
+     "     VISIBLE:  'When Firefox starts: When Firefo', cursor=22",
+     "SPEECH OUTPUT: 'Show a blank page'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Basic Where Am I",
+    ["KNOWN ISSUE: Crazy chattines",
+     "BRAILLE LINE:  'Firefox application Firefox Preferences dialog Startup When Firefox starts: When 
Firefox starts: combo box'",
+     "     VISIBLE:  'When Firefox starts: When Firefo', cursor=22",
+     "SPEECH OUTPUT: 'Firefox Preferences'",
+     "SPEECH OUTPUT: 'Startup'",
+     "SPEECH OUTPUT: 'panel'",
+     "SPEECH OUTPUT: 'Show a blank page'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'Show a blank page'",
+     "SPEECH OUTPUT: 'combo box'",
+     "SPEECH OUTPUT: 'Show a blank page'",
+     "SPEECH OUTPUT: '1 of 2'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_entry.py b/test/keystrokes/firefox/ui_role_entry.py
new file mode 100644
index 0000000..53c3bcb
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_entry.py
@@ -0,0 +1,151 @@
+#!/usr/bin/python
+
+"""Test of entry output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>b"))
+sequence.append(KeyComboAction("Return"))
+
+########################################################################
+# Tab three times, then down arrow twice to Bookmarks Menu. (This is
+# necessary to add a new item).  Then Press Alt+O for Organize and Return
+# on "New Bookmark..."
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Tab"))
+sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("Down"))
+sequence.append(KeyComboAction("<Alt>o"))
+sequence.append(KeyComboAction("Return"))
+
+sequence.append(KeyComboAction("<Control>a"))
+sequence.append(KeyComboAction("BackSpace"))
+sequence.append(TypeAction("this is a test"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("BackSpace"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Backspace",
+    ["BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is a tes $l'",
+     "     VISIBLE:  'Name: this is a tes $l', cursor=20",
+     "BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is a tes $l'",
+     "     VISIBLE:  'Name: this is a tes $l', cursor=20",
+     "SPEECH OUTPUT: 't'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("BackSpace"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Backspace",
+    ["BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is a te $l'",
+     "     VISIBLE:  'Name: this is a te $l', cursor=19",
+     "BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is a te $l'",
+     "     VISIBLE:  'Name: this is a te $l', cursor=19",
+     "SPEECH OUTPUT: 's'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>BackSpace"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Control Backspace",
+    ["BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is a  $l'",
+     "     VISIBLE:  'Name: this is a  $l', cursor=17",
+     "BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is a  $l'",
+     "     VISIBLE:  'Name: this is a  $l', cursor=17",
+     "SPEECH OUTPUT: 'te'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>BackSpace"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Control Backspace",
+    ["BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is  $l'",
+     "     VISIBLE:  'Name: this is  $l', cursor=15",
+     "BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is  $l'",
+     "     VISIBLE:  'Name: this is  $l', cursor=15",
+     "SPEECH OUTPUT: 'a '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Left",
+    ["BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is  $l'",
+     "     VISIBLE:  'Name: this is  $l', cursor=14",
+     "SPEECH OUTPUT: 'space'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Left",
+    ["BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is  $l'",
+     "     VISIBLE:  'Name: this is  $l', cursor=13",
+     "SPEECH OUTPUT: 's'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Control>Left"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Control Left",
+    ["BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this is  $l'",
+     "     VISIBLE:  'Name: this is  $l', cursor=12",
+     "SPEECH OUTPUT: 'is '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Delete"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Delete",
+    ["BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this s  $l'",
+     "     VISIBLE:  'Name: this s  $l', cursor=12",
+     "SPEECH OUTPUT: 's'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Basic Where Am I",
+    ["KNOWN ISSUE: The mnemonic seems to have gone missing",
+     "BRAILLE LINE:  'Firefox application New Bookmark dialog Name: this s  $l'",
+     "     VISIBLE:  'Name: this s  $l', cursor=12",
+     "SPEECH OUTPUT: 'Name:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'this s '"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>d"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Alt+D to Description",
+    ["BRAILLE LINE:  'Description:  $l'",
+     "     VISIBLE:  'Description:  $l', cursor=14",
+     "SPEECH OUTPUT: 'Description: entry'"]))
+
+sequence.append(TypeAction("Here is the first line."))
+sequence.append(KeyComboAction("Return"))
+sequence.append(TypeAction("Here is the second line."))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Up Arrow",
+    ["BRAILLE LINE:  'Firefox application New Bookmark dialog Description: Here is the first line. $l'",
+     "     VISIBLE:  'iption: Here is the first line. ', cursor=32",
+     "SPEECH OUTPUT: 'Here is the first line.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Down Arrow",
+    ["BRAILLE LINE:  'Description: Here is the second line. $l'",
+     "     VISIBLE:  'ption: Here is the second line. ', cursor=32",
+     "SPEECH OUTPUT: 'Here is the second line.'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Basic Where Am I",
+    ["BRAILLE LINE:  'Description: Here is the second line. $l'",
+     "     VISIBLE:  'ption: Here is the second line. ', cursor=32",
+     "SPEECH OUTPUT: 'Description:'",
+     "SPEECH OUTPUT: 'entry'",
+     "SPEECH OUTPUT: 'Here is the second line.'"]))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_list_item.py b/test/keystrokes/firefox/ui_role_list_item.py
new file mode 100644
index 0000000..30a1e00
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_list_item.py
@@ -0,0 +1,47 @@
+#!/usr/bin/python
+
+"""Test of list item output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>e"))
+sequence.append(KeyComboAction("Up"))
+sequence.append(KeyComboAction("Return"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Right Arrow in list",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog Tabs list box General'",
+     "     VISIBLE:  'General', cursor=1",
+     "BRAILLE LINE:  'Firefox application Firefox Preferences dialog Tabs list box Tabs'",
+     "     VISIBLE:  'Tabs', cursor=1",
+     "SPEECH OUTPUT: 'Tabs'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Left Arrow in list",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog General list box Tabs'",
+     "     VISIBLE:  'Tabs', cursor=1",
+     "BRAILLE LINE:  'Firefox application Firefox Preferences dialog General list box General'",
+     "     VISIBLE:  'General', cursor=1",
+     "SPEECH OUTPUT: 'General'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Firefox Preferences dialog General list box General'",
+     "     VISIBLE:  'General', cursor=1",
+     "SPEECH OUTPUT: 'list item'",
+     "SPEECH OUTPUT: 'General'",
+     "SPEECH OUTPUT: '1 of 8'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_menu_bar.py b/test/keystrokes/firefox/ui_role_menu_bar.py
new file mode 100644
index 0000000..587e0d2
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_menu_bar.py
@@ -0,0 +1,49 @@
+#!/usr/bin/python
+
+"""Test of menu bar output of Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>f"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Right Arrow on menu bar",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Edit menu'",
+     "     VISIBLE:  'Edit menu', cursor=1",
+     "BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar Undo 
grayed(Ctrl+Z)'",
+     "     VISIBLE:  'Undo grayed(Ctrl+Z)', cursor=1",
+     "SPEECH OUTPUT: 'Edit menu'",
+     "SPEECH OUTPUT: 'Undo grayed Ctrl+Z'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Left Arrow on menu bar",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar New 
Tab(Ctrl+T)'",
+     "     VISIBLE:  'New Tab(Ctrl+T)', cursor=1",
+     "SPEECH OUTPUT: 'File menu'",
+     "SPEECH OUTPUT: 'New Tab Ctrl+T'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar New 
Tab(Ctrl+T)'",
+     "     VISIBLE:  'New Tab(Ctrl+T)', cursor=1",
+     "SPEECH OUTPUT: 'Menu Bar'",
+     "SPEECH OUTPUT: 'File'",
+     "SPEECH OUTPUT: 'menu'",
+     "SPEECH OUTPUT: 'tool bar'",
+     "SPEECH OUTPUT: 'New Tab'",
+     "SPEECH OUTPUT: 'Ctrl+T 1 of 12.'",
+     "SPEECH OUTPUT: 'T'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_page_tab.py b/test/keystrokes/firefox/ui_role_page_tab.py
new file mode 100644
index 0000000..80f779d
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_page_tab.py
@@ -0,0 +1,51 @@
+#!/usr/bin/python
+
+"""Test of page tab output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>f"))
+sequence.append(KeyComboAction("p"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Right Arrow to next page tab",
+    ["BRAILLE LINE:  'Firefox application Print dialog Page Setup page tab'",
+     "     VISIBLE:  'Page Setup page tab', cursor=1",
+     "SPEECH OUTPUT: 'Page Setup page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Right Arrow to next page tab",
+    ["BRAILLE LINE:  'Firefox application Print dialog Options page tab'",
+     "     VISIBLE:  'Options page tab', cursor=1",
+     "SPEECH OUTPUT: 'Options page tab'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Print dialog Options page tab'",
+     "     VISIBLE:  'Options page tab', cursor=1",
+     "SPEECH OUTPUT: 'page tab list'",
+     "SPEECH OUTPUT: 'Options'",
+     "SPEECH OUTPUT: 'page tab 3 of 5'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Left Arrow to previous page tab",
+    ["BRAILLE LINE:  'Firefox application Print dialog Page Setup page tab'",
+     "     VISIBLE:  'Page Setup page tab', cursor=1",
+     "SPEECH OUTPUT: 'Page Setup page tab'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_push_button.py b/test/keystrokes/firefox/ui_role_push_button.py
new file mode 100644
index 0000000..8b6e3fb
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_push_button.py
@@ -0,0 +1,34 @@
+#!/usr/bin/python
+
+"""Test of push button output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>f"))
+sequence.append(KeyComboAction("p"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>ISO_Left_Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Shift+Tab to button",
+    ["BRAILLE LINE:  'Firefox application Print dialog Print push button'",
+     "     VISIBLE:  'Print push button', cursor=1",
+     "SPEECH OUTPUT: 'Print push button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Print dialog Print push button'",
+     "     VISIBLE:  'Print push button', cursor=1",
+     "SPEECH OUTPUT: 'Print'",
+     "SPEECH OUTPUT: 'push button.'",
+     "SPEECH OUTPUT: 'Alt+P'"]))
+
+sequence.append(TypeAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_radio_button.py b/test/keystrokes/firefox/ui_role_radio_button.py
new file mode 100644
index 0000000..8635508
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_radio_button.py
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+
+"""Test of radio button output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>f"))
+sequence.append(KeyComboAction("p"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Alt>a"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Alt a to radio button group",
+    ["BRAILLE LINE:  'Firefox application Print dialog General page tab &=y All Pages radio button'",
+     "     VISIBLE:  '&=y All Pages radio button', cursor=1",
+     "SPEECH OUTPUT: 'General page tab'",
+     "SPEECH OUTPUT: 'All Pages selected radio button'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Print dialog General page tab &=y All Pages radio button'",
+     "     VISIBLE:  '&=y All Pages radio button', cursor=1",
+     "SPEECH OUTPUT: 'All Pages'",
+     "SPEECH OUTPUT: 'radio button selected 1 of 4.'",
+     "SPEECH OUTPUT: 'Alt+A'"]))
+
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_radio_menu_item.py 
b/test/keystrokes/firefox/ui_role_radio_menu_item.py
new file mode 100644
index 0000000..e861427
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_radio_menu_item.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+
+"""Test of menu radio button output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>v"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("y"))
+sequence.append(utils.AssertPresentationAction(
+    "1. y for the Page Style menu",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar View 
menu & y No Style radio menu item'",
+     "     VISIBLE:  '& y No Style radio menu item', cursor=1",
+     "SPEECH OUTPUT: 'Page Style menu'",
+     "SPEECH OUTPUT: 'No Style not selected radio menu item'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar View 
menu & y No Style radio menu item'",
+     "     VISIBLE:  '& y No Style radio menu item', cursor=1",
+     "SPEECH OUTPUT: 'Menu Bar'",
+     "SPEECH OUTPUT: 'View'",
+     "SPEECH OUTPUT: 'menu'",
+     "SPEECH OUTPUT: 'Page Style'",
+     "SPEECH OUTPUT: 'menu'",
+     "SPEECH OUTPUT: 'tool bar'",
+     "SPEECH OUTPUT: 'No Style'",
+     "SPEECH OUTPUT: 'radio menu item not selected 1 of 2.'",
+     "SPEECH OUTPUT: 'N'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Down Arrow in menu",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar View 
menu &=y Basic Page Style radio menu item'",
+     "     VISIBLE:  '&=y Basic Page Style radio menu ', cursor=1",
+     "SPEECH OUTPUT: 'Basic Page Style selected radio menu item'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Mozilla Firefox frame Menu Bar tool bar Application menu bar View 
menu &=y Basic Page Style radio menu item'",
+     "     VISIBLE:  '&=y Basic Page Style radio menu ', cursor=1",
+     "SPEECH OUTPUT: 'Menu Bar'",
+     "SPEECH OUTPUT: 'View'",
+     "SPEECH OUTPUT: 'menu'",
+     "SPEECH OUTPUT: 'Page Style'",
+     "SPEECH OUTPUT: 'menu'",
+     "SPEECH OUTPUT: 'tool bar'",
+     "SPEECH OUTPUT: 'Basic Page Style'",
+     "SPEECH OUTPUT: 'radio menu item selected 2 of 2.'",
+     "SPEECH OUTPUT: 'B'"]))
+
+sequence.append(KeyComboAction("Escape"))
+sequence.append(KeyComboAction("Escape"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_tree.py b/test/keystrokes/firefox/ui_role_tree.py
new file mode 100644
index 0000000..4b4d196
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_tree.py
@@ -0,0 +1,126 @@
+#!/usr/bin/python
+
+"""Test of tree output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>b"))
+sequence.append(KeyComboAction("Return"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("<Shift>Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Shift Tab for tree",
+    ["BRAILLE LINE:  'Firefox application Library frame All Bookmarks expanded list item TREE LEVEL 1'",
+     "     VISIBLE:  'All Bookmarks expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'All Bookmarks expanded'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Down Arrow in tree",
+    ["BRAILLE LINE:  'Firefox application Library frame Bookmarks Toolbar collapsed list item TREE LEVEL 2'",
+     "     VISIBLE:  'Bookmarks Toolbar collapsed list', cursor=1",
+     "SPEECH OUTPUT: 'Bookmarks Toolbar collapsed tree level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Down Arrow in tree",
+    ["BRAILLE LINE:  'Firefox application Library frame Bookmarks Menu collapsed list item TREE LEVEL 2'",
+     "     VISIBLE:  'Bookmarks Menu collapsed list it', cursor=1",
+     "SPEECH OUTPUT: 'Bookmarks Menu collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "4. Basic Where Am I", 
+    ["BRAILLE LINE:  'Firefox application Library frame Bookmarks Menu collapsed list item TREE LEVEL 2'",
+     "     VISIBLE:  'Bookmarks Menu collapsed list it', cursor=1",
+     "SPEECH OUTPUT: 'list item'",
+     "SPEECH OUTPUT: 'Bookmarks Menu'",
+     "SPEECH OUTPUT: '2 of 3 collapsed tree level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Right"))
+sequence.append(utils.AssertPresentationAction(
+    "5. Right Arrow to expand folder", 
+    ["BRAILLE LINE:  'Firefox application Library frame Bookmarks Menu expanded list item TREE LEVEL 2'",
+     "     VISIBLE:  'Bookmarks Menu expanded list ite', cursor=1",
+     "SPEECH OUTPUT: 'expanded'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "6. Basic Where Am I", 
+    ["BRAILLE LINE:  'Firefox application Library frame Bookmarks Menu expanded list item TREE LEVEL 2'",
+     "     VISIBLE:  'Bookmarks Menu expanded list ite', cursor=1",
+     "SPEECH OUTPUT: 'list item'",
+     "SPEECH OUTPUT: 'Bookmarks Menu'",
+     "SPEECH OUTPUT: '2 of 3 expanded tree level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "7. Down Arrow in tree",
+    ["BRAILLE LINE:  'Firefox application Library frame Recently Bookmarked list item TREE LEVEL 3'",
+     "     VISIBLE:  'Recently Bookmarked list item TR', cursor=1",
+     "SPEECH OUTPUT: 'Recently Bookmarked tree level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "8. Basic Where Am I", 
+    ["BRAILLE LINE:  'Firefox application Library frame Recently Bookmarked list item TREE LEVEL 3'",
+     "     VISIBLE:  'Recently Bookmarked list item TR', cursor=1",
+     "SPEECH OUTPUT: 'list item'",
+     "SPEECH OUTPUT: 'Recently Bookmarked'",
+     "SPEECH OUTPUT: '1 of 4 tree level 3'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "9. Up Arrow in tree",
+    ["BRAILLE LINE:  'Firefox application Library frame Bookmarks Menu expanded list item TREE LEVEL 2'",
+     "     VISIBLE:  'Bookmarks Menu expanded list ite', cursor=1",
+     "SPEECH OUTPUT: 'Bookmarks Menu expanded tree level 2'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Left"))
+sequence.append(utils.AssertPresentationAction(
+    "10. Left Arrow to collapse folder", 
+    ["BRAILLE LINE:  'Firefox application Library frame Bookmarks Menu collapsed list item TREE LEVEL 2'",
+     "     VISIBLE:  'Bookmarks Menu collapsed list it', cursor=1",
+     "SPEECH OUTPUT: 'collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "11. Up Arrow in tree",
+    ["BRAILLE LINE:  'Firefox application Library frame Bookmarks Toolbar collapsed list item TREE LEVEL 2'",
+     "     VISIBLE:  'Bookmarks Toolbar collapsed list', cursor=1",
+     "SPEECH OUTPUT: 'Bookmarks Toolbar collapsed'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "12. Up Arrow in tree",
+    ["BRAILLE LINE:  'Firefox application Library frame All Bookmarks expanded list item TREE LEVEL 1'",
+     "     VISIBLE:  'All Bookmarks expanded list item', cursor=1",
+     "SPEECH OUTPUT: 'All Bookmarks expanded tree level 1'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Tab"))
+sequence.append(utils.AssertPresentationAction(
+    "13. Tab back to tree table",
+    ["BRAILLE LINE:  'Firefox application Library frame tree table Tags column header Bookmarks Toolbar 
table row TREE LEVEL 1'",
+     "     VISIBLE:  'Bookmarks Toolbar table row TREE', cursor=1",
+     "SPEECH OUTPUT: 'Bookmarks Toolbar table row'"]))
+
+sequence.append(KeyComboAction("<Alt>F4"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()
diff --git a/test/keystrokes/firefox/ui_role_tree_table.py b/test/keystrokes/firefox/ui_role_tree_table.py
new file mode 100644
index 0000000..a56f60c
--- /dev/null
+++ b/test/keystrokes/firefox/ui_role_tree_table.py
@@ -0,0 +1,41 @@
+#!/usr/bin/python
+
+"""Test of tree table output using Firefox."""
+
+from macaroon.playback import *
+import utils
+
+sequence = MacroSequence()
+
+sequence.append(KeyComboAction("<Alt>b"))
+sequence.append(KeyComboAction("Return"))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Down"))
+sequence.append(utils.AssertPresentationAction(
+    "1. Down Arrow in tree table",
+    ["BRAILLE LINE:  'Firefox application Library frame tree table Location column header Bookmarks Menu 
table row TREE LEVEL 1'",
+     "     VISIBLE:  'Bookmarks Menu table row TREE LE', cursor=1",
+     "SPEECH OUTPUT: 'Bookmarks Menu table row'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("KP_Enter"))
+sequence.append(utils.AssertPresentationAction(
+    "2. Basic Where Am I",
+    ["BRAILLE LINE:  'Firefox application Library frame tree table Location column header Bookmarks Menu 
table row TREE LEVEL 1'",
+     "     VISIBLE:  'Bookmarks Menu table row TREE LE', cursor=1",
+     "SPEECH OUTPUT: 'Bookmarks Menu'",
+     "SPEECH OUTPUT: 'table row'"]))
+
+sequence.append(utils.StartRecordingAction())
+sequence.append(KeyComboAction("Up"))
+sequence.append(utils.AssertPresentationAction(
+    "3. Up Arrow in tree table",
+    ["BRAILLE LINE:  'Firefox application Library frame tree table Tags column header Bookmarks Toolbar 
table row TREE LEVEL 1'",
+     "     VISIBLE:  'Bookmarks Toolbar table row TREE', cursor=1",
+     "SPEECH OUTPUT: 'Bookmarks Toolbar table row'"]))
+
+sequence.append(KeyComboAction("<Alt>F4"))
+
+sequence.append(utils.AssertionSummaryAction())
+sequence.start()


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