Backed out changeset 28fa968ea46c (bug 1181261) for breaking mulet tests CLOSED TREE
authorWes Kocher <wkocher@mozilla.com>
Fri, 21 Aug 2015 08:45:27 -0700
changeset 258718 639a28373b059b7073db15a49b840c1a5221471d
parent 258717 1bf4bafdb70e8dfbd220a25896f2fb16f0f5f574
child 258719 305b8bcf1a89b9e1d0fa486c4c3c3d6ba9ea60bc
push id64035
push userkwierso@gmail.com
push dateFri, 21 Aug 2015 15:45:33 +0000
treeherdermozilla-inbound@639a28373b05 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1181261
milestone43.0a1
backs out28fa968ea46ca3e232b8cfbb4a88e9a492e71b16
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
Backed out changeset 28fa968ea46c (bug 1181261) for breaking mulet tests CLOSED TREE
testing/config/mozharness/android_arm_4_3_config.py
testing/config/mozharness/android_arm_config.py
testing/config/mozharness/android_panda_config.py
testing/config/mozharness/android_x86_config.py
testing/config/mozharness/b2g_desktop_config.py
testing/config/mozharness/b2g_emulator_config.py
testing/config/mozharness/linux_config.py
testing/config/mozharness/linux_mulet_config.py
testing/config/mozharness/mac_config.py
testing/config/mozharness/marionette.py
testing/config/mozharness/taskcluster_linux_config.py
testing/config/mozharness/try_arguments.py
testing/config/mozharness/web_platform_tests_config.py
testing/config/mozharness/windows_config.py
testing/mozharness/configs/android/android_panda_releng.py
testing/mozharness/configs/android/androidarm.py
testing/mozharness/configs/android/androidarm_4_3.py
testing/mozharness/configs/android/androidx86.py
testing/mozharness/configs/b2g/desktop_automation_config.py
testing/mozharness/configs/b2g/emulator_automation_config.py
testing/mozharness/configs/b2g/mulet_config.py
testing/mozharness/configs/luciddream/linux_config.py
testing/mozharness/configs/marionette/automation_emulator_config.py
testing/mozharness/configs/marionette/gaia_ui_test_prod_config.py
testing/mozharness/configs/marionette/prod_config.py
testing/mozharness/configs/marionette/test_config.py
testing/mozharness/configs/marionette/windows_config.py
testing/mozharness/configs/unittests/linux_unittest.py
testing/mozharness/configs/unittests/mac_unittest.py
testing/mozharness/configs/unittests/win_unittest.py
testing/mozharness/configs/web_platform_tests/prod_config.py
testing/mozharness/configs/web_platform_tests/prod_config_windows.py
testing/mozharness/configs/web_platform_tests/test_config.py
testing/mozharness/configs/web_platform_tests/test_config_windows.py
testing/mozharness/mozharness/mozilla/testing/testbase.py
testing/mozharness/mozharness/mozilla/testing/try_tools.py
testing/mozharness/scripts/android_emulator_unittest.py
testing/mozharness/scripts/android_panda.py
testing/mozharness/scripts/androidx86_emulator_unittest.py
testing/mozharness/scripts/b2g_desktop_unittest.py
testing/mozharness/scripts/b2g_emulator_unittest.py
testing/mozharness/scripts/desktop_unittest.py
testing/mozharness/scripts/luciddream_unittest.py
testing/mozharness/scripts/marionette.py
testing/mozharness/scripts/mulet_unittest.py
testing/mozharness/scripts/web_platform_tests.py
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/android_arm_4_3_config.py
@@ -0,0 +1,154 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "mochitest": {
+            "run_filename": "runtestsremote.py",
+            "testsdir": "mochitest",
+            "options": [
+                "--dm_trans=adb",
+                "--app=%(app)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--certificate-path=%(certs_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--screenshot-on-fail",
+            ],
+        },
+        "mochitest-gl": {
+            "run_filename": "runtestsremote.py",
+            "testsdir": "mochitest",
+            "options": [
+                "--dm_trans=adb",
+                "--app=%(app)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--certificate-path=%(certs_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--screenshot-on-fail",
+                "--total-chunks=4",
+                "--subsuite=webgl",
+            ],
+        },
+        "robocop": {
+            "run_filename": "runrobocop.py",
+            "testsdir": "mochitest",
+            "options": [
+                "--dm_trans=adb",
+                "--app=%(app)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--certificate-path=%(certs_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--total-chunks=4",
+                "--robocop-apk=../../robocop.apk",
+                "--robocop-ini=robocop.ini",
+            ],
+        },
+        "reftest": {
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest",
+            "options": [
+                "--app=%(app)s",
+                "--ignore-window-size",
+                "--dm_trans=adb",
+                "--bootstrap",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--httpd-path", "%(modules_dir)s",
+                "--symbols-path=%(symbols_path)s",
+                "--total-chunks=16",
+                "tests/layout/reftests/reftest.list",
+            ],
+        },
+        "crashtest": {
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest",
+            "options": [
+                "--app=%(app)s",
+                "--ignore-window-size",
+                "--dm_trans=adb",
+                "--bootstrap",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--httpd-path",
+                "%(modules_dir)s",
+                "--symbols-path=%(symbols_path)s",
+                "--total-chunks=2",
+                "tests/testing/crashtest/crashtests.list",
+            ],
+        },
+        "jsreftest": {
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest",
+            "options": [
+                "--app=%(app)s",
+                "--ignore-window-size",
+                "--dm_trans=adb",
+                "--bootstrap",
+                "--remote-webserver=%(remote_webserver)s", "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s", "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s", "--httpd-path", "%(modules_dir)s",
+                "--symbols-path=%(symbols_path)s",
+                "../jsreftest/tests/jstests.list",
+                "--total-chunks=6",
+                "--extra-profile-file=jsreftest/tests/user.js",
+            ],
+        },
+        "xpcshell": {
+            "run_filename": "remotexpcshelltests.py",
+            "testsdir": "xpcshell",
+            "options": [
+                "--dm_trans=adb",
+                "--xre-path=%(xre_path)s",
+                "--testing-modules-dir=%(modules_dir)s",
+                "--apk=%(installer_path)s",
+                "--no-logfiles",
+                "--symbols-path=%(symbols_path)s",
+                "--manifest=tests/xpcshell.ini",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--total-chunks=3",
+            ],
+        },
+        "cppunittest": {
+            "run_filename": "remotecppunittests.py",
+            "testsdir": "cppunittest",
+            "options": [
+                "--symbols-path=%(symbols_path)s",
+                "--xre-path=%(xre_path)s",
+                "--dm_trans=adb",
+                "--localBinDir=../bin",
+                "--apk=%(installer_path)s",
+                ".",
+            ],
+        },
+
+    }, # end suite_definitions
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/android_arm_config.py
@@ -0,0 +1,156 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "mochitest": {
+            "run_filename": "runtestsremote.py",
+            "testsdir": "mochitest",
+            "options": [
+                "--dm_trans=sut",
+                "--app=%(app)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--deviceIP=%(device_ip)s",
+                "--devicePort=%(device_port)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--certificate-path=%(certs_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--screenshot-on-fail",
+            ],
+        },
+        "mochitest-gl": {
+            "run_filename": "runtestsremote.py",
+            "testsdir": "mochitest",
+            "options": [
+                "--dm_trans=sut",
+                "--app=%(app)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--deviceIP=%(device_ip)s",
+                "--devicePort=%(device_port)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--certificate-path=%(certs_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--screenshot-on-fail",
+                "--total-chunks=4",
+                "--subsuite=webgl",
+            ],
+        },
+        "robocop": {
+            "run_filename": "runrobocop.py",
+            "testsdir": "mochitest",
+            "options": [
+                "--dm_trans=sut",
+                "--app=%(app)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--deviceIP=%(device_ip)s",
+                "--devicePort=%(device_port)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--certificate-path=%(certs_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--total-chunks=4",
+                "--robocop-apk=../../robocop.apk",
+                "--robocop-ini=robocop.ini",
+            ],
+        },
+        "reftest": {
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest",
+            "options": [
+                "--app=%(app)s",
+                "--ignore-window-size",
+                "--bootstrap",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--deviceIP=%(device_ip)s",
+                "--devicePort=%(device_port)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--httpd-path",
+                "%(modules_dir)s",
+                "--symbols-path=%(symbols_path)s",
+                "--total-chunks=16",
+                "tests/layout/reftests/reftest.list",
+            ],
+        },
+        "crashtest": {
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest",
+            "options": [
+                "--app=%(app)s",
+                "--ignore-window-size",
+                "--bootstrap",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--deviceIP=%(device_ip)s",
+                "--devicePort=%(device_port)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--httpd-path",
+                "%(modules_dir)s",
+                "--symbols-path=%(symbols_path)s",
+                "--total-chunks=2",
+                "tests/testing/crashtest/crashtests.list",
+            ],
+        },
+        "jsreftest": {
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest",
+            "options": [
+                "--app=%(app)s",
+                "--ignore-window-size",
+                "--bootstrap",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--utility-path=%(utility_path)s",
+                "--deviceIP=%(device_ip)s",
+                "--devicePort=%(device_port)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--httpd-path",
+                "%(modules_dir)s",
+                "--symbols-path=%(symbols_path)s",
+                "../jsreftest/tests/jstests.list",
+                "--total-chunks=6",
+                "--extra-profile-file=jsreftest/tests/user.js",
+            ],
+        },
+        "xpcshell": {
+            "run_filename": "remotexpcshelltests.py",
+            "testsdir": "xpcshell",
+            "options": [
+                "--deviceIP=%(device_ip)s",
+                "--devicePort=%(device_port)s",
+                "--xre-path=%(xre_path)s",
+                "--testing-modules-dir=%(modules_dir)s",
+                "--apk=%(installer_path)s",
+                "--no-logfiles",
+                "--symbols-path=%(symbols_path)s",
+                "--manifest=tests/xpcshell.ini",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--total-chunks=3",
+            ],
+        },
+    }, # end suite_definitions
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/android_panda_config.py
@@ -0,0 +1,140 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "cppunittest": {
+            "options": [
+                "--symbols-path=%(symbols_path)s",
+                "--xre-path=tests/bin",
+                "--dm_trans=sut",
+                "--deviceIP=%(device_ip)s",
+                "--localBinDir=../tests/bin",
+                "--apk=%(apk_path)s",
+                "--skip-manifest=../tests/cppunittests/android_cppunittest_manifest.txt"
+            ],
+            "run_filename": "remotecppunittests.py",
+            "testsdir": "cppunittest"
+        },
+        "crashtest": {
+            "options": [
+                "--deviceIP=%(device_ip)s",
+                "--xre-path=../hostutils/xre",
+                "--utility-path=../hostutils/bin",
+                "--app=%(app_name)s",
+                "--ignore-window-size",
+                "--bootstrap",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--symbols-path=%(symbols_path)s",
+                "reftest/tests/testing/crashtest/crashtests.list"
+            ],
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest"
+        },
+        "jittest": {
+            "options": [
+                "bin/js",
+                "--remote",
+                "-j",
+                "1",
+                "--deviceTransport=sut",
+                "--deviceIP=%(device_ip)s",
+                "--localLib=../tests/bin",
+                "--no-slow",
+                "--no-progress",
+                "--format=automation",
+                "--jitflags=all"
+            ],
+            "run_filename": "jit_test.py",
+            "testsdir": "jit-test/jit-test"
+        },
+        "jsreftest": {
+            "options": [
+                "--deviceIP=%(device_ip)s",
+                "--xre-path=../hostutils/xre",
+                "--utility-path=../hostutils/bin",
+                "--app=%(app_name)s",
+                "--ignore-window-size",
+                "--bootstrap",
+                "--extra-profile-file=jsreftest/tests/user.js",
+                "jsreftest/tests/jstests.list",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--symbols-path=%(symbols_path)s"
+            ],
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest"
+        },
+        "mochitest": {
+            "options": [
+                "--dm_trans=sut",
+                "--deviceIP=%(device_ip)s",
+                "--xre-path=../hostutils/xre",
+                "--utility-path=../hostutils/bin",
+                "--certificate-path=certs",
+                "--app=%(app_name)s",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--symbols-path=%(symbols_path)s",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--screenshot-on-fail",
+            ],
+            "run_filename": "runtestsremote.py",
+            "testsdir": "mochitest"
+        },
+        "reftest": {
+            "options": [
+                "--deviceIP=%(device_ip)s",
+                "--xre-path=../hostutils/xre",
+                "--utility-path=../hostutils/bin",
+                "--app=%(app_name)s",
+                "--ignore-window-size",
+                "--bootstrap",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--symbols-path=%(symbols_path)s",
+                "reftest/tests/layout/reftests/reftest.list"
+            ],
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest"
+        },
+        "robocop": {
+            "options": [
+                "--dm_trans=sut",
+                "--deviceIP=%(device_ip)s",
+                "--xre-path=../hostutils/xre",
+                "--utility-path=../hostutils/bin",
+                "--certificate-path=certs",
+                "--app=%(app_name)s",
+                "--console-level=INFO",
+                "--http-port=%(http_port)s",
+                "--ssl-port=%(ssl_port)s",
+                "--symbols-path=%(symbols_path)s",
+                "--robocop-ini=mochitest/robocop.ini"
+            ],
+            "run_filename": "runrobocop.py",
+            "testsdir": "mochitest"
+        },
+        "xpcshell": {
+            "options": [
+                "--deviceIP=%(device_ip)s",
+                "--xre-path=../hostutils/xre",
+                "--manifest=xpcshell/tests/xpcshell.ini",
+                "--build-info-json=xpcshell/mozinfo.json",
+                "--testing-modules-dir=modules",
+                "--local-lib-dir=../fennec",
+                "--apk=../%(apk_name)s",
+                "--no-logfiles",
+                "--symbols-path=%(symbols_path)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+            ],
+            "run_filename": "remotexpcshelltests.py",
+            "testsdir": "xpcshell"
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/android_x86_config.py
@@ -0,0 +1,57 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "mochitest": {
+            "run_filename": "runtestsremote.py",
+            "options": ["--dm_trans=sut",
+                        "--app=%(app)s",
+                        "--remote-webserver=%(remote_webserver)s",
+                        "--xre-path=%(xre_path)s",
+                        "--utility-path=%(utility_path)s",
+                        "--deviceIP=%(device_ip)s",
+                        "--devicePort=%(device_port)s",
+                        "--http-port=%(http_port)s",
+                        "--ssl-port=%(ssl_port)s",
+                        "--certificate-path=%(certs_path)s",
+                        "--symbols-path=%(symbols_path)s",
+                        "--quiet",
+                        "--log-raw=%(raw_log_file)s",
+                        "--log-errorsummary=%(error_summary_file)s",
+                        "--screenshot-on-fail",
+                    ],
+        },
+        "reftest": {
+            "run_filename": "remotereftest.py",
+            "options": ["--app=%(app)s",
+                        "--ignore-window-size",
+                        "--bootstrap",
+                        "--remote-webserver=%(remote_webserver)s",
+                        "--xre-path=%(xre_path)s",
+                        "--utility-path=%(utility_path)s",
+                        "--deviceIP=%(device_ip)s",
+                        "--devicePort=%(device_port)s",
+                        "--http-port=%(http_port)s",
+                        "--ssl-port=%(ssl_port)s",
+                        "--httpd-path", "%(modules_dir)s",
+                        "--symbols-path=%(symbols_path)s",
+                    ],
+        },
+        "xpcshell": {
+            "run_filename": "remotexpcshelltests.py",
+            "options": ["--deviceIP=%(device_ip)s",
+                        "--devicePort=%(device_port)s",
+                        "--xre-path=%(xre_path)s",
+                        "--testing-modules-dir=%(modules_dir)s",
+                        "--apk=%(installer_path)s",
+                        "--no-logfiles",
+                        "--symbols-path=%(symbols_path)s",
+                        "--manifest=tests/xpcshell.ini",
+                        "--log-raw=%(raw_log_file)s",
+                        "--log-errorsummary=%(error_summary_file)s",
+                    ],
+        },
+    }, # end suite_definitions
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/b2g_desktop_config.py
@@ -0,0 +1,41 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "mochitest": {
+            "options": [
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s",
+                "--profile=%(gaia_profile)s",
+                "--app=%(application)s",
+                "--desktop",
+                "--utility-path=%(utility_path)s",
+                "--certificate-path=%(cert_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--browser-arg=%(browser_arg)s",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--screenshot-on-fail",
+            ],
+            "run_filename": "runtestsb2g.py",
+            "testsdir": "mochitest"
+        },
+        "reftest": {
+            "options": [
+                "--desktop",
+                "--profile=%(gaia_profile)s",
+                "--appname=%(application)s",
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s",
+                "--browser-arg=%(browser_arg)s",
+                "--symbols-path=%(symbols_path)s",
+                "%(test_manifest)s"
+            ],
+            "run_filename": "runreftestsb2g.py",
+            "testsdir": "reftest"
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/b2g_emulator_config.py
@@ -0,0 +1,144 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "cppunittest": {
+            "options": [
+                "--dm_trans=adb",
+                "--symbols-path=%(symbols_path)s",
+                "--xre-path=%(xre_path)s",
+                "--addEnv",
+                "LD_LIBRARY_PATH=/vendor/lib:/system/lib:/system/b2g",
+                "--with-b2g-emulator=%(b2gpath)s",
+                "."
+            ],
+            "run_filename": "remotecppunittests.py",
+            "testsdir": "cppunittest"
+        },
+        "crashtest": {
+            "options": [
+                "--adbpath=%(adbpath)s",
+                "--b2gpath=%(b2gpath)s",
+                "--emulator=%(emulator)s",
+                "--emulator-res=800x1000",
+                "--logdir=%(logcat_dir)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--ignore-window-size",
+                "--xre-path=%(xre_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--busybox=%(busybox)s",
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s",
+                "tests/testing/crashtest/crashtests.list"
+            ],
+            "run_filename": "runreftestb2g.py",
+            "testsdir": "reftest"
+        },
+        "jsreftest": {
+            "options": [
+                "--adbpath=%(adbpath)s",
+                "--b2gpath=%(b2gpath)s",
+                "--emulator=%(emulator)s",
+                "--emulator-res=800x1000",
+                "--logdir=%(logcat_dir)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--ignore-window-size",
+                "--xre-path=%(xre_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--busybox=%(busybox)s",
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s",
+                "--extra-profile-file=jsreftest/tests/user.js",
+                "jsreftest/tests/jstests.list"
+            ],
+            "run_filename": "remotereftest.py",
+            "testsdir": "reftest"
+        },
+        "mochitest": {
+            "options": [
+                "--adbpath=%(adbpath)s",
+                "--b2gpath=%(b2gpath)s",
+                "--emulator=%(emulator)s",
+                "--logdir=%(logcat_dir)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--busybox=%(busybox)s",
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--certificate-path=%(certificate_path)s",
+                "--screenshot-on-fail",
+                "%(test_path)s"
+            ],
+            "run_filename": "runtestsb2g.py",
+            "testsdir": "mochitest"
+        },
+        "mochitest-chrome": {
+            "options": [
+                "--adbpath=%(adbpath)s",
+                "--b2gpath=%(b2gpath)s",
+                "--emulator=%(emulator)s",
+                "--logdir=%(logcat_dir)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--xre-path=%(xre_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--busybox=%(busybox)s",
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s",
+                "--quiet",
+                "--chrome",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--certificate-path=%(certificate_path)s",
+                "--screenshot-on-fail",
+                "%(test_path)s"
+            ],
+            "run_filename": "runtestsb2g.py",
+            "testsdir": "mochitest"
+        },
+        "reftest": {
+            "options": [
+                "--adbpath=%(adbpath)s",
+                "--b2gpath=%(b2gpath)s",
+                "--emulator=%(emulator)s",
+                "--emulator-res=800x1000",
+                "--logdir=%(logcat_dir)s",
+                "--remote-webserver=%(remote_webserver)s",
+                "--ignore-window-size",
+                "--xre-path=%(xre_path)s",
+                "--symbols-path=%(symbols_path)s",
+                "--busybox=%(busybox)s",
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s",
+                "--enable-oop",
+                "tests/layout/reftests/reftest.list"
+            ],
+            "run_filename": "runreftestsb2g.py",
+            "testsdir": "reftest"
+        },
+        "xpcshell": {
+            "options": [
+                "--adbpath=%(adbpath)s",
+                "--b2gpath=%(b2gpath)s",
+                "--emulator=%(emulator)s",
+                "--logdir=%(logcat_dir)s",
+                "--manifest=tests/xpcshell.ini",
+                "--use-device-libs",
+                "--testing-modules-dir=%(modules_dir)s",
+                "--symbols-path=%(symbols_path)s",
+                "--busybox=%(busybox)s",
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+            ],
+            "run_filename": "runtestsb2g.py",
+            "testsdir": "xpcshell"
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/linux_config.py
@@ -0,0 +1,116 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "cppunittest": {
+            "options": [
+                "--symbols-path=%(symbols_path)s",
+                "--xre-path=%(abs_app_dir)s"
+            ],
+            "run_filename": "runcppunittests.py",
+            "testsdir": "cppunittest"
+        },
+        "jittest": {
+            "options": [
+                "tests/bin/js",
+                "--no-slow",
+                "--no-progress",
+                "--format=automation",
+                "--jitflags=all"
+            ],
+            "run_filename": "jit_test.py",
+            "testsdir": "jit-test/jit-test"
+        },
+        "luciddream-emulator": {
+            "options": [
+                "--startup-timeout=300",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--browser-path=%(browser_path)s",
+                "--b2gpath=%(emulator_path)s",
+                "%(test_manifest)s"
+            ],
+        },
+        "luciddream-b2gdt": {
+            "options": [
+                "--startup-timeout=300",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--browser-path=%(browser_path)s",
+                "--b2g-desktop-path=%(fxos_desktop_path)s",
+                "--gaia-profile=%(gaia_profile)s",
+                "%(test_manifest)s"
+            ],
+        },
+        "mochitest": {
+            "options": [
+                "--appname=%(binary_path)s",
+                "--utility-path=tests/bin",
+                "--extra-profile-file=tests/bin/plugins",
+                "--symbols-path=%(symbols_path)s",
+                "--certificate-path=tests/certs",
+                "--setpref=webgl.force-enabled=true",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--use-test-media-devices",
+                "--screenshot-on-fail",
+            ],
+            "run_filename": "runtests.py",
+            "testsdir": "mochitest"
+        },
+        "mozbase": {
+            "options": [
+                "-b",
+                "%(binary_path)s"
+            ],
+            "run_filename": "test.py",
+            "testsdir": "mozbase"
+        },
+        "mozmill": {
+            "options": [
+                "--binary=%(binary_path)s",
+                "--symbols-path=%(symbols_path)s"
+            ],
+            "run_filename": "runtestlist.py",
+            "testsdir": "mozmill"
+        },
+        "reftest": {
+            "options": [
+                "--appname=%(binary_path)s",
+                "--utility-path=tests/bin",
+                "--extra-profile-file=tests/bin/plugins",
+                "--symbols-path=%(symbols_path)s"
+            ],
+            "run_filename": "runreftest.py",
+            "testsdir": "reftest"
+        },
+        "webapprt": {
+            "options": [
+                "--app=%(app_path)s",
+                "--utility-path=tests/bin",
+                "--extra-profile-file=tests/bin/plugins",
+                "--symbols-path=%(symbols_path)s",
+                "--certificate-path=tests/certs",
+                "--console-level=INFO",
+                "--testing-modules-dir=tests/modules",
+                "--quiet"
+            ],
+            "run_filename": "runtests.py",
+            "testsdir": "mochitest"
+        },
+        "xpcshell": {
+            "options": [
+                "--symbols-path=%(symbols_path)s",
+                "--test-plugin-path=%(test_plugin_path)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--utility-path=tests/bin",
+            ],
+            "run_filename": "runxpcshelltests.py",
+            "testsdir": "xpcshell"
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/linux_mulet_config.py
@@ -0,0 +1,17 @@
+# This is used by mozharness' mulet_unittest.py
+config = {
+    # testsuite options
+    "reftest_options": [
+        "--mulet",
+        "--profile=%(gaia_profile)s",
+        "--appname=%(application)s",
+        "--total-chunks=%(total_chunks)s",
+        "--this-chunk=%(this_chunk)s",
+        "--symbols-path=%(symbols_path)s",
+        "--enable-oop",
+        "%(test_manifest)s"
+    ],
+    "run_file_names": {
+        "reftest": "runreftestb2g.py",
+    },
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/mac_config.py
@@ -0,0 +1,94 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "cppunittest": {
+            "options": [
+                "--symbols-path=%(symbols_path)s",
+                "--xre-path=%(abs_app_dir)s"
+            ],
+            "run_filename": "runcppunittests.py",
+            "testsdir": "cppunittest"
+        },
+        "jittest": {
+            "options": [
+                "tests/bin/js",
+                "--no-slow",
+                "--no-progress",
+                "--format=automation",
+                "--jitflags=all"
+            ],
+            "run_filename": "jit_test.py",
+            "testsdir": "jit-test/jit-test"
+        },
+        "mochitest": {
+            "options": [
+                "--appname=%(binary_path)s",
+                "--utility-path=tests/bin",
+                "--extra-profile-file=tests/bin/plugins",
+                "--symbols-path=%(symbols_path)s",
+                "--certificate-path=tests/certs",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--screenshot-on-fail",
+            ],
+            "run_filename": "runtests.py",
+            "testsdir": "mochitest"
+        },
+        "mozbase": {
+            "options": [
+                "-b",
+                "%(binary_path)s"
+            ],
+            "run_filename": "test.py",
+            "testsdir": "mozbase"
+        },
+        "mozmill": {
+            "options": [
+                "--binary=%(binary_path)s",
+                "--symbols-path=%(symbols_path)s"
+            ],
+            "run_filename": "runtestlist.py",
+            "testsdir": "mozmill"
+        },
+        "reftest": {
+            "options": [
+                "--appname=%(binary_path)s",
+                "--utility-path=tests/bin",
+                "--extra-profile-file=tests/bin/plugins",
+                "--symbols-path=%(symbols_path)s"
+            ],
+            "run_filename": "runreftest.py",
+            "testsdir": "reftest"
+        },
+        "webapprt": {
+            "options": [
+                "--app=%(app_path)s",
+                "--xre-path=%(abs_res_dir)s",
+                "--utility-path=tests/bin",
+                "--extra-profile-file=tests/bin/plugins",
+                "--symbols-path=%(symbols_path)s",
+                "--certificate-path=tests/certs",
+                "--console-level=INFO",
+                "--testing-modules-dir=tests/modules",
+                "--quiet"
+            ],
+            "run_filename": "runtests.py",
+            "testsdir": "mochitest"
+        },
+        "xpcshell": {
+            "options": [
+                "--symbols-path=%(symbols_path)s",
+                "--test-plugin-path=%(test_plugin_path)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--utility-path=tests/bin",
+            ],
+            "run_filename": "runxpcshelltests.py",
+            "testsdir": "xpcshell"
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/marionette.py
@@ -0,0 +1,91 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "gaiatest_desktop": {
+            "options": [
+                "--restart",
+                "--timeout=%(timeout)s",
+                "--type=%(type)s",
+                "--testvars=%(testvars)s",
+                "--profile=%(profile)s",
+                "--symbols-path=%(symbols_path)s",
+                "--gecko-log=%(gecko_log)s",
+                "--xml-output=%(xml_output)s",
+                "--html-output=%(html_output)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--binary=%(binary)s",
+                "--address=%(address)s",
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s"
+            ],
+            "run_filename": "",
+            "testsdir": ""
+        },
+        "gaiatest_emulator": {
+            "options": [
+                "--restart",
+                "--timeout=%(timeout)s",
+                "--type=%(type)s",
+                "--testvars=%(testvars)s",
+                "--profile=%(profile)s",
+                "--symbols-path=%(symbols_path)s",
+                "--xml-output=%(xml_output)s",
+                "--html-output=%(html_output)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--logcat-dir=%(logcat_dir)s",
+                "--emulator=%(emulator)s",
+                "--homedir=%(homedir)s"
+            ],
+            "run_filename": "",
+            "testsdir": ""
+        },
+        "marionette_desktop": {
+            "options": [
+                "--type=%(type)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--binary=%(binary)s",
+                "--address=%(address)s",
+                "--symbols-path=%(symbols_path)s"
+            ],
+            "run_filename": "",
+            "testsdir": ""
+        },
+        "marionette_emulator": {
+            "options": [
+                "--type=%(type)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--logcat-dir=%(logcat_dir)s",
+                "--emulator=%(emulator)s",
+                "--homedir=%(homedir)s",
+                "--symbols-path=%(symbols_path)s"
+            ],
+            "run_filename": "",
+            "testsdir": ""
+        },
+        "webapi_desktop": {
+            "options": [],
+            "run_filename": "",
+            "testsdir": ""
+        },
+        "webapi_emulator": {
+            "options": [
+                "--type=%(type)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--symbols-path=%(symbols_path)s",
+                "--logcat-dir=%(logcat_dir)s",
+                "--emulator=%(emulator)s",
+                "--homedir=%(homedir)s"
+            ],
+            "run_filename": "",
+            "testsdir": ""
+        }
+    }
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/taskcluster_linux_config.py
@@ -0,0 +1,52 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "reftest_options": [
+        "--appname=%(binary_path)s",
+        "--utility-path=tests/bin",
+        "--extra-profile-file=tests/bin/plugins",
+        "--symbols-path=%(symbols_path)s"
+    ],
+    "mochitest_options": [
+        "--appname=%(binary_path)s",
+        "--utility-path=tests/bin",
+        "--extra-profile-file=tests/bin/plugins",
+        "--symbols-path=%(symbols_path)s",
+        "--certificate-path=tests/certs",
+        "--setpref=webgl.force-enabled=true",
+        "--quiet",
+        "--log-raw=%(raw_log_file)s",
+        "--log-errorsummary=%(error_summary_file)s",
+        "--screenshot-on-fail",
+    ],
+    "webapprt_options": [
+        "--app=%(app_path)s",
+        "--utility-path=tests/bin",
+        "--extra-profile-file=tests/bin/plugins",
+        "--symbols-path=%(symbols_path)s",
+        "--certificate-path=tests/certs",
+        "--console-level=INFO",
+        "--testing-modules-dir=tests/modules",
+        "--quiet"
+    ],
+    "xpcshell_options": [
+        "--symbols-path=%(symbols_path)s",
+        "--test-plugin-path=%(test_plugin_path)s"
+    ],
+    "cppunittest_options": [
+        "--symbols-path=%(symbols_path)s",
+        "--xre-path=%(abs_app_dir)s"
+    ],
+    "jittest_options": [
+        "tests/bin/js",
+        "--no-slow",
+        "--no-progress",
+        "--format=automation",
+        "--jitflags=all"
+    ],
+    "mozbase_options": [
+        "-b", "%(binary_path)s"
+    ],
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/try_arguments.py
@@ -0,0 +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/.
+
+# Because this list exposes new surface to our interface to try, and could
+# easily produce unexpected results if misused, this should only include
+# arguments likely to work with multiple harnesses, and will have unintended
+# effects if conflicts with TryParser are introduced.
+config = {
+    '--tag': {
+        'action': 'append',
+        'dest': 'tags',
+        'default': None,
+    },
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/web_platform_tests_config.py
@@ -0,0 +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/.
+
+config = {
+    "options": [
+        "--prefs-root=%(test_path)s/prefs",
+        "--processes=1",
+        "--config=%(test_path)s/wptrunner.ini",
+        "--ca-cert-path=%(test_path)s/certs/cacert.pem",
+        "--host-key-path=%(test_path)s/certs/web-platform.test.key",
+        "--host-cert-path=%(test_path)s/certs/web-platform.test.pem",
+        "--certutil-binary=%(test_install_path)s/bin/certutil",
+    ],
+}
new file mode 100644
--- /dev/null
+++ b/testing/config/mozharness/windows_config.py
@@ -0,0 +1,93 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+config = {
+    "suite_definitions": {
+        "cppunittest": {
+            "options": [
+                "--symbols-path=%(symbols_path)s",
+                "--xre-path=%(abs_app_dir)s"
+            ],
+            "run_filename": "runcppunittests.py",
+            "testsdir": "cppunittest"
+        },
+        "jittest": {
+            "options": [
+                "tests/bin/js",
+                "--no-slow",
+                "--no-progress",
+                "--format=automation",
+                "--jitflags=all"
+            ],
+            "run_filename": "jit_test.py",
+            "testsdir": "jit-test/jit-test"
+        },
+        "mochitest": {
+            "options": [
+                "--appname=%(binary_path)s",
+                "--utility-path=tests/bin",
+                "--extra-profile-file=tests/bin/plugins",
+                "--symbols-path=%(symbols_path)s",
+                "--certificate-path=tests/certs",
+                "--quiet",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--screenshot-on-fail",
+            ],
+            "run_filename": "runtests.py",
+            "testsdir": "mochitest"
+        },
+        "mozbase": {
+            "options": [
+                "-b",
+                "%(binary_path)s"
+            ],
+            "run_filename": "test.py",
+            "testsdir": "mozbase"
+        },
+        "mozmill": {
+            "options": [
+                "--binary=%(binary_path)s",
+                "--symbols-path=%(symbols_path)s"
+            ],
+            "run_filename": "runtestlist.py",
+            "testsdir": "mozmill"
+        },
+        "reftest": {
+            "options": [
+                "--appname=%(binary_path)s",
+                "--utility-path=tests/bin",
+                "--extra-profile-file=tests/bin/plugins",
+                "--symbols-path=%(symbols_path)s"
+            ],
+            "run_filename": "runreftest.py",
+            "testsdir": "reftest"
+        },
+        "webapprt": {
+            "options": [
+                "--app=%(app_path)s",
+                "--utility-path=tests/bin",
+                "--extra-profile-file=tests/bin/plugins",
+                "--symbols-path=%(symbols_path)s",
+                "--certificate-path=tests/certs",
+                "--console-level=INFO",
+                "--testing-modules-dir=tests/modules",
+                "--quiet"
+            ],
+            "run_filename": "runtests.py",
+            "testsdir": "mochitest"
+        },
+        "xpcshell": {
+            "options": [
+                "--symbols-path=%(symbols_path)s",
+                "--test-plugin-path=%(test_plugin_path)s",
+                "--log-raw=%(raw_log_file)s",
+                "--log-errorsummary=%(error_summary_file)s",
+                "--utility-path=tests/bin",
+            ],
+            "run_filename": "runxpcshelltests.py",
+            "testsdir": "xpcshell"
+        }
+    }
+}
--- a/testing/mozharness/configs/android/android_panda_releng.py
+++ b/testing/mozharness/configs/android/android_panda_releng.py
@@ -9,16 +9,18 @@ config = {
     "exes": {
         'python': '/tools/buildbot/bin/python',
         'virtualenv': ['/tools/buildbot/bin/python', '/tools/misc-python/virtualenv.py'],
     },
     "hostutils_url":  "http://talos-remote.pvt.build.mozilla.org/tegra/tegra-host-utils.Linux.1109310.2.zip",
     "verify_path":  "/builds/sut_tools/verify.py",
     "install_app_path":  "/builds/sut_tools/installApp.py",
     "logcat_path":  "/builds/sut_tools/logcat.py",
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/android_panda_config.py",
     "all_mochitest_suites": {
         "mochitest-1": ["--total-chunks=8", "--this-chunk=1"],
         "mochitest-2": ["--total-chunks=8", "--this-chunk=2"],
         "mochitest-3": ["--total-chunks=8", "--this-chunk=3"],
         "mochitest-4": ["--total-chunks=8", "--this-chunk=4"],
         "mochitest-5": ["--total-chunks=8", "--this-chunk=5"],
         "mochitest-6": ["--total-chunks=8", "--this-chunk=6"],
         "mochitest-7": ["--total-chunks=8", "--this-chunk=7"],
@@ -67,150 +69,16 @@ config = {
     },
     "all_cppunittest_suites": {
         "cppunittest": ['cppunittest']
     },
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
-    "suite_definitions": {
-        "cppunittest": {
-            "options": [
-                "--symbols-path=%(symbols_path)s",
-                "--xre-path=tests/bin",
-                "--dm_trans=sut",
-                "--deviceIP=%(device_ip)s",
-                "--localBinDir=../tests/bin",
-                "--apk=%(apk_path)s",
-                "--skip-manifest=../tests/cppunittests/android_cppunittest_manifest.txt"
-            ],
-            "run_filename": "remotecppunittests.py",
-            "testsdir": "cppunittest"
-        },
-        "crashtest": {
-            "options": [
-                "--deviceIP=%(device_ip)s",
-                "--xre-path=../hostutils/xre",
-                "--utility-path=../hostutils/bin",
-                "--app=%(app_name)s",
-                "--ignore-window-size",
-                "--bootstrap",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--symbols-path=%(symbols_path)s",
-                "reftest/tests/testing/crashtest/crashtests.list"
-            ],
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest"
-        },
-        "jittest": {
-            "options": [
-                "bin/js",
-                "--remote",
-                "-j",
-                "1",
-                "--deviceTransport=sut",
-                "--deviceIP=%(device_ip)s",
-                "--localLib=../tests/bin",
-                "--no-slow",
-                "--no-progress",
-                "--format=automation",
-                "--jitflags=all"
-            ],
-            "run_filename": "jit_test.py",
-            "testsdir": "jit-test/jit-test"
-        },
-        "jsreftest": {
-            "options": [
-                "--deviceIP=%(device_ip)s",
-                "--xre-path=../hostutils/xre",
-                "--utility-path=../hostutils/bin",
-                "--app=%(app_name)s",
-                "--ignore-window-size",
-                "--bootstrap",
-                "--extra-profile-file=jsreftest/tests/user.js",
-                "jsreftest/tests/jstests.list",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest"
-        },
-        "mochitest": {
-            "options": [
-                "--dm_trans=sut",
-                "--deviceIP=%(device_ip)s",
-                "--xre-path=../hostutils/xre",
-                "--utility-path=../hostutils/bin",
-                "--certificate-path=certs",
-                "--app=%(app_name)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--symbols-path=%(symbols_path)s",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--screenshot-on-fail",
-            ],
-            "run_filename": "runtestsremote.py",
-            "testsdir": "mochitest"
-        },
-        "reftest": {
-            "options": [
-                "--deviceIP=%(device_ip)s",
-                "--xre-path=../hostutils/xre",
-                "--utility-path=../hostutils/bin",
-                "--app=%(app_name)s",
-                "--ignore-window-size",
-                "--bootstrap",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--symbols-path=%(symbols_path)s",
-                "reftest/tests/layout/reftests/reftest.list"
-            ],
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest"
-        },
-        "robocop": {
-            "options": [
-                "--dm_trans=sut",
-                "--deviceIP=%(device_ip)s",
-                "--xre-path=../hostutils/xre",
-                "--utility-path=../hostutils/bin",
-                "--certificate-path=certs",
-                "--app=%(app_name)s",
-                "--console-level=INFO",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--symbols-path=%(symbols_path)s",
-                "--robocop-ini=mochitest/robocop.ini"
-            ],
-            "run_filename": "runrobocop.py",
-            "testsdir": "mochitest"
-        },
-        "xpcshell": {
-            "options": [
-                "--deviceIP=%(device_ip)s",
-                "--xre-path=../hostutils/xre",
-                "--manifest=xpcshell/tests/xpcshell.ini",
-                "--build-info-json=xpcshell/mozinfo.json",
-                "--testing-modules-dir=modules",
-                "--local-lib-dir=../fennec",
-                "--apk=../%(apk_name)s",
-                "--no-logfiles",
-                "--symbols-path=%(symbols_path)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-            ],
-            "run_filename": "remotexpcshelltests.py",
-            "testsdir": "xpcshell"
-        }
-    },
     "pip_index": False,
     "buildbot_json_path": "buildprops.json",
     "mobile_imaging_format": "http://mobile-imaging",
     "mozpool_assignee": socket.gethostname(),
     "default_actions": [
         'clobber',
         'read-buildbot-config',
         'download-and-extract',
--- a/testing/mozharness/configs/android/androidarm.py
+++ b/testing/mozharness/configs/android/androidarm.py
@@ -49,166 +49,16 @@ config = {
             "name": "test-1",
             "device_id": "emulator-5554",
             "http_port": "8854", # starting http port to use for the mochitest server
             "ssl_port": "4454", # starting ssl port to use for the server
             "emulator_port": 5554,
             "sut_port1": 20701,
             "sut_port2": 20700
         },
-    "suite_definitions": {
-        "mochitest": {
-            "run_filename": "runtestsremote.py",
-            "testsdir": "mochitest",
-            "options": [
-                "--dm_trans=sut",
-                "--app=%(app)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--deviceIP=%(device_ip)s",
-                "--devicePort=%(device_port)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--certificate-path=%(certs_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--screenshot-on-fail",
-            ],
-        },
-        "mochitest-gl": {
-            "run_filename": "runtestsremote.py",
-            "testsdir": "mochitest",
-            "options": [
-                "--dm_trans=sut",
-                "--app=%(app)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--deviceIP=%(device_ip)s",
-                "--devicePort=%(device_port)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--certificate-path=%(certs_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--screenshot-on-fail",
-                "--total-chunks=4",
-                "--subsuite=webgl",
-            ],
-        },
-        "robocop": {
-            "run_filename": "runrobocop.py",
-            "testsdir": "mochitest",
-            "options": [
-                "--dm_trans=sut",
-                "--app=%(app)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--deviceIP=%(device_ip)s",
-                "--devicePort=%(device_port)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--certificate-path=%(certs_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--total-chunks=4",
-                "--robocop-apk=../../robocop.apk",
-                "--robocop-ini=robocop.ini",
-            ],
-        },
-        "reftest": {
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest",
-            "options": [
-                "--app=%(app)s",
-                "--ignore-window-size",
-                "--bootstrap",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--deviceIP=%(device_ip)s",
-                "--devicePort=%(device_port)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--httpd-path",
-                "%(modules_dir)s",
-                "--symbols-path=%(symbols_path)s",
-                "--total-chunks=16",
-                "tests/layout/reftests/reftest.list",
-            ],
-        },
-        "crashtest": {
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest",
-            "options": [
-                "--app=%(app)s",
-                "--ignore-window-size",
-                "--bootstrap",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--deviceIP=%(device_ip)s",
-                "--devicePort=%(device_port)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--httpd-path",
-                "%(modules_dir)s",
-                "--symbols-path=%(symbols_path)s",
-                "--total-chunks=2",
-                "tests/testing/crashtest/crashtests.list",
-            ],
-        },
-        "jsreftest": {
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest",
-            "options": [
-                "--app=%(app)s",
-                "--ignore-window-size",
-                "--bootstrap",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--deviceIP=%(device_ip)s",
-                "--devicePort=%(device_port)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--httpd-path",
-                "%(modules_dir)s",
-                "--symbols-path=%(symbols_path)s",
-                "../jsreftest/tests/jstests.list",
-                "--total-chunks=6",
-                "--extra-profile-file=jsreftest/tests/user.js",
-            ],
-        },
-        "xpcshell": {
-            "run_filename": "remotexpcshelltests.py",
-            "testsdir": "xpcshell",
-            "options": [
-                "--deviceIP=%(device_ip)s",
-                "--devicePort=%(device_port)s",
-                "--xre-path=%(xre_path)s",
-                "--testing-modules-dir=%(modules_dir)s",
-                "--apk=%(installer_path)s",
-                "--no-logfiles",
-                "--symbols-path=%(symbols_path)s",
-                "--manifest=tests/xpcshell.ini",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--total-chunks=3",
-            ],
-        },
-    }, # end suite_definitions
     "test_suite_definitions": {
         "jsreftest-1": {
             "category": "jsreftest",
             "extra_args": ["--this-chunk=1"],
         },
         "jsreftest-2": {
             "category": "jsreftest",
             "extra_args": ["--this-chunk=2"],
@@ -425,14 +275,16 @@ config = {
             "category": "robocop",
             "extra_args": ["--this-chunk=3"],
         },
         "robocop-4": {
             "category": "robocop",
             "extra_args": ["--this-chunk=4"],
         },
     }, # end of "test_definitions"
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/android_arm_config.py",
     "download_minidump_stackwalk": True,
     "default_blob_upload_servers": [
          "https://blobupload.elasticbeanstalk.com",
     ],
     "blob_uploader_auth_file" : os.path.join(os.getcwd(), "oauth.txt"),
 }
--- a/testing/mozharness/configs/android/androidarm_4_3.py
+++ b/testing/mozharness/configs/android/androidarm_4_3.py
@@ -55,164 +55,16 @@ config = {
     ],
     "emulator": {
             "name": "test-1",
             "device_id": "emulator-5554",
             "http_port": "8854", # starting http port to use for the mochitest server
             "ssl_port": "4454", # starting ssl port to use for the server
             "emulator_port": 5554,
         },
-    "suite_definitions": {
-        "mochitest": {
-            "run_filename": "runtestsremote.py",
-            "testsdir": "mochitest",
-            "options": [
-                "--dm_trans=adb",
-                "--app=%(app)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--certificate-path=%(certs_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--screenshot-on-fail",
-            ],
-        },
-        "mochitest-gl": {
-            "run_filename": "runtestsremote.py",
-            "testsdir": "mochitest",
-            "options": [
-                "--dm_trans=adb",
-                "--app=%(app)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--certificate-path=%(certs_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--screenshot-on-fail",
-                "--total-chunks=4",
-                "--subsuite=webgl",
-            ],
-        },
-        "robocop": {
-            "run_filename": "runrobocop.py",
-            "testsdir": "mochitest",
-            "options": [
-                "--dm_trans=adb",
-                "--app=%(app)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--certificate-path=%(certs_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--total-chunks=4",
-                "--robocop-apk=../../robocop.apk",
-                "--robocop-ini=robocop.ini",
-            ],
-        },
-        "reftest": {
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest",
-            "options": [
-                "--app=%(app)s",
-                "--ignore-window-size",
-                "--dm_trans=adb",
-                "--bootstrap",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--httpd-path", "%(modules_dir)s",
-                "--symbols-path=%(symbols_path)s",
-                "--total-chunks=16",
-                "tests/layout/reftests/reftest.list",
-            ],
-        },
-        "crashtest": {
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest",
-            "options": [
-                "--app=%(app)s",
-                "--ignore-window-size",
-                "--dm_trans=adb",
-                "--bootstrap",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s",
-                "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s",
-                "--httpd-path",
-                "%(modules_dir)s",
-                "--symbols-path=%(symbols_path)s",
-                "--total-chunks=2",
-                "tests/testing/crashtest/crashtests.list",
-            ],
-        },
-        "jsreftest": {
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest",
-            "options": [
-                "--app=%(app)s",
-                "--ignore-window-size",
-                "--dm_trans=adb",
-                "--bootstrap",
-                "--remote-webserver=%(remote_webserver)s", "--xre-path=%(xre_path)s",
-                "--utility-path=%(utility_path)s", "--http-port=%(http_port)s",
-                "--ssl-port=%(ssl_port)s", "--httpd-path", "%(modules_dir)s",
-                "--symbols-path=%(symbols_path)s",
-                "../jsreftest/tests/jstests.list",
-                "--total-chunks=6",
-                "--extra-profile-file=jsreftest/tests/user.js",
-            ],
-        },
-        "xpcshell": {
-            "run_filename": "remotexpcshelltests.py",
-            "testsdir": "xpcshell",
-            "options": [
-                "--dm_trans=adb",
-                "--xre-path=%(xre_path)s",
-                "--testing-modules-dir=%(modules_dir)s",
-                "--apk=%(installer_path)s",
-                "--no-logfiles",
-                "--symbols-path=%(symbols_path)s",
-                "--manifest=tests/xpcshell.ini",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--total-chunks=3",
-            ],
-        },
-        "cppunittest": {
-            "run_filename": "remotecppunittests.py",
-            "testsdir": "cppunittest",
-            "options": [
-                "--symbols-path=%(symbols_path)s",
-                "--xre-path=%(xre_path)s",
-                "--dm_trans=adb",
-                "--localBinDir=../bin",
-                "--apk=%(installer_path)s",
-                ".",
-            ],
-        },
-
-    }, # end suite_definitions
     "test_suite_definitions": {
         "jsreftest-1": {
             "category": "jsreftest",
             "extra_args": ["--this-chunk=1"],
         },
         "jsreftest-2": {
             "category": "jsreftest",
             "extra_args": ["--this-chunk=2"],
@@ -657,14 +509,16 @@ config = {
             "category": "robocop",
             "extra_args": ["--this-chunk=4"],
         },
         "cppunittest": {
             "category": "cppunittest",
             "extra_args": [],
         },
     }, # end of "test_definitions"
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/android_arm_4_3_config.py",
     "download_minidump_stackwalk": True,
     "default_blob_upload_servers": [
          "https://blobupload.elasticbeanstalk.com",
     ],
     "blob_uploader_auth_file" : os.path.join(os.getcwd(), "oauth.txt"),
 }
--- a/testing/mozharness/configs/android/androidx86.py
+++ b/testing/mozharness/configs/android/androidx86.py
@@ -76,67 +76,16 @@ config = {
             "device_id": "emulator-5560",
             "http_port": "8860", # starting http port to use for the mochitest server
             "ssl_port": "4460", # starting ssl port to use for the server
             "emulator_port": 5560,
             "sut_port1": 20707,
             "sut_port2": 20706
         }
     ],
-    "suite_definitions": {
-        "mochitest": {
-            "run_filename": "runtestsremote.py",
-            "options": ["--dm_trans=sut",
-                        "--app=%(app)s",
-                        "--remote-webserver=%(remote_webserver)s",
-                        "--xre-path=%(xre_path)s",
-                        "--utility-path=%(utility_path)s",
-                        "--deviceIP=%(device_ip)s",
-                        "--devicePort=%(device_port)s",
-                        "--http-port=%(http_port)s",
-                        "--ssl-port=%(ssl_port)s",
-                        "--certificate-path=%(certs_path)s",
-                        "--symbols-path=%(symbols_path)s",
-                        "--quiet",
-                        "--log-raw=%(raw_log_file)s",
-                        "--log-errorsummary=%(error_summary_file)s",
-                        "--screenshot-on-fail",
-                    ],
-        },
-        "reftest": {
-            "run_filename": "remotereftest.py",
-            "options": ["--app=%(app)s",
-                        "--ignore-window-size",
-                        "--bootstrap",
-                        "--remote-webserver=%(remote_webserver)s",
-                        "--xre-path=%(xre_path)s",
-                        "--utility-path=%(utility_path)s",
-                        "--deviceIP=%(device_ip)s",
-                        "--devicePort=%(device_port)s",
-                        "--http-port=%(http_port)s",
-                        "--ssl-port=%(ssl_port)s",
-                        "--httpd-path", "%(modules_dir)s",
-                        "--symbols-path=%(symbols_path)s",
-                    ],
-        },
-        "xpcshell": {
-            "run_filename": "remotexpcshelltests.py",
-            "options": ["--deviceIP=%(device_ip)s",
-                        "--devicePort=%(device_port)s",
-                        "--xre-path=%(xre_path)s",
-                        "--testing-modules-dir=%(modules_dir)s",
-                        "--apk=%(installer_path)s",
-                        "--no-logfiles",
-                        "--symbols-path=%(symbols_path)s",
-                        "--manifest=tests/xpcshell.ini",
-                        "--log-raw=%(raw_log_file)s",
-                        "--log-errorsummary=%(error_summary_file)s",
-                    ],
-        },
-    }, # end suite_definitions
     "test_suite_definitions": {
         "jsreftest": {
             "category": "reftest",
             "extra_args": ["../jsreftest/tests/jstests.list",
                 "--extra-profile-file=jsreftest/tests/user.js"]
         },
         "mochitest-1": {
             "category": "mochitest",
@@ -171,14 +120,16 @@ config = {
         },
         "xpcshell": {
             "category": "xpcshell",
             # XXX --manifest is superceded by testing/config/mozharness/android_x86_config.py.
             # Remove when Gecko 35 no longer in tbpl.
             "extra_args": ["--manifest=tests/xpcshell_android.ini"]
         },
     }, # end of "test_definitions"
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/android_x86_config.py",
     "download_minidump_stackwalk": True,
     "default_blob_upload_servers": [
          "https://blobupload.elasticbeanstalk.com",
     ],
     "blob_uploader_auth_file" : os.path.join(os.getcwd(), "oauth.txt"),
 }
--- a/testing/mozharness/configs/b2g/desktop_automation_config.py
+++ b/testing/mozharness/configs/b2g/desktop_automation_config.py
@@ -35,44 +35,11 @@ config = {
     ],
     "blob_uploader_auth_file": os.path.join(os.getcwd(), "oauth.txt"),
 
     # testsuite options
     "run_file_names": {
         "mochitest": "runtestsb2g.py",
         "reftest": "runreftestb2g.py",
     },
-    "suite_definitions": {
-        "mochitest": {
-            "options": [
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s",
-                "--profile=%(gaia_profile)s",
-                "--app=%(application)s",
-                "--desktop",
-                "--utility-path=%(utility_path)s",
-                "--certificate-path=%(cert_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--browser-arg=%(browser_arg)s",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--screenshot-on-fail",
-            ],
-            "run_filename": "runtestsb2g.py",
-            "testsdir": "mochitest"
-        },
-        "reftest": {
-            "options": [
-                "--desktop",
-                "--profile=%(gaia_profile)s",
-                "--appname=%(application)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s",
-                "--browser-arg=%(browser_arg)s",
-                "--symbols-path=%(symbols_path)s",
-                "%(test_manifest)s"
-            ],
-            "run_filename": "runreftestsb2g.py",
-            "testsdir": "reftest"
-        }
-    },
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/b2g_desktop_config.py",
 }
--- a/testing/mozharness/configs/b2g/emulator_automation_config.py
+++ b/testing/mozharness/configs/b2g/emulator_automation_config.py
@@ -41,148 +41,12 @@ config = {
         "jsreftest": "runreftestb2g.py",
         "mochitest": "runtestsb2g.py",
         "mochitest-chrome": "runtestsb2g.py",
         "reftest": "runreftestb2g.py",
         "crashtest": "runreftestb2g.py",
         "xpcshell": "runtestsb2g.py",
         "cppunittest": "remotecppunittests.py"
     },
-    "suite_definitions": {
-        "cppunittest": {
-            "options": [
-                "--dm_trans=adb",
-                "--symbols-path=%(symbols_path)s",
-                "--xre-path=%(xre_path)s",
-                "--addEnv",
-                "LD_LIBRARY_PATH=/vendor/lib:/system/lib:/system/b2g",
-                "--with-b2g-emulator=%(b2gpath)s",
-                "."
-            ],
-            "run_filename": "remotecppunittests.py",
-            "testsdir": "cppunittest"
-        },
-        "crashtest": {
-            "options": [
-                "--adbpath=%(adbpath)s",
-                "--b2gpath=%(b2gpath)s",
-                "--emulator=%(emulator)s",
-                "--emulator-res=800x1000",
-                "--logdir=%(logcat_dir)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--ignore-window-size",
-                "--xre-path=%(xre_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--busybox=%(busybox)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s",
-                "tests/testing/crashtest/crashtests.list"
-            ],
-            "run_filename": "runreftestb2g.py",
-            "testsdir": "reftest"
-        },
-        "jsreftest": {
-            "options": [
-                "--adbpath=%(adbpath)s",
-                "--b2gpath=%(b2gpath)s",
-                "--emulator=%(emulator)s",
-                "--emulator-res=800x1000",
-                "--logdir=%(logcat_dir)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--ignore-window-size",
-                "--xre-path=%(xre_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--busybox=%(busybox)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s",
-                "--extra-profile-file=jsreftest/tests/user.js",
-                "jsreftest/tests/jstests.list"
-            ],
-            "run_filename": "remotereftest.py",
-            "testsdir": "reftest"
-        },
-        "mochitest": {
-            "options": [
-                "--adbpath=%(adbpath)s",
-                "--b2gpath=%(b2gpath)s",
-                "--emulator=%(emulator)s",
-                "--logdir=%(logcat_dir)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--busybox=%(busybox)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--certificate-path=%(certificate_path)s",
-                "--screenshot-on-fail",
-                "%(test_path)s"
-            ],
-            "run_filename": "runtestsb2g.py",
-            "testsdir": "mochitest"
-        },
-        "mochitest-chrome": {
-            "options": [
-                "--adbpath=%(adbpath)s",
-                "--b2gpath=%(b2gpath)s",
-                "--emulator=%(emulator)s",
-                "--logdir=%(logcat_dir)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--xre-path=%(xre_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--busybox=%(busybox)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s",
-                "--quiet",
-                "--chrome",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--certificate-path=%(certificate_path)s",
-                "--screenshot-on-fail",
-                "%(test_path)s"
-            ],
-            "run_filename": "runtestsb2g.py",
-            "testsdir": "mochitest"
-        },
-        "reftest": {
-            "options": [
-                "--adbpath=%(adbpath)s",
-                "--b2gpath=%(b2gpath)s",
-                "--emulator=%(emulator)s",
-                "--emulator-res=800x1000",
-                "--logdir=%(logcat_dir)s",
-                "--remote-webserver=%(remote_webserver)s",
-                "--ignore-window-size",
-                "--xre-path=%(xre_path)s",
-                "--symbols-path=%(symbols_path)s",
-                "--busybox=%(busybox)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s",
-                "--enable-oop",
-                "tests/layout/reftests/reftest.list"
-            ],
-            "run_filename": "runreftestsb2g.py",
-            "testsdir": "reftest"
-        },
-        "xpcshell": {
-            "options": [
-                "--adbpath=%(adbpath)s",
-                "--b2gpath=%(b2gpath)s",
-                "--emulator=%(emulator)s",
-                "--logdir=%(logcat_dir)s",
-                "--manifest=tests/xpcshell.ini",
-                "--use-device-libs",
-                "--testing-modules-dir=%(modules_dir)s",
-                "--symbols-path=%(symbols_path)s",
-                "--busybox=%(busybox)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-            ],
-            "run_filename": "runtestsb2g.py",
-            "testsdir": "xpcshell"
-        }
-    },
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/b2g_emulator_config.py",
     "vcs_output_timeout": 1760,
 }
--- a/testing/mozharness/configs/b2g/mulet_config.py
+++ b/testing/mozharness/configs/b2g/mulet_config.py
@@ -4,23 +4,10 @@ config = {
         'clobber',
         'read-buildbot-config',
         'pull',
         'download-and-extract',
         'create-virtualenv',
         'install',
         'run-tests',
     ],
-    # testsuite options
-    "reftest_options": [
-        "--mulet",
-        "--profile=%(gaia_profile)s",
-        "--appname=%(application)s",
-        "--total-chunks=%(total_chunks)s",
-        "--this-chunk=%(this_chunk)s",
-        "--symbols-path=%(symbols_path)s",
-        "--enable-oop",
-        "%(test_manifest)s"
-    ],
-    "run_file_names": {
-        "reftest": "runreftestb2g.py",
-    },
+    "in_tree_config": "config/mozharness/linux_mulet_config.py",
 }
--- a/testing/mozharness/configs/luciddream/linux_config.py
+++ b/testing/mozharness/configs/luciddream/linux_config.py
@@ -24,42 +24,22 @@ config = {
     },
 
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
 
-    "suite_definitions": {
-        "luciddream-emulator": {
-            "options": [
-                "--startup-timeout=300",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--browser-path=%(browser_path)s",
-                "--b2gpath=%(emulator_path)s",
-                "%(test_manifest)s"
-            ],
-        },
-        "luciddream-b2gdt": {
-            "options": [
-                "--startup-timeout=300",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--browser-path=%(browser_path)s",
-                "--b2g-desktop-path=%(fxos_desktop_path)s",
-                "--gaia-profile=%(gaia_profile)s",
-                "%(test_manifest)s"
-            ],
-        },
-    },
+    "in_tree_config": "config/mozharness/linux_config.py",
 
     "buildbot_json_path": "buildprops.json",
 
     "default_blob_upload_servers": [
         "https://blobupload.elasticbeanstalk.com",
     ],
     "blob_uploader_auth_file": os.path.join(os.getcwd(), "oauth.txt"),
+    # will handle in-tree config as subsequent patch
+    # "in_tree_config": "config/mozharness/luciddream.py",
     "download_symbols": "ondemand",
     "download_minidump_stackwalk": True,
     "tooltool_cache": "/builds/tooltool_cache",
 }
--- a/testing/mozharness/configs/marionette/automation_emulator_config.py
+++ b/testing/mozharness/configs/marionette/automation_emulator_config.py
@@ -1,12 +1,11 @@
 # This is a template config file for marionette production.
 import os
 
-
 HG_SHARE_BASE_DIR = "/builds/hg-shared"
 
 config = {
     # marionette options
     "test_type": "b2g",
     "emulator": "arm",
     "tooltool_cache": "/builds/tooltool_cache",
     "test_manifest": "unit-tests.ini",
@@ -35,95 +34,10 @@ config = {
         'run-marionette',
     ],
     "download_symbols": "ondemand",
     "download_minidump_stackwalk": True,
     "default_blob_upload_servers": [
          "https://blobupload.elasticbeanstalk.com",
     ],
     "blob_uploader_auth_file" : os.path.join(os.getcwd(), "oauth.txt"),
-    },
-    "suite_definitions": {
-        "gaiatest_desktop": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--gecko-log=%(gecko_log)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "gaiatest_emulator": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_desktop": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_desktop": {
-            "options": [],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--symbols-path=%(symbols_path)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        }
-    },
+    "in_tree_config": "config/mozharness/marionette.py",
 }
--- a/testing/mozharness/configs/marionette/gaia_ui_test_prod_config.py
+++ b/testing/mozharness/configs/marionette/gaia_ui_test_prod_config.py
@@ -1,13 +1,12 @@
 # This is a template config file for marionette production.
 import os
 import platform
 
-
 HG_SHARE_BASE_DIR = "/builds/hg-shared"
 
 if platform.system().lower() == 'darwin':
     xre_url = "https://api.pub.build.mozilla.org/tooltool/sha512/4d8d7a37d90c34a2a2fda3066a8fe85c189b183d05389cb957fc6fed31f10a6924e50c1b84488ff61c015293803f58a3aed5d4819374d04c8e0ee2b9e3997278"
 else:
     xre_url = "https://api.pub.build.mozilla.org/tooltool/sha512/dc9503b21c87b5a469118746f99e4f41d73888972ce735fa10a80f6d218086da0e3da525d9a4cd8e4ea497ec199fef720e4a525873d77a1af304ac505e076462"
 
 config = {
@@ -44,95 +43,11 @@ config = {
     ],
     "download_symbols": "ondemand",
     "download_minidump_stackwalk": True,
     "default_blob_upload_servers": [
         "https://blobupload.elasticbeanstalk.com",
     ],
     "blob_uploader_auth_file": os.path.join(os.getcwd(), "oauth.txt"),
     "vcs_output_timeout": 1760,
+    "in_tree_config": "config/mozharness/marionette.py",
     "tooltool_cache": "/builds/tooltool_cache",
-    "suite_definitions": {
-        "gaiatest_desktop": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--gecko-log=%(gecko_log)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "gaiatest_emulator": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_desktop": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_desktop": {
-            "options": [],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--symbols-path=%(symbols_path)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        }
-    },
 }
--- a/testing/mozharness/configs/marionette/prod_config.py
+++ b/testing/mozharness/configs/marionette/prod_config.py
@@ -31,97 +31,13 @@ config = {
         'create-virtualenv',
         'install',
         'run-marionette',
     ],
     "default_blob_upload_servers": [
          "https://blobupload.elasticbeanstalk.com",
     ],
     "blob_uploader_auth_file" : os.path.join(os.getcwd(), "oauth.txt"),
+    "in_tree_config": "config/mozharness/marionette.py",
     "download_symbols": "ondemand",
     "download_minidump_stackwalk": True,
     "tooltool_cache": "/builds/tooltool_cache",
-    "suite_definitions": {
-        "gaiatest_desktop": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--gecko-log=%(gecko_log)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "gaiatest_emulator": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_desktop": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_desktop": {
-            "options": [],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--symbols-path=%(symbols_path)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        }
-    },
 }
--- a/testing/mozharness/configs/marionette/test_config.py
+++ b/testing/mozharness/configs/marionette/test_config.py
@@ -12,94 +12,10 @@ config = {
 
     "default_actions": [
         'clobber',
         'download-and-extract',
         'create-virtualenv',
         'install',
         'run-marionette',
     ],
-    "suite_definitions": {
-        "gaiatest_desktop": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--gecko-log=%(gecko_log)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "gaiatest_emulator": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_desktop": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_desktop": {
-            "options": [],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--symbols-path=%(symbols_path)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        }
-    },
+    "in_tree_config": "config/mozharness/marionette.py",
 }
--- a/testing/mozharness/configs/marionette/windows_config.py
+++ b/testing/mozharness/configs/marionette/windows_config.py
@@ -34,96 +34,12 @@ config = {
         'create-virtualenv',
         'install',
         'run-marionette',
     ],
     "default_blob_upload_servers": [
          "https://blobupload.elasticbeanstalk.com",
     ],
     "blob_uploader_auth_file" : os.path.join(os.getcwd(), "oauth.txt"),
+    "in_tree_config": "config/mozharness/marionette.py",
     "download_minidump_stackwalk": True,
     "download_symbols": "ondemand",
-    "suite_definitions": {
-        "gaiatest_desktop": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--gecko-log=%(gecko_log)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--total-chunks=%(total_chunks)s",
-                "--this-chunk=%(this_chunk)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "gaiatest_emulator": {
-            "options": [
-                "--restart",
-                "--timeout=%(timeout)s",
-                "--type=%(type)s",
-                "--testvars=%(testvars)s",
-                "--profile=%(profile)s",
-                "--symbols-path=%(symbols_path)s",
-                "--xml-output=%(xml_output)s",
-                "--html-output=%(html_output)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_desktop": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--binary=%(binary)s",
-                "--address=%(address)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "marionette_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_desktop": {
-            "options": [],
-            "run_filename": "",
-            "testsdir": ""
-        },
-        "webapi_emulator": {
-            "options": [
-                "--type=%(type)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--symbols-path=%(symbols_path)s",
-                "--logcat-dir=%(logcat_dir)s",
-                "--emulator=%(emulator)s",
-                "--homedir=%(homedir)s"
-            ],
-            "run_filename": "",
-            "testsdir": ""
-        }
-    },
 }
--- a/testing/mozharness/configs/unittests/linux_unittest.py
+++ b/testing/mozharness/configs/unittests/linux_unittest.py
@@ -50,126 +50,18 @@ config = {
         "webapprt": ["mochitest/*"],
         "reftest": ["reftest/*", "jsreftest/*"],
         "xpcshell": ["xpcshell/*"],
         "cppunittest": ["cppunittest/*"],
         "jittest": ["jit-test/*"],
         "mozbase": ["mozbase/*"],
         "mozmill": ["mozmill/*"],
     },
-    "suite_definitions": {
-        "cppunittest": {
-            "options": [
-                "--symbols-path=%(symbols_path)s",
-                "--xre-path=%(abs_app_dir)s"
-            ],
-            "run_filename": "runcppunittests.py",
-            "testsdir": "cppunittest"
-        },
-        "jittest": {
-            "options": [
-                "tests/bin/js",
-                "--no-slow",
-                "--no-progress",
-                "--format=automation",
-                "--jitflags=all"
-            ],
-            "run_filename": "jit_test.py",
-            "testsdir": "jit-test/jit-test"
-        },
-        "luciddream-emulator": {
-            "options": [
-                "--startup-timeout=300",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--browser-path=%(browser_path)s",
-                "--b2gpath=%(emulator_path)s",
-                "%(test_manifest)s"
-            ],
-        },
-        "luciddream-b2gdt": {
-            "options": [
-                "--startup-timeout=300",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--browser-path=%(browser_path)s",
-                "--b2g-desktop-path=%(fxos_desktop_path)s",
-                "--gaia-profile=%(gaia_profile)s",
-                "%(test_manifest)s"
-            ],
-        },
-        "mochitest": {
-            "options": [
-                "--appname=%(binary_path)s",
-                "--utility-path=tests/bin",
-                "--extra-profile-file=tests/bin/plugins",
-                "--symbols-path=%(symbols_path)s",
-                "--certificate-path=tests/certs",
-                "--setpref=webgl.force-enabled=true",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--use-test-media-devices",
-                "--screenshot-on-fail",
-            ],
-            "run_filename": "runtests.py",
-            "testsdir": "mochitest"
-        },
-        "mozbase": {
-            "options": [
-                "-b",
-                "%(binary_path)s"
-            ],
-            "run_filename": "test.py",
-            "testsdir": "mozbase"
-        },
-        "mozmill": {
-            "options": [
-                "--binary=%(binary_path)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "runtestlist.py",
-            "testsdir": "mozmill"
-        },
-        "reftest": {
-            "options": [
-                "--appname=%(binary_path)s",
-                "--utility-path=tests/bin",
-                "--extra-profile-file=tests/bin/plugins",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "runreftest.py",
-            "testsdir": "reftest"
-        },
-        "webapprt": {
-            "options": [
-                "--app=%(app_path)s",
-                "--utility-path=tests/bin",
-                "--extra-profile-file=tests/bin/plugins",
-                "--symbols-path=%(symbols_path)s",
-                "--certificate-path=tests/certs",
-                "--console-level=INFO",
-                "--testing-modules-dir=tests/modules",
-                "--quiet"
-            ],
-            "run_filename": "runtests.py",
-            "testsdir": "mochitest"
-        },
-        "xpcshell": {
-            "options": [
-                "--symbols-path=%(symbols_path)s",
-                "--test-plugin-path=%(test_plugin_path)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--utility-path=tests/bin",
-            ],
-            "run_filename": "runxpcshelltests.py",
-            "testsdir": "xpcshell"
-        }
-    },
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/linux_config.py",
     # local mochi suites
     "all_mochitest_suites": {
         "plain1": ["--total-chunks=5", "--this-chunk=1", "--chunk-by-dir=4"],
         "plain2": ["--total-chunks=5", "--this-chunk=2", "--chunk-by-dir=4"],
         "plain3": ["--total-chunks=5", "--this-chunk=3", "--chunk-by-dir=4"],
         "plain4": ["--total-chunks=5", "--this-chunk=4", "--chunk-by-dir=4"],
         "plain5": ["--total-chunks=5", "--this-chunk=5", "--chunk-by-dir=4"],
         "plain": [],
--- a/testing/mozharness/configs/unittests/mac_unittest.py
+++ b/testing/mozharness/configs/unittests/mac_unittest.py
@@ -39,104 +39,18 @@ config = {
         "webapprt": ["mochitest/*"],
         "reftest": ["reftest/*", "jsreftest/*"],
         "xpcshell": ["xpcshell/*"],
         "cppunittest": ["cppunittest/*"],
         "jittest": ["jit-test/*"],
         "mozbase": ["mozbase/*"],
         "mozmill": ["mozmill/*"],
     },
-    "suite_definitions": {
-        "cppunittest": {
-            "options": [
-                "--symbols-path=%(symbols_path)s",
-                "--xre-path=%(abs_app_dir)s"
-            ],
-            "run_filename": "runcppunittests.py",
-            "testsdir": "cppunittest"
-        },
-        "jittest": {
-            "options": [
-                "tests/bin/js",
-                "--no-slow",
-                "--no-progress",
-                "--format=automation",
-                "--jitflags=all"
-            ],
-            "run_filename": "jit_test.py",
-            "testsdir": "jit-test/jit-test"
-        },
-        "mochitest": {
-            "options": [
-                "--appname=%(binary_path)s",
-                "--utility-path=tests/bin",
-                "--extra-profile-file=tests/bin/plugins",
-                "--symbols-path=%(symbols_path)s",
-                "--certificate-path=tests/certs",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--screenshot-on-fail",
-            ],
-            "run_filename": "runtests.py",
-            "testsdir": "mochitest"
-        },
-        "mozbase": {
-            "options": [
-                "-b",
-                "%(binary_path)s"
-            ],
-            "run_filename": "test.py",
-            "testsdir": "mozbase"
-        },
-        "mozmill": {
-            "options": [
-                "--binary=%(binary_path)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "runtestlist.py",
-            "testsdir": "mozmill"
-        },
-        "reftest": {
-            "options": [
-                "--appname=%(binary_path)s",
-                "--utility-path=tests/bin",
-                "--extra-profile-file=tests/bin/plugins",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "runreftest.py",
-            "testsdir": "reftest"
-        },
-        "webapprt": {
-            "options": [
-                "--app=%(app_path)s",
-                "--xre-path=%(abs_res_dir)s",
-                "--utility-path=tests/bin",
-                "--extra-profile-file=tests/bin/plugins",
-                "--symbols-path=%(symbols_path)s",
-                "--certificate-path=tests/certs",
-                "--console-level=INFO",
-                "--testing-modules-dir=tests/modules",
-                "--quiet"
-            ],
-            "run_filename": "runtests.py",
-            "testsdir": "mochitest"
-        },
-        "xpcshell": {
-            "options": [
-                "--symbols-path=%(symbols_path)s",
-                "--test-plugin-path=%(test_plugin_path)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--utility-path=tests/bin",
-            ],
-            "run_filename": "runxpcshelltests.py",
-            "testsdir": "xpcshell"
-        }
-    },
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/mac_config.py",
     # local mochi suites
     "all_mochitest_suites": {
         "plain1": ["--total-chunks=5", "--this-chunk=1", "--chunk-by-dir=4"],
         "plain2": ["--total-chunks=5", "--this-chunk=2", "--chunk-by-dir=4"],
         "plain3": ["--total-chunks=5", "--this-chunk=3", "--chunk-by-dir=4"],
         "plain4": ["--total-chunks=5", "--this-chunk=4", "--chunk-by-dir=4"],
         "plain5": ["--total-chunks=5", "--this-chunk=5", "--chunk-by-dir=4"],
         "plain": [],
--- a/testing/mozharness/configs/unittests/win_unittest.py
+++ b/testing/mozharness/configs/unittests/win_unittest.py
@@ -48,103 +48,18 @@ config = {
         "webapprt": ["mochitest/*"],
         "reftest": ["reftest/*", "jsreftest/*"],
         "xpcshell": ["xpcshell/*"],
         "cppunittest": ["cppunittest/*"],
         "jittest": ["jit-test/*"],
         "mozbase": ["mozbase/*"],
         "mozmill": ["mozmill/*"],
     },
-    "suite_definitions": {
-        "cppunittest": {
-            "options": [
-                "--symbols-path=%(symbols_path)s",
-                "--xre-path=%(abs_app_dir)s"
-            ],
-            "run_filename": "runcppunittests.py",
-            "testsdir": "cppunittest"
-        },
-        "jittest": {
-            "options": [
-                "tests/bin/js",
-                "--no-slow",
-                "--no-progress",
-                "--format=automation",
-                "--jitflags=all"
-            ],
-            "run_filename": "jit_test.py",
-            "testsdir": "jit-test/jit-test"
-        },
-        "mochitest": {
-            "options": [
-                "--appname=%(binary_path)s",
-                "--utility-path=tests/bin",
-                "--extra-profile-file=tests/bin/plugins",
-                "--symbols-path=%(symbols_path)s",
-                "--certificate-path=tests/certs",
-                "--quiet",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--screenshot-on-fail",
-            ],
-            "run_filename": "runtests.py",
-            "testsdir": "mochitest"
-        },
-        "mozbase": {
-            "options": [
-                "-b",
-                "%(binary_path)s"
-            ],
-            "run_filename": "test.py",
-            "testsdir": "mozbase"
-        },
-        "mozmill": {
-            "options": [
-                "--binary=%(binary_path)s",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "runtestlist.py",
-            "testsdir": "mozmill"
-        },
-        "reftest": {
-            "options": [
-                "--appname=%(binary_path)s",
-                "--utility-path=tests/bin",
-                "--extra-profile-file=tests/bin/plugins",
-                "--symbols-path=%(symbols_path)s"
-            ],
-            "run_filename": "runreftest.py",
-            "testsdir": "reftest"
-        },
-        "webapprt": {
-            "options": [
-                "--app=%(app_path)s",
-                "--utility-path=tests/bin",
-                "--extra-profile-file=tests/bin/plugins",
-                "--symbols-path=%(symbols_path)s",
-                "--certificate-path=tests/certs",
-                "--console-level=INFO",
-                "--testing-modules-dir=tests/modules",
-                "--quiet"
-            ],
-            "run_filename": "runtests.py",
-            "testsdir": "mochitest"
-        },
-        "xpcshell": {
-            "options": [
-                "--symbols-path=%(symbols_path)s",
-                "--test-plugin-path=%(test_plugin_path)s",
-                "--log-raw=%(raw_log_file)s",
-                "--log-errorsummary=%(error_summary_file)s",
-                "--utility-path=tests/bin",
-            ],
-            "run_filename": "runxpcshelltests.py",
-            "testsdir": "xpcshell"
-        }
-    },
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/windows_config.py",
     # local mochi suites
     "all_mochitest_suites":
     {
         "plain1": ["--total-chunks=5", "--this-chunk=1", "--chunk-by-dir=4"],
         "plain2": ["--total-chunks=5", "--this-chunk=2", "--chunk-by-dir=4"],
         "plain3": ["--total-chunks=5", "--this-chunk=3", "--chunk-by-dir=4"],
         "plain4": ["--total-chunks=5", "--this-chunk=4", "--chunk-by-dir=4"],
         "plain5": ["--total-chunks=5", "--this-chunk=5", "--chunk-by-dir=4"],
--- a/testing/mozharness/configs/web_platform_tests/prod_config.py
+++ b/testing/mozharness/configs/web_platform_tests/prod_config.py
@@ -1,25 +1,20 @@
 # ***** BEGIN LICENSE BLOCK *****
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 # ***** END LICENSE BLOCK *****
 import os
 
 config = {
-    "options": [
-        "--prefs-root=%(test_path)s/prefs",
-        "--processes=1",
-        "--config=%(test_path)s/wptrunner.ini",
-        "--ca-cert-path=%(test_path)s/certs/cacert.pem",
-        "--host-key-path=%(test_path)s/certs/web-platform.test.key",
-        "--host-cert-path=%(test_path)s/certs/web-platform.test.pem",
-        "--certutil-binary=%(test_install_path)s/bin/certutil",
-    ],
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/web_platform_tests_config.py",
+
+    "options": [],
 
     "exes": {
         'python': '/tools/buildbot/bin/python',
         'virtualenv': ['/tools/buildbot/bin/python', '/tools/misc-python/virtualenv.py'],
         'tooltool.py': "/tools/tooltool.py",
     },
 
     "find_links": [
--- a/testing/mozharness/configs/web_platform_tests/prod_config_windows.py
+++ b/testing/mozharness/configs/web_platform_tests/prod_config_windows.py
@@ -5,35 +5,30 @@
 # ***** END LICENSE BLOCK *****
 
 # This is a template config file for web-platform-tests test.
 
 import os
 import sys
 
 config = {
-    "options": [
-        "--prefs-root=%(test_path)s/prefs",
-        "--processes=1",
-        "--config=%(test_path)s/wptrunner.ini",
-        "--ca-cert-path=%(test_path)s/certs/cacert.pem",
-        "--host-key-path=%(test_path)s/certs/web-platform.test.key",
-        "--host-cert-path=%(test_path)s/certs/web-platform.test.pem",
-        "--certutil-binary=%(test_install_path)s/bin/certutil",
-    ],
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/web_platform_tests_config.py",
 
     "exes": {
         'python': sys.executable,
         'virtualenv': [sys.executable, 'c:/mozilla-build/buildbotve/virtualenv.py'],
         'hg': 'c:/mozilla-build/hg/hg',
         'mozinstall': ['%s/build/venv/scripts/python' % os.getcwd(),
                        '%s/build/venv/scripts/mozinstall-script.py' % os.getcwd()],
         'tooltool.py': [sys.executable, 'C:/mozilla-build/tooltool.py'],
     },
 
+    "options": [],
+
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
 
     "pip_index": False,
 
     "buildbot_json_path": "buildprops.json",
--- a/testing/mozharness/configs/web_platform_tests/test_config.py
+++ b/testing/mozharness/configs/web_platform_tests/test_config.py
@@ -1,24 +1,19 @@
 # ***** BEGIN LICENSE BLOCK *****
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 # ***** END LICENSE BLOCK *****
 
 config = {
-    "options": [
-        "--prefs-root=%(test_path)s/prefs",
-        "--processes=1",
-        "--config=%(test_path)s/wptrunner.ini",
-        "--ca-cert-path=%(test_path)s/certs/cacert.pem",
-        "--host-key-path=%(test_path)s/certs/web-platform.test.key",
-        "--host-cert-path=%(test_path)s/certs/web-platform.test.pem",
-        "--certutil-binary=%(test_install_path)s/bin/certutil",
-    ],
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/web_platform_tests_config.py",
+
+    "options": [],
 
     "default_actions": [
         'clobber',
         'download-and-extract',
         'create-virtualenv',
         'pull',
         'install',
         'run-tests',
--- a/testing/mozharness/configs/web_platform_tests/test_config_windows.py
+++ b/testing/mozharness/configs/web_platform_tests/test_config_windows.py
@@ -3,34 +3,29 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 # ***** END LICENSE BLOCK *****
 
 import os
 import sys
 
 config = {
-    "options": [
-        "--prefs-root=%(test_path)s/prefs",
-        "--processes=1",
-        "--config=%(test_path)s/wptrunner.ini",
-        "--ca-cert-path=%(test_path)s/certs/cacert.pem",
-        "--host-key-path=%(test_path)s/certs/web-platform.test.key",
-        "--host-cert-path=%(test_path)s/certs/web-platform.test.pem",
-        "--certutil-binary=%(test_install_path)s/bin/certutil",
-    ],
+    # test harness options are located in the gecko tree
+    "in_tree_config": "config/mozharness/web_platform_tests_config.py",
 
     "exes": {
         'python': sys.executable,
         'virtualenv': [sys.executable, 'c:/mozilla-source/cedar/python/virtualenv/virtualenv.py'], #'c:/mozilla-build/buildbotve/virtualenv.py'],
         'hg': 'c:/mozilla-build/hg/hg',
         'mozinstall': ['%s/build/venv/scripts/python' % os.getcwd(),
                        '%s/build/venv/scripts/mozinstall-script.py' % os.getcwd()],
     },
 
+    "options": [],
+
     "default_actions": [
         'clobber',
         'download-and-extract',
         'create-virtualenv',
         'pull',
         'install',
         'run-tests',
     ],
--- a/testing/mozharness/mozharness/mozilla/testing/testbase.py
+++ b/testing/mozharness/mozharness/mozilla/testing/testbase.py
@@ -94,16 +94,17 @@ class TestingMixin(VirtualenvMixin, Buil
     """
 
     installer_url = None
     installer_path = None
     binary_path = None
     test_url = None
     test_packages_url = None
     test_zip_path = None
+    tree_config = ReadOnlyDict({})
     symbols_url = None
     symbols_path = None
     jsshell_url = None
     minidump_stackwalk_path = None
     default_tools_repo = 'https://hg.mozilla.org/build/tools'
     proxxy = None
 
     def _query_proxxy(self):
@@ -128,16 +129,23 @@ class TestingMixin(VirtualenvMixin, Buil
         since it does not support authenticated downloads.
         This could be re-factored and fixed in bug 1087664.
         '''
         if self.config.get("developer_mode"):
             return super(TestingMixin, self).download_file(*args, **kwargs)
         else:
             return self.download_proxied_file(*args, **kwargs)
 
+    def query_value(self, key):
+        """
+        This function allows us to check for a value
+        in the self.tree_config first and then on self.config
+        """
+        return self.tree_config.get(key, self.config.get(key))
+
     def query_build_dir_url(self, file_name):
         """
         Resolve a file name to a potential url in the build upload directory where
         that file can be found.
         """
         if self.test_packages_url:
             reference_url = self.test_packages_url
         elif self.installer_url:
@@ -438,23 +446,57 @@ 2. running via buildbot and running the 
         if target_unzip_dirs:
             unzip_cmd.extend(target_unzip_dirs)
         # TODO error_list
         # unzip return code 11 is 'no matching files were found'
         self.run_command(unzip_cmd, cwd=test_install_dir,
                          halt_on_failure=True, success_codes=[0, 11],
                          fatal_exit_code=3)
 
+    def _read_tree_config(self):
+        """Reads an in-tree config file"""
+        dirs = self.query_abs_dirs()
+        test_install_dir = dirs.get('abs_test_install_dir',
+                                    os.path.join(dirs['abs_work_dir'], 'tests'))
+
+        if 'in_tree_config' in self.config:
+            rel_tree_config_path = self.config['in_tree_config']
+            tree_config_path = os.path.join(test_install_dir, rel_tree_config_path)
+
+            if not os.path.isfile(tree_config_path):
+                self.fatal("The in-tree configuration file '%s' does not exist!"
+                           "It must be added to '%s'. See bug 1035551 for more details." %
+                           (tree_config_path, os.path.join('gecko', 'testing', rel_tree_config_path)))
+
+            try:
+                self.tree_config.update(parse_config_file(tree_config_path))
+            except:
+                msg = "There was a problem parsing the in-tree configuration file '%s'!" % \
+                      os.path.join('gecko', 'testing', rel_tree_config_path)
+                self.exception(message=msg, level=FATAL)
+
+            self.dump_config(file_path=os.path.join(dirs['abs_log_dir'], 'treeconfig.json'),
+                             config=self.tree_config)
+
+        if (self.buildbot_config and 'properties' in self.buildbot_config and
+            self.buildbot_config['properties'].get('branch') == 'try'):
+            try_config_path = os.path.join(test_install_dir, 'config', 'mozharness',
+                                           'try_arguments.py')
+            known_try_arguments = parse_config_file(try_config_path)
+            self.set_extra_try_arguments(known_try_arguments)
+
+        self.tree_config.lock()
+
     def structured_output(self, suite_category):
         """Defines whether structured logging is in use in this configuration. This
         may need to be replaced with data from a different config at the resolution
         of bug 1070041 and related bugs.
         """
-        return ('structured_suites' in self.config and
-                suite_category in self.config['structured_suites'])
+        return ('structured_suites' in self.tree_config and
+                suite_category in self.tree_config['structured_suites'])
 
     def get_test_output_parser(self, suite_category, strict=False,
                                fallback_parser_class=DesktopUnittestOutputParser,
                                **kwargs):
         """Derive and return an appropriate output parser, either the structured
         output parser or a fallback based on the type of logging in use as determined by
         configuration.
         """
@@ -525,16 +567,17 @@ 2. running via buildbot and running the 
                 # where the packages manifest is located. This is the case when the
                 # test package manifest isn't set as a buildbot property, which is true
                 # for some self-serve jobs and platforms using parse_make_upload.
                 self.test_packages_url = self.query_build_dir_url('test_packages.json')
 
             suite_categories = suite_categories or ['common']
             self._download_test_packages(suite_categories, target_unzip_dirs)
 
+        self._read_tree_config()
         self._download_installer()
         if self.config.get('download_symbols'):
             self._download_and_extract_symbols()
 
     # create_virtualenv is in VirtualenvMixin.
 
     def preflight_install(self):
         if not self.installer_path:
@@ -684,16 +727,20 @@ Did you run with --create-virtualenv? Is
             self.run_command(cmd,
                              cwd=dirs['abs_work_dir'],
                              error_list=BaseErrorList,
                              halt_on_failure=suite['halt_on_failure'],
                              fatal_exit_code=suite.get('fatal_exit_code', 3))
 
     def preflight_run_tests(self):
         """preflight commands for all tests"""
+        # If the in tree config hasn't been loaded by a previous step, load it here.
+        if len(self.tree_config) == 0:
+            self._read_tree_config()
+
         c = self.config
         if c.get('run_cmd_checks_enabled'):
             self._run_cmd_checks(c.get('preflight_run_cmd_suites', []))
         elif c.get('preflight_run_cmd_suites'):
             self.warning("Proceeding without running prerun test commands."
                          " These are often OS specific and disabling them may"
                          " result in spurious test results!")
 
--- a/testing/mozharness/mozharness/mozilla/testing/try_tools.py
+++ b/testing/mozharness/mozharness/mozilla/testing/try_tools.py
@@ -4,33 +4,25 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 # ***** END LICENSE BLOCK *****
 
 import argparse
 import os
 import re
 
-from mozharness.base.script import PostScriptAction
 from mozharness.base.transfer import TransferMixin
 
 
 class TryToolsMixin(TransferMixin):
     """Utility functions for an interface between try syntax and out test harnesses.
     Requires log and script mixins."""
 
     harness_extra_args = None
     try_test_paths = []
-    known_try_arguments = {
-        '--tag': {
-            'action': 'append',
-            'dest': 'tags',
-            'default': None,
-        },
-    }
 
     def _extract_try_message(self):
         msg = self.buildbot_config['sourcestamp']['changes'][-1]['comments']
         if len(msg) == 1024:
             # This commit message was potentially truncated, get the full message
             # from hg.
             props = self.buildbot_config['properties']
             rev = props['revision']
@@ -44,27 +36,22 @@ class TryToolsMixin(TransferMixin):
 
         if not msg and 'try_syntax' in self.buildbot_config['properties']:
             # If we don't find try syntax in the usual place, check for it in an
             # alternate property available to tools using self-serve.
             msg = self.buildbot_config['properties']['try_syntax']
 
         return msg
 
-    @PostScriptAction('download-and-extract')
-    def _set_extra_try_arguments(self, action, success=None):
+    def set_extra_try_arguments(self, known_try_arguments):
         """Finds a commit message and parses it for extra arguments to pass to the test
         harness command line and test paths used to filter manifests.
 
         Extracting arguments from a commit message taken directly from the try_parser.
         """
-        if (not self.buildbot_config or 'properties' not in self.buildbot_config or
-                self.buildbot_config['properties'].get('branch') != 'try'):
-            return
-
         msg = self._extract_try_message()
         if not msg:
             return
 
         all_try_args = None
         for line in msg.splitlines():
             if 'try: ' in line:
                 # Autoland adds quotes to try strings that will confuse our
@@ -87,17 +74,17 @@ class TryToolsMixin(TransferMixin):
                          ' and forward them to the underlying test harness command.'))
 
         label_dict = {}
         def label_from_val(val):
             if val in label_dict:
                 return label_dict[val]
             return '--%s' % val.replace('_', '-')
 
-        for label, opts in self.known_try_arguments.iteritems():
+        for label, opts in known_try_arguments.iteritems():
             if 'action' in opts and opts['action'] not in ('append', 'store',
                                                            'store_true', 'store_false'):
                 self.fatal('Try syntax does not support passing custom or store_const '
                            'arguments to the harness process.')
             if 'dest' in opts:
                 label_dict[opts['dest']] = label
 
             parser.add_argument(label, **opts)
--- a/testing/mozharness/scripts/android_emulator_unittest.py
+++ b/testing/mozharness/scripts/android_emulator_unittest.py
@@ -118,17 +118,17 @@ class AndroidEmulatorTest(BlobUploadMixi
         self.test_suite_definitions = c['test_suite_definitions']
         self.test_suite = c.get('test_suite')
         assert self.test_suite in self.test_suite_definitions
 
     def _query_tests_dir(self):
         dirs = self.query_abs_dirs()
         suite_category = self.test_suite_definitions[self.test_suite]["category"]
         try:
-            test_dir = self.config["suite_definitions"][suite_category]["testsdir"]
+            test_dir = self.tree_config["suite_definitions"][suite_category]["testsdir"]
         except:
             test_dir = suite_category
         return os.path.join(dirs['abs_test_install_dir'], test_dir)
 
     def query_abs_dirs(self):
         if self.abs_dirs:
             return self.abs_dirs
         abs_dirs = super(AndroidEmulatorTest, self).query_abs_dirs()
@@ -429,25 +429,26 @@ class AndroidEmulatorTest(BlobUploadMixi
         # in the base class, this checks for mozinstall, but we don't use it
         pass
 
     def _build_command(self):
         c = self.config
         dirs = self.query_abs_dirs()
         suite_category = self.test_suite_definitions[self.test_suite]["category"]
 
-        if suite_category not in self.config["suite_definitions"]:
-            self.fatal("Key '%s' not defined in the config!" % suite_category)
-
+        if suite_category not in self.tree_config["suite_definitions"]:
+            self.fatal("Key '%s' not defined in the in-tree config! Please add it to '%s'. "
+                       "See bug 981030 for more details." % (suite_category,
+                       os.path.join('gecko', 'testing', self.config['in_tree_config'])))
         cmd = [
             self.query_python_path('python'),
             '-u',
             os.path.join(
                 self._query_tests_dir(),
-                self.config["suite_definitions"][suite_category]["run_filename"]
+                self.tree_config["suite_definitions"][suite_category]["run_filename"]
             ),
         ]
 
         raw_log_file = os.path.join(dirs['abs_blob_upload_dir'],
                                     '%s_raw.log' % self.test_suite)
 
         error_summary_file = os.path.join(dirs['abs_blob_upload_dir'],
                                           '%s_errorsummary.log' % self.test_suite)
@@ -468,17 +469,17 @@ class AndroidEmulatorTest(BlobUploadMixi
             'error_summary_file': error_summary_file,
             'dm_trans': c['device_manager'],
         }
         if self.config["device_manager"] == "sut":
             str_format_values.update({
                 'device_ip': c['device_ip'],
                 'device_port': str(self.emulator['sut_port1']),
             })
-        for option in self.config["suite_definitions"][suite_category]["options"]:
+        for option in self.tree_config["suite_definitions"][suite_category]["options"]:
             cmd.extend([option % str_format_values])
 
         for arg in self.test_suite_definitions[self.test_suite]["extra_args"]:
             argname = arg.split('=')[0]
             # only add the extra arg if it wasn't already defined by in-tree configs
             if any(a.split('=')[0] == argname for a in cmd):
                 continue
             cmd.append(arg)
--- a/testing/mozharness/scripts/android_panda.py
+++ b/testing/mozharness/scripts/android_panda.py
@@ -427,17 +427,17 @@ class PandaTest(TestingMixin, MercurialS
         if self.symbols_url:
             return self.symbols_url
 
     def _query_abs_base_cmd(self, suite_category, suite):
         #check for apk first with if ?
         c = self.config
         dirs = self.query_abs_dirs()
         options = []
-        run_file = c["suite_definitions"][suite_category]["run_filename"]
+        run_file = self.tree_config["suite_definitions"][suite_category]["run_filename"]
         base_cmd = ['python', '-u']
         base_cmd.append(os.path.join((dirs["abs_%s_dir" % suite_category]), run_file))
         self.device_ip = socket.gethostbyname(self.mozpool_device)
         #applies to mochitest, reftest, jsreftest
         # TestingMixin._download_and_extract_symbols() will set
         # self.symbols_path when downloading/extracting.
         hostnumber = 0
         mozpool_device_list = self.mozpool_device.split('-')
@@ -467,27 +467,33 @@ class PandaTest(TestingMixin, MercurialS
             'http_port': http_port,
             'ssl_port':  ssl_port,
             'app_name':  self.app_name,
             'apk_name':  self.filename_apk,
             'apk_path':  self.apk_path,
             'raw_log_file': raw_log_file,
             'error_summary_file': error_summary_file,
         }
-        if "suite_definitions" in c and \
-                suite_category in c["suite_definitions"]: # new in-tree format
-            for option in c["suite_definitions"][suite_category]["options"]:
+        if '%s_options' % suite_category in self.tree_config:
+            for option in self.tree_config['%s_options' % suite_category]:
+                options.append(option % str_format_values)
+            abs_base_cmd = base_cmd + options
+            return abs_base_cmd
+        elif "suite_definitions" in self.tree_config and \
+                suite_category in self.tree_config["suite_definitions"]: # new in-tree format
+            for option in self.tree_config["suite_definitions"][suite_category]["options"]:
                 options.append(option % str_format_values)
             abs_base_cmd = base_cmd + options
             return abs_base_cmd
         else:
             self.warning("Suite options for %s could not be determined."
                          "\nIf you meant to have options for this suite, "
                          "please make sure they are specified in your "
-                         "config." % suite_category)
+                         "tree config under %s_options" %
+                         (suite_category, suite_category))
 
     ###### helper methods
     def _pre_config_lock(self, rw_config):
         super(PandaTest, self)._pre_config_lock(rw_config)
         c = self.config
         if not c.get('run_all_suites'):
             return  # configs are valid
         for category in SUITE_CATEGORIES:
--- a/testing/mozharness/scripts/androidx86_emulator_unittest.py
+++ b/testing/mozharness/scripts/androidx86_emulator_unittest.py
@@ -119,17 +119,17 @@ class AndroidEmulatorTest(BlobUploadMixi
         self.test_suites = c.get('test_suites')
         for suite in self.test_suites:
             assert suite in self.test_suite_definitions
 
     def _query_tests_dir(self, suite_name):
         dirs = self.query_abs_dirs()
         suite_category = self.test_suite_definitions[suite_name]["category"]
         try:
-            test_dir = self.config["suite_definitions"][suite_category]["testsdir"]
+            test_dir = self.tree_config["suite_definitions"][suite_category]["testsdir"]
         except:
             test_dir = suite_category
 
         return os.path.join(dirs['abs_test_install_dir'], test_dir)
 
     def query_abs_dirs(self):
         if self.abs_dirs:
             return self.abs_dirs
@@ -399,25 +399,26 @@ class AndroidEmulatorTest(BlobUploadMixi
         # in the base class, this checks for mozinstall, but we don't use it
         pass
 
     def _build_command(self, emulator, suite_name):
         c = self.config
         dirs = self.query_abs_dirs()
         suite_category = self.test_suite_definitions[suite_name]["category"]
 
-        if suite_category not in c["suite_definitions"]:
-            self.fatal("Key '%s' not defined in the config!" % suite_category)
-
+        if suite_category not in self.tree_config["suite_definitions"]:
+            self.fatal("Key '%s' not defined in the in-tree config! Please add it to '%s'. "
+                       "See bug 981030 for more details." % (suite_category,
+                       os.path.join('gecko', 'testing', self.config['in_tree_config'])))
         cmd = [
             self.query_python_path('python'),
             '-u',
             os.path.join(
                 self._query_tests_dir(suite_name),
-                c["suite_definitions"][suite_category]["run_filename"]
+                self.tree_config["suite_definitions"][suite_category]["run_filename"]
             ),
         ]
 
         raw_log_file = os.path.join(dirs['abs_blob_upload_dir'],
                                     '%s_raw.log' % suite_name)
         error_summary_file = os.path.join(dirs['abs_blob_upload_dir'],
                                           '%s_errorsummary.log' % suite_name)
         str_format_values = {
@@ -437,17 +438,17 @@ class AndroidEmulatorTest(BlobUploadMixi
             'error_summary_file': error_summary_file,
             'dm_trans': c['device_manager'],
         }
         if self.config["device_manager"] == "sut":
             str_format_values.update({
                 'device_ip': c['device_ip'],
                 'device_port': str(emulator['sut_port1']),
             })
-        for option in c["suite_definitions"][suite_category]["options"]:
+        for option in self.tree_config["suite_definitions"][suite_category]["options"]:
             cmd.extend([option % str_format_values])
 
         for arg in self.test_suite_definitions[suite_name]["extra_args"]:
             argname = arg.split('=')[0]
             # only add the extra arg if it wasn't already defined by in-tree configs
             if any(a.split('=')[0] == argname for a in cmd):
                 continue
             cmd.append(arg)
--- a/testing/mozharness/scripts/b2g_desktop_unittest.py
+++ b/testing/mozharness/scripts/b2g_desktop_unittest.py
@@ -119,26 +119,36 @@ class B2GDesktopTest(BlobUploadMixin, Te
         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
 
     @PreScriptAction('create-virtualenv')
     def _pre_create_virtualenv(self, action):
+        if self.tree_config.get('use_puppetagain_packages'):
+            requirements = [os.path.join('tests', 'b2g',
+                'b2g-unittest-requirements.txt')]
+
+            self.register_virtualenv_module('mozinstall',
+                requirements=requirements)
+            self.register_virtualenv_module('marionette',
+                url=os.path.join('tests', 'marionette'), requirements=requirements)
+            return
+
         dirs = self.query_abs_dirs()
         requirements = os.path.join(dirs['abs_config_dir'],
                                     'marionette_requirements.txt')
         self.register_virtualenv_module(requirements=[requirements],
                                         two_pass=True)
 
     def _query_abs_base_cmd(self, suite):
         dirs = self.query_abs_dirs()
         cmd = [self.query_python_path('python')]
-        cmd.append(self.config["run_file_names"][suite])
+        cmd.append(self.query_value("run_file_names")[suite])
 
         raw_log_file = os.path.join(dirs['abs_blob_upload_dir'],
                                     '%s_raw.log' % suite)
         error_summary_file = os.path.join(dirs['abs_blob_upload_dir'],
                                           '%s_errorsummary.log' % suite)
         str_format_values = {
             'application': self.binary_path,
             'test_manifest': self.test_manifest,
@@ -148,20 +158,33 @@ class B2GDesktopTest(BlobUploadMixin, Te
             'total_chunks': self.config.get('total_chunks'),
             'this_chunk': self.config.get('this_chunk'),
             'cert_path': dirs['abs_certs_dir'],
             'browser_arg': self.config.get('browser_arg'),
             'raw_log_file': raw_log_file,
             'error_summary_file': error_summary_file,
         }
 
-        if suite not in self.config["suite_definitions"]:
-            self.fatal("'%s' not defined in the config!" % suite),
+        missing_key = True
+        if "suite_definitions" in self.tree_config: # new structure
+            if suite in self.tree_config["suite_definitions"]:
+                missing_key = False
+            options = self.tree_config["suite_definitions"][suite]["options"]
+        else:
+            suite_options = '%s_options' % suite
+            if suite_options in self.tree_config:
+                missing_key = False
+            options = self.tree_config[suite_options]
 
-        options = self.config["suite_definitions"][suite]["options"]
+        if missing_key:
+            self.fatal("'%s' not defined in the in-tree config! Please add it to '%s'. "
+                       "See bug 981030 for more details." %
+                       (suite,
+                        os.path.join('gecko', 'testing', self.config['in_tree_config'])))
+
         if options:
             for option in options:
                 option = option % str_format_values
                 if not option.endswith('None'):
                     cmd.append(option)
         return cmd
 
     def download_and_extract(self):
--- a/testing/mozharness/scripts/b2g_emulator_unittest.py
+++ b/testing/mozharness/scripts/b2g_emulator_unittest.py
@@ -207,16 +207,31 @@ class B2GEmulatorTest(TestingMixin, VCSM
         if self.config.get('busybox_url'):
             self.download_file(self.config['busybox_url'],
                                file_name='busybox',
                                parent_dir=dirs['abs_work_dir'])
             self.busybox_path = os.path.join(dirs['abs_work_dir'], 'busybox')
 
     @PreScriptAction('create-virtualenv')
     def _pre_create_virtualenv(self, action):
+        if self.tree_config.get('use_puppetagain_packages'):
+            requirements = [os.path.join('tests', 'b2g',
+                            'b2g-unittest-requirements.txt')]
+
+            self.register_virtualenv_module(
+                'mozinstall',
+                requirements=requirements
+            )
+            self.register_virtualenv_module(
+                'marionette',
+                url=os.path.join('tests', 'marionette'),
+                requirements=requirements
+            )
+            return
+
         dirs = self.query_abs_dirs()
         requirements = os.path.join(dirs['abs_test_install_dir'],
                                     'config',
                                     'marionette_requirements.txt')
         if os.path.isfile(requirements):
             self.register_virtualenv_module(requirements=[requirements],
                                             two_pass=True)
             return
@@ -266,20 +281,32 @@ class B2GEmulatorTest(TestingMixin, VCSM
             'total_chunks': self.config.get('total_chunks'),
             'this_chunk': self.config.get('this_chunk'),
             'test_path': self.config.get('test_path'),
             'certificate_path': dirs['abs_certs_dir'],
             'raw_log_file': raw_log_file,
             'error_summary_file': error_summary_file,
         }
 
-        if suite not in self.config["suite_definitions"]:
-            self.fatal("Key '%s' not defined in the config!" % suite)
+        missing_key = True
+        if "suite_definitions" in self.tree_config: # new structure
+            if suite in self.tree_config["suite_definitions"]:
+                missing_key = False
+            options = self.tree_config["suite_definitions"][suite]["options"]
+        else:
+            suite_options = '%s_options' % suite
+            if suite_options in self.tree_config:
+                missing_key = False
+            options = self.tree_config[suite_options]
 
-        options = self.config["suite_definitions"][suite]["options"]
+        if missing_key:
+            self.fatal("Key '%s' not defined in the in-tree config! Please add it to '%s'." \
+                       "See bug 981030 for more details." % (suite,
+                       os.path.join('gecko', 'testing', self.config['in_tree_config'])))
+
         if options:
             for option in options:
                 option = option % str_format_values
                 if not option.endswith('None'):
                     cmd.append(option)
         return cmd
 
     def _query_adb(self):
--- a/testing/mozharness/scripts/desktop_unittest.py
+++ b/testing/mozharness/scripts/desktop_unittest.py
@@ -241,17 +241,17 @@ class DesktopUnittest(TestingMixin, Merc
         As with the app dir, we can't set this in advance, because OSX install
         directories change depending on branding and opt/debug.
         """
         if self.abs_res_dir:
             return self.abs_res_dir
 
         abs_app_dir = self.query_abs_app_dir()
         if self._is_darwin():
-            res_subdir = self.config.get("mac_res_subdir", "Resources")
+            res_subdir = self.tree_config.get("mac_res_subdir", "Resources")
             self.abs_res_dir = os.path.join(os.path.dirname(abs_app_dir), res_subdir)
         else:
             self.abs_res_dir = abs_app_dir
         return self.abs_res_dir
 
     @PreScriptAction('create-virtualenv')
     def _pre_create_virtualenv(self, action):
         dirs = self.query_abs_dirs()
@@ -363,20 +363,33 @@ class DesktopUnittest(TestingMixin, Merc
                     base_cmd.append('--bisect-chunk=default')
                 else:
                     self.warning("--no-random does not currently work with suites other than mochitest.")
 
             # set pluginsPath
             abs_res_plugins_dir = os.path.join(abs_res_dir, 'plugins')
             str_format_values['test_plugin_path'] = abs_res_plugins_dir
 
-            if suite_category not in c["suite_definitions"]:
-                self.fatal("'%s' not defined in the config!")
+            missing_key = True
+            if "suite_definitions" in self.tree_config: # new structure
+                if suite_category in self.tree_config["suite_definitions"]:
+                    missing_key = False
+                options = self.tree_config["suite_definitions"][suite_category]["options"]
+            else:
+                suite_options = '%s_options' % suite_category
+                if suite_options in self.tree_config:
+                    missing_key = False
+                options = self.tree_config[suite_options]
 
-            options = c["suite_definitions"][suite_category]["options"]
+            if missing_key:
+                self.fatal("'%s' not defined in the in-tree config! Please add it to '%s'. "
+                           "See bug 981030 for more details." %
+                           (suite_category,
+                            os.path.join('gecko', 'testing', self.config['in_tree_config'])))
+
             if options:
                 for option in options:
                     option = option % str_format_values
                     if not option.endswith('None'):
                         base_cmd.append(option)
                 return base_cmd
             else:
                 self.warning("Suite options for %s could not be determined."
--- a/testing/mozharness/scripts/luciddream_unittest.py
+++ b/testing/mozharness/scripts/luciddream_unittest.py
@@ -245,17 +245,17 @@ class LuciddreamTest(TestingMixin, Mercu
         else:
             if self.config.get('b2gdesktop_url'):
                 str_format_values['fxos_desktop_path'] = os.path.join(dirs['abs_b2g_desktop'], 'b2g', 'b2g')
             else:
                 str_format_values['fxos_desktop_path'] = self.config.get('b2gdesktop_path')
             str_format_values['gaia_profile'] = os.path.join(dirs['abs_gaia_dir'], 'profile')
 
         suite = 'luciddream-emulator' if self.config.get('emulator_url') else 'luciddream-b2gdt'
-        options = self.config['suite_definitions'][suite]['options']
+        options = self.tree_config['suite_definitions'][suite]['options']
         for option in options:
             option = option % str_format_values
             if not option.endswith('None'):
                 cmd.append(option)
 
         code = self.run_command(cmd, env=env,
                                 output_timeout=1000,
                                 output_parser=ld_parser,
--- a/testing/mozharness/scripts/marionette.py
+++ b/testing/mozharness/scripts/marionette.py
@@ -221,16 +221,28 @@ class MarionetteTest(TestingMixin, Mercu
         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
 
     @PreScriptAction('create-virtualenv')
     def _configure_marionette_virtualenv(self, action):
+        # XXX Bug 981030 - hack to unbreak b2g18. Remove when b2g18 no longer supported
+        try:
+            branch = self.buildbot_config['properties']['branch']
+        except:
+            branch = None
+        if self.tree_config.get('use_puppetagain_packages') or branch in ('mozilla-b2g18', 'mozilla-b2g18_v1_1_0_hd'):
+            self.register_virtualenv_module('mozinstall')
+            self.register_virtualenv_module(
+                'marionette', os.path.join('tests', 'marionette'))
+
+            return
+
         dirs = self.query_abs_dirs()
         requirements = os.path.join(dirs['abs_test_install_dir'],
                                     'config',
                                     'marionette_requirements.txt')
         if os.access(requirements, os.F_OK):
             self.register_virtualenv_module(requirements=[requirements],
                                             two_pass=True)
         else:
@@ -290,17 +302,17 @@ class MarionetteTest(TestingMixin, Mercu
         appropriate key.
         """
         platform = 'emulator' if is_emulator else 'desktop'
         testsuite = 'gaiatest' if is_gaiatest else 'marionette'
         # Currently running marionette on an emulator means webapi
         # tests. This method will need to change if this does.
         if is_emulator and not is_gaiatest:
             testsuite = 'webapi'
-        return '{}_{}'.format(testsuite, platform)
+        return '_'.join([testsuite, platform, 'options'])
 
     def download_and_extract(self):
         super(MarionetteTest, self).download_and_extract()
 
         if self.config.get('emulator'):
             dirs = self.query_abs_dirs()
 
             self.mkdir_p(dirs['abs_emulator_dir'])
@@ -311,16 +323,22 @@ class MarionetteTest(TestingMixin, Mercu
                              halt_on_failure=True, fatal_exit_code=3)
 
     def install(self):
         if self.config.get('emulator'):
             self.info("Emulator tests; skipping.")
         else:
             super(MarionetteTest, self).install()
 
+    def preflight_run_marionette(self):
+        """preflight commands for all tests"""
+        # If the in tree config hasn't been loaded by a previous step, load it here.
+        if not self.tree_config:
+            self._read_tree_config()
+
     def run_marionette(self):
         """
         Run the Marionette tests
         """
         dirs = self.query_abs_dirs()
 
         raw_log_file = os.path.join(dirs['abs_blob_upload_dir'],
                                     'marionette_raw.log')
@@ -417,27 +435,33 @@ class MarionetteTest(TestingMixin, Mercu
                 config_fmt_args['app_arg'] = self.config['app_arg']
 
             if self.config.get('e10s'):
                 cmd.append('--e10s')
 
             cmd.append('--gecko-log=%s' % os.path.join(dirs["abs_blob_upload_dir"],
                                                        'gecko.log'))
 
-        if self.config.get("structured_output"):
-            config_fmt_args["raw_log_file"]= "-"
-
         options_group = self._get_options_group(self.config.get('emulator'),
                                                 self.config.get('gaiatest'))
 
-        if options_group not in self.config["suite_definitions"]:
-            self.fatal("%s is not defined in the config!" % options_group)
+        if self.config.get("structured_output"):
+            config_fmt_args["raw_log_file"]= "-"
 
-        for s in self.config["suite_definitions"][options_group]["options"]:
-            cmd.append(s % config_fmt_args)
+        if options_group not in self.tree_config:
+            # This allows using the new in-tree format
+            options_group = options_group.split("_options")[0]
+            if options_group not in self.tree_config["suite_definitions"]:
+                self.fatal("%s is not defined in the in-tree config" %
+                           options_group)
+            for s in self.tree_config["suite_definitions"][options_group]["options"]:
+                cmd.append(s % config_fmt_args)
+        else:
+            for s in self.tree_config[options_group]:
+                cmd.append(s % config_fmt_args)
 
         if self.mkdir_p(dirs["abs_blob_upload_dir"]) == -1:
             # Make sure that the logging directory exists
             self.fatal("Could not create blobber upload directory")
 
         cmd.append(manifest)
         cmd = self.append_harness_extra_args(cmd)
 
--- a/testing/mozharness/scripts/mulet_unittest.py
+++ b/testing/mozharness/scripts/mulet_unittest.py
@@ -54,16 +54,21 @@ class MuletUnittest(B2GDesktopTest, Gaia
         # This is if we don't run all actions since we set this inside
         # of download-and-extract()
         if self.config.get("binary_path"):
             self.binary_path = self.config["binary_path"]
 
         if not self.binary_path:
             self.fatal("Use --binary-path as it is needed for _query_abs_dir().")
 
+        # This is if we don't run all actions since we set this inside
+        # of download-and-extract()
+        if not self.tree_config:
+            self._read_tree_config()
+
     def run_tests(self):
         """
         Run the unit test suite.
         """
         dirs = self.query_abs_dirs()
 
         # NOTE: We currently don't clobber the checkout or the profile
         if not os.path.isdir(dirs['abs_gaia_profile']):
--- a/testing/mozharness/scripts/web_platform_tests.py
+++ b/testing/mozharness/scripts/web_platform_tests.py
@@ -128,17 +128,17 @@ class WebPlatformTest(TestingMixin, Merc
         for test_type in c.get("test_type", []):
             base_cmd.append("--test-type=%s" % test_type)
 
         for opt in ["total_chunks", "this_chunk"]:
             val = c.get(opt)
             if val:
                 base_cmd.append("--%s=%s" % (opt.replace("_", "-"), val))
 
-        options = list(c.get("options", []))
+        options = list(c.get("options", [])) + list(self.tree_config["options"])
 
         str_format_values = {
             'binary_path': self.binary_path,
             'test_path': dirs["abs_wpttest_dir"],
             'test_install_path': dirs["abs_test_install_dir"],
             'abs_app_dir': abs_app_dir,
             'abs_work_dir': dirs["abs_work_dir"]
             }