Bug 1320073 - Rename marionette-client to marionette-harness and release version 4.0.0. r=gps,maja_zf,mtseng,SingingTree
authorHenrik Skupin <mail@hskupin.info>
Mon, 12 Dec 2016 13:05:34 +0100
changeset 325663 476845a2cafb42d02a5215fe63187c0638548edf
parent 325662 8d457264614b53a18bda8bd204eca647d7970465
child 325664 da29c78960ebcfce36b84784522ecd000f5b2c00
push id35021
push userhskupin@mozilla.com
push dateTue, 13 Dec 2016 08:07:10 +0000
treeherderautoland@476845a2cafb [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgps, maja_zf, mtseng, SingingTree
bugs1320073
milestone53.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1320073 - Rename marionette-client to marionette-harness and release version 4.0.0. r=gps,maja_zf,mtseng,SingingTree 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