Bug 1320073 - Rename marionette-client to marionette-harness and release version 4.0.0. draft
authorHenrik Skupin <mail@hskupin.info>
Mon, 12 Dec 2016 13:05:34 +0100
changeset 448877 a24c7acc1855023189947fc12e3de926bdca0dfa
parent 448756 6253ce7b7de39eabf2a93f39c7fed58935cc8d0b
child 539405 8e53658ea3f596730fdf47975216ed591a5ebc68
push id38467
push userbmo:hskupin@gmail.com
push dateTue, 13 Dec 2016 07:11:04 +0000
bugs1320073
milestone53.0a1
Bug 1320073 - Rename marionette-client to marionette-harness and release version 4.0.0. MozReview-Commit-ID: L6V3b5h8RWm
browser/components/migration/tests/marionette/test_refresh_firefox.py
build/mach_bootstrap.py
build/virtualenv_packages.txt
dom/media/test/external/external_media_harness/runtests.py
dom/media/test/external/external_media_harness/testcase.py
dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py
dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py
dom/media/test/external/external_media_tests/playback/test_eme_playback_limiting_bandwidth.py
dom/media/test/external/external_media_tests/playback/test_full_playback.py
dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py
dom/media/test/external/external_media_tests/playback/test_shaka_playback.py
dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py
dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py
dom/media/test/external/external_media_tests/test_example.py
dom/media/test/external/requirements.txt
dom/system/gonk/tests/marionette/test_ril_code_quality.py
layout/base/tests/marionette/test_accessiblecaret_cursor_mode.py
layout/base/tests/marionette/test_accessiblecaret_selection_mode.py
layout/tools/reftest/runreftest.py
layout/tools/reftest/runreftestb2g.py
python/mozbuild/mozbuild/action/test_archive.py
taskcluster/ci/marionette-harness/kind.yml
testing/config/marionette_harness_test_requirements.txt
testing/config/marionette_requirements.txt
testing/firefox-ui/harness/firefox_ui_harness/arguments/base.py
testing/firefox-ui/harness/firefox_ui_harness/cli_functional.py
testing/firefox-ui/harness/firefox_ui_harness/cli_update.py
testing/firefox-ui/harness/firefox_ui_harness/runners/base.py
testing/firefox-ui/harness/firefox_ui_harness/testcases.py
testing/firefox-ui/harness/requirements.txt
testing/firefox-ui/tests/functional/keyboard_shortcuts/test_browser_window.py
testing/firefox-ui/tests/functional/locationbar/test_access_locationbar.py
testing/firefox-ui/tests/functional/locationbar/test_escape_autocomplete.py
testing/firefox-ui/tests/functional/locationbar/test_favicon_in_autocomplete.py
testing/firefox-ui/tests/functional/locationbar/test_suggest_bookmarks.py
testing/firefox-ui/tests/functional/private_browsing/test_about_private_browsing.py
testing/firefox-ui/tests/functional/security/test_dv_certificate.py
testing/firefox-ui/tests/functional/security/test_enable_privilege.py
testing/firefox-ui/tests/functional/security/test_ev_certificate.py
testing/firefox-ui/tests/functional/security/test_mixed_content_page.py
testing/firefox-ui/tests/functional/security/test_mixed_script_content_blocking.py
testing/firefox-ui/tests/functional/security/test_no_certificate.py
testing/firefox-ui/tests/functional/security/test_safe_browsing_initial_download.py
testing/firefox-ui/tests/functional/security/test_safe_browsing_notification.py
testing/firefox-ui/tests/functional/security/test_safe_browsing_warning_pages.py
testing/firefox-ui/tests/functional/security/test_security_notification.py
testing/firefox-ui/tests/functional/security/test_ssl_disabled_error_page.py
testing/firefox-ui/tests/functional/security/test_ssl_status_after_restart.py
testing/firefox-ui/tests/functional/security/test_submit_unencrypted_info_warning.py
testing/firefox-ui/tests/functional/security/test_unknown_issuer.py
testing/firefox-ui/tests/functional/security/test_untrusted_connection_error_page.py
testing/firefox-ui/tests/functional/sessionstore/test_restore_windows_after_restart.py
testing/firefox-ui/tests/puppeteer/test_about_window.py
testing/firefox-ui/tests/puppeteer/test_appinfo.py
testing/firefox-ui/tests/puppeteer/test_l10n.py
testing/firefox-ui/tests/puppeteer/test_menubar.py
testing/firefox-ui/tests/puppeteer/test_notifications.py
testing/firefox-ui/tests/puppeteer/test_page_info_window.py
testing/firefox-ui/tests/puppeteer/test_places.py
testing/firefox-ui/tests/puppeteer/test_prefs.py
testing/firefox-ui/tests/puppeteer/test_security.py
testing/firefox-ui/tests/puppeteer/test_software_update.py
testing/firefox-ui/tests/puppeteer/test_tabbar.py
testing/firefox-ui/tests/puppeteer/test_toolbars.py
testing/firefox-ui/tests/puppeteer/test_update_wizard.py
testing/firefox-ui/tests/puppeteer/test_utils.py
testing/firefox-ui/tests/puppeteer/test_windows.py
testing/marionette/chrome/test.xul
testing/marionette/chrome/test2.xul
testing/marionette/chrome/test_anonymous_content.xul
testing/marionette/chrome/test_dialog.xul
testing/marionette/chrome/test_nested_iframe.xul
testing/marionette/harness/.flake8
testing/marionette/harness/MANIFEST.in
testing/marionette/harness/README.rst
testing/marionette/harness/marionette/__init__.py
testing/marionette/harness/marionette/chrome/test.xul
testing/marionette/harness/marionette/chrome/test2.xul
testing/marionette/harness/marionette/chrome/test_anonymous_content.xul
testing/marionette/harness/marionette/chrome/test_dialog.xul
testing/marionette/harness/marionette/chrome/test_nested_iframe.xul
testing/marionette/harness/marionette/marionette_test/__init__.py
testing/marionette/harness/marionette/marionette_test/decorators.py
testing/marionette/harness/marionette/marionette_test/errors.py
testing/marionette/harness/marionette/marionette_test/testcases.py
testing/marionette/harness/marionette/runner/__init__.py
testing/marionette/harness/marionette/runner/base.py
testing/marionette/harness/marionette/runner/httpd.py
testing/marionette/harness/marionette/runner/mixins/__init__.py
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/History.md
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/browsermobproxy/__init__.py
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/browsermobproxy/client.py
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/browsermobproxy/webdriver_event_listener.py
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/Makefile
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/.buildinfo
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_modules/browsermobproxy.html
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_modules/index.html
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/client.txt
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/index.txt
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/server.txt
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/basic.css
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/default.css
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/doctools.js
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/jquery.js
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/pygments.css
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/searchtools.js
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/sidebar.js
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/underscore.js
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/websupport.js
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/client.html
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/genindex.html
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/index.html
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/objects.inv
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/py-modindex.html
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/search.html
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/searchindex.js
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/server.html
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/client.rst
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/conf.py
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/index.rst
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/make.bat
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/server.rst
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/readme.md
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/setup.py
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/test/test_client.py
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/test/test_remote.py
testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/test/test_webdriver.py
testing/marionette/harness/marionette/runner/mixins/browsermob.py
testing/marionette/harness/marionette/runner/mixins/window_manager.py
testing/marionette/harness/marionette/runner/serve.py
testing/marionette/harness/marionette/runner/test.cert
testing/marionette/harness/marionette/runner/test.key
testing/marionette/harness/marionette/runtests.py
testing/marionette/harness/marionette/tests/harness_unit/conftest.py
testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py
testing/marionette/harness/marionette/tests/harness_unit/test_marionette_arguments.py
testing/marionette/harness/marionette/tests/harness_unit/test_marionette_harness.py
testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py
testing/marionette/harness/marionette/tests/harness_unit/test_marionette_test_result.py
testing/marionette/harness/marionette/tests/harness_unit/test_serve.py
testing/marionette/harness/marionette/tests/unit-tests.ini
testing/marionette/harness/marionette/tests/unit/importanotherscript.js
testing/marionette/harness/marionette/tests/unit/importscript.js
testing/marionette/harness/marionette/tests/unit/mn-restartless-unsigned.xpi
testing/marionette/harness/marionette/tests/unit/single_finger_functions.py
testing/marionette/harness/marionette/tests/unit/test_about_pages.py
testing/marionette/harness/marionette/tests/unit/test_accessibility.py
testing/marionette/harness/marionette/tests/unit/test_addons.py
testing/marionette/harness/marionette/tests/unit/test_anonymous_content.py
testing/marionette/harness/marionette/tests/unit/test_browsermobproxy.py
testing/marionette/harness/marionette/tests/unit/test_capabilities.py
testing/marionette/harness/marionette/tests/unit/test_certificates.py
testing/marionette/harness/marionette/tests/unit/test_checkbox.py
testing/marionette/harness/marionette/tests/unit/test_checkbox_chrome.py
testing/marionette/harness/marionette/tests/unit/test_chrome.py
testing/marionette/harness/marionette/tests/unit/test_chrome_async_finish.js
testing/marionette/harness/marionette/tests/unit/test_chrome_element_css.py
testing/marionette/harness/marionette/tests/unit/test_clearing.py
testing/marionette/harness/marionette/tests/unit/test_click.py
testing/marionette/harness/marionette/tests/unit/test_click_chrome.py
testing/marionette/harness/marionette/tests/unit/test_click_scrolling.py
testing/marionette/harness/marionette/tests/unit/test_cookies.py
testing/marionette/harness/marionette/tests/unit/test_crash.py
testing/marionette/harness/marionette/tests/unit/test_data_driven.py
testing/marionette/harness/marionette/tests/unit/test_date_time_value.py
testing/marionette/harness/marionette/tests/unit/test_element_retrieval.py
testing/marionette/harness/marionette/tests/unit/test_element_state.py
testing/marionette/harness/marionette/tests/unit/test_element_state_chrome.py
testing/marionette/harness/marionette/tests/unit/test_elementsize.py
testing/marionette/harness/marionette/tests/unit/test_elementsize_chrome.py
testing/marionette/harness/marionette/tests/unit/test_errors.py
testing/marionette/harness/marionette/tests/unit/test_execute_async_script.py
testing/marionette/harness/marionette/tests/unit/test_execute_isolate.py
testing/marionette/harness/marionette/tests/unit/test_execute_sandboxes.py
testing/marionette/harness/marionette/tests/unit/test_execute_script.py
testing/marionette/harness/marionette/tests/unit/test_expected.py
testing/marionette/harness/marionette/tests/unit/test_expectedfail.py
testing/marionette/harness/marionette/tests/unit/test_file_upload.py
testing/marionette/harness/marionette/tests/unit/test_findelement_chrome.py
testing/marionette/harness/marionette/tests/unit/test_geckoinstance.py
testing/marionette/harness/marionette/tests/unit/test_getactiveframe_oop.py
testing/marionette/harness/marionette/tests/unit/test_implicit_waits.py
testing/marionette/harness/marionette/tests/unit/test_import_script.py
testing/marionette/harness/marionette/tests/unit/test_key_actions.py
testing/marionette/harness/marionette/tests/unit/test_localization.py
testing/marionette/harness/marionette/tests/unit/test_log.py
testing/marionette/harness/marionette/tests/unit/test_marionette.py
testing/marionette/harness/marionette/tests/unit/test_modal_dialogs.py
testing/marionette/harness/marionette/tests/unit/test_mouse_action.py
testing/marionette/harness/marionette/tests/unit/test_navigation.py
testing/marionette/harness/marionette/tests/unit/test_pagesource.py
testing/marionette/harness/marionette/tests/unit/test_pagesource_chrome.py
testing/marionette/harness/marionette/tests/unit/test_position.py
testing/marionette/harness/marionette/tests/unit/test_prefs.py
testing/marionette/harness/marionette/tests/unit/test_profile_management.py
testing/marionette/harness/marionette/tests/unit/test_proxy.py
testing/marionette/harness/marionette/tests/unit/test_quit_restart.py
testing/marionette/harness/marionette/tests/unit/test_rendered_element.py
testing/marionette/harness/marionette/tests/unit/test_report.py
testing/marionette/harness/marionette/tests/unit/test_run_js_test.py
testing/marionette/harness/marionette/tests/unit/test_screen_orientation.py
testing/marionette/harness/marionette/tests/unit/test_screenshot.py
testing/marionette/harness/marionette/tests/unit/test_select.py
testing/marionette/harness/marionette/tests/unit/test_session.py
testing/marionette/harness/marionette/tests/unit/test_set_window_size.py
testing/marionette/harness/marionette/tests/unit/test_shadow_dom.py
testing/marionette/harness/marionette/tests/unit/test_simpletest_chrome.js
testing/marionette/harness/marionette/tests/unit/test_simpletest_fail.js
testing/marionette/harness/marionette/tests/unit/test_simpletest_pass.js
testing/marionette/harness/marionette/tests/unit/test_simpletest_sanity.py
testing/marionette/harness/marionette/tests/unit/test_simpletest_timeout.js
testing/marionette/harness/marionette/tests/unit/test_single_finger_desktop.py
testing/marionette/harness/marionette/tests/unit/test_skip_setup.py
testing/marionette/harness/marionette/tests/unit/test_switch_frame.py
testing/marionette/harness/marionette/tests/unit/test_switch_frame_chrome.py
testing/marionette/harness/marionette/tests/unit/test_switch_remote_frame.py
testing/marionette/harness/marionette/tests/unit/test_teardown_context_preserved.py
testing/marionette/harness/marionette/tests/unit/test_text.py
testing/marionette/harness/marionette/tests/unit/test_text_chrome.py
testing/marionette/harness/marionette/tests/unit/test_timeouts.py
testing/marionette/harness/marionette/tests/unit/test_transport.py
testing/marionette/harness/marionette/tests/unit/test_typing.py
testing/marionette/harness/marionette/tests/unit/test_using_permissions.py
testing/marionette/harness/marionette/tests/unit/test_visibility.py
testing/marionette/harness/marionette/tests/unit/test_wait.py
testing/marionette/harness/marionette/tests/unit/test_window_handles.py
testing/marionette/harness/marionette/tests/unit/test_window_management.py
testing/marionette/harness/marionette/tests/unit/test_window_position.py
testing/marionette/harness/marionette/tests/unit/test_window_switching.py
testing/marionette/harness/marionette/tests/unit/test_window_title.py
testing/marionette/harness/marionette/tests/unit/test_window_title_chrome.py
testing/marionette/harness/marionette/tests/unit/test_window_type.py
testing/marionette/harness/marionette/tests/unit/test_with_using_context.py
testing/marionette/harness/marionette/tests/unit/unit-tests.ini
testing/marionette/harness/marionette/tests/webapi-tests.ini
testing/marionette/harness/marionette/www/bug814037.html
testing/marionette/harness/marionette/www/click_out_of_bounds_overflow.html
testing/marionette/harness/marionette/www/clicks.html
testing/marionette/harness/marionette/www/cssTransform.html
testing/marionette/harness/marionette/www/cssTransform2.html
testing/marionette/harness/marionette/www/datetimePage.html
testing/marionette/harness/marionette/www/deletingFrame.html
testing/marionette/harness/marionette/www/double_click.html
testing/marionette/harness/marionette/www/element_bottom.html
testing/marionette/harness/marionette/www/element_left.html
testing/marionette/harness/marionette/www/element_outside_viewport.html
testing/marionette/harness/marionette/www/element_right.html
testing/marionette/harness/marionette/www/element_top.html
testing/marionette/harness/marionette/www/empty.html
testing/marionette/harness/marionette/www/formPage.html
testing/marionette/harness/marionette/www/frameset.html
testing/marionette/harness/marionette/www/framesetPage2.html
testing/marionette/harness/marionette/www/hidden.html
testing/marionette/harness/marionette/www/html5/blue.jpg
testing/marionette/harness/marionette/www/html5/boolean_attributes.html
testing/marionette/harness/marionette/www/html5/geolocation.js
testing/marionette/harness/marionette/www/html5/green.jpg
testing/marionette/harness/marionette/www/html5/offline.html
testing/marionette/harness/marionette/www/html5/red.jpg
testing/marionette/harness/marionette/www/html5/status.html
testing/marionette/harness/marionette/www/html5/test.appcache
testing/marionette/harness/marionette/www/html5/test_html_inputs.html
testing/marionette/harness/marionette/www/html5/yellow.jpg
testing/marionette/harness/marionette/www/html5Page.html
testing/marionette/harness/marionette/www/javascriptPage.html
testing/marionette/harness/marionette/www/macbeth.html
testing/marionette/harness/marionette/www/modal_dialogs.html
testing/marionette/harness/marionette/www/nestedElements.html
testing/marionette/harness/marionette/www/rectangles.html
testing/marionette/harness/marionette/www/resultPage.html
testing/marionette/harness/marionette/www/scroll.html
testing/marionette/harness/marionette/www/scroll2.html
testing/marionette/harness/marionette/www/scroll3.html
testing/marionette/harness/marionette/www/scroll4.html
testing/marionette/harness/marionette/www/scroll5.html
testing/marionette/harness/marionette/www/shim.js
testing/marionette/harness/marionette/www/test.html
testing/marionette/harness/marionette/www/testAction.html
testing/marionette/harness/marionette/www/testPageSource.html
testing/marionette/harness/marionette/www/testPageSource.xml
testing/marionette/harness/marionette/www/testPageSourceWithUnicodeChars.html
testing/marionette/harness/marionette/www/testSize.html
testing/marionette/harness/marionette/www/test_accessibility.html
testing/marionette/harness/marionette/www/test_carets_columns.html
testing/marionette/harness/marionette/www/test_carets_cursor.html
testing/marionette/harness/marionette/www/test_carets_display_none.html
testing/marionette/harness/marionette/www/test_carets_iframe.html
testing/marionette/harness/marionette/www/test_carets_longtext.html
testing/marionette/harness/marionette/www/test_carets_multipleline.html
testing/marionette/harness/marionette/www/test_carets_multiplerange.html
testing/marionette/harness/marionette/www/test_carets_selection.html
testing/marionette/harness/marionette/www/test_clearing.html
testing/marionette/harness/marionette/www/test_dynamic.html
testing/marionette/harness/marionette/www/test_iframe.html
testing/marionette/harness/marionette/www/test_inner_iframe.html
testing/marionette/harness/marionette/www/test_nested_iframe.html
testing/marionette/harness/marionette/www/test_oop_1.html
testing/marionette/harness/marionette/www/test_oop_2.html
testing/marionette/harness/marionette/www/test_shadow_dom.html
testing/marionette/harness/marionette/www/test_windows.html
testing/marionette/harness/marionette/www/windowHandles.html
testing/marionette/harness/marionette/www/xhtmlTest.html
testing/marionette/harness/marionette_harness/__init__.py
testing/marionette/harness/marionette_harness/marionette_test/__init__.py
testing/marionette/harness/marionette_harness/marionette_test/decorators.py
testing/marionette/harness/marionette_harness/marionette_test/errors.py
testing/marionette/harness/marionette_harness/marionette_test/testcases.py
testing/marionette/harness/marionette_harness/runner/__init__.py
testing/marionette/harness/marionette_harness/runner/base.py
testing/marionette/harness/marionette_harness/runner/httpd.py
testing/marionette/harness/marionette_harness/runner/mixins/__init__.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/History.md
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/__init__.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/client.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/webdriver_event_listener.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/Makefile
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/.buildinfo
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_modules/browsermobproxy.html
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_modules/index.html
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/client.txt
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/index.txt
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/server.txt
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/basic.css
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/default.css
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/doctools.js
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/jquery.js
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/pygments.css
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/searchtools.js
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/sidebar.js
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/underscore.js
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/websupport.js
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/client.html
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/genindex.html
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/index.html
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/objects.inv
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/py-modindex.html
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/search.html
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/searchindex.js
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/server.html
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/client.rst
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/conf.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/index.rst
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/make.bat
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/server.rst
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/readme.md
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/setup.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/test/test_client.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/test/test_remote.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/test/test_webdriver.py
testing/marionette/harness/marionette_harness/runner/mixins/browsermob.py
testing/marionette/harness/marionette_harness/runner/mixins/window_manager.py
testing/marionette/harness/marionette_harness/runner/serve.py
testing/marionette/harness/marionette_harness/runner/test.cert
testing/marionette/harness/marionette_harness/runner/test.key
testing/marionette/harness/marionette_harness/runtests.py
testing/marionette/harness/marionette_harness/tests/harness_unit/conftest.py
testing/marionette/harness/marionette_harness/tests/harness_unit/test_httpd.py
testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_arguments.py
testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_harness.py
testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_runner.py
testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_test_result.py
testing/marionette/harness/marionette_harness/tests/harness_unit/test_serve.py
testing/marionette/harness/marionette_harness/tests/unit-tests.ini
testing/marionette/harness/marionette_harness/tests/unit/importanotherscript.js
testing/marionette/harness/marionette_harness/tests/unit/importscript.js
testing/marionette/harness/marionette_harness/tests/unit/mn-restartless-unsigned.xpi
testing/marionette/harness/marionette_harness/tests/unit/single_finger_functions.py
testing/marionette/harness/marionette_harness/tests/unit/test_about_pages.py
testing/marionette/harness/marionette_harness/tests/unit/test_accessibility.py
testing/marionette/harness/marionette_harness/tests/unit/test_addons.py
testing/marionette/harness/marionette_harness/tests/unit/test_anonymous_content.py
testing/marionette/harness/marionette_harness/tests/unit/test_browsermobproxy.py
testing/marionette/harness/marionette_harness/tests/unit/test_capabilities.py
testing/marionette/harness/marionette_harness/tests/unit/test_certificates.py
testing/marionette/harness/marionette_harness/tests/unit/test_checkbox.py
testing/marionette/harness/marionette_harness/tests/unit/test_checkbox_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_chrome_async_finish.js
testing/marionette/harness/marionette_harness/tests/unit/test_chrome_element_css.py
testing/marionette/harness/marionette_harness/tests/unit/test_clearing.py
testing/marionette/harness/marionette_harness/tests/unit/test_click.py
testing/marionette/harness/marionette_harness/tests/unit/test_click_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_click_scrolling.py
testing/marionette/harness/marionette_harness/tests/unit/test_cookies.py
testing/marionette/harness/marionette_harness/tests/unit/test_crash.py
testing/marionette/harness/marionette_harness/tests/unit/test_data_driven.py
testing/marionette/harness/marionette_harness/tests/unit/test_date_time_value.py
testing/marionette/harness/marionette_harness/tests/unit/test_element_retrieval.py
testing/marionette/harness/marionette_harness/tests/unit/test_element_state.py
testing/marionette/harness/marionette_harness/tests/unit/test_element_state_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_elementsize.py
testing/marionette/harness/marionette_harness/tests/unit/test_elementsize_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_errors.py
testing/marionette/harness/marionette_harness/tests/unit/test_execute_async_script.py
testing/marionette/harness/marionette_harness/tests/unit/test_execute_isolate.py
testing/marionette/harness/marionette_harness/tests/unit/test_execute_sandboxes.py
testing/marionette/harness/marionette_harness/tests/unit/test_execute_script.py
testing/marionette/harness/marionette_harness/tests/unit/test_expected.py
testing/marionette/harness/marionette_harness/tests/unit/test_expectedfail.py
testing/marionette/harness/marionette_harness/tests/unit/test_file_upload.py
testing/marionette/harness/marionette_harness/tests/unit/test_findelement_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_geckoinstance.py
testing/marionette/harness/marionette_harness/tests/unit/test_getactiveframe_oop.py
testing/marionette/harness/marionette_harness/tests/unit/test_implicit_waits.py
testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py
testing/marionette/harness/marionette_harness/tests/unit/test_key_actions.py
testing/marionette/harness/marionette_harness/tests/unit/test_localization.py
testing/marionette/harness/marionette_harness/tests/unit/test_log.py
testing/marionette/harness/marionette_harness/tests/unit/test_marionette.py
testing/marionette/harness/marionette_harness/tests/unit/test_modal_dialogs.py
testing/marionette/harness/marionette_harness/tests/unit/test_mouse_action.py
testing/marionette/harness/marionette_harness/tests/unit/test_navigation.py
testing/marionette/harness/marionette_harness/tests/unit/test_pagesource.py
testing/marionette/harness/marionette_harness/tests/unit/test_pagesource_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_position.py
testing/marionette/harness/marionette_harness/tests/unit/test_prefs.py
testing/marionette/harness/marionette_harness/tests/unit/test_profile_management.py
testing/marionette/harness/marionette_harness/tests/unit/test_proxy.py
testing/marionette/harness/marionette_harness/tests/unit/test_quit_restart.py
testing/marionette/harness/marionette_harness/tests/unit/test_rendered_element.py
testing/marionette/harness/marionette_harness/tests/unit/test_report.py
testing/marionette/harness/marionette_harness/tests/unit/test_run_js_test.py
testing/marionette/harness/marionette_harness/tests/unit/test_screen_orientation.py
testing/marionette/harness/marionette_harness/tests/unit/test_screenshot.py
testing/marionette/harness/marionette_harness/tests/unit/test_select.py
testing/marionette/harness/marionette_harness/tests/unit/test_session.py
testing/marionette/harness/marionette_harness/tests/unit/test_set_window_size.py
testing/marionette/harness/marionette_harness/tests/unit/test_shadow_dom.py
testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_chrome.js
testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_fail.js
testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_pass.js
testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_sanity.py
testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_timeout.js
testing/marionette/harness/marionette_harness/tests/unit/test_single_finger_desktop.py
testing/marionette/harness/marionette_harness/tests/unit/test_skip_setup.py
testing/marionette/harness/marionette_harness/tests/unit/test_switch_frame.py
testing/marionette/harness/marionette_harness/tests/unit/test_switch_frame_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_switch_remote_frame.py
testing/marionette/harness/marionette_harness/tests/unit/test_teardown_context_preserved.py
testing/marionette/harness/marionette_harness/tests/unit/test_text.py
testing/marionette/harness/marionette_harness/tests/unit/test_text_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_timeouts.py
testing/marionette/harness/marionette_harness/tests/unit/test_transport.py
testing/marionette/harness/marionette_harness/tests/unit/test_typing.py
testing/marionette/harness/marionette_harness/tests/unit/test_using_permissions.py
testing/marionette/harness/marionette_harness/tests/unit/test_visibility.py
testing/marionette/harness/marionette_harness/tests/unit/test_wait.py
testing/marionette/harness/marionette_harness/tests/unit/test_window_handles.py
testing/marionette/harness/marionette_harness/tests/unit/test_window_management.py
testing/marionette/harness/marionette_harness/tests/unit/test_window_position.py
testing/marionette/harness/marionette_harness/tests/unit/test_window_switching.py
testing/marionette/harness/marionette_harness/tests/unit/test_window_title.py
testing/marionette/harness/marionette_harness/tests/unit/test_window_title_chrome.py
testing/marionette/harness/marionette_harness/tests/unit/test_window_type.py
testing/marionette/harness/marionette_harness/tests/unit/test_with_using_context.py
testing/marionette/harness/marionette_harness/tests/unit/unit-tests.ini
testing/marionette/harness/marionette_harness/tests/webapi-tests.ini
testing/marionette/harness/marionette_harness/www/bug814037.html
testing/marionette/harness/marionette_harness/www/click_out_of_bounds_overflow.html
testing/marionette/harness/marionette_harness/www/clicks.html
testing/marionette/harness/marionette_harness/www/cssTransform.html
testing/marionette/harness/marionette_harness/www/cssTransform2.html
testing/marionette/harness/marionette_harness/www/datetimePage.html
testing/marionette/harness/marionette_harness/www/deletingFrame.html
testing/marionette/harness/marionette_harness/www/double_click.html
testing/marionette/harness/marionette_harness/www/element_bottom.html
testing/marionette/harness/marionette_harness/www/element_left.html
testing/marionette/harness/marionette_harness/www/element_outside_viewport.html
testing/marionette/harness/marionette_harness/www/element_right.html
testing/marionette/harness/marionette_harness/www/element_top.html
testing/marionette/harness/marionette_harness/www/empty.html
testing/marionette/harness/marionette_harness/www/formPage.html
testing/marionette/harness/marionette_harness/www/frameset.html
testing/marionette/harness/marionette_harness/www/framesetPage2.html
testing/marionette/harness/marionette_harness/www/hidden.html
testing/marionette/harness/marionette_harness/www/html5/blue.jpg
testing/marionette/harness/marionette_harness/www/html5/boolean_attributes.html
testing/marionette/harness/marionette_harness/www/html5/geolocation.js
testing/marionette/harness/marionette_harness/www/html5/green.jpg
testing/marionette/harness/marionette_harness/www/html5/offline.html
testing/marionette/harness/marionette_harness/www/html5/red.jpg
testing/marionette/harness/marionette_harness/www/html5/status.html
testing/marionette/harness/marionette_harness/www/html5/test.appcache
testing/marionette/harness/marionette_harness/www/html5/test_html_inputs.html
testing/marionette/harness/marionette_harness/www/html5/yellow.jpg
testing/marionette/harness/marionette_harness/www/html5Page.html
testing/marionette/harness/marionette_harness/www/javascriptPage.html
testing/marionette/harness/marionette_harness/www/macbeth.html
testing/marionette/harness/marionette_harness/www/modal_dialogs.html
testing/marionette/harness/marionette_harness/www/nestedElements.html
testing/marionette/harness/marionette_harness/www/rectangles.html
testing/marionette/harness/marionette_harness/www/resultPage.html
testing/marionette/harness/marionette_harness/www/scroll.html
testing/marionette/harness/marionette_harness/www/scroll2.html
testing/marionette/harness/marionette_harness/www/scroll3.html
testing/marionette/harness/marionette_harness/www/scroll4.html
testing/marionette/harness/marionette_harness/www/scroll5.html
testing/marionette/harness/marionette_harness/www/shim.js
testing/marionette/harness/marionette_harness/www/test.html
testing/marionette/harness/marionette_harness/www/testAction.html
testing/marionette/harness/marionette_harness/www/testPageSource.html
testing/marionette/harness/marionette_harness/www/testPageSource.xml
testing/marionette/harness/marionette_harness/www/testPageSourceWithUnicodeChars.html
testing/marionette/harness/marionette_harness/www/testSize.html
testing/marionette/harness/marionette_harness/www/test_accessibility.html
testing/marionette/harness/marionette_harness/www/test_carets_columns.html
testing/marionette/harness/marionette_harness/www/test_carets_cursor.html
testing/marionette/harness/marionette_harness/www/test_carets_display_none.html
testing/marionette/harness/marionette_harness/www/test_carets_iframe.html
testing/marionette/harness/marionette_harness/www/test_carets_longtext.html
testing/marionette/harness/marionette_harness/www/test_carets_multipleline.html
testing/marionette/harness/marionette_harness/www/test_carets_multiplerange.html
testing/marionette/harness/marionette_harness/www/test_carets_selection.html
testing/marionette/harness/marionette_harness/www/test_clearing.html
testing/marionette/harness/marionette_harness/www/test_dynamic.html
testing/marionette/harness/marionette_harness/www/test_iframe.html
testing/marionette/harness/marionette_harness/www/test_inner_iframe.html
testing/marionette/harness/marionette_harness/www/test_nested_iframe.html
testing/marionette/harness/marionette_harness/www/test_oop_1.html
testing/marionette/harness/marionette_harness/www/test_oop_2.html
testing/marionette/harness/marionette_harness/www/test_shadow_dom.html
testing/marionette/harness/marionette_harness/www/test_windows.html
testing/marionette/harness/marionette_harness/www/windowHandles.html
testing/marionette/harness/marionette_harness/www/xhtmlTest.html
testing/marionette/harness/setup.py
testing/marionette/jar.mn
testing/marionette/mach_commands.py
testing/marionette/mach_test_package_commands.py
testing/marionette/moz.build
testing/mochitest/runtests.py
testing/mozharness/configs/android/androidarm_4_3.py
testing/mozharness/scripts/android_emulator_unittest.py
testing/mozharness/scripts/marionette.py
testing/mozharness/scripts/marionette_harness_tests.py
toolkit/components/microformats/test/marionette/microformats_tester.py
--- a/browser/components/migration/tests/marionette/test_refresh_firefox.py
+++ b/browser/components/migration/tests/marionette/test_refresh_firefox.py
@@ -1,10 +1,12 @@
-import os, shutil
-from marionette import MarionetteTestCase
+import os
+import shutil
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestFirefoxRefresh(MarionetteTestCase):
     _username = "marionette-test-login"
     _password = "marionette-test-password"
     _bookmarkURL = "about:mozilla"
     _bookmarkText = "Some bookmark from Marionette"
 
--- a/build/mach_bootstrap.py
+++ b/build/mach_bootstrap.py
@@ -63,17 +63,17 @@ SEARCH_PATHS = [
     'dom/media/test/external',
     'layout/tools/reftest',
     'other-licenses/ply',
     'taskcluster',
     'testing',
     'testing/firefox-ui/harness',
     'testing/marionette/client',
     'testing/marionette/harness',
-    'testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py',
+    'testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py',
     'testing/marionette/puppeteer/firefox',
     'testing/mozbase/mozcrash',
     'testing/mozbase/mozdebug',
     'testing/mozbase/mozdevice',
     'testing/mozbase/mozfile',
     'testing/mozbase/mozhttpd',
     'testing/mozbase/mozinfo',
     'testing/mozbase/mozinstall',
--- a/build/virtualenv_packages.txt
+++ b/build/virtualenv_packages.txt
@@ -1,13 +1,13 @@
 altgraph.pth:python/altgraph
 marionette_driver.pth:testing/marionette/client
-browsermobproxy.pth:testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py
+marionette_harness.pth:testing/marionette/harness
+browsermobproxy.pth:testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py
 wptserve.pth:testing/web-platform/tests/tools/wptserve
-marionette.pth:testing/marionette/harness
 blessings.pth:python/blessings
 configobj.pth:python/configobj
 jsmin.pth:python/jsmin
 mach.pth:python/mach
 mozbuild.pth:python/mozbuild
 mozversioncontrol.pth:python/mozversioncontrol
 mozlint.pth:python/mozlint
 pymake.pth:build/pymake
--- a/dom/media/test/external/external_media_harness/runtests.py
+++ b/dom/media/test/external/external_media_harness/runtests.py
@@ -1,21 +1,25 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from manifestparser import read_ini
 import os
 import sys
 
-from marionette import BaseMarionetteTestRunner, BaseMarionetteArguments
-from marionette.runner import BrowserMobProxyArguments
-from marionette.runtests import MarionetteHarness, cli as mn_cli
 import mozlog
 
+from manifestparser import read_ini
+from marionette_harness import (
+    BaseMarionetteTestRunner,
+    BaseMarionetteArguments,
+    BrowserMobProxyArguments,
+)
+from marionette_harness.runtests import MarionetteHarness, cli as mn_cli
+
 import external_media_tests
 from testcase import MediaTestCase
 from external_media_tests.media_utils.video_puppeteer import debug_script
 
 
 class MediaTestArgumentsBase(object):
     name = 'Firefox Media Tests'
     args = [
--- a/dom/media/test/external/external_media_harness/testcase.py
+++ b/dom/media/test/external/external_media_harness/testcase.py
@@ -1,20 +1,23 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import re
 import os
-import time
 
-from marionette import BrowserMobProxyTestCaseMixin, MarionetteTestCase, Marionette
 from marionette_driver import Wait
 from marionette_driver.errors import TimeoutException
-from marionette.marionette_test import SkipTest
+from marionette_harness import (
+    BrowserMobProxyTestCaseMixin,
+    MarionetteTestCase,
+    Marionette,
+    SkipTest,
+)
 
 from firefox_puppeteer import PuppeteerMixin
 from external_media_tests.utils import (timestamp_now, verbose_until)
 from external_media_tests.media_utils.video_puppeteer import (
     VideoException,
     VideoPuppeteer
 )
 
--- a/dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py
+++ b/dom/media/test/external/external_media_tests/media_utils/video_puppeteer.py
@@ -1,16 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 from collections import namedtuple
 from time import clock, sleep
 
-from marionette import Marionette
 from marionette_driver import By, expected, Wait
+from marionette_harness import Marionette
 
 from external_media_tests.utils import verbose_until
 
 
 # Adapted from
 # https://github.com/gavinsharp/aboutmedia/blob/master/chrome/content/aboutmedia.xhtml
 debug_script = """
 var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
--- a/dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py
+++ b/dom/media/test/external/external_media_tests/media_utils/youtube_puppeteer.py
@@ -1,19 +1,22 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from collections import namedtuple
-from time import sleep
+
 import re
-from json import loads
 
-from marionette import Marionette
+from collections import namedtuple
+from json import loads
+from time import sleep
+
 from marionette_driver import By, expected, Wait
 from marionette_driver.errors import TimeoutException, NoSuchElementException
+from marionette_harness import Marionette
+
 from video_puppeteer import VideoPuppeteer, VideoException
 from external_media_tests.utils import verbose_until
 
 
 class YouTubePuppeteer(VideoPuppeteer):
     """
     Wrapper around a YouTube .html5-video-player element.
 
--- a/dom/media/test/external/external_media_tests/playback/test_eme_playback_limiting_bandwidth.py
+++ b/dom/media/test/external/external_media_tests/playback/test_eme_playback_limiting_bandwidth.py
@@ -1,20 +1,21 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import BrowserMobProxyTestCaseMixin
+from marionette_harness import BrowserMobProxyTestCaseMixin
 
 from external_media_harness.testcase import (
     EMESetupMixin,
     NetworkBandwidthTestCase,
     NetworkBandwidthTestsMixin,
 )
 
+
 class TestEMEPlaybackLimitingBandwidth(NetworkBandwidthTestCase,
                                        BrowserMobProxyTestCaseMixin,
                                        NetworkBandwidthTestsMixin,
                                        EMESetupMixin):
 
 
     def setUp(self):
         super(TestEMEPlaybackLimitingBandwidth, self).setUp()
--- a/dom/media/test/external/external_media_tests/playback/test_full_playback.py
+++ b/dom/media/test/external/external_media_tests/playback/test_full_playback.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
+from marionette_harness import Marionette
 
-from marionette import Marionette
 from external_media_harness.testcase import MediaTestCase
 from external_media_tests.media_utils.video_puppeteer import VideoPuppeteer
 
 
 class TestFullPlayback(MediaTestCase):
     """ Test MSE playback in HTML5 video element.
 
     These tests should pass on any site where a single video element plays
--- a/dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py
+++ b/dom/media/test/external/external_media_tests/playback/test_playback_limiting_bandwidth.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import BrowserMobProxyTestCaseMixin
+from marionette_harness import BrowserMobProxyTestCaseMixin
 
 from external_media_harness.testcase import (
     NetworkBandwidthTestCase, NetworkBandwidthTestsMixin
 )
 
 
 class TestPlaybackLimitingBandwidth(NetworkBandwidthTestCase,
                                     NetworkBandwidthTestsMixin,
--- a/dom/media/test/external/external_media_tests/playback/test_shaka_playback.py
+++ b/dom/media/test/external/external_media_tests/playback/test_shaka_playback.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
+from marionette_harness import Marionette
 
-from marionette import Marionette
 from external_media_harness.testcase import MediaTestCase
 from external_media_tests.media_utils.video_puppeteer import VideoPuppeteer
 
 
 class TestShakaPlayback(MediaTestCase):
     """ Test Widevine playback in shaka-player
 
     This test takes manifest URLs rather than URLs for pages with videos. These
--- a/dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py
+++ b/dom/media/test/external/external_media_tests/playback/test_ultra_low_bandwidth.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import BrowserMobProxyTestCaseMixin
+from marionette_harness import BrowserMobProxyTestCaseMixin
 
 from external_media_harness.testcase import NetworkBandwidthTestCase
 
 
 class TestUltraLowBandwidth(NetworkBandwidthTestCase,
                                     BrowserMobProxyTestCaseMixin):
 
     def test_playback_limiting_bandwidth_160(self):
--- a/dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py
+++ b/dom/media/test/external/external_media_tests/playback/youtube/test_basic_playback.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import Marionette
 from marionette_driver import Wait
 from marionette_driver.errors import TimeoutException
+from marionette_harness import Marionette
 
 from external_media_tests.utils import verbose_until
 from external_media_harness.testcase import MediaTestCase
 from external_media_tests.media_utils.video_puppeteer import VideoException
 from external_media_tests.media_utils.youtube_puppeteer import YouTubePuppeteer
 
 
 class TestBasicYouTubePlayback(MediaTestCase):
--- a/dom/media/test/external/external_media_tests/test_example.py
+++ b/dom/media/test/external/external_media_tests/test_example.py
@@ -1,9 +1,10 @@
-from marionette import Marionette
+from marionette_harness import Marionette
+
 from external_media_harness.testcase import MediaTestCase
 
 
 class TestSomethingElse(MediaTestCase):
     def setUp(self):
         MediaTestCase.setUp(self)
         self.test_urls = [
             'mozilla.html',
--- a/dom/media/test/external/requirements.txt
+++ b/dom/media/test/external/requirements.txt
@@ -1,20 +1,5 @@
-browsermob-proxy==0.7.1
+firefox-puppeteer >= 52.1.0, <53.0.0
 manifestparser==1.1
-mozcrash==0.17
-mozdevice==0.48
-mozfile==1.2
-mozhttpd==0.7
-mozinfo==0.9
-# optional - mozharness install step
-mozInstall==1.12
+marionette-driver==2.2.0
+marionette-harness==4.0.0
 mozlog==3.3
-moznetwork==0.27
-mozprocess==0.23
-mozprofile==0.28
-mozrunner==6.12
-moztest==0.7
-mozversion==1.4
-wptserve==1.3.0
-marionette-client==3.1.0
-marionette-driver==2.0.0
-firefox-puppeteer >= 52.1.0, <53.0.0
--- a/dom/system/gonk/tests/marionette/test_ril_code_quality.py
+++ b/dom/system/gonk/tests/marionette/test_ril_code_quality.py
@@ -24,25 +24,25 @@ We merge these two scripts into one by t
 --------------------------------
 
 Script A (ril_worker.js) runs global strict mode.
 Script B (ril_consts.js) not.
 
 The above merge way ensures the correct scope of 'strict mode.'
 """
 
-
-from marionette.marionette_test import MarionetteTestCase
 import bisect
 import inspect
 import os
 import os.path
 import re
 import unicodedata
 
+from marionette_harness import MarionetteTestCase
+
 
 class StringUtility:
 
     """A collection of some string utilities."""
 
     @staticmethod
     def find_match_lines(lines, pattern):
         """Return a list of lines that contains given pattern."""
--- a/layout/base/tests/marionette/test_accessiblecaret_cursor_mode.py
+++ b/layout/base/tests/marionette/test_accessiblecaret_cursor_mode.py
@@ -1,21 +1,22 @@
 # -*- coding: utf-8 -*-
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import string
 
-from marionette.marionette_test import (
-    MarionetteTestCase, parameterized
-)
 from marionette_driver.by import By
 from marionette_driver.marionette import Actions
 from marionette_driver.selection import SelectionManager
+from marionette_harness.marionette_test import (
+    MarionetteTestCase,
+    parameterized,
+)
 
 
 class AccessibleCaretCursorModeTestCase(MarionetteTestCase):
     '''Test cases for AccessibleCaret under cursor mode.
 
     We call the blinking cursor (nsCaret) as cursor, and call AccessibleCaret as
     caret for short.
 
--- a/layout/base/tests/marionette/test_accessiblecaret_selection_mode.py
+++ b/layout/base/tests/marionette/test_accessiblecaret_selection_mode.py
@@ -1,21 +1,23 @@
 # -*- coding: utf-8 -*-
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import re
 
-from marionette.marionette_test import (
-    MarionetteTestCase, SkipTest, parameterized
-)
 from marionette_driver.by import By
 from marionette_driver.marionette import Actions
 from marionette_driver.selection import SelectionManager
+from marionette_harness.marionette_test import (
+    MarionetteTestCase,
+    SkipTest,
+    parameterized
+)
 
 
 def skip_if_not_rotatable(target):
     def wrapper(self, *args, **kwargs):
         if not self.marionette.session_capabilities.get('rotatable'):
             raise SkipTest('skipping due to device not rotatable')
         return target(self, *args, **kwargs)
     return wrapper
--- a/layout/tools/reftest/runreftest.py
+++ b/layout/tools/reftest/runreftest.py
@@ -30,18 +30,18 @@ import mozleak
 import mozlog
 import mozprocess
 import mozprofile
 import mozrunner
 from mozrunner.utils import get_stack_fixer_function, test_environment
 from mozscreenshot import printstatus, dump_screen
 
 try:
-    from marionette import Marionette
     from marionette_driver.addons import Addons
+    from marionette_harness import Marionette
 except ImportError, e:
     # Defer ImportError until attempt to use Marionette
     def reraise(*args, **kwargs):
         raise(e)
     Marionette = reraise
 
 from output import OutputHandler, ReftestFormatter
 import reftestcommandline
--- a/layout/tools/reftest/runreftestb2g.py
+++ b/layout/tools/reftest/runreftestb2g.py
@@ -16,18 +16,19 @@ if here not in sys.path:
 from automation import Automation
 from b2gautomation import B2GRemoteAutomation
 from runreftestmulet import run_test_harness as run_mulet_reftests
 from output import OutputHandler
 from remotereftest import RemoteReftestResolver, ReftestServer
 from runreftest import RefTest
 import reftestcommandline
 
+from marionette_harness import Marionette
 from mozdevice import DeviceManagerADB, DMError
-from marionette import Marionette
+
 
 class ProfileConfigParser(ConfigParser.RawConfigParser):
     """Subclass of RawConfigParser that outputs .ini files in the exact
        format expected for profiles.ini, which is slightly different
        than the default format.
     """
 
     def optionxform(self, optionstr):
--- a/python/mozbuild/mozbuild/action/test_archive.py
+++ b/python/mozbuild/mozbuild/action/test_archive.py
@@ -100,30 +100,30 @@ ARCHIVE_FILES = {
             'patterns': [
                 'client/**',
                 'harness/**',
                 'puppeteer/**',
                 'mach_test_package_commands.py',
             ],
             'dest': 'marionette',
             'ignore': [
-                'harness/docs',
-                'harness/marionette/tests',
+                'client/docs',
+                'harness/marionette_harness/tests',
                 'puppeteer/firefox/docs',
             ],
         },
         {
             'source': buildconfig.topsrcdir,
             'base': '',
             'manifests': [
-                'testing/marionette/harness/marionette/tests/unit-tests.ini',
-                'testing/marionette/harness/marionette/tests/webapi-tests.ini',
+                'testing/marionette/harness/marionette_harness/tests/unit-tests.ini',
+                'testing/marionette/harness/marionette_harness/tests/webapi-tests.ini',
             ],
             # We also need the manifests and harness_unit tests
-            'pattern': 'testing/marionette/harness/marionette/tests/**',
+            'pattern': 'testing/marionette/harness/marionette_harness/tests/**',
             'dest': 'marionette/tests',
         },
         {
             'source': buildconfig.topobjdir,
             'base': '_tests',
             'pattern': 'mozbase/**',
         },
         {
--- a/taskcluster/ci/marionette-harness/kind.yml
+++ b/taskcluster/ci/marionette-harness/kind.yml
@@ -36,16 +36,16 @@ jobs:
                 TOOLTOOL_REV: "master"
             artifacts:
               - name: public/logs/
                 path: /home/worker/workspace/mozharness_workspace/upload/logs/
                 type: directory
             command:
               - "bash"
               - "/home/worker/bin/build.sh"
-              - "--tests=testing/marionette/harness/marionette/tests/harness_unit"
+              - "--tests=testing/marionette/harness/marionette_harness/tests/harness_unit"
               - "--work-dir=mozharness_workspace"
             max-run-time: 1800
         when:
             files-changed:
               - "testing/marionette/harness/**"
               - "testing/mozharness/scripts/marionette_harness_tests.py"
               - "testing/config/marionette_harness_test_requirements.txt"
--- a/testing/config/marionette_harness_test_requirements.txt
+++ b/testing/config/marionette_harness_test_requirements.txt
@@ -1,13 +1,13 @@
 -r mozbase_requirements.txt
 
 # TODO - if we structure common.tests.zip to match the in-tree structure of the
 # testing directory, we could use ./marionette_requirements.txt instead
 ../web-platform/tests/tools/wptserve
 ../marionette/client
-../marionette/harness/marionette/runner/mixins/browsermob-proxy-py
+../marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py
 ../marionette/harness
 
 # pytest
 ../../python/py
 ../../python/pytest
 ../../python/mock-1.0.0
--- a/testing/config/marionette_requirements.txt
+++ b/testing/config/marionette_requirements.txt
@@ -1,8 +1,9 @@
 -r mozbase_requirements.txt
+
 ../tools/wptserve
 ../marionette/client
-../marionette/harness/marionette/runner/mixins/browsermob-proxy-py
+../marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py
 ../marionette/harness
 
 # Allows to use the Puppeteer page object model for Firefox
 ../marionette/puppeteer/firefox/
--- a/testing/firefox-ui/harness/firefox_ui_harness/arguments/base.py
+++ b/testing/firefox-ui/harness/firefox_ui_harness/arguments/base.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import BaseMarionetteArguments
+from marionette_harness import BaseMarionetteArguments
 
 
 class FirefoxUIBaseArguments(object):
     name = 'Firefox UI Tests'
     args = []
 
 
 class FirefoxUIArguments(BaseMarionetteArguments):
--- a/testing/firefox-ui/harness/firefox_ui_harness/cli_functional.py
+++ b/testing/firefox-ui/harness/firefox_ui_harness/cli_functional.py
@@ -1,15 +1,15 @@
 #!/usr/bin/env python
 
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette.runtests import cli as mn_cli
+from marionette_harness.runtests import cli as mn_cli
 
 from firefox_ui_harness.arguments import FirefoxUIArguments
 from firefox_ui_harness.runners import FirefoxUITestRunner
 
 
 def cli(args=None):
     mn_cli(runner_class=FirefoxUITestRunner,
            parser_class=FirefoxUIArguments,
--- a/testing/firefox-ui/harness/firefox_ui_harness/cli_update.py
+++ b/testing/firefox-ui/harness/firefox_ui_harness/cli_update.py
@@ -1,15 +1,15 @@
 #!/usr/bin/env python
 
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette.runtests import cli as mn_cli
+from marionette_harness.runtests import cli as mn_cli
 
 from firefox_ui_harness.arguments import UpdateArguments
 from firefox_ui_harness.runners import UpdateTestRunner
 
 
 def cli(args=None):
     mn_cli(runner_class=UpdateTestRunner,
            parser_class=UpdateArguments,
--- a/testing/firefox-ui/harness/firefox_ui_harness/runners/base.py
+++ b/testing/firefox-ui/harness/firefox_ui_harness/runners/base.py
@@ -4,17 +4,17 @@
 
 import os
 import shutil
 import tempfile
 
 import mozfile
 import mozinfo
 
-from marionette import BaseMarionetteTestRunner, MarionetteTestCase
+from marionette_harness import BaseMarionetteTestRunner, MarionetteTestCase
 
 
 class FirefoxUITestRunner(BaseMarionetteTestRunner):
 
     def __init__(self, **kwargs):
         super(FirefoxUITestRunner, self).__init__(**kwargs)
 
         # select the appropriate GeckoInstance
--- a/testing/firefox-ui/harness/firefox_ui_harness/testcases.py
+++ b/testing/firefox-ui/harness/firefox_ui_harness/testcases.py
@@ -7,20 +7,19 @@ import pprint
 from datetime import datetime
 
 import mozfile
 
 from firefox_puppeteer import PuppeteerMixin
 from firefox_puppeteer.api.prefs import Preferences
 from firefox_puppeteer.api.software_update import SoftwareUpdate
 from firefox_puppeteer.ui.update_wizard import UpdateWizardDialog
-
-from marionette import MarionetteTestCase
 from marionette_driver import Wait
 from marionette_driver.errors import NoSuchWindowException
+from marionette_harness import MarionetteTestCase
 
 
 class UpdateTestCase(PuppeteerMixin, MarionetteTestCase):
 
     TIMEOUT_UPDATE_APPLY = 300
     TIMEOUT_UPDATE_CHECK = 30
     TIMEOUT_UPDATE_DOWNLOAD = 720
 
--- a/testing/firefox-ui/harness/requirements.txt
+++ b/testing/firefox-ui/harness/requirements.txt
@@ -1,5 +1,5 @@
 firefox-puppeteer >= 52.1.0, <53.0.0
-marionette-client >= 2.3.0
+marionette-harness >= 4.0.0
 mozfile >= 1.2
 mozinfo >= 0.8
 mozinstall >= 1.12
--- a/testing/firefox-ui/tests/functional/keyboard_shortcuts/test_browser_window.py
+++ b/testing/firefox-ui/tests/functional/keyboard_shortcuts/test_browser_window.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestBrowserWindowShortcuts(PuppeteerMixin, MarionetteTestCase):
 
     def test_addons_manager(self):
         # If an about:xyz page is visible, no new tab will be opened
         with self.marionette.using_context('content'):
             self.marionette.navigate('about:')
--- a/testing/firefox-ui/tests/functional/locationbar/test_access_locationbar.py
+++ b/testing/firefox-ui/tests/functional/locationbar/test_access_locationbar.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestAccessLocationBar(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestAccessLocationBar, self).setUp()
 
         # Clear complete history so there's no interference from previous entries.
--- a/testing/firefox-ui/tests/functional/locationbar/test_escape_autocomplete.py
+++ b/testing/firefox-ui/tests/functional/locationbar/test_escape_autocomplete.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestEscapeAutocomplete(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestEscapeAutocomplete, self).setUp()
 
         # Clear complete history so there's no interference from previous entries.
--- a/testing/firefox-ui/tests/functional/locationbar/test_favicon_in_autocomplete.py
+++ b/testing/firefox-ui/tests/functional/locationbar/test_favicon_in_autocomplete.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestFaviconInAutocomplete(PuppeteerMixin, MarionetteTestCase):
 
     PREF_SUGGEST_SEARCHES = 'browser.urlbar.suggest.searches'
     PREF_SUGGEST_BOOKMARK = 'browser.urlbar.suggest.bookmark'
 
     def setUp(self):
--- a/testing/firefox-ui/tests/functional/locationbar/test_suggest_bookmarks.py
+++ b/testing/firefox-ui/tests/functional/locationbar/test_suggest_bookmarks.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import By, Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestStarInAutocomplete(PuppeteerMixin, MarionetteTestCase):
     """ This replaces
     http://hg.mozilla.org/qa/mozmill-tests/file/default/firefox/tests/functional/testAwesomeBar/testSuggestBookmarks.js
     Check a star appears in autocomplete list for a bookmarked page.
     """
 
--- a/testing/firefox-ui/tests/functional/private_browsing/test_about_private_browsing.py
+++ b/testing/firefox-ui/tests/functional/private_browsing/test_about_private_browsing.py
@@ -1,16 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
 from firefox_puppeteer.ui.browser.window import BrowserWindow
-from marionette import MarionetteTestCase
 from marionette_driver import By, Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestAboutPrivateBrowsing(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestAboutPrivateBrowsing, self).setUp()
 
         # Use a fake local support URL
--- a/testing/firefox-ui/tests/functional/security/test_dv_certificate.py
+++ b/testing/firefox-ui/tests/functional/security/test_dv_certificate.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestDVCertificate(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestDVCertificate, self).setUp()
 
         self.locationbar = self.browser.navbar.locationbar
--- a/testing/firefox-ui/tests/functional/security/test_enable_privilege.py
+++ b/testing/firefox-ui/tests/functional/security/test_enable_privilege.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver import By
+from marionette_harness import MarionetteTestCase
 
 
 class TestEnablePrivilege(MarionetteTestCase):
 
     def test_enable_privilege(self):
         with self.marionette.using_context('content'):
             url = self.marionette.absolute_url('security/enable_privilege.html')
             self.marionette.navigate(url)
--- a/testing/firefox-ui/tests/functional/security/test_ev_certificate.py
+++ b/testing/firefox-ui/tests/functional/security/test_ev_certificate.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestEVCertificate(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestEVCertificate, self).setUp()
 
         self.locationbar = self.browser.navbar.locationbar
--- a/testing/firefox-ui/tests/functional/security/test_mixed_content_page.py
+++ b/testing/firefox-ui/tests/functional/security/test_mixed_content_page.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestMixedContentPage(PuppeteerMixin, MarionetteTestCase):
     def setUp(self):
         super(TestMixedContentPage, self).setUp()
 
         self.locationbar = self.browser.navbar.locationbar
         self.identity_popup = self.locationbar.identity_popup
--- a/testing/firefox-ui/tests/functional/security/test_mixed_script_content_blocking.py
+++ b/testing/firefox-ui/tests/functional/security/test_mixed_script_content_blocking.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import By, Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestMixedScriptContentBlocking(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestMixedScriptContentBlocking, self).setUp()
 
         self.url = 'https://mozqa.com/data/firefox/security/mixed_content_blocked/index.html'
--- a/testing/firefox-ui/tests/functional/security/test_no_certificate.py
+++ b/testing/firefox-ui/tests/functional/security/test_no_certificate.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from urlparse import urlparse
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import expected, Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestNoCertificate(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestNoCertificate, self).setUp()
 
         self.locationbar = self.browser.navbar.locationbar
--- a/testing/firefox-ui/tests/functional/security/test_safe_browsing_initial_download.py
+++ b/testing/firefox-ui/tests/functional/security/test_safe_browsing_initial_download.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import os
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestSafeBrowsingInitialDownload(PuppeteerMixin, MarionetteTestCase):
 
     file_extensions = [
         'pset',
         'sbstore',
     ]
--- a/testing/firefox-ui/tests/functional/security/test_safe_browsing_notification.py
+++ b/testing/firefox-ui/tests/functional/security/test_safe_browsing_notification.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import time
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import By, expected, Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestSafeBrowsingNotificationBar(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSafeBrowsingNotificationBar, self).setUp()
 
         self.test_data = [
--- a/testing/firefox-ui/tests/functional/security/test_safe_browsing_warning_pages.py
+++ b/testing/firefox-ui/tests/functional/security/test_safe_browsing_warning_pages.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import time
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import By, expected, Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestSafeBrowsingWarningPages(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSafeBrowsingWarningPages, self).setUp()
 
         self.urls = [
--- a/testing/firefox-ui/tests/functional/security/test_security_notification.py
+++ b/testing/firefox-ui/tests/functional/security/test_security_notification.py
@@ -1,18 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import time
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import By, Wait
 from marionette_driver.errors import MarionetteException
+from marionette_harness import MarionetteTestCase
 
 
 class TestSecurityNotification(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSecurityNotification, self).setUp()
 
         self.urls = [
--- a/testing/firefox-ui/tests/functional/security/test_ssl_disabled_error_page.py
+++ b/testing/firefox-ui/tests/functional/security/test_ssl_disabled_error_page.py
@@ -1,18 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import time
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import By, expected, Wait
 from marionette_driver.errors import MarionetteException
+from marionette_harness import MarionetteTestCase
 
 
 class TestSSLDisabledErrorPage(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSSLDisabledErrorPage, self).setUp()
 
         self.url = 'https://tlsv1-0.mozqa.com'
--- a/testing/firefox-ui/tests/functional/security/test_ssl_status_after_restart.py
+++ b/testing/firefox-ui/tests/functional/security/test_ssl_status_after_restart.py
@@ -1,16 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
-from marionette.marionette_test import skip_if_e10s
 from marionette_driver import Wait
+from marionette_harness import MarionetteTestCase, skip_if_e10s
 
 
 class TestSSLStatusAfterRestart(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSSLStatusAfterRestart, self).setUp()
 
         self.test_data = (
--- a/testing/firefox-ui/tests/functional/security/test_submit_unencrypted_info_warning.py
+++ b/testing/firefox-ui/tests/functional/security/test_submit_unencrypted_info_warning.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import By, expected, Wait
 from marionette_driver.errors import NoAlertPresentException
 from marionette_driver.marionette import Alert
+from marionette_harness import MarionetteTestCase
 
 
 class TestSubmitUnencryptedInfoWarning(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSubmitUnencryptedInfoWarning, self).setUp()
 
         self.url = 'https://ssl-dv.mozqa.com/data/firefox/security/unencryptedsearch.html'
--- a/testing/firefox-ui/tests/functional/security/test_unknown_issuer.py
+++ b/testing/firefox-ui/tests/functional/security/test_unknown_issuer.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import time
 
-from marionette import MarionetteTestCase
 from marionette_driver import By
 from marionette_driver.errors import MarionetteException
+from marionette_harness import MarionetteTestCase
 
 
 class TestUnknownIssuer(MarionetteTestCase):
 
     def setUp(self):
         super(TestUnknownIssuer, self).setUp()
 
         self.url = 'https://ssl-unknownissuer.mozqa.com'
--- a/testing/firefox-ui/tests/functional/security/test_untrusted_connection_error_page.py
+++ b/testing/firefox-ui/tests/functional/security/test_untrusted_connection_error_page.py
@@ -1,18 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import time
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import By, Wait
 from marionette_driver.errors import MarionetteException
+from marionette_harness import MarionetteTestCase
 
 
 class TestUntrustedConnectionErrorPage(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestUntrustedConnectionErrorPage, self).setUp()
 
         self.url = 'https://ssl-selfsigned.mozqa.com'
--- a/testing/firefox-ui/tests/functional/sessionstore/test_restore_windows_after_restart.py
+++ b/testing/firefox-ui/tests/functional/sessionstore/test_restore_windows_after_restart.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestRestoreWindowsAfterRestart(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestRestoreWindowsAfterRestart, self).setUp()
 
         # Each list element represents a window of tabs loaded at
--- a/testing/firefox-ui/tests/puppeteer/test_about_window.py
+++ b/testing/firefox-ui/tests/puppeteer/test_about_window.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestAboutWindow(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestAboutWindow, self).setUp()
 
         self.about_window = self.browser.open_about_window()
--- a/testing/firefox-ui/tests/puppeteer/test_appinfo.py
+++ b/testing/firefox-ui/tests/puppeteer/test_appinfo.py
@@ -1,16 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import mozversion
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestAppInfo(PuppeteerMixin, MarionetteTestCase):
 
     def test_valid_properties(self):
         binary = self.marionette.bin
         version_info = mozversion.get_version(binary=binary)
 
--- a/testing/firefox-ui/tests/puppeteer/test_l10n.py
+++ b/testing/firefox-ui/tests/puppeteer/test_l10n.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
 from firefox_puppeteer.api.l10n import L10n
-from marionette import MarionetteTestCase
 from marionette_driver import By
 from marionette_driver.errors import MarionetteException
+from marionette_harness import MarionetteTestCase
 
 
 class TestL10n(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestL10n, self).setUp()
 
         self.l10n = L10n(self.marionette)
--- a/testing/firefox-ui/tests/puppeteer/test_menubar.py
+++ b/testing/firefox-ui/tests/puppeteer/test_menubar.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver.errors import NoSuchElementException
+from marionette_harness import MarionetteTestCase
 
 
 class TestMenuBar(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestMenuBar, self).setUp()
 
     def test_click_item_in_menubar(self):
--- a/testing/firefox-ui/tests/puppeteer/test_notifications.py
+++ b/testing/firefox-ui/tests/puppeteer/test_notifications.py
@@ -2,19 +2,19 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
 from firefox_puppeteer.ui.browser.notifications import (
     AddOnInstallFailedNotification,
     AddOnInstallConfirmationNotification,
 )
-from marionette import MarionetteTestCase
 from marionette_driver import By
 from marionette_driver.errors import TimeoutException
+from marionette_harness import MarionetteTestCase
 
 
 class TestNotifications(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestNotifications, self).setUp()
 
         self.puppeteer.prefs.set_pref('extensions.install.requireSecureOrigin', False)
--- a/testing/firefox-ui/tests/puppeteer/test_page_info_window.py
+++ b/testing/firefox-ui/tests/puppeteer/test_page_info_window.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestPageInfoWindow(PuppeteerMixin, MarionetteTestCase):
 
     def tearDown(self):
         try:
             self.puppeteer.windows.close_all([self.browser])
         finally:
--- a/testing/firefox-ui/tests/puppeteer/test_places.py
+++ b/testing/firefox-ui/tests/puppeteer/test_places.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import By, Wait
+from marionette_harness import MarionetteTestCase
 
 
 class TestPlaces(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestPlaces, self).setUp()
 
         self.urls = [self.marionette.absolute_url('layout/mozilla_governance.html'),
--- a/testing/firefox-ui/tests/puppeteer/test_prefs.py
+++ b/testing/firefox-ui/tests/puppeteer/test_prefs.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class testPreferences(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(testPreferences, self).setUp()
 
         self.new_pref = 'marionette.unittest.set_pref'
--- a/testing/firefox-ui/tests/puppeteer/test_security.py
+++ b/testing/firefox-ui/tests/puppeteer/test_security.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
 from firefox_puppeteer.errors import NoCertificateError
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestSecurity(PuppeteerMixin, MarionetteTestCase):
 
     def test_get_address_from_certificate(self):
         url = 'https://ssl-ev.mozqa.com'
 
         with self.marionette.using_context(self.marionette.CONTEXT_CONTENT):
--- a/testing/firefox-ui/tests/puppeteer/test_software_update.py
+++ b/testing/firefox-ui/tests/puppeteer/test_software_update.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import os
 
 from firefox_puppeteer import PuppeteerMixin
 from firefox_puppeteer.api.software_update import SoftwareUpdate
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestSoftwareUpdate(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSoftwareUpdate, self).setUp()
 
         self.software_update = SoftwareUpdate(self.marionette)
--- a/testing/firefox-ui/tests/puppeteer/test_tabbar.py
+++ b/testing/firefox-ui/tests/puppeteer/test_tabbar.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
 from firefox_puppeteer.errors import NoCertificateError
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestTabBar(PuppeteerMixin, MarionetteTestCase):
 
     def tearDown(self):
         try:
             self.browser.tabbar.close_all_tabs([self.browser.tabbar.tabs[0]])
         finally:
--- a/testing/firefox-ui/tests/puppeteer/test_toolbars.py
+++ b/testing/firefox-ui/tests/puppeteer/test_toolbars.py
@@ -1,16 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
 from marionette_driver import expected, By, Wait
 from marionette_driver.errors import NoSuchElementException
+from marionette_harness import MarionetteTestCase
 
 
 class TestNavBar(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestNavBar, self).setUp()
 
         self.navbar = self.browser.navbar
--- a/testing/firefox-ui/tests/puppeteer/test_update_wizard.py
+++ b/testing/firefox-ui/tests/puppeteer/test_update_wizard.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
 from firefox_puppeteer.ui.update_wizard import UpdateWizardDialog
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestUpdateWizard(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestUpdateWizard, self).setUp()
 
         def opener(win):
--- a/testing/firefox-ui/tests/puppeteer/test_utils.py
+++ b/testing/firefox-ui/tests/puppeteer/test_utils.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from firefox_puppeteer import PuppeteerMixin
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestSanitize(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSanitize, self).setUp()
 
         # Clear all previous history and cookies.
--- a/testing/firefox-ui/tests/puppeteer/test_windows.py
+++ b/testing/firefox-ui/tests/puppeteer/test_windows.py
@@ -1,19 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import firefox_puppeteer.errors as errors
 
 from firefox_puppeteer import PuppeteerMixin
 from firefox_puppeteer.ui.windows import BaseWindow
-from marionette import MarionetteTestCase
 from marionette_driver import By, Wait
 from marionette_driver.errors import NoSuchWindowException
+from marionette_harness import MarionetteTestCase
 
 
 class BaseWindowTestCase(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         """
         These tests open and close windows pretty rapidly, which
         (since bug 1261842) can cause content processes to be
rename from testing/marionette/harness/marionette/chrome/test.xul
rename to testing/marionette/chrome/test.xul
rename from testing/marionette/harness/marionette/chrome/test2.xul
rename to testing/marionette/chrome/test2.xul
rename from testing/marionette/harness/marionette/chrome/test_anonymous_content.xul
rename to testing/marionette/chrome/test_anonymous_content.xul
rename from testing/marionette/harness/marionette/chrome/test_dialog.xul
rename to testing/marionette/chrome/test_dialog.xul
rename from testing/marionette/harness/marionette/chrome/test_nested_iframe.xul
rename to testing/marionette/chrome/test_nested_iframe.xul
--- a/testing/marionette/harness/.flake8
+++ b/testing/marionette/harness/.flake8
@@ -1,3 +1,3 @@
 [flake8]
 max-line-length = 99
-exclude = __init__.py,disti/*,build/*,session/*,marionette/runner/mixins/*, marionette/tests/*
+exclude = __init__.py,disti/*,build/*,marionette_harness/runner/mixins/*, marionette_harness/tests/*
--- a/testing/marionette/harness/MANIFEST.in
+++ b/testing/marionette/harness/MANIFEST.in
@@ -1,8 +1,3 @@
-recursive-include marionette/touch *.js
-recursive-include marionette/www *
-recursive-include marionette/chrome *
-recursive-include marionette/runner/mixins/resources *
 exclude MANIFEST.in
 include requirements.txt
-include marionette/runner/test.cert
-include marionette/runner/test.key
+recursive-include marionette_harness/www *
--- a/testing/marionette/harness/README.rst
+++ b/testing/marionette/harness/README.rst
@@ -1,8 +1,30 @@
-marionette-client
-=================
+marionette-harness
+==================
+
+Marionette is an automation driver for Mozilla's Gecko engine. It can remotely
+control either the UI or the internal JavaScript of a Gecko platform, such as
+Firefox. It can control both the chrome (i.e. menus and functions) or the
+content (the webpage loaded inside the browsing context), giving a high level
+of control and ability to replicate user actions. In addition to performing
+actions on the browser, Marionette can also read the properties and attributes
+of the DOM.
 
-marionette_client has been renamed and is now available as marionette-harness:
+The marionette_harness package contains the test runner for Marionette, and
+allows you to run automated tests written in Python for Gecko based
+applications. Therefore it offers the necessary testcase classes, which are
+based on the unittest framework.
+
+For more information and the repository please checkout:
+
+- home and docs: https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette
+
 
-* marionette-harness <https://pypi.python.org/pypi/marionette-harness/>`_
+Example
+-------
 
-Please consider migrating to this new package.
+The following command will run the tests as specified via a manifest file, or
+test path, or test folder in Firefox:
+
+    marionette --binary %path_to_firefox% [manifest_file | test_file | test_folder]
+
+To get an overview about all possible option run `marionette --help`.
rename from testing/marionette/harness/marionette/__init__.py
rename to testing/marionette/harness/marionette_harness/__init__.py
--- a/testing/marionette/harness/marionette/__init__.py
+++ b/testing/marionette/harness/marionette_harness/__init__.py
@@ -1,29 +1,31 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-__version__ = '3.3.0'
+__version__ = '4.0.0'
 
 from .marionette_test import (
     CommonTestCase,
     expectedFailure,
     MarionetteTestCase,
     run_if_e10s,
     skip,
     skip_if_chrome,
     skip_if_desktop,
+    skip_if_e10s,
     skip_if_mobile,
     SkipTest,
     skip_unless_protocol,
 )
 from .runner import (
     BaseMarionetteArguments,
     BaseMarionetteTestRunner,
+    BrowserMobProxyArguments,
     BrowserMobProxyTestCaseMixin,
     Marionette,
     MarionetteTest,
     MarionetteTestResult,
     MarionetteTextTestRunner,
     TestManifest,
     TestResult,
     TestResultCollection,
rename from testing/marionette/harness/marionette/marionette_test/__init__.py
rename to testing/marionette/harness/marionette_harness/marionette_test/__init__.py
rename from testing/marionette/harness/marionette/marionette_test/decorators.py
rename to testing/marionette/harness/marionette_harness/marionette_test/decorators.py
--- a/testing/marionette/harness/marionette/marionette_test/decorators.py
+++ b/testing/marionette/harness/marionette_harness/marionette_test/decorators.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import functools
 import sys
 import types
 
-from marionette.marionette_test.errors import (
+from .errors import (
     _ExpectedFailure,
     _UnexpectedSuccess,
     SkipTest,
 )
 
 
 def expectedFailure(func):
     """Decorator which marks a test as expected fail."""
rename from testing/marionette/harness/marionette/marionette_test/errors.py
rename to testing/marionette/harness/marionette_harness/marionette_test/errors.py
rename from testing/marionette/harness/marionette/marionette_test/testcases.py
rename to testing/marionette/harness/marionette_harness/marionette_test/testcases.py
--- a/testing/marionette/harness/marionette/marionette_test/testcases.py
+++ b/testing/marionette/harness/marionette_harness/marionette_test/testcases.py
@@ -4,32 +4,32 @@
 
 import imp
 import os
 import re
 import sys
 import time
 import types
 import unittest
+import warnings
 import weakref
-import warnings
-
-from marionette.marionette_test.errors import (
-    _ExpectedFailure,
-    _UnexpectedSuccess,
-    SkipTest,
-)
 
 from marionette_driver.errors import (
     MarionetteException,
     ScriptTimeoutException,
     TimeoutException,
 )
 from mozlog import get_default_logger
 
+from .errors import (
+    _ExpectedFailure,
+    _UnexpectedSuccess,
+    SkipTest,
+)
+
 
 def _wraps_parameterized(func, func_suffix, args, kwargs):
     """Internal: Decorator used in class MetaParameterized."""
     def wrapper(self):
         return func(self, *args, **kwargs)
     wrapper.__name__ = func.__name__ + '_' + str(func_suffix)
     wrapper.__doc__ = '[{0}] {1}'.format(func_suffix, func.__doc__)
     return wrapper
rename from testing/marionette/harness/marionette/runner/__init__.py
rename to testing/marionette/harness/marionette_harness/runner/__init__.py
rename from testing/marionette/harness/marionette/runner/base.py
rename to testing/marionette/harness/marionette_harness/runner/base.py
--- a/testing/marionette/harness/marionette/runner/base.py
+++ b/testing/marionette/harness/marionette_harness/runner/base.py
@@ -6,28 +6,29 @@ import json
 import os
 import random
 import re
 import socket
 import sys
 import time
 import traceback
 import unittest
+
 from argparse import ArgumentParser
 from copy import deepcopy
 
 import mozinfo
 import moznetwork
 import mozprofile
-from marionette_driver.marionette import Marionette
-
 import mozversion
 import serve
+
 from manifestparser import TestManifest
 from manifestparser.filters import tags
+from marionette_driver.marionette import Marionette
 from moztest.adapters.unit import StructuredTestResult, StructuredTestRunner
 from moztest.results import TestResult, TestResultCollection, relevant_line
 from serve import iter_proc, iter_url
 
 here = os.path.abspath(os.path.dirname(__file__))
 
 
 def update_mozinfo(path=None):
rename from testing/marionette/harness/marionette/runner/httpd.py
rename to testing/marionette/harness/marionette_harness/runner/httpd.py
rename from testing/marionette/harness/marionette/runner/mixins/__init__.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/__init__.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/History.md
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/History.md
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/browsermobproxy/__init__.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/__init__.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/browsermobproxy/client.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/client.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/server.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/browsermobproxy/webdriver_event_listener.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/browsermobproxy/webdriver_event_listener.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/Makefile
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/Makefile
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/.buildinfo
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/.buildinfo
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_modules/browsermobproxy.html
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_modules/browsermobproxy.html
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_modules/index.html
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_modules/index.html
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/client.txt
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/client.txt
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/index.txt
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/index.txt
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/server.txt
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_sources/server.txt
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/basic.css
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/basic.css
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/default.css
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/default.css
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/doctools.js
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/doctools.js
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/jquery.js
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/jquery.js
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/pygments.css
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/pygments.css
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/searchtools.js
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/searchtools.js
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/sidebar.js
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/sidebar.js
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/underscore.js
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/underscore.js
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/websupport.js
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/_static/websupport.js
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/client.html
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/client.html
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/genindex.html
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/genindex.html
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/index.html
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/index.html
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/objects.inv
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/objects.inv
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/py-modindex.html
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/py-modindex.html
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/search.html
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/search.html
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/searchindex.js
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/searchindex.js
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/_build/html/server.html
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/_build/html/server.html
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/client.rst
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/client.rst
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/conf.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/conf.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/index.rst
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/index.rst
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/make.bat
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/make.bat
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/docs/server.rst
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/docs/server.rst
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/readme.md
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/readme.md
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/setup.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/setup.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/test/test_client.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/test/test_client.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/test/test_remote.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/test/test_remote.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob-proxy-py/test/test_webdriver.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py/test/test_webdriver.py
rename from testing/marionette/harness/marionette/runner/mixins/browsermob.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/browsermob.py
--- a/testing/marionette/harness/marionette/runner/mixins/browsermob.py
+++ b/testing/marionette/harness/marionette_harness/runner/mixins/browsermob.py
@@ -1,16 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import os
 
 from browsermobproxy import Server
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class BrowserMobProxyArguments(object):
     name = 'Browsermob Proxy'
     args = [
         [['--browsermob-script'],
          {'help': 'path to the browsermob-proxy shell script or batch file',
           }],
rename from testing/marionette/harness/marionette/runner/mixins/window_manager.py
rename to testing/marionette/harness/marionette_harness/runner/mixins/window_manager.py
rename from testing/marionette/harness/marionette/runner/serve.py
rename to testing/marionette/harness/marionette_harness/runner/serve.py
--- a/testing/marionette/harness/marionette/runner/serve.py
+++ b/testing/marionette/harness/marionette_harness/runner/serve.py
@@ -8,20 +8,22 @@
 processes.
 
 """
 
 import argparse
 import multiprocessing
 import os
 import sys
+
 from collections import defaultdict
 
 import httpd
 
+
 __all__ = ["default_doc_root",
            "iter_proc",
            "iter_url",
            "registered_servers",
            "servers",
            "start",
            "where_is"]
 here = os.path.abspath(os.path.dirname(__file__))
@@ -155,17 +157,17 @@ def start_servers(doc_root, ssl_config, 
         servers[schema] = (proc.get_url("/"), proc)
     return servers
 
 
 def start(doc_root=None, **kwargs):
     """Start all relevant test servers.
 
     If no `doc_root` is given the default
-    testing/marionette/harness/marionette/www directory will be used.
+    testing/marionette/harness/marionette_harness/www directory will be used.
 
     Additional keyword arguments can be given which will be passed on
     to the individual ``FixtureServer``'s in httpd.py.
 
     """
     doc_root = doc_root or default_doc_root
     ssl_config = {"cert_path": httpd.default_ssl_cert,
                   "key_path": httpd.default_ssl_key}
rename from testing/marionette/harness/marionette/runner/test.cert
rename to testing/marionette/harness/marionette_harness/runner/test.cert
rename from testing/marionette/harness/marionette/runner/test.key
rename to testing/marionette/harness/marionette_harness/runner/test.key
rename from testing/marionette/harness/marionette/runtests.py
rename to testing/marionette/harness/marionette_harness/runtests.py
--- a/testing/marionette/harness/marionette/runtests.py
+++ b/testing/marionette/harness/marionette_harness/runtests.py
@@ -1,23 +1,25 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import sys
 
-from marionette import __version__
+import mozlog
+
 from marionette_driver import __version__ as driver_version
-from marionette.marionette_test import MarionetteTestCase
-from marionette.runner import (
+
+from marionette_harness import (
+    __version__,
     BaseMarionetteTestRunner,
     BaseMarionetteArguments,
     BrowserMobProxyArguments,
+    MarionetteTestCase,
 )
-import mozlog
 
 
 class MarionetteTestRunner(BaseMarionetteTestRunner):
     def __init__(self, **kwargs):
         BaseMarionetteTestRunner.__init__(self, **kwargs)
         self.test_handlers = [MarionetteTestCase]
 
 
rename from testing/marionette/harness/marionette/tests/harness_unit/conftest.py
rename to testing/marionette/harness/marionette_harness/tests/harness_unit/conftest.py
--- a/testing/marionette/harness/marionette/tests/harness_unit/conftest.py
+++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/conftest.py
@@ -2,17 +2,18 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import pytest
 
 from mock import Mock, MagicMock
 
 from marionette_driver.marionette import Marionette
-from marionette.runner.httpd import FixtureServer
+
+from marionette_harness.runner.httpd import FixtureServer
 
 
 @pytest.fixture(scope='module')
 def logger():
     """
     Fake logger to help with mocking out other runner-related classes.
     """
     import mozlog
rename from testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py
rename to testing/marionette/harness/marionette_harness/tests/harness_unit/test_httpd.py
--- a/testing/marionette/harness/marionette/tests/harness_unit/test_httpd.py
+++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_httpd.py
@@ -4,19 +4,20 @@
 
 import json
 import os
 import types
 import urllib2
 
 import pytest
 
-from marionette.runner import httpd
 from wptserve.handlers import json_handler
 
+from marionette_harness.runner import httpd
+
 here = os.path.abspath(os.path.dirname(__file__))
 parent = os.path.dirname(here)
 default_doc_root = os.path.join(os.path.dirname(parent), "www")
 
 
 @pytest.yield_fixture
 def server():
     server = httpd.FixtureServer(default_doc_root)
rename from testing/marionette/harness/marionette/tests/harness_unit/test_marionette_arguments.py
rename to testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_arguments.py
--- a/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_arguments.py
+++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_arguments.py
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 import pytest
 
-from marionette.runtests import MarionetteArguments
+from marionette_harness.runtests import MarionetteArguments
 
 
 @pytest.mark.parametrize("socket_timeout", ['A', '10', '1B-', '1C2', '44.35'])
 def test_parse_arg_socket_timeout(socket_timeout):
     argv = ['marionette', '--socket-timeout', socket_timeout]
     parser = MarionetteArguments()
 
     def _is_float_convertible(value):
rename from testing/marionette/harness/marionette/tests/harness_unit/test_marionette_harness.py
rename to testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_harness.py
--- a/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_harness.py
+++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_harness.py
@@ -1,18 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 import pytest
 
 from mock import Mock, patch, sentinel
 
-from marionette.runtests import MarionetteTestRunner, MarionetteHarness, cli
+import marionette_harness.marionette_test as marionette_test
 
-import marionette.marionette_test as marionette_test
+from marionette_harness.runtests import MarionetteTestRunner, MarionetteHarness, cli
 
 
 @pytest.fixture
 def harness_class(request):
     """
     Mock based on MarionetteHarness whose run method just returns a number of
     failures according to the supplied test parameter
     """
@@ -57,27 +58,27 @@ def test_cli_exit_code(num_fails_crashed
     assert err.value.code == exit_code
 
 
 @pytest.mark.parametrize("num_fails_crashed", [(0, 0), (1, 0), (1, 1)])
 def test_call_harness_with_parsed_args_yields_num_failures(mach_parsed_kwargs,
                                                            runner_class,
                                                            num_fails_crashed):
     with patch(
-        'marionette.runtests.MarionetteHarness.parse_args'
+        'marionette_harness.runtests.MarionetteHarness.parse_args'
     ) as parse_args:
         failed_or_crashed = MarionetteHarness(runner_class,
                                               args=mach_parsed_kwargs).run()
         parse_args.assert_not_called()
     assert failed_or_crashed == sum(num_fails_crashed)
 
 
 def test_call_harness_with_no_args_yields_num_failures(runner_class):
     with patch(
-        'marionette.runtests.MarionetteHarness.parse_args',
+        'marionette_harness.runtests.MarionetteHarness.parse_args',
         return_value={'tests': []}
     ) as parse_args:
         failed_or_crashed = MarionetteHarness(runner_class).run()
         assert parse_args.call_count == 1
     assert failed_or_crashed == 0
 
 
 def test_args_passed_to_runner_class(mach_parsed_kwargs, runner_class):
rename from testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py
rename to testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_runner.py
--- a/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_runner.py
+++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_runner.py
@@ -1,17 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import manifestparser
 import pytest
 
 from mock import Mock, patch, mock_open, sentinel, DEFAULT
 
-from marionette.runtests import MarionetteTestRunner
-import manifestparser
+from marionette_harness.runtests import MarionetteTestRunner
 
 
 @pytest.fixture
 def runner(mach_parsed_kwargs):
     """
     MarionetteTestRunner instance initialized with default options.
     """
     return MarionetteTestRunner(**mach_parsed_kwargs)
@@ -23,27 +24,27 @@ def mock_runner(runner, mock_marionette,
     MarionetteTestRunner instance with mocked-out
     self.marionette and other properties,
     to enable testing runner.run_tests().
     """
     runner.driverclass = mock_marionette
     for attr in ['run_test_set', '_capabilities']:
         setattr(runner, attr, Mock())
     runner._appName = 'fake_app'
-    monkeypatch.setattr('marionette.runner.base.mozversion', Mock())
+    monkeypatch.setattr('marionette_harness.runner.base.mozversion', Mock())
     return runner
 
 
 @pytest.fixture
 def build_kwargs_using(mach_parsed_kwargs):
     '''Helper function for test_build_kwargs_* functions'''
     def kwarg_builder(new_items, return_socket=False):
         mach_parsed_kwargs.update(new_items)
         runner = MarionetteTestRunner(**mach_parsed_kwargs)
-        with patch('marionette.runner.base.socket') as socket:
+        with patch('marionette_harness.runner.base.socket') as socket:
             built_kwargs = runner._build_kwargs()
         if return_socket:
             return built_kwargs, socket
         return built_kwargs
     return kwarg_builder
 
 
 @pytest.fixture
@@ -206,17 +207,17 @@ def test_parsing_testvars(mach_parsed_kw
              "ssid": "blah",
              "keyManagement": "WPA-PSK",
              "psk": "foo",
              "PEAP": "bar"
          },
          "device": {"stuff": "buzz"}
     }
     with patch(
-        'marionette.runtests.MarionetteTestRunner._load_testvars',
+        'marionette_harness.runtests.MarionetteTestRunner._load_testvars',
         return_value=testvars_json_loads
     ) as load:
         runner = MarionetteTestRunner(**mach_parsed_kwargs)
         assert runner.testvars == expected_dict
         assert load.call_count == 1
 
 
 def test_load_testvars_throws_expected_errors(mach_parsed_kwargs):
@@ -288,38 +289,40 @@ def test_add_test_directory(runner):
     assert isdir.called and walk.called
     for test in runner.tests:
         assert test_dir in test['filepath']
     assert len(runner.tests) == 4
 
 
 @pytest.mark.parametrize("test_files_exist", [True, False])
 def test_add_test_manifest(mock_runner, manifest_with_tests, monkeypatch, test_files_exist):
-    monkeypatch.setattr('marionette.runner.base.TestManifest', manifest_with_tests.manifest_class)
-    with patch('marionette.runner.base.os.path.exists', return_value=test_files_exist):
+    monkeypatch.setattr('marionette_harness.runner.base.TestManifest',
+                        manifest_with_tests.manifest_class)
+    with patch('marionette_harness.runner.base.os.path.exists', return_value=test_files_exist):
         if test_files_exist or manifest_with_tests.n_enabled == 0:
             mock_runner.add_test(manifest_with_tests.filepath)
             assert len(mock_runner.tests) == manifest_with_tests.n_enabled
             assert len(mock_runner.manifest_skipped_tests) == manifest_with_tests.n_disabled
             for test in mock_runner.tests:
                 assert test['filepath'].endswith(test['expected'] + '.py')
         else:
             pytest.raises(IOError, "mock_runner.add_test(manifest_with_tests.filepath)")
     assert manifest_with_tests.manifest_class().read.called
     assert manifest_with_tests.manifest_class().active_tests.called
 
 
 def get_kwargs_passed_to_manifest(mock_runner, manifest, monkeypatch, **kwargs):
     '''Helper function for test_manifest_* tests.
     Returns the kwargs passed to the call to manifest.active_tests.'''
-    monkeypatch.setattr('marionette.runner.base.TestManifest', manifest.manifest_class)
-    monkeypatch.setattr('marionette.runner.base.mozinfo.info', {'mozinfo_key': 'mozinfo_val'})
+    monkeypatch.setattr('marionette_harness.runner.base.TestManifest', manifest.manifest_class)
+    monkeypatch.setattr('marionette_harness.runner.base.mozinfo.info',
+                        {'mozinfo_key': 'mozinfo_val'})
     for attr in kwargs:
         setattr(mock_runner, attr, kwargs[attr])
-    with patch('marionette.runner.base.os.path.exists', return_value=True):
+    with patch('marionette_harness.runner.base.os.path.exists', return_value=True):
         mock_runner.add_test(manifest.filepath)
     call_args, call_kwargs = manifest.manifest_class().active_tests.call_args
     return call_kwargs
 
 
 def test_manifest_basic_args(mock_runner, manifest, monkeypatch):
     kwargs = get_kwargs_passed_to_manifest(mock_runner, manifest, monkeypatch)
     assert kwargs['exists'] is False
@@ -339,19 +342,20 @@ def test_manifest_with_test_tags(mock_ru
     kwargs = get_kwargs_passed_to_manifest(mock_runner, manifest, monkeypatch, test_tags=test_tags)
     if test_tags is None:
         assert kwargs['filters'] == []
     else:
         assert len(kwargs['filters']) == 1 and kwargs['filters'][0].tags == test_tags
 
 
 def test_cleanup_with_manifest(mock_runner, manifest_with_tests, monkeypatch):
-    monkeypatch.setattr('marionette.runner.base.TestManifest', manifest_with_tests.manifest_class)
+    monkeypatch.setattr('marionette_harness.runner.base.TestManifest',
+                        manifest_with_tests.manifest_class)
     if manifest_with_tests.n_enabled > 0:
-        context = patch('marionette.runner.base.os.path.exists', return_value=True)
+        context = patch('marionette_harness.runner.base.os.path.exists', return_value=True)
     else:
         context = pytest.raises(Exception)
     with context:
         mock_runner.run_tests([manifest_with_tests.filepath])
     assert mock_runner.marionette is None
     assert mock_runner.fixture_servers == {}
 
 
rename from testing/marionette/harness/marionette/tests/harness_unit/test_marionette_test_result.py
rename to testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_test_result.py
--- a/testing/marionette/harness/marionette/tests/harness_unit/test_marionette_test_result.py
+++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_marionette_test_result.py
@@ -1,20 +1,21 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 import pytest
 
-from marionette.runner import MarionetteTestResult
+from marionette_harness import MarionetteTestResult
 
 
 @pytest.fixture
 def empty_marionette_testcase():
     """ Testable MarionetteTestCase class """
-    from marionette.marionette_test import MarionetteTestCase
+    from marionette_harness import MarionetteTestCase
 
     class EmptyTestCase(MarionetteTestCase):
         def test_nothing(self):
             pass
 
     return EmptyTestCase
 
 
rename from testing/marionette/harness/marionette/tests/harness_unit/test_serve.py
rename to testing/marionette/harness/marionette_harness/tests/harness_unit/test_serve.py
--- a/testing/marionette/harness/marionette/tests/harness_unit/test_serve.py
+++ b/testing/marionette/harness/marionette_harness/tests/harness_unit/test_serve.py
@@ -1,18 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import types
 
 import pytest
 
-from marionette.runner import serve
-from marionette.runner.serve import iter_proc, iter_url
+from marionette_harness.runner import serve
+from marionette_harness.runner.serve import iter_proc, iter_url
 
 
 def teardown_function(func):
     for server in [server for server in iter_proc(serve.servers) if server.is_alive]:
         server.stop()
         server.kill()
 
 
rename from testing/marionette/harness/marionette/tests/unit-tests.ini
rename to testing/marionette/harness/marionette_harness/tests/unit-tests.ini
rename from testing/marionette/harness/marionette/tests/unit/importanotherscript.js
rename to testing/marionette/harness/marionette_harness/tests/unit/importanotherscript.js
rename from testing/marionette/harness/marionette/tests/unit/importscript.js
rename to testing/marionette/harness/marionette_harness/tests/unit/importscript.js
rename from testing/marionette/harness/marionette/tests/unit/mn-restartless-unsigned.xpi
rename to testing/marionette/harness/marionette_harness/tests/unit/mn-restartless-unsigned.xpi
rename from testing/marionette/harness/marionette/tests/unit/single_finger_functions.py
rename to testing/marionette/harness/marionette_harness/tests/unit/single_finger_functions.py
rename from testing/marionette/harness/marionette/tests/unit/test_about_pages.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_about_pages.py
--- a/testing/marionette/harness/marionette/tests/unit/test_about_pages.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_about_pages.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, WindowManagerMixin
+from marionette_driver.by import By
 from marionette_driver.keys import Keys
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
 
 
 class TestAboutPages(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestAboutPages, self).setUp()
 
         if self.marionette.session_capabilities['platformName'] == 'darwin':
rename from testing/marionette/harness/marionette/tests/unit/test_accessibility.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_accessibility.py
--- a/testing/marionette/harness/marionette/tests/unit/test_accessibility.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_accessibility.py
@@ -1,16 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
-from marionette_driver.errors import (ElementNotAccessibleException,
-                                      ElementNotVisibleException)
 from marionette_driver.by import By
+from marionette_driver.errors import (
+    ElementNotAccessibleException,
+    ElementNotVisibleException
+)
+
+from marionette_harness import MarionetteTestCase
 
 
 
 class TestAccessibility(MarionetteTestCase):
     def setUp(self):
         super(TestAccessibility, self).setUp()
         with self.marionette.using_context("chrome"):
             self.marionette.set_pref("dom.ipc.processCount", 1)
rename from testing/marionette/harness/marionette/tests/unit/test_addons.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_addons.py
--- a/testing/marionette/harness/marionette/tests/unit/test_addons.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_addons.py
@@ -1,18 +1,20 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import os
 import unittest
 
-from marionette import MarionetteTestCase
 from marionette_driver.addons import Addons, AddonInstallException
 
+from marionette_harness import MarionetteTestCase
+
+
 here = os.path.abspath(os.path.dirname(__file__))
 
 
 class TestAddons(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.addons = Addons(self.marionette)
 
rename from testing/marionette/harness/marionette/tests/unit/test_anonymous_content.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_anonymous_content.py
--- a/testing/marionette/harness/marionette/tests/unit/test_anonymous_content.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_anonymous_content.py
@@ -1,20 +1,21 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from unittest import skip
 
-from marionette import MarionetteTestCase, WindowManagerMixin
+from marionette_driver.by import By
 from marionette_driver.errors import NoSuchElementException
 from marionette_driver.expected import element_present
 from marionette_driver.marionette import HTMLElement
 from marionette_driver.wait import Wait
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
 
 
 class TestAnonymousContent(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestAnonymousContent, self).setUp()
         self.marionette.set_context("chrome")
 
rename from testing/marionette/harness/marionette/tests/unit/test_browsermobproxy.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_browsermobproxy.py
--- a/testing/marionette/harness/marionette/tests/unit/test_browsermobproxy.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_browsermobproxy.py
@@ -1,11 +1,11 @@
 import datetime
 
-from marionette.runner import BrowserMobTestCase
+from marionette_harness.runner import BrowserMobTestCase
 
 
 class TestBrowserMobProxy(BrowserMobTestCase):
     """To run this test, you'll need to download the browsermob-proxy from
        http://bmp.lightbody.net/, and then pass the path to the startup
        script (typically /path/to/browsermob-proxy-2.0.0/bin/browsermob-proxy)
        as the --browsermob-script argument when running runtests.py.
 
rename from testing/marionette/harness/marionette/tests/unit/test_capabilities.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_capabilities.py
--- a/testing/marionette/harness/marionette/tests/unit/test_capabilities.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_capabilities.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.errors import SessionNotCreatedException
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestCapabilities(MarionetteTestCase):
 
     def setUp(self):
         super(TestCapabilities, self).setUp()
         self.caps = self.marionette.session_capabilities
         with self.marionette.using_context("chrome"):
             self.appinfo = self.marionette.execute_script(
rename from testing/marionette/harness/marionette/tests/unit/test_certificates.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_certificates.py
--- a/testing/marionette/harness/marionette/tests/unit/test_certificates.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_certificates.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.errors import UnknownException
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestCertificates(MarionetteTestCase):
     def test_block_insecure_sites(self):
         self.marionette.delete_session()
         self.marionette.start_session()
 
         self.marionette.navigate(self.fixtures.where_is("test.html", on="http"))
         self.assertIn("http://", self.marionette.get_url())
rename from testing/marionette/harness/marionette/tests/unit/test_checkbox.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_checkbox.py
--- a/testing/marionette/harness/marionette/tests/unit/test_checkbox.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_checkbox.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestCheckbox(MarionetteTestCase):
     def test_selected(self):
         test_html = self.marionette.absolute_url("test.html")
         self.marionette.navigate(test_html)
         box = self.marionette.find_element(By.NAME, "myCheckBox")
         self.assertFalse(box.is_selected())
         box.click()
rename from testing/marionette/harness/marionette/tests/unit/test_checkbox_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_checkbox_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_checkbox_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_checkbox_chrome.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, WindowManagerMixin
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
+
 
 class TestSelectedChrome(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSelectedChrome, self).setUp()
 
         self.marionette.set_context("chrome")
 
rename from testing/marionette/harness/marionette/tests/unit/test_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_chrome.py
@@ -8,19 +8,20 @@
 #     http://www.apache.org/licenses/LICENSE-2.0
 #
 #Unless required by applicable law or agreed to in writing, software
 #distributed under the License is distributed on an "AS IS" BASIS,
 #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 #See the License for the specific language governing permissions and
 #limitations under the License.
 
-from marionette import MarionetteTestCase, WindowManagerMixin
 from marionette_driver import By
 
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
+
 
 class ChromeTests(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(ChromeTests, self).setUp()
 
         self.marionette.set_context('chrome')
 
rename from testing/marionette/harness/marionette/tests/unit/test_chrome_async_finish.js
rename to testing/marionette/harness/marionette_harness/tests/unit/test_chrome_async_finish.js
rename from testing/marionette/harness/marionette/tests/unit/test_chrome_element_css.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_chrome_element_css.py
--- a/testing/marionette/harness/marionette/tests/unit/test_chrome_element_css.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_chrome_element_css.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestChromeElementCSS(MarionetteTestCase):
 
     def test_we_can_get_css_value_on_chrome_element(self):
         self.marionette.navigate("about:blank")
         with self.marionette.using_context("chrome"):
             element = self.marionette.find_element(By.ID, "identity-icon")
             favicon_image = element.value_of_css_property("list-style-image")
rename from testing/marionette/harness/marionette/tests/unit/test_clearing.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_clearing.py
--- a/testing/marionette/harness/marionette/tests/unit/test_clearing.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_clearing.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_driver.by import By
 from marionette_driver.errors import InvalidElementStateException
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestClear(MarionetteTestCase):
     def testWriteableTextInputShouldClear(self):
         test_html = self.marionette.absolute_url("test_clearing.html")
         self.marionette.navigate(test_html)
         element = self.marionette.find_element(By.ID, "writableTextInput")
         element.clear()
rename from testing/marionette/harness/marionette/tests/unit/test_click.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_click.py
--- a/testing/marionette/harness/marionette/tests/unit/test_click.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_click.py
@@ -1,19 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import urllib
-from unittest import skip
 
 from marionette_driver.by import By
 from marionette_driver.errors import NoSuchElementException, ElementNotVisibleException
 from marionette_driver.wait import Wait
-from marionette import MarionetteTestCase
+
+from marionette_harness import MarionetteTestCase
 
 
 def inline(doc):
     return "data:text/html;charset=utf-8,{}".format(urllib.quote(doc))
 
 
 # The <a> element in the following HTML is not interactable because it
 # is hidden by an overlay when scrolled into the top of the viewport.
rename from testing/marionette/harness/marionette/tests/unit/test_click_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_click_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_click_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_click_chrome.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestClickChrome(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.root_window = self.marionette.current_window_handle
         self.marionette.set_context("chrome")
         self.marionette.execute_script(
             "window.open('chrome://marionette/content/test.xul', 'foo', 'chrome,centerscreen')")
rename from testing/marionette/harness/marionette/tests/unit/test_click_scrolling.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_click_scrolling.py
--- a/testing/marionette/harness/marionette/tests/unit/test_click_scrolling.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_click_scrolling.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from marionette_driver.by import By
 from marionette_driver.errors import MoveTargetOutOfBoundsException
-from marionette import MarionetteTestCase, skip
+
+from marionette_harness import MarionetteTestCase, skip
 
 
 class TestClickScrolling(MarionetteTestCase):
 
 
     def test_clicking_on_anchor_scrolls_page(self):
         scrollScript = """
             var pageY;
rename from testing/marionette/harness/marionette/tests/unit/test_cookies.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_cookies.py
--- a/testing/marionette/harness/marionette/tests/unit/test_cookies.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_cookies.py
@@ -1,12 +1,17 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 import calendar
+import random
 import time
-import random
-from marionette import MarionetteTestCase
+
+from marionette_harness import MarionetteTestCase
 
 
 class CookieTest(MarionetteTestCase):
 
     def setUp(self):
         MarionetteTestCase.setUp(self)
         test_url = self.marionette.absolute_url('test.html')
         self.marionette.navigate(test_url)
rename from testing/marionette/harness/marionette/tests/unit/test_crash.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_crash.py
--- a/testing/marionette/harness/marionette/tests/unit/test_crash.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_crash.py
@@ -1,21 +1,21 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import glob
 import shutil
 
-from marionette import MarionetteTestCase, expectedFailure, run_if_e10s
 from marionette_driver.errors import MarionetteException
-
 # Import runner module to monkey patch mozcrash module
 from mozrunner.base import runner
 
+from marionette_harness import MarionetteTestCase, expectedFailure, run_if_e10s
+
 
 class MockMozCrash(object):
     """Mock object to replace original mozcrash methods."""
 
     def __init__(self, marionette):
         self.marionette = marionette
 
         with self.marionette.using_context('chrome'):
rename from testing/marionette/harness/marionette/tests/unit/test_data_driven.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_data_driven.py
--- a/testing/marionette/harness/marionette/tests/unit/test_data_driven.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_data_driven.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette.marionette_test import (
+from marionette_harness.marionette_test import (
     parameterized,
     with_parameters,
     MetaParameterized,
     MarionetteTestCase
 )
 
 class Parameterizable(object):
     __metaclass__ = MetaParameterized
rename from testing/marionette/harness/marionette/tests/unit/test_date_time_value.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_date_time_value.py
--- a/testing/marionette/harness/marionette/tests/unit/test_date_time_value.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_date_time_value.py
@@ -1,17 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from datetime import datetime
 
-from marionette import MarionetteTestCase
+from marionette_driver.by import By
 from marionette_driver.date_time_value import DateTimeValue
-from marionette_driver.by import By
+from marionette_harness import MarionetteTestCase
 
 
 class TestDateTime(MarionetteTestCase):
     def test_set_date(self):
         test_html = self.marionette.absolute_url("datetimePage.html")
         self.marionette.navigate(test_html)
 
         element = self.marionette.find_element(By.ID, "date-test")
rename from testing/marionette/harness/marionette/tests/unit/test_element_retrieval.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_element_retrieval.py
--- a/testing/marionette/harness/marionette/tests/unit/test_element_retrieval.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_element_retrieval.py
@@ -1,19 +1,20 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import re
 import urllib
 
-from marionette import MarionetteTestCase, skip
-from marionette_driver.marionette import HTMLElement
 from marionette_driver.by import By
 from marionette_driver.errors import NoSuchElementException, InvalidSelectorException
+from marionette_driver.marionette import HTMLElement
+
+from marionette_harness import MarionetteTestCase, skip
 
 
 def inline(doc, doctype="html"):
     if doctype == "html":
         return "data:text/html;charset=utf-8,{}".format(urllib.quote(doc))
     elif doctype == "xhtml":
         return "data:application/xhtml+xml,{}".format(urllib.quote(
 r"""<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
rename from testing/marionette/harness/marionette/tests/unit/test_element_state.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_element_state.py
--- a/testing/marionette/harness/marionette/tests/unit/test_element_state.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_element_state.py
@@ -1,18 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import types
 import urllib
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 boolean_attributes = {
   "audio": ["autoplay", "controls", "loop", "muted"],
   "button": ["autofocus", "disabled", "formnovalidate"],
   "details": ["open"],
   "dialog": ["open"],
   "fieldset": ["disabled"],
   "form": ["novalidate"],
rename from testing/marionette/harness/marionette/tests/unit/test_element_state_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_element_state_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_element_state_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_element_state_chrome.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestIsElementEnabledChrome(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.marionette.set_context("chrome")
         self.win = self.marionette.current_window_handle
         self.marionette.execute_script("window.open('chrome://marionette/content/test.xul', 'foo', 'chrome,centerscreen');")
         self.marionette.switch_to_window('foo')
rename from testing/marionette/harness/marionette/tests/unit/test_elementsize.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_elementsize.py
--- a/testing/marionette/harness/marionette/tests/unit/test_elementsize.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_elementsize.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestElementSize(MarionetteTestCase):
     def testShouldReturnTheSizeOfALink(self):
         test_html = self.marionette.absolute_url("testSize.html")
         self.marionette.navigate(test_html)
         shrinko = self.marionette.find_element(By.ID, 'linkId')
         size = shrinko.rect
         self.assertTrue(size['width'] > 0)
rename from testing/marionette/harness/marionette/tests/unit/test_elementsize_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_elementsize_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_elementsize_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_elementsize_chrome.py
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
+from marionette_driver.by import By
 
-from marionette import MarionetteTestCase, WindowManagerMixin
-from marionette_driver.by import By
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
 
 
 class TestElementSizeChrome(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestElementSizeChrome, self).setUp()
 
         self.marionette.set_context("chrome")
rename from testing/marionette/harness/marionette/tests/unit/test_errors.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_errors.py
--- a/testing/marionette/harness/marionette/tests/unit/test_errors.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_errors.py
@@ -1,17 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import sys
 
-from marionette import marionette_test
 from marionette_driver import errors
 
+from marionette_harness import marionette_test
+
+
 def fake_cause():
     try:
         raise ValueError("bar")
     except ValueError as e:
         return sys.exc_info()
 
 message = "foo"
 cause = fake_cause()
rename from testing/marionette/harness/marionette/tests/unit/test_execute_async_script.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_execute_async_script.py
--- a/testing/marionette/harness/marionette/tests/unit/test_execute_async_script.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_execute_async_script.py
@@ -1,16 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
-from marionette_driver.errors import ( JavascriptException,
-                                       MarionetteException,
-                                       ScriptTimeoutException )
+from marionette_driver.errors import (
+    JavascriptException,
+    ScriptTimeoutException,
+)
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestExecuteAsyncContent(MarionetteTestCase):
     def setUp(self):
         super(TestExecuteAsyncContent, self).setUp()
         self.marionette.timeout.script = 1
 
     def test_execute_async_simple(self):
rename from testing/marionette/harness/marionette/tests/unit/test_execute_isolate.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_execute_isolate.py
--- a/testing/marionette/harness/marionette/tests/unit/test_execute_isolate.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_execute_isolate.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
-from marionette_driver.errors import (MarionetteException,
-                                      ScriptTimeoutException)
+from marionette_driver.errors import ScriptTimeoutException
+
+from marionette_harness import MarionetteTestCase
+
 
 class TestExecuteIsolationContent(MarionetteTestCase):
     def setUp(self):
         super(TestExecuteIsolationContent, self).setUp()
         self.content = True
 
     def test_execute_async_isolate(self):
         # Results from one execute call that has timed out should not
rename from testing/marionette/harness/marionette/tests/unit/test_execute_sandboxes.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_execute_sandboxes.py
--- a/testing/marionette/harness/marionette/tests/unit/test_execute_sandboxes.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_execute_sandboxes.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.errors import JavascriptException
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestExecuteSandboxes(MarionetteTestCase):
     def setUp(self):
         super(TestExecuteSandboxes, self).setUp()
 
     def test_execute_system_sandbox(self):
         # Test that "system" sandbox has elevated privileges in execute_script
         result = self.marionette.execute_script(
rename from testing/marionette/harness/marionette/tests/unit/test_execute_script.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_execute_script.py
--- a/testing/marionette/harness/marionette/tests/unit/test_execute_script.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_execute_script.py
@@ -1,21 +1,20 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import os
-import time
 import urllib
 
 from marionette_driver import By, errors
 from marionette_driver.marionette import HTMLElement
 from marionette_driver.wait import Wait
 
-from marionette import MarionetteTestCase, WindowManagerMixin
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
 
 
 def inline(doc):
     return "data:text/html;charset=utf-8,{}".format(urllib.quote(doc))
 
 
 elements = inline("<p>foo</p> <p>bar</p>")
 
rename from testing/marionette/harness/marionette/tests/unit/test_expected.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_expected.py
--- a/testing/marionette/harness/marionette/tests/unit/test_expected.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_expected.py
@@ -2,17 +2,17 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import urllib
 
 from marionette_driver import expected
 from marionette_driver.by import By
 
-from marionette import marionette_test
+from marionette_harness import marionette_test
 
 
 def inline(doc):
     return "data:text/html;charset=utf-8,{}".format(urllib.quote(doc))
 
 static_element = inline("""<p>foo</p>""")
 static_elements = static_element + static_element
 
rename from testing/marionette/harness/marionette/tests/unit/test_expectedfail.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_expectedfail.py
--- a/testing/marionette/harness/marionette/tests/unit/test_expectedfail.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_expectedfail.py
@@ -1,10 +1,11 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
+
 
 class TestFail(MarionetteTestCase):
     def test_fails(self):
         # this test is supposed to fail!
         self.assertEquals(True, False)
rename from testing/marionette/harness/marionette/tests/unit/test_file_upload.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_file_upload.py
--- a/testing/marionette/harness/marionette/tests/unit/test_file_upload.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_file_upload.py
@@ -2,19 +2,19 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import contextlib
 import urllib
 
 from tempfile import NamedTemporaryFile as tempfile
 
-from marionette import MarionetteTestCase, skip
 from marionette_driver import By, errors, expected
 from marionette_driver.wait import Wait
+from marionette_harness import MarionetteTestCase, skip
 
 
 single = "data:text/html,{}".format(urllib.quote("<input type=file>"))
 multiple = "data:text/html,{}".format(urllib.quote("<input type=file multiple>"))
 upload = lambda url: "data:text/html,{}".format(urllib.quote("""
     <form action='{}' method=post enctype='multipart/form-data'>
      <input type=file>
      <input type=submit>
rename from testing/marionette/harness/marionette/tests/unit/test_findelement_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_findelement_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_findelement_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_findelement_chrome.py
@@ -1,16 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
-from marionette_driver.marionette import HTMLElement
 from marionette_driver.by import By
 from marionette_driver.errors import NoSuchElementException
+from marionette_driver.marionette import HTMLElement
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestElementsChrome(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.marionette.set_context("chrome")
         self.win = self.marionette.current_window_handle
         self.marionette.execute_script("window.open('chrome://marionette/content/test.xul', 'foo', 'chrome,centerscreen');")
rename from testing/marionette/harness/marionette/tests/unit/test_geckoinstance.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_geckoinstance.py
--- a/testing/marionette/harness/marionette/tests/unit/test_geckoinstance.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_geckoinstance.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette.marionette_test import MarionetteTestCase
 from marionette_driver.geckoinstance import apps, GeckoInstance
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestGeckoInstance(MarionetteTestCase):
 
     def test_create(self):
         """Test that the correct gecko instance is determined."""
         for app in apps:
             # If app has been specified we directly return the appropriate instance class
             self.assertEqual(type(GeckoInstance.create(app=app, bin="n/a")),
rename from testing/marionette/harness/marionette/tests/unit/test_getactiveframe_oop.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_getactiveframe_oop.py
--- a/testing/marionette/harness/marionette/tests/unit/test_getactiveframe_oop.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_getactiveframe_oop.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 OOP_BY_DEFAULT = "dom.ipc.browser_frames.oop_by_default"
 BROWSER_FRAMES_ENABLED = "dom.mozBrowserFramesEnabeld"
 
 
 class TestGetActiveFrameOOP(MarionetteTestCase):
     def setUp(self):
         super(TestGetActiveFrameOOP, self).setUp()
rename from testing/marionette/harness/marionette/tests/unit/test_implicit_waits.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_implicit_waits.py
--- a/testing/marionette/harness/marionette/tests/unit/test_implicit_waits.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_implicit_waits.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_driver.by import By
 from marionette_driver.errors import NoSuchElementException
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestImplicitWaits(MarionetteTestCase):
     def test_implicitly_wait_for_single_element(self):
         test_html = self.marionette.absolute_url("test_dynamic.html")
         self.marionette.navigate(test_html)
         add = self.marionette.find_element(By.ID, "adder")
         self.marionette.timeout.implicit = 30
rename from testing/marionette/harness/marionette/tests/unit/test_import_script.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py
--- a/testing/marionette/harness/marionette/tests/unit/test_import_script.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_import_script.py
@@ -1,17 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import os
 
-from marionette import MarionetteTestCase, WindowManagerMixin, skip_if_chrome
+from marionette_driver.by import By
 from marionette_driver.errors import JavascriptException
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase, WindowManagerMixin, skip_if_chrome
 
 
 class TestImportScriptContent(WindowManagerMixin, MarionetteTestCase):
     contexts = set(["chrome", "content"])
 
     script_file = os.path.abspath(
         os.path.join(__file__, os.path.pardir, "importscript.js"))
     another_script_file = os.path.abspath(
rename from testing/marionette/harness/marionette/tests/unit/test_key_actions.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_key_actions.py
--- a/testing/marionette/harness/marionette/tests/unit/test_key_actions.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_key_actions.py
@@ -1,16 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, WindowManagerMixin
+from marionette_driver.by import By
 from marionette_driver.keys import Keys
 from marionette_driver.marionette import Actions
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
 
 
 class TestKeyActions(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestKeyActions, self).setUp()
         if self.marionette.session_capabilities["platformName"] == "darwin":
             self.mod_key = Keys.META
rename from testing/marionette/harness/marionette/tests/unit/test_localization.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_localization.py
--- a/testing/marionette/harness/marionette/tests/unit/test_localization.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_localization.py
@@ -1,17 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver import By
 from marionette_driver.errors import InvalidArgumentException, NoSuchElementException
 from marionette_driver.localization import L10n
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestL10n(MarionetteTestCase):
 
     def setUp(self):
         super(TestL10n, self).setUp()
 
         self.l10n = L10n(self.marionette)
 
rename from testing/marionette/harness/marionette/tests/unit/test_log.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_log.py
--- a/testing/marionette/harness/marionette/tests/unit/test_log.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_log.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestLog(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         # clears log cache
         self.marionette.get_logs()
 
rename from testing/marionette/harness/marionette/tests/unit/test_marionette.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_marionette.py
--- a/testing/marionette/harness/marionette/tests/unit/test_marionette.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_marionette.py
@@ -1,18 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import itertools
 import time
 
-from marionette.marionette_test import MarionetteTestCase
+from marionette_driver import errors
 
-from marionette_driver import errors
+from marionette_harness import MarionetteTestCase
 
 
 class TestMarionette(MarionetteTestCase):
 
     def test_correct_test_name(self):
         """Test that the correct test name gets set."""
         expected_test_name = '{module}.py {cls}.{func}'.format(
             module=__name__,
rename from testing/marionette/harness/marionette/tests/unit/test_modal_dialogs.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_modal_dialogs.py
--- a/testing/marionette/harness/marionette/tests/unit/test_modal_dialogs.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_modal_dialogs.py
@@ -1,17 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette.marionette_test import MarionetteTestCase, skip_if_e10s
+from marionette_driver.by import By
 from marionette_driver.errors import NoAlertPresentException, ElementNotVisibleException
 from marionette_driver.marionette import Alert
 from marionette_driver.wait import Wait
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase, skip_if_e10s
 
 
 class TestTabModals(MarionetteTestCase):
 
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.marionette.enforce_gecko_prefs({"prompts.tab_modal.enabled": True})
         self.marionette.navigate(self.marionette.absolute_url('modal_dialogs.html'))
rename from testing/marionette/harness/marionette/tests/unit/test_mouse_action.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_mouse_action.py
--- a/testing/marionette/harness/marionette/tests/unit/test_mouse_action.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_mouse_action.py
@@ -1,16 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_driver.by import By
+from marionette_driver.keys import Keys
 from marionette_driver.marionette import Actions
-from marionette_driver.keys import Keys
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestMouseAction(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         if self.marionette.session_capabilities["platformName"] == "darwin":
             self.mod_key = Keys.META
         else:
rename from testing/marionette/harness/marionette/tests/unit/test_navigation.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_navigation.py
--- a/testing/marionette/harness/marionette/tests/unit/test_navigation.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_navigation.py
@@ -1,19 +1,20 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
+import contextlib
 import time
 import urllib
-import contextlib
 
-from marionette import MarionetteTestCase, WindowManagerMixin
 from marionette_driver import errors, By, Wait
 
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
+
 
 def inline(doc):
     return "data:text/html;charset=utf-8,%s" % urllib.quote(doc)
 
 
 class TestNavigate(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
rename from testing/marionette/harness/marionette/tests/unit/test_pagesource.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_pagesource.py
--- a/testing/marionette/harness/marionette/tests/unit/test_pagesource.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_pagesource.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestPageSource(MarionetteTestCase):
     def testShouldReturnTheSourceOfAPage(self):
         test_html = self.marionette.absolute_url("testPageSource.html")
         self.marionette.navigate(test_html)
         source = self.marionette.page_source
         from_web_api = self.marionette.execute_script("return document.documentElement.outerHTML")
rename from testing/marionette/harness/marionette/tests/unit/test_pagesource_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_pagesource_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_pagesource_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_pagesource_chrome.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, WindowManagerMixin
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
 
 
 class TestPageSourceChrome(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestPageSourceChrome, self).setUp()
         self.marionette.set_context("chrome")
 
rename from testing/marionette/harness/marionette/tests/unit/test_position.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_position.py
--- a/testing/marionette/harness/marionette/tests/unit/test_position.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_position.py
@@ -1,11 +1,16 @@
-from marionette import MarionetteTestCase
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestPosition(MarionetteTestCase):
 
     def test_should_get_element_position_back(self):
         test_url = self.marionette.absolute_url('rectangles.html')
         self.marionette.navigate(test_url)
 
         r2 = self.marionette.find_element(By.ID, "r2")
rename from testing/marionette/harness/marionette/tests/unit/test_prefs.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_prefs.py
--- a/testing/marionette/harness/marionette/tests/unit/test_prefs.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_prefs.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.errors import JavascriptException
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestPreferences(MarionetteTestCase):
     prefs = {
         "bool": "marionette.test.bool",
         "int": "marionette.test.int",
         "string": "marionette.test.string",
     }
 
rename from testing/marionette/harness/marionette/tests/unit/test_profile_management.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_profile_management.py
--- a/testing/marionette/harness/marionette/tests/unit/test_profile_management.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_profile_management.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestProfileManagement(MarionetteTestCase):
 
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.marionette.enforce_gecko_prefs(
             {"marionette.test.bool": True,
rename from testing/marionette/harness/marionette/tests/unit/test_proxy.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_proxy.py
--- a/testing/marionette/harness/marionette/tests/unit/test_proxy.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_proxy.py
@@ -1,15 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.errors import InvalidArgumentException
 
+from marionette_harness import MarionetteTestCase
+
+
 class TestProxy(MarionetteTestCase):
 
     def setUp(self):
         super(TestProxy, self).setUp()
         self.marionette.delete_session()
 
     def test_that_we_can_set_a_autodetect_proxy(self):
         capabilities = {"requiredCapabilities":
rename from testing/marionette/harness/marionette/tests/unit/test_quit_restart.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_quit_restart.py
--- a/testing/marionette/harness/marionette/tests/unit/test_quit_restart.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_quit_restart.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.errors import MarionetteException
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestQuitRestart(MarionetteTestCase):
 
     def setUp(self):
         MarionetteTestCase.setUp(self)
 
         self.pid = self.marionette.process_id
         self.session_id = self.marionette.session_id
rename from testing/marionette/harness/marionette/tests/unit/test_rendered_element.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_rendered_element.py
--- a/testing/marionette/harness/marionette/tests/unit/test_rendered_element.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_rendered_element.py
@@ -8,19 +8,20 @@
 #     http://www.apache.org/licenses/LICENSE-2.0
 #
 #Unless required by applicable law or agreed to in writing, software
 #distributed under the License is distributed on an "AS IS" BASIS,
 #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 #See the License for the specific language governing permissions and
 #limitations under the License.
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 class RenderedElementTests(MarionetteTestCase):
 
     def testWeCanGetComputedStyleValueOnElement(self):
         test_url = self.marionette.absolute_url('javascriptPage.html')
         self.marionette.navigate(test_url)
         element = self.marionette.find_element(By.ID, "green-parent")
         backgroundColour = element.value_of_css_property("background-color")
rename from testing/marionette/harness/marionette/tests/unit/test_report.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_report.py
--- a/testing/marionette/harness/marionette/tests/unit/test_report.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_report.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, expectedFailure, skip
+from marionette_harness import MarionetteTestCase, expectedFailure, skip
 
 
 class TestReport(MarionetteTestCase):
 
     def test_pass(self):
         assert True
 
     def test_fail(self):
rename from testing/marionette/harness/marionette/tests/unit/test_run_js_test.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_run_js_test.py
--- a/testing/marionette/harness/marionette/tests/unit/test_run_js_test.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_run_js_test.py
@@ -1,9 +1,10 @@
 # Any copyright is dedicated to the Public Domain.
 # http://creativecommons.org/publicdomain/zero/1.0/
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
+
 
 class TestRunJSTest(MarionetteTestCase):
     def test_basic(self):
         self.run_js_test('test_simpletest_pass.js')
         self.run_js_test('test_simpletest_fail.js')
rename from testing/marionette/harness/marionette/tests/unit/test_screen_orientation.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_screen_orientation.py
--- a/testing/marionette/harness/marionette/tests/unit/test_screen_orientation.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_screen_orientation.py
@@ -1,19 +1,22 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from marionette_driver import errors
-from marionette import MarionetteTestCase, skip_if_desktop, skip_if_mobile
 from mozrunner.devices.emulator_screen import EmulatorScreen
 
+from marionette_harness import MarionetteTestCase, skip_if_desktop, skip_if_mobile
+
+
 default_orientation = "portrait-primary"
 unknown_orientation = "Unknown screen orientation: {}"
 
+
 class TestScreenOrientation(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.is_mobile = self.marionette.session_capabilities.get("rotatable", False)
 
     def tearDown(self):
         if self.is_mobile:
             self.marionette.set_orientation(default_orientation)
rename from testing/marionette/harness/marionette/tests/unit/test_screenshot.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_screenshot.py
--- a/testing/marionette/harness/marionette/tests/unit/test_screenshot.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_screenshot.py
@@ -5,19 +5,20 @@
 import base64
 import hashlib
 import imghdr
 import struct
 import urllib
 
 from unittest import skip
 
-from marionette import MarionetteTestCase, WindowManagerMixin
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
+
 
 def inline(doc, mime="text/html;charset=utf-8"):
     return "data:{0},{1}".format(mime, urllib.quote(doc))
 
 
 ELEMENT = "iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAVklEQVRoge3PMQ0AMAzAsPJHVWYbjEWTj/zx7O75oXk9AAISD6QWSC2QWiC1QGqB1AKpBVILpBZILZBaILVAaoHUAqkFUgukFkgtkFogtUBqgdT6BnIBMKa1DtYxhPkAAAAASUVORK5CYII="
 HIGHLIGHTED_ELEMENT = "iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAVklEQVRoge3PQRHAQAgAMfyrwhm1sb3JIwIyN3MvmJu53f01kRqRGpEakRqRGpEakRqRGpEakRqRGpEakRqRGpEakRqRGpEakRqRGpEakRqRmvciL/gAQgW/OxTpMPwAAAAASUVORK5CYII="
 
rename from testing/marionette/harness/marionette/tests/unit/test_select.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_select.py
--- a/testing/marionette/harness/marionette/tests/unit/test_select.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_select.py
@@ -1,17 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import urllib
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 def inline(doc):
     return "data:text/html;charset=utf-8,{}".format(urllib.quote(doc))
 
 
 class SelectTestCase(MarionetteTestCase):
     def assertSelected(self, option_element):
         self.assertTrue(option_element.is_selected(), "<option> element not selected")
rename from testing/marionette/harness/marionette/tests/unit/test_session.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_session.py
--- a/testing/marionette/harness/marionette/tests/unit/test_session.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_session.py
@@ -1,15 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.errors import SessionNotCreatedException
 
+from marionette_harness import MarionetteTestCase
+
+
 class TestSession(MarionetteTestCase):
     def setUp(self):
         super(TestSession, self).setUp()
         self.marionette.delete_session()
 
     def test_new_session_returns_capabilities(self):
         # Sends newSession
         caps = self.marionette.start_session()
rename from testing/marionette/harness/marionette/tests/unit/test_set_window_size.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_set_window_size.py
--- a/testing/marionette/harness/marionette/tests/unit/test_set_window_size.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_set_window_size.py
@@ -1,14 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette_driver.errors import UnsupportedOperationException
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestSetWindowSize(MarionetteTestCase):
     def setUp(self):
         super(MarionetteTestCase, self).setUp()
         self.start_size = self.marionette.window_size
         self.max_width = self.marionette.execute_script("return window.screen.availWidth;")
         self.max_height = self.marionette.execute_script("return window.screen.availHeight;")
rename from testing/marionette/harness/marionette/tests/unit/test_shadow_dom.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_shadow_dom.py
--- a/testing/marionette/harness/marionette/tests/unit/test_shadow_dom.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_shadow_dom.py
@@ -1,15 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
-from marionette_driver.errors import (NoSuchElementException, StaleElementException)
 from marionette_driver.by import By
+from marionette_driver.errors import (
+    NoSuchElementException,
+    StaleElementException
+)
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestShadowDom(MarionetteTestCase):
 
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.marionette.enforce_gecko_prefs({"dom.webcomponents.enabled": True})
         self.marionette.navigate(self.marionette.absolute_url("test_shadow_dom.html"))
rename from testing/marionette/harness/marionette/tests/unit/test_simpletest_chrome.js
rename to testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_chrome.js
rename from testing/marionette/harness/marionette/tests/unit/test_simpletest_fail.js
rename to testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_fail.js
rename from testing/marionette/harness/marionette/tests/unit/test_simpletest_pass.js
rename to testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_pass.js
rename from testing/marionette/harness/marionette/tests/unit/test_simpletest_sanity.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_sanity.py
--- a/testing/marionette/harness/marionette/tests/unit/test_simpletest_sanity.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_sanity.py
@@ -1,13 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
+
 
 class SimpletestSanityTest(MarionetteTestCase):
     callFinish = "return finish();"
 
     def run_sync(self, test):
         return self.marionette.execute_js_script(test, async=False)
 
     def run_async(self, test):
rename from testing/marionette/harness/marionette/tests/unit/test_simpletest_timeout.js
rename to testing/marionette/harness/marionette_harness/tests/unit/test_simpletest_timeout.js
rename from testing/marionette/harness/marionette/tests/unit/test_single_finger_desktop.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_single_finger_desktop.py
--- a/testing/marionette/harness/marionette/tests/unit/test_single_finger_desktop.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_single_finger_desktop.py
@@ -1,21 +1,30 @@
-from marionette import MarionetteTestCase
-from marionette_driver.errors import MarionetteException
-from marionette_driver.by import By
-#add this directory to the path
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 import os
 import sys
+
+from marionette_driver.errors import MarionetteException
+from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase
+
+# add this directory to the path
 sys.path.append(os.path.dirname(__file__))
+
 from single_finger_functions import (
-        chain, chain_flick, context_menu, double_tap,
-        long_press_action, long_press_on_xy_action,
-        move_element, move_element_offset, press_release, single_tap, wait,
-        wait_with_value
-        )
+    chain, chain_flick, context_menu, double_tap,
+    long_press_action, long_press_on_xy_action,
+    move_element, move_element_offset, press_release, single_tap, wait,
+    wait_with_value
+)
+
 
 class testSingleFingerMouse(MarionetteTestCase):
     def setUp(self):
         super(MarionetteTestCase, self).setUp()
         # set context menu related preferences needed for some tests
         self.marionette.set_context("chrome")
         self.enabled = self.marionette.execute_script("""
 let prefs = Components.classes["@mozilla.org/preferences-service;1"]
@@ -82,17 +91,17 @@ prefs.setIntPref("ui.click_hold_context_
         context_menu(self.marionette, self.wait_for_condition, "button1-mousemove-mousedown-contextmenu", "button1-mousemove-mousedown-contextmenu-mouseup-click")
 
     def test_long_press_action(self):
         long_press_action(self.marionette, self.wait_for_condition, "button1-mousemove-mousedown-contextmenu-mouseup-click")
 
     def test_long_press_on_xy_action(self):
         long_press_on_xy_action(self.marionette, self.wait_for_condition, "button1-mousemove-mousedown-contextmenu-mouseup-click")
     """
-    
+
     """
     //Skipping due to Bug 865334
     def test_long_press_fail(self):
         testAction = self.marionette.absolute_url("testAction.html")
         self.marionette.navigate(testAction)
         button = self.marionette.find_element(By.ID, "button1Copy")
         action = Actions(self.marionette)
         action.press(button).long_press(button, 5)
rename from testing/marionette/harness/marionette/tests/unit/test_skip_setup.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_skip_setup.py
--- a/testing/marionette/harness/marionette/tests/unit/test_skip_setup.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_skip_setup.py
@@ -1,13 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, SkipTest
+from marionette_harness import MarionetteTestCase, SkipTest
+
 
 class TestSetUpSkipped(MarionetteTestCase):
 
     testVar = {'test':'SkipTest'}
 
     def setUp(self):
         try:
             self.testVar['email']
rename from testing/marionette/harness/marionette/tests/unit/test_switch_frame.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_switch_frame.py
--- a/testing/marionette/harness/marionette/tests/unit/test_switch_frame.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_switch_frame.py
@@ -1,17 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
-from marionette_driver.errors import (JavascriptException,
-                                      NoSuchFrameException)
-from marionette_driver.by import By
+from marionette_driver.errors import (
+    JavascriptException,
+    NoSuchFrameException,
+)
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestSwitchFrame(MarionetteTestCase):
     def test_switch_simple(self):
         start_url = "test_iframe.html"
         verify_title = "Marionette IFrame Test"
         test_html = self.marionette.absolute_url(start_url)
         self.marionette.navigate(test_html)
rename from testing/marionette/harness/marionette/tests/unit/test_switch_frame_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_switch_frame_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_switch_frame_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_switch_frame_chrome.py
@@ -1,17 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from unittest import skip
 
-from marionette import MarionetteTestCase, WindowManagerMixin
 from marionette_driver.errors import JavascriptException
 
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
+
 
 class TestSwitchFrameChrome(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSwitchFrameChrome, self).setUp()
         self.marionette.set_context("chrome")
 
         def open_window_with_js():
rename from testing/marionette/harness/marionette/tests/unit/test_switch_remote_frame.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_switch_remote_frame.py
--- a/testing/marionette/harness/marionette/tests/unit/test_switch_remote_frame.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_switch_remote_frame.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 OOP_BY_DEFAULT = "dom.ipc.browser_frames.oop_by_default"
 BROWSER_FRAMES_ENABLED = "dom.mozBrowserFramesEnabled"
 
 
 class TestSwitchRemoteFrame(MarionetteTestCase):
     def setUp(self):
         super(TestSwitchRemoteFrame, self).setUp()
rename from testing/marionette/harness/marionette/tests/unit/test_teardown_context_preserved.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_teardown_context_preserved.py
--- a/testing/marionette/harness/marionette/tests/unit/test_teardown_context_preserved.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_teardown_context_preserved.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, SkipTest
+from marionette_harness import MarionetteTestCase, SkipTest
 
 
 class TestTearDownContext(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.marionette.set_context(self.marionette.CONTEXT_CHROME)
 
     def tearDown(self):
rename from testing/marionette/harness/marionette/tests/unit/test_text.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_text.py
--- a/testing/marionette/harness/marionette/tests/unit/test_text.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_text.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_driver.by import By
 from marionette_driver.keys import Keys
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestText(MarionetteTestCase):
     def test_getText(self):
         test_html = self.marionette.absolute_url("test.html")
         self.marionette.navigate(test_html)
         l = self.marionette.find_element(By.ID, "mozLink")
         self.assertEqual("Click me!", l.text)
rename from testing/marionette/harness/marionette/tests/unit/test_text_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_text_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_text_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_text_chrome.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, WindowManagerMixin
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
+
 
 ''' Disabled in bug 896043 and when working on Chrome code re-enable for bug 896046
 class TestTextChrome(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestTextChrome, self).setUp()
         self.marionette.set_context("chrome")
 
rename from testing/marionette/harness/marionette/tests/unit/test_timeouts.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_timeouts.py
--- a/testing/marionette/harness/marionette/tests/unit/test_timeouts.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_timeouts.py
@@ -1,19 +1,21 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_driver.by import By
+from marionette_driver.errors import (
+    MarionetteException,
+    NoSuchElementException,
+    ScriptTimeoutException,
+)
 from marionette_driver.marionette import HTMLElement
-from marionette_driver.errors import (NoSuchElementException,
-                                      MarionetteException,
-                                      InvalidArgumentException,
-                                      ScriptTimeoutException)
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase
 
 
 class TestTimeouts(MarionetteTestCase):
     def tearDown(self):
         self.marionette.timeout.reset()
         MarionetteTestCase.tearDown(self)
 
     def test_page_timeout_notdefinetimeout_pass(self):
rename from testing/marionette/harness/marionette/tests/unit/test_transport.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_transport.py
--- a/testing/marionette/harness/marionette/tests/unit/test_transport.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_transport.py
@@ -1,21 +1,24 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import json
-from marionette import MarionetteTestCase, skip_unless_protocol
+
 from marionette_driver.transport import (
     Command,
     Proto2Command,
     Proto2Response,
     Response,
 )
 
+from marionette_harness import MarionetteTestCase, skip_unless_protocol
+
+
 get_current_url = ("getCurrentUrl", None)
 execute_script = ("executeScript", {"script": "return 42"})
 
 
 class TestMessageSequencing(MarionetteTestCase):
     @property
     def last_id(self):
         return self.marionette.client.last_id
rename from testing/marionette/harness/marionette/tests/unit/test_typing.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_typing.py
--- a/testing/marionette/harness/marionette/tests/unit/test_typing.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_typing.py
@@ -1,18 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import urllib
 
-from marionette import MarionetteTestCase
+from marionette_driver.by import By
+from marionette_driver.errors import ElementNotVisibleException
 from marionette_driver.keys import Keys
-from marionette_driver.errors import ElementNotVisibleException
-from marionette_driver.by import By
+
+from marionette_harness import MarionetteTestCase
 
 
 def inline(doc):
     return "data:text/html;charset=utf-8,{}".format(urllib.quote(doc))
 
 
 class TestTyping(MarionetteTestCase):
     def testShouldFireKeyPressEvents(self):
rename from testing/marionette/harness/marionette/tests/unit/test_using_permissions.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_using_permissions.py
--- a/testing/marionette/harness/marionette/tests/unit/test_using_permissions.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_using_permissions.py
@@ -1,11 +1,16 @@
-from marionette import MarionetteTestCase
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 from marionette_driver.errors import JavascriptException
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestUsingPermssions(MarionetteTestCase):
 
     def test_using_permissions(self):
         # Test that multiple permissions can be set with 'using_permissions',
         # and that they are set correctly and unset correctly after leaving
         # the context manager.
         original_perm = self.marionette.get_permission('systemXHR')
rename from testing/marionette/harness/marionette/tests/unit/test_visibility.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_visibility.py
--- a/testing/marionette/harness/marionette/tests/unit/test_visibility.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_visibility.py
@@ -1,11 +1,16 @@
-from marionette import MarionetteTestCase
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
 from marionette_driver.by import By
 
+from marionette_harness import MarionetteTestCase
+
 
 class TestVisibility(MarionetteTestCase):
 
     def testShouldAllowTheUserToTellIfAnElementIsDisplayedOrNot(self):
         test_html = self.marionette.absolute_url("javascriptPage.html")
         self.marionette.navigate(test_html)
 
         self.assertTrue(self.marionette.find_element(By.ID, "displayed").is_displayed())
rename from testing/marionette/harness/marionette/tests/unit/test_wait.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_wait.py
--- a/testing/marionette/harness/marionette/tests/unit/test_wait.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_wait.py
@@ -1,20 +1,19 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 import sys
 import time
 
-from marionette_driver import errors
-from marionette_driver import wait
+from marionette_driver import errors, wait
 from marionette_driver.wait import Wait
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TickingClock(object):
 
     def __init__(self, incr=1):
         self.ticks = 0
         self.increment = incr
 
rename from testing/marionette/harness/marionette/tests/unit/test_window_handles.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_window_handles.py
--- a/testing/marionette/harness/marionette/tests/unit/test_window_handles.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_window_handles.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, WindowManagerMixin
+from marionette_driver import By, Wait
 from marionette_driver.keys import Keys
-from marionette_driver import By, Wait
+
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
 
 
 class TestWindowHandles(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestWindowHandles, self).setUp()
 
         self.test_page = self.marionette.absolute_url("windowHandles.html")
rename from testing/marionette/harness/marionette/tests/unit/test_window_management.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_window_management.py
--- a/testing/marionette/harness/marionette/tests/unit/test_window_management.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_window_management.py
@@ -1,15 +1,16 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, WindowManagerMixin
 from marionette_driver import By
 
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
+
 
 class TestSwitchWindow(WindowManagerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestSwitchWindow, self).setUp()
         self.marionette.set_context("chrome")
 
     def tearDown(self):
rename from testing/marionette/harness/marionette/tests/unit/test_window_position.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_window_position.py
--- a/testing/marionette/harness/marionette/tests/unit/test_window_position.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_window_position.py
@@ -7,19 +7,21 @@
 #     http://www.apache.org/licenses/LICENSE-2.0
 #
 #Unless required by applicable law or agreed to in writing, software
 #distributed under the License is distributed on an "AS IS" BASIS,
 #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 #See the License for the specific language governing permissions and
 #limitations under the License.
 
-from marionette import MarionetteTestCase
 from marionette_driver.errors import InvalidArgumentException
 
+from marionette_harness import MarionetteTestCase
+
+
 class TestWindowPosition(MarionetteTestCase):
     def test_get_types(self):
         position = self.marionette.get_window_position()
         self.assertTrue(isinstance(position["x"], int))
         self.assertTrue(isinstance(position["y"], int))
 
     def test_set_types(self):
         for x, y in (["a", "b"], [1.2, 3.4], [True, False], [[], []], [{}, {}]):
rename from testing/marionette/harness/marionette/tests/unit/test_window_switching.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_window_switching.py
--- a/testing/marionette/harness/marionette/tests/unit/test_window_switching.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_window_switching.py
@@ -1,17 +1,18 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase, WindowManagerMixin
 from marionette_driver.by import By
 from marionette_driver.errors import NoSuchElementException
 from marionette_driver.wait import Wait
 
+from marionette_harness import MarionetteTestCase, WindowManagerMixin
+
 
 class TestWindowSwitching(WindowManagerMixin, MarionetteTestCase):
 
     def testJSWindowCreationAndSwitching(self):
         test_html = self.marionette.absolute_url("test_windows.html")
         self.marionette.navigate(test_html)
 
         def open_window_with_link():
rename from testing/marionette/harness/marionette/tests/unit/test_window_title.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_window_title.py
--- a/testing/marionette/harness/marionette/tests/unit/test_window_title.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_window_title.py
@@ -1,12 +1,12 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestTitle(MarionetteTestCase):
     def test_get_html_title(self):
         test_html = self.marionette.absolute_url("test.html")
         self.marionette.navigate(test_html)
         self.assertEqual('Marionette Test', self.marionette.title)
rename from testing/marionette/harness/marionette/tests/unit/test_window_title_chrome.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_window_title_chrome.py
--- a/testing/marionette/harness/marionette/tests/unit/test_window_title_chrome.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_window_title_chrome.py
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
 
 
 class TestTitleChrome(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.marionette.set_context("chrome")
         self.win = self.marionette.current_window_handle
         self.marionette.execute_script("window.open('chrome://marionette/content/test.xul', 'foo', 'chrome,centerscreen');")
rename from testing/marionette/harness/marionette/tests/unit/test_window_type.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_window_type.py
--- a/testing/marionette/harness/marionette/tests/unit/test_window_type.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_window_type.py
@@ -1,13 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_harness import MarionetteTestCase
+
 
 class TestWindowTypeChrome(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.marionette.set_context("chrome")
         self.win = self.marionette.current_window_handle
         self.marionette.execute_script("window.open('chrome://marionette/content/test.xul', 'foo', 'chrome,centerscreen');")
         self.marionette.switch_to_window('foo')
rename from testing/marionette/harness/marionette/tests/unit/test_with_using_context.py
rename to testing/marionette/harness/marionette_harness/tests/unit/test_with_using_context.py
--- a/testing/marionette/harness/marionette/tests/unit/test_with_using_context.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_with_using_context.py
@@ -1,16 +1,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-from marionette import MarionetteTestCase
+from marionette_driver.decorators import using_context
 from marionette_driver.errors import MarionetteException
 
-from marionette_driver.decorators import using_context
+from marionette_harness import MarionetteTestCase
+
 
 class TestSetContext(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
 
         # shortcuts to improve readability of these tests
         self.chrome = self.marionette.CONTEXT_CHROME
         self.content = self.marionette.CONTEXT_CONTENT
rename from testing/marionette/harness/marionette/tests/unit/unit-tests.ini
rename to testing/marionette/harness/marionette_harness/tests/unit/unit-tests.ini
rename from testing/marionette/harness/marionette/tests/webapi-tests.ini
rename to testing/marionette/harness/marionette_harness/tests/webapi-tests.ini
rename from testing/marionette/harness/marionette/www/bug814037.html
rename to testing/marionette/harness/marionette_harness/www/bug814037.html
rename from testing/marionette/harness/marionette/www/click_out_of_bounds_overflow.html
rename to testing/marionette/harness/marionette_harness/www/click_out_of_bounds_overflow.html
rename from testing/marionette/harness/marionette/www/clicks.html
rename to testing/marionette/harness/marionette_harness/www/clicks.html
rename from testing/marionette/harness/marionette/www/cssTransform.html
rename to testing/marionette/harness/marionette_harness/www/cssTransform.html
rename from testing/marionette/harness/marionette/www/cssTransform2.html
rename to testing/marionette/harness/marionette_harness/www/cssTransform2.html
rename from testing/marionette/harness/marionette/www/datetimePage.html
rename to testing/marionette/harness/marionette_harness/www/datetimePage.html
rename from testing/marionette/harness/marionette/www/deletingFrame.html
rename to testing/marionette/harness/marionette_harness/www/deletingFrame.html
rename from testing/marionette/harness/marionette/www/double_click.html
rename to testing/marionette/harness/marionette_harness/www/double_click.html
rename from testing/marionette/harness/marionette/www/element_bottom.html
rename to testing/marionette/harness/marionette_harness/www/element_bottom.html
rename from testing/marionette/harness/marionette/www/element_left.html
rename to testing/marionette/harness/marionette_harness/www/element_left.html
rename from testing/marionette/harness/marionette/www/element_outside_viewport.html
rename to testing/marionette/harness/marionette_harness/www/element_outside_viewport.html
rename from testing/marionette/harness/marionette/www/element_right.html
rename to testing/marionette/harness/marionette_harness/www/element_right.html
rename from testing/marionette/harness/marionette/www/element_top.html
rename to testing/marionette/harness/marionette_harness/www/element_top.html
rename from testing/marionette/harness/marionette/www/empty.html
rename to testing/marionette/harness/marionette_harness/www/empty.html
rename from testing/marionette/harness/marionette/www/formPage.html
rename to testing/marionette/harness/marionette_harness/www/formPage.html
rename from testing/marionette/harness/marionette/www/frameset.html
rename to testing/marionette/harness/marionette_harness/www/frameset.html
rename from testing/marionette/harness/marionette/www/framesetPage2.html
rename to testing/marionette/harness/marionette_harness/www/framesetPage2.html
rename from testing/marionette/harness/marionette/www/hidden.html
rename to testing/marionette/harness/marionette_harness/www/hidden.html
rename from testing/marionette/harness/marionette/www/html5/blue.jpg
rename to testing/marionette/harness/marionette_harness/www/html5/blue.jpg
rename from testing/marionette/harness/marionette/www/html5/boolean_attributes.html
rename to testing/marionette/harness/marionette_harness/www/html5/boolean_attributes.html
rename from testing/marionette/harness/marionette/www/html5/geolocation.js
rename to testing/marionette/harness/marionette_harness/www/html5/geolocation.js
rename from testing/marionette/harness/marionette/www/html5/green.jpg
rename to testing/marionette/harness/marionette_harness/www/html5/green.jpg
rename from testing/marionette/harness/marionette/www/html5/offline.html
rename to testing/marionette/harness/marionette_harness/www/html5/offline.html
rename from testing/marionette/harness/marionette/www/html5/red.jpg
rename to testing/marionette/harness/marionette_harness/www/html5/red.jpg
rename from testing/marionette/harness/marionette/www/html5/status.html
rename to testing/marionette/harness/marionette_harness/www/html5/status.html
rename from testing/marionette/harness/marionette/www/html5/test.appcache
rename to testing/marionette/harness/marionette_harness/www/html5/test.appcache
rename from testing/marionette/harness/marionette/www/html5/test_html_inputs.html
rename to testing/marionette/harness/marionette_harness/www/html5/test_html_inputs.html
rename from testing/marionette/harness/marionette/www/html5/yellow.jpg
rename to testing/marionette/harness/marionette_harness/www/html5/yellow.jpg
rename from testing/marionette/harness/marionette/www/html5Page.html
rename to testing/marionette/harness/marionette_harness/www/html5Page.html
rename from testing/marionette/harness/marionette/www/javascriptPage.html
rename to testing/marionette/harness/marionette_harness/www/javascriptPage.html
rename from testing/marionette/harness/marionette/www/macbeth.html
rename to testing/marionette/harness/marionette_harness/www/macbeth.html
rename from testing/marionette/harness/marionette/www/modal_dialogs.html
rename to testing/marionette/harness/marionette_harness/www/modal_dialogs.html
rename from testing/marionette/harness/marionette/www/nestedElements.html
rename to testing/marionette/harness/marionette_harness/www/nestedElements.html
rename from testing/marionette/harness/marionette/www/rectangles.html
rename to testing/marionette/harness/marionette_harness/www/rectangles.html
rename from testing/marionette/harness/marionette/www/resultPage.html
rename to testing/marionette/harness/marionette_harness/www/resultPage.html
rename from testing/marionette/harness/marionette/www/scroll.html
rename to testing/marionette/harness/marionette_harness/www/scroll.html
rename from testing/marionette/harness/marionette/www/scroll2.html
rename to testing/marionette/harness/marionette_harness/www/scroll2.html
rename from testing/marionette/harness/marionette/www/scroll3.html
rename to testing/marionette/harness/marionette_harness/www/scroll3.html
rename from testing/marionette/harness/marionette/www/scroll4.html
rename to testing/marionette/harness/marionette_harness/www/scroll4.html
rename from testing/marionette/harness/marionette/www/scroll5.html
rename to testing/marionette/harness/marionette_harness/www/scroll5.html
rename from testing/marionette/harness/marionette/www/shim.js
rename to testing/marionette/harness/marionette_harness/www/shim.js
rename from testing/marionette/harness/marionette/www/test.html
rename to testing/marionette/harness/marionette_harness/www/test.html
rename from testing/marionette/harness/marionette/www/testAction.html
rename to testing/marionette/harness/marionette_harness/www/testAction.html
rename from testing/marionette/harness/marionette/www/testPageSource.html
rename to testing/marionette/harness/marionette_harness/www/testPageSource.html
rename from testing/marionette/harness/marionette/www/testPageSource.xml
rename to testing/marionette/harness/marionette_harness/www/testPageSource.xml
rename from testing/marionette/harness/marionette/www/testPageSourceWithUnicodeChars.html
rename to testing/marionette/harness/marionette_harness/www/testPageSourceWithUnicodeChars.html
rename from testing/marionette/harness/marionette/www/testSize.html
rename to testing/marionette/harness/marionette_harness/www/testSize.html
rename from testing/marionette/harness/marionette/www/test_accessibility.html
rename to testing/marionette/harness/marionette_harness/www/test_accessibility.html
rename from testing/marionette/harness/marionette/www/test_carets_columns.html
rename to testing/marionette/harness/marionette_harness/www/test_carets_columns.html
rename from testing/marionette/harness/marionette/www/test_carets_cursor.html
rename to testing/marionette/harness/marionette_harness/www/test_carets_cursor.html
rename from testing/marionette/harness/marionette/www/test_carets_display_none.html
rename to testing/marionette/harness/marionette_harness/www/test_carets_display_none.html
rename from testing/marionette/harness/marionette/www/test_carets_iframe.html
rename to testing/marionette/harness/marionette_harness/www/test_carets_iframe.html
rename from testing/marionette/harness/marionette/www/test_carets_longtext.html
rename to testing/marionette/harness/marionette_harness/www/test_carets_longtext.html
rename from testing/marionette/harness/marionette/www/test_carets_multipleline.html
rename to testing/marionette/harness/marionette_harness/www/test_carets_multipleline.html
rename from testing/marionette/harness/marionette/www/test_carets_multiplerange.html
rename to testing/marionette/harness/marionette_harness/www/test_carets_multiplerange.html
rename from testing/marionette/harness/marionette/www/test_carets_selection.html
rename to testing/marionette/harness/marionette_harness/www/test_carets_selection.html
rename from testing/marionette/harness/marionette/www/test_clearing.html
rename to testing/marionette/harness/marionette_harness/www/test_clearing.html
rename from testing/marionette/harness/marionette/www/test_dynamic.html
rename to testing/marionette/harness/marionette_harness/www/test_dynamic.html
rename from testing/marionette/harness/marionette/www/test_iframe.html
rename to testing/marionette/harness/marionette_harness/www/test_iframe.html
rename from testing/marionette/harness/marionette/www/test_inner_iframe.html
rename to testing/marionette/harness/marionette_harness/www/test_inner_iframe.html
rename from testing/marionette/harness/marionette/www/test_nested_iframe.html
rename to testing/marionette/harness/marionette_harness/www/test_nested_iframe.html
rename from testing/marionette/harness/marionette/www/test_oop_1.html
rename to testing/marionette/harness/marionette_harness/www/test_oop_1.html
rename from testing/marionette/harness/marionette/www/test_oop_2.html
rename to testing/marionette/harness/marionette_harness/www/test_oop_2.html
rename from testing/marionette/harness/marionette/www/test_shadow_dom.html
rename to testing/marionette/harness/marionette_harness/www/test_shadow_dom.html
rename from testing/marionette/harness/marionette/www/test_windows.html
rename to testing/marionette/harness/marionette_harness/www/test_windows.html
rename from testing/marionette/harness/marionette/www/windowHandles.html
rename to testing/marionette/harness/marionette_harness/www/windowHandles.html
rename from testing/marionette/harness/marionette/www/xhtmlTest.html
rename to testing/marionette/harness/marionette_harness/www/xhtmlTest.html
--- a/testing/marionette/harness/setup.py
+++ b/testing/marionette/harness/setup.py
@@ -1,53 +1,59 @@
 import os
 import re
 
-from setuptools import setup, find_packages
+from setuptools import find_packages, setup
 
 
 THIS_DIR = os.path.dirname(os.path.realpath(__name__))
 
 
 def read(*parts):
     with open(os.path.join(THIS_DIR, *parts)) as f:
         return f.read()
 
 
 def get_version():
     return re.findall("__version__ = '([\d\.]+)'",
-                      read('marionette', '__init__.py'), re.M)[0]
+                      read('marionette_harness', '__init__.py'), re.M)[0]
 
 
-setup(name='marionette_client',
+setup(name='marionette-harness',
       version=get_version(),
-      description="Marionette test automation client",
+      description="Marionette test automation harness",
       long_description=open('README.rst').read(),
       # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
       classifiers=[
-          'Development Status :: 7 - Inactive',
+          'Development Status :: 5 - Production/Stable',
           'Intended Audience :: Developers',
           'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)',
           'Operating System :: MacOS :: MacOS X',
           'Operating System :: Microsoft :: Windows',
           'Operating System :: POSIX',
           'Topic :: Software Development :: Quality Assurance',
           'Topic :: Software Development :: Testing',
           'Topic :: Utilities',
           'Programming Language :: Python',
           'Programming Language :: Python :: 2.7',
       ],
       keywords='mozilla',
       author='Auto-tools',
       author_email='tools-marionette@lists.mozilla.org',
       url='https://wiki.mozilla.org/Auto-tools/Projects/Marionette',
       license='Mozilla Public License 2.0 (MPL 2.0)',
-      packages=['marionette_client'],
-      package_data={'marionette': ['touch/*.js']},
+      packages=find_packages(),
+      package_data={
+          'marionette_harness': [
+              'runner/test.cert',
+              'runner/test.key'
+          ],
+      },
+      # Needed to include package data as specified in MANIFEST.in
       include_package_data=True,
+      install_requires=read('requirements.txt').splitlines(),
       zip_safe=False,
       entry_points="""
       # -*- Entry points: -*-
       [console_scripts]
-      marionette = marionette.runtests:cli
+      marionette = marionette_harness.runtests:cli
       """,
-      install_requires=read('requirements.txt').splitlines(),
       )
--- a/testing/marionette/jar.mn
+++ b/testing/marionette/jar.mn
@@ -27,14 +27,14 @@ marionette.jar:
   content/atom.js (atom.js)
   content/evaluate.js (evaluate.js)
   content/logging.js (logging.js)
   content/navigate.js (navigate.js)
   content/l10n.js (l10n.js)
   content/assert.js (assert.js)
   content/addon.js (addon.js)
 #ifdef ENABLE_TESTS
-  content/test.xul  (harness/marionette/chrome/test.xul)
-  content/test2.xul  (harness/marionette/chrome/test2.xul)
-  content/test_dialog.xul  (harness/marionette/chrome/test_dialog.xul)
-  content/test_nested_iframe.xul  (harness/marionette/chrome/test_nested_iframe.xul)
-  content/test_anonymous_content.xul  (harness/marionette/chrome/test_anonymous_content.xul)
+  content/test.xul (chrome/test.xul)
+  content/test2.xul (chrome/test2.xul)
+  content/test_dialog.xul (chrome/test_dialog.xul)
+  content/test_nested_iframe.xul (chrome/test_nested_iframe.xul)
+  content/test_anonymous_content.xul (chrome/test_anonymous_content.xul)
 #endif
--- a/testing/marionette/mach_commands.py
+++ b/testing/marionette/mach_commands.py
@@ -37,17 +37,17 @@ def run_marionette(tests, binary=None, t
         MarionetteTestRunner,
         MarionetteHarness
     )
 
     parser = setup_marionette_argument_parser()
 
     if not tests:
         tests = [os.path.join(topsrcdir,
-                 'testing/marionette/harness/marionette/tests/unit-tests.ini')]
+                 'testing/marionette/harness/marionette_harness/tests/unit-tests.ini')]
 
     args = argparse.Namespace(tests=tests)
 
     args.binary = binary
 
     for k, v in kwargs.iteritems():
         setattr(args, k, v)
 
--- a/testing/marionette/mach_test_package_commands.py
+++ b/testing/marionette/mach_test_package_commands.py
@@ -25,17 +25,17 @@ def run_marionette(context, **kwargs):
 
     args = argparse.Namespace(**kwargs)
     args.binary = args.binary or context.firefox_bin
     args.e10s = context.mozharness_config.get('e10s', args.e10s)
 
     test_root = os.path.join(context.package_root, 'marionette', 'tests')
     if not args.tests:
         args.tests = [os.path.join(test_root, 'testing', 'marionette', 'harness',
-                                   'marionette', 'tests', 'unit-tests.ini')]
+                                   'marionette_harness', 'tests', 'unit-tests.ini')]
 
     normalize = partial(context.normalize_test_path, test_root)
     args.tests = map(normalize, args.tests)
 
     commandline.add_logging_group(parser)
     parser.verify_usage(args)
 
     args.logger = commandline.setup_logging("Marionette Unit Tests",
--- a/testing/marionette/moz.build
+++ b/testing/marionette/moz.build
@@ -1,13 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += ["components"]
 
 JAR_MANIFESTS += ["jar.mn"]
-MARIONETTE_UNIT_MANIFESTS += ["harness/marionette/tests/unit/unit-tests.ini"]
-MARIONETTE_WEBAPI_MANIFESTS += ["harness/marionette/tests/webapi-tests.ini"]
+MARIONETTE_UNIT_MANIFESTS += ["harness/marionette_harness/tests/unit/unit-tests.ini"]
+MARIONETTE_WEBAPI_MANIFESTS += ["harness/marionette_harness/tests/webapi-tests.ini"]
 XPCSHELL_TESTS_MANIFESTS += ["unit.ini"]
 
 with Files("**"):
     BUG_COMPONENT = ("Testing", "Marionette")
--- a/testing/mochitest/runtests.py
+++ b/testing/mochitest/runtests.py
@@ -44,18 +44,18 @@ from manifestparser.filters import (
     chunk_by_runtime,
     chunk_by_slice,
     pathprefix,
     subsuite,
     tags,
 )
 
 try:
-    from marionette import Marionette
     from marionette_driver.addons import Addons
+    from marionette_harness import Marionette
 except ImportError, e:
     # Defer ImportError until attempt to use Marionette
     def reraise(*args, **kwargs):
         raise(e)
     Marionette = reraise
 
 from leaks import ShutdownLeaks, LSANLeaks
 from mochitest_options import (
--- a/testing/mozharness/configs/android/androidarm_4_3.py
+++ b/testing/mozharness/configs/android/androidarm_4_3.py
@@ -352,17 +352,17 @@ config = {
                 "--xre-path=%(xre_path)s",
                 "--dm_trans=adb",
                 "--localBinDir=../bin",
                 "--apk=%(installer_path)s",
                 ".",
             ],
         },
         "marionette": {
-            "run_filename": os.path.join("harness", "marionette", "runtests.py"),
+            "run_filename": os.path.join("harness", "marionette_harness", "runtests.py"),
             "testsdir": "marionette",
             "options": [
                 "--emulator",
                 "--app=fennec",
                 "--package=%(app)s",
                 "--address=%(address)s",
                 "%(test_manifest)s",
                 "--disable-e10s",
--- a/testing/mozharness/scripts/android_emulator_unittest.py
+++ b/testing/mozharness/scripts/android_emulator_unittest.py
@@ -150,20 +150,20 @@ class AndroidEmulatorTest(BlobUploadMixi
         dirs['abs_modules_dir'] = os.path.join(
             dirs['abs_test_install_dir'], 'modules')
         dirs['abs_blob_upload_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'blobber_upload_dir')
         dirs['abs_emulator_dir'] = abs_dirs['abs_work_dir']
         dirs['abs_mochitest_dir'] = os.path.join(
             dirs['abs_test_install_dir'], 'mochitest')
         dirs['abs_marionette_dir'] = os.path.join(
-            dirs['abs_test_install_dir'], 'marionette', 'harness', 'marionette')
+            dirs['abs_test_install_dir'], 'marionette', 'harness', 'marionette_harness')
         dirs['abs_marionette_tests_dir'] = os.path.join(
             dirs['abs_test_install_dir'], 'marionette', 'tests', 'testing',
-            'marionette', 'harness', 'marionette', 'tests')
+            'marionette', 'harness', 'marionette_harness', 'tests')
         dirs['abs_avds_dir'] = self.config.get("avds_dir", "/home/cltbld/.android")
 
         for key in dirs.keys():
             if key not in abs_dirs:
                 abs_dirs[key] = dirs[key]
         self.abs_dirs = abs_dirs
         return self.abs_dirs
 
--- a/testing/mozharness/scripts/marionette.py
+++ b/testing/mozharness/scripts/marionette.py
@@ -147,20 +147,20 @@ class MarionetteTest(TestingMixin, Mercu
     def query_abs_dirs(self):
         if self.abs_dirs:
             return self.abs_dirs
         abs_dirs = super(MarionetteTest, self).query_abs_dirs()
         dirs = {}
         dirs['abs_test_install_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'tests')
         dirs['abs_marionette_dir'] = os.path.join(
-            dirs['abs_test_install_dir'], 'marionette', 'harness', 'marionette')
+            dirs['abs_test_install_dir'], 'marionette', 'harness', 'marionette_harness')
         dirs['abs_marionette_tests_dir'] = os.path.join(
             dirs['abs_test_install_dir'], 'marionette', 'tests', 'testing',
-            'marionette', 'harness', 'marionette', 'tests')
+            'marionette', 'harness', 'marionette_harness', 'tests')
         dirs['abs_gecko_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'gecko')
         dirs['abs_emulator_dir'] = os.path.join(
             abs_dirs['abs_work_dir'], 'emulator')
 
         dirs['abs_blob_upload_dir'] = os.path.join(abs_dirs['abs_work_dir'], 'blobber_upload_dir')
 
         for key in dirs.keys():
--- a/testing/mozharness/scripts/marionette_harness_tests.py
+++ b/testing/mozharness/scripts/marionette_harness_tests.py
@@ -110,17 +110,17 @@ class MarionetteHarnessTests(VirtualenvM
             return TBPL_EXCEPTION
 
     def run_tests(self):
         """Run all the tests"""
         dirs = self.query_abs_dirs()
         test_relpath = self.config.get(
             'test_path',
             os.path.join('testing', 'marionette',
-                         'harness', 'marionette', 'tests',
+                         'harness', 'marionette_harness', 'tests',
                          'harness_unit')
         )
         test_path = os.path.join(dirs['abs_src_dir'], test_relpath)
         self.activate_virtualenv()
         import pytest
         command = ['-p', 'no:terminalreporter',  # disable pytest logging
                    test_path]
         logs = {}
--- a/toolkit/components/microformats/test/marionette/microformats_tester.py
+++ b/toolkit/components/microformats/test/marionette/microformats_tester.py
@@ -1,19 +1,20 @@
-from marionette import MarionetteTestCase
-from marionette_driver.errors import NoSuchElementException
 import threading
 import SimpleHTTPServer
 import SocketServer
 import BaseHTTPServer
 import urllib
 import urlparse
 import os
 import posixpath
 
+from marionette_driver.errors import NoSuchElementException
+from marionette_harness import MarionetteTestCase
+
 DEBUG = True
 
 # Example taken from mozilla-central/browser/components/loop/
 
 # XXX Once we're on a branch with bug 993478 landed, we may want to get
 # rid of this HTTP server and just use the built-in one from Marionette,
 # since there will less code to maintain, and it will be faster.  We'll
 # need to consider whether this code wants to be shared with WebDriver tests