bug 793022 - split out mozilla-tests/mobile_config.py. r=rail
authorAki Sasaki <asasaki@mozilla.com>
Fri, 08 Feb 2013 11:07:36 -0800
changeset 7835 5e29160d702f834b700cffb505d96f176cd32329
parent 7834 b6c9066bfc7a2b00a778e4d50c206a33b9348f6f
child 7836 6ee9b90c16f204fc095de3f3065a0df000b9a345
push id1
push userroot
push dateWed, 17 Dec 2014 00:18:48 +0000
reviewersrail
bugs793022
bug 793022 - split out mozilla-tests/mobile_config.py. r=rail
mozilla-tests/b2g_config.py
mozilla-tests/config.py
mozilla-tests/config_common.py
mozilla-tests/mobile_config.py
mozilla-tests/preproduction_tests_master_localconfig.py
mozilla-tests/preproduction_tests_scheduler_master_localconfig.py
mozilla-tests/scheduler_localconfig.py
mozilla-tests/scheduler_master.cfg
mozilla-tests/tests_localconfig.py
mozilla-tests/tests_master.cfg
mozilla-tests/thunderbird_config.py
mozilla-tests/universal_master_sqlite.cfg
mozilla/b2g_config.py
mozilla/config.py
mozilla/project_branches.py
mozilla/thunderbird_config.py
setup-master.py
--- a/mozilla-tests/b2g_config.py
+++ b/mozilla-tests/b2g_config.py
@@ -952,12 +952,12 @@ if __name__ == "__main__":
     else:
         items = dict(BRANCHES.items())
 
     for k, v in sorted(items.iteritems()):
         out = pprint.pformat(v)
         for l in out.splitlines():
             print '%s: %s' % (k, l)
 
-    for suite in SUITES:
+    for suite in sorted(SUITES):
         out = pprint.pformat(SUITES[suite])
         for l in out.splitlines():
             print '%s: %s' % (suite, l)
--- a/mozilla-tests/config.py
+++ b/mozilla-tests/config.py
@@ -1,54 +1,31 @@
 from copy import deepcopy
 
-from buildbot.steps.shell import WithProperties
+import config_common
+reload(config_common)
+from config_common import TALOS_CMD, loadDefaultValues, loadCustomTalosSuites, loadTalosSuites
 
 import project_branches
 reload(project_branches)
 from project_branches import PROJECT_BRANCHES, ACTIVE_PROJECT_BRANCHES
 
 import localconfig
 reload(localconfig)
 from localconfig import SLAVES, TRY_SLAVES, GLOBAL_VARS, GRAPH_CONFIG
 
-REMOTE_PROCESS_NAMES = {'default': 'org.mozilla.fennec',
-                        'mozilla-beta': 'org.mozilla.firefox_beta',
-                        'mozilla-aurora': 'org.mozilla.fennec_aurora',
-                        'mozilla-release': 'org.mozilla.firefox',
-                        'release-mozilla-beta': 'org.mozilla.firefox_beta',
-                        'release-mozilla-release': 'org.mozilla.firefox',
-                        }
-
 MOZHARNESS_REBOOT_CMD = ['scripts/external_tools/count_and_reboot.py',
                          '-f', '../reboot_count.txt',
                          '-n', '1', '-z']
 
-TALOS_CMD = ['python', 'run_tests.py', '--noisy', WithProperties('%(configFile)s')]
-
 TALOS_DIRTY_OPTS = {'talosAddOns': ['profiles/dirtyDBs.zip', 'profiles/dirtyMaxDBs.zip']}
 
 TALOS_TP_OPTS = {'plugins': {'32': 'zips/flash32_10_3_183_5.zip', '64': 'zips/flash64_11_0_d1_98.zip'}, 'pagesets': ['zips/tp5.zip']}
 TALOS_TP_NEW_OPTS = {'plugins': {'32': 'zips/flash32_10_3_183_5.zip', '64': 'zips/flash64_11_0_d1_98.zip'}, 'pagesets': ['zips/tp5n.zip']}
 
-TALOS_REMOTE_FENNEC_OPTS = {'productName': 'fennec',
-                            'remoteTests': True,
-                            'remoteExtras': {'options': ['--sampleConfig', 'remote.config',
-                                                         '--output', 'local.yml',
-                                                         '--webServer', 'bm-remote.build.mozilla.org',
-                                                         '--browserWait', '60',
-                                                         ],
-                                             'processName': REMOTE_PROCESS_NAMES,
-                                             },
-                            }
-
-UNITTEST_REMOTE_EXTRAS = {'processName': REMOTE_PROCESS_NAMES}
-ANDROID_UNITTEST_REMOTE_EXTRAS = deepcopy(UNITTEST_REMOTE_EXTRAS)
-ANDROID_UNITTEST_REMOTE_EXTRAS['cmdOptions'] = ['--bootstrap']
-
 BRANCHES = {
     'mozilla-central':     {},
     'mozilla-aurora':      {},
     'mozilla-release':     {},
     'mozilla-beta':        {},
     'mozilla-esr10':       {
         'datazilla_url': None,
         'platforms': {
@@ -74,63 +51,51 @@ BRANCHES = {
     'mozilla-b2g18': {
         'datazilla_url': None,
         'platforms': {
             # desktop per sicking in Bug 829513
             'macosx64': {},
             'win32': {},
             'linux': {},
             'linux64': {},
-            'android-noion': {},
-            'ics_armv7a_gecko': {},
-            'b2g_panda': {},
         },
         'lock_platforms': True,
     },
     'mozilla-b2g18_v1_0_0': {
         'datazilla_url': None,
         'platforms': {
             # desktop per sicking in Bug 829513
             'macosx64': {},
             'win32': {},
             'linux': {},
             'linux64': {},
-            'android-noion': {},
-            'ics_armv7a_gecko': {},
-            'b2g_panda': {},
         },
         'lock_platforms': True,
     },
     'mozilla-b2g18_v1_0_1': {
         'datazilla_url': None,
         'platforms': {
             # desktop per sicking in Bug 829513
             'macosx64': {},
             'win32': {},
             'linux': {},
             'linux64': {},
-            'android-noion': {},
-            'ics_armv7a_gecko': {},
-            'b2g_panda': {},
         },
         'lock_platforms': True,
     },
     'try': {'coallesce_jobs': False},
 }
 
 # Talos
 PLATFORMS = {
     'macosx': {},
     'macosx64': {},
     'win32': {},
     'linux': {},
     'linux64': {},
-    'android': {},
-    'android-armv6': {},
-    'android-noion': {},
 }
 
 # work around path length problem bug 599795
 # leopard-o == leopard-old
 PLATFORMS['macosx']['slave_platforms'] = ['leopard-o']
 PLATFORMS['macosx']['env_name'] = 'mac-perf'
 PLATFORMS['macosx']['leopard-o'] = {'name': "Rev3 MacOSX Leopard 10.5.8"}
 PLATFORMS['macosx']['stage_product'] = 'firefox'
@@ -181,39 +146,16 @@ PLATFORMS['linux64']['fedora64'] = {'nam
 PLATFORMS['linux64']['ubuntu64'] = {'name': 'Ubuntu 12.04 x64'}
 PLATFORMS['linux64']['stage_product'] = 'firefox'
 PLATFORMS['linux64']['mozharness_config'] = {
     'mozharness_python': '/tools/buildbot/bin/python',
     'hg_bin': 'hg',
     'reboot_command': ['/tools/buildbot/bin/python'] + MOZHARNESS_REBOOT_CMD,
 }
 
-PLATFORMS['android']['slave_platforms'] = ['tegra_android', 'panda_android']
-PLATFORMS['android']['env_name'] = 'android-perf'
-PLATFORMS['android']['is_mobile'] = True
-PLATFORMS['android']['tegra_android'] = {'name': "Android Tegra 250"}
-PLATFORMS['android']['panda_android'] = {'name': "Android 4.0 Panda"}
-PLATFORMS['android']['stage_product'] = 'mobile'
-PLATFORMS['android']['mozharness_config'] = {}
-
-PLATFORMS['android-armv6']['slave_platforms'] = ['tegra_android-armv6']
-PLATFORMS['android-armv6']['env_name'] = 'android-perf'
-PLATFORMS['android-armv6']['is_mobile'] = True
-PLATFORMS['android-armv6']['tegra_android-armv6'] = {'name': "Android Armv6 Tegra 250"}
-PLATFORMS['android-armv6']['stage_product'] = 'mobile'
-PLATFORMS['android-armv6']['mozharness_config'] = {}
-
-PLATFORMS['android-noion']['slave_platforms'] = ['tegra_android-noion']
-PLATFORMS['android-noion']['env_name'] = 'android-perf'
-PLATFORMS['android-noion']['is_mobile'] = True
-PLATFORMS['android-noion']['tegra_android-noion'] = {'name': "Android no-ionmonkey Tegra 250"}
-PLATFORMS['android-noion']['stage_product'] = 'mobile'
-PLATFORMS['android-noion']['mozharness_python'] = '/tools/buildbot/bin/python'
-
-
 # Lets be explicit instead of magical.  leopard-o should be a second
 # entry in the SLAVE dict
 for platform, platform_config in PLATFORMS.items():
     for slave_platform in platform_config['slave_platforms']:
         platform_config[slave_platform]['slaves'] = sorted(SLAVES[slave_platform])
         if slave_platform in TRY_SLAVES:
             platform_config[slave_platform]['try_slaves'] = sorted(TRY_SLAVES[slave_platform])
         else:
@@ -238,20 +180,16 @@ NO_MAC = PLATFORMS['linux']['slave_platf
     PLATFORMS['linux64']['slave_platforms'] + \
     PLATFORMS['win32']['slave_platforms']
 # Don't use ubuntu{32,64} for talos for now
 NO_MAC.remove('ubuntu32')
 NO_MAC.remove('ubuntu64')
 
 MAC_ONLY = PLATFORMS['macosx64']['slave_platforms']
 
-ANDROID = PLATFORMS['android']['slave_platforms']
-
-ANDROID_ARMV6 = PLATFORMS['android-armv6']['slave_platforms']
-
 SUITES = {
     'chrome': {
         'enable_by_default': False,
         'suites': GRAPH_CONFIG + ['--activeTests', 'tscroll:a11y:ts_paint:tpaint:tsspider', '--mozAfterPaint'],
         'options': ({}, NO_MAC),
     },
     # chrome_mac compared to chrome is that it does not contain a11y and only run on Mac
     'chrome_mac': {
@@ -340,72 +278,27 @@ SUITES = {
         'suites': GRAPH_CONFIG + ['--activeTests', 'dromaeo_css:dromaeo_dom:kraken:v8_7'],
         'options': ({}, ALL_PLATFORMS),
     },
     'chromez': {
         'enable_by_default': True,
         'suites': GRAPH_CONFIG + ['--activeTests', 'tresize', '--mozAfterPaint', '--filter', 'ignore_first:5', '--filter', 'median'],
         'options': ({}, ALL_PLATFORMS),
     },
-
-    # Mobile specific talos tests
-    'remote-ts': {
-        'enable_by_default': True,
-        'suites': GRAPH_CONFIG + ['--activeTests', 'ts', '--mozAfterPaint', '--noChrome'],
-        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
-    },
-    'remote-tsvg': {
-        'enable_by_default': True,
-        'suites': GRAPH_CONFIG + ['--activeTests', 'tsvg', '--noChrome'],
-        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
-    },
-    'remote-tsspider': {
-        'enable_by_default': False,
-        'suites': GRAPH_CONFIG + ['--activeTests', 'tsspider', '--noChrome'],
-        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
-    },
-    'remote-trobopan': {
-        'enable_by_default': True,
-        'suites': GRAPH_CONFIG + ['--activeTests', 'trobopan', '--noChrome', '--fennecIDs', '../fennec_ids.txt'],
-        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
-    },
-    'remote-trobocheck': {
-        'enable_by_default': True,
-        'suites': GRAPH_CONFIG + ['--activeTests', 'tcheckerboard', '--noChrome', '--fennecIDs', '../fennec_ids.txt'],
-        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
-    },
-    'remote-troboprovider': {
-        'enable_by_default': True,
-        'suites': GRAPH_CONFIG + ['--activeTests', 'tprovider', '--noChrome', '--fennecIDs', '../fennec_ids.txt'],
-        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
-    },
-    'remote-trobocheck2': {
-        'enable_by_default': True,
-        'suites': GRAPH_CONFIG + ['--activeTests', 'tcheck2', '--noChrome', '--fennecIDs', '../fennec_ids.txt'],
-        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
-    },
-    'remote-tp4m_nochrome': {
-        'enable_by_default': True,
-        'suites': GRAPH_CONFIG + ['--activeTests', 'tp4m', '--noChrome', '--rss'],
-        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
-    },
 }
 
 BRANCH_UNITTEST_VARS = {
     'hghost': 'hg.mozilla.org',
     # turn on platforms as we get them running
     'platforms': {
         'linux': {},
         'linux64': {},
         'macosx': {},
         'macosx64': {},
         'win32': {},
-        'android': {},
-        'android-armv6': {},
-        'android-noion': {},
     },
 }
 
 # Default set of unit tests
 UNITTEST_SUITES = {
     'opt_unittest_suites': [
         # Turn on chunks for mochitest
         ('mochitest', dict(suite='mochitest-plain', chunkByDir=4, totalChunks=5)),
@@ -425,28 +318,16 @@ UNITTEST_SUITES = {
         ('mochitest-other', ['mochitest-chrome', 'mochitest-a11y', 'mochitest-ipcplugins']),
         ('reftest', ['reftest']),
         ('crashtest', ['crashtest']),
         ('xpcshell', ['xpcshell']),
         ('jsreftest', ['jsreftest']),
         # Disabled in bug 630551
         #('mozmill-all', ['mozmill']),
     ],
-    'mobile_unittest_suites': [
-        # The disabled test suites are only disabled until we can get
-        # to 100% green
-        #('mochitest', dict(suite='mochitest-plain', chunkByDir=4, totalChunks=5)),
-        #('mochitest-other', ['mochitest-chrome', 'mochitest-a11y',
-        #                     'mochitest-ipcplugins']),
-        ('mobile-mochitest-browser-chrome', ['mobile-mochitest-browser-chrome']),
-        #('reftest', ['reftest']),
-        #('crashtest', ['crashtest']),
-        #('xpcshell', ['xpcshell']),
-        #('jsreftest', ['jsreftest']),
-    ],
 }
 
 
 def removeSuite(suiteName, suiteList):
     '''It removes 'suite' from 'suiteList' and returns it.
 
     Keyword arguments:
     suiteName -- it is the name of the suite that we want to remove
@@ -461,17 +342,17 @@ def removeSuite(suiteName, suiteList):
         if suiteName in suites:
             suites = suites[:]
             suites.remove(suiteName)
             suiteList[i] = (name, suites)
     return suiteList
 
 
 def addSuite(suiteGroupName, newSuiteName, suiteList):
-    # In UNITTEST_SUITES we have opt, debug and mobile unit tests keys.
+    # In UNITTEST_SUITES we have opt and debug unit tests keys.
     # Each one of these have a list of tuples of test suites.
     #     e.g. suiteGroup = ('reftest', ['reftest])
     newSuiteList = []
     added = False
     for tup in suiteList:
         name, suites = tup
         if suiteGroupName == name:
             suites.append(newSuiteName)
@@ -479,79 +360,16 @@ def addSuite(suiteGroupName, newSuiteNam
         newSuiteList.append((name, suites))
 
     if not added:
         newSuiteList.append((suiteGroupName, [newSuiteName]))
 
     return newSuiteList
 
 
-def loadDefaultValues(BRANCHES, branch, branchConfig):
-    BRANCHES[branch]['repo_path'] = branchConfig.get('repo_path', 'projects/' + branch)
-    BRANCHES[branch]['branch_name'] = branchConfig.get('branch_name', branch.title())
-    BRANCHES[branch]['mobile_branch_name'] = branchConfig.get('mobile_branch_name', branch.title())
-    BRANCHES[branch]['build_branch'] = branchConfig.get('build_branch', branch.title())
-    BRANCHES[branch]['talos_command'] = branchConfig.get('talos_cmd', TALOS_CMD)
-    BRANCHES[branch]['fetch_symbols'] = branchConfig.get('fetch_symbols', True)
-    BRANCHES[branch]['talos_from_source_code'] = branchConfig.get('talos_from_source_code', True)
-    BRANCHES[branch]['support_url_base'] = branchConfig.get('support_url_base', 'http://build.mozilla.org/talos')
-    BRANCHES[branch]['enable_unittests'] = branchConfig.get('enable_unittests', True)
-    BRANCHES[branch]['pgo_strategy'] = branchConfig.get('pgo_strategy', None)
-
-
-def loadCustomTalosSuites(BRANCHES, SUITES, branch, branchConfig):
-    coallesceJobs = branchConfig.get('coallesce_jobs', True)
-    BRANCHES[branch]['suites'] = deepcopy(SUITES)
-    # Check if Talos is enabled, if False, set 0 runs for all suites
-    if branchConfig.get('enable_talos') is False:
-        branchConfig['talos_suites'] = {}
-        for suite in SUITES.keys():
-            branchConfig['talos_suites'][suite] = 0
-
-    # Want to turn on/off a talos suite? Set it in the PROJECT_BRANCHES[branch]['talos_suites']
-    # This is the default and will make all talosConfig.get(key,0) calls
-    # to default to 0 a.k.a. disabled suite
-    talosConfig = {}
-    if branchConfig.get('talos_suites'):
-        for suite, settings in branchConfig['talos_suites'].items():
-            # Normally the setting is just 0 or 1 for talosConfig to enable/disable a test
-            # If there's a list, value[0] is the enabling flag and [1] is a dict of customization
-            if isinstance(settings, list):
-                talosConfig[suite] = settings[0]
-                # append anything new in 'suites' for a talos_suite
-                for key, value in settings[1].items():
-                    if suite in SUITES.keys():
-                        BRANCHES[branch]['suites'][suite][key] += value
-            else:
-                talosConfig[suite] = settings
-
-    for suite in SUITES.keys():
-        if not SUITES[suite]['enable_by_default']:
-            # Suites that are turned off by default
-            BRANCHES[branch][suite + '_tests'] = (talosConfig.get(suite, 0), coallesceJobs) + SUITES[suite]['options']
-        else:
-            # Suites that are turned on by default
-            BRANCHES[branch][suite + '_tests'] = (talosConfig.get(suite, 1), coallesceJobs) + SUITES[suite]['options']
-
-
-def loadTalosSuites(BRANCHES, SUITES, branch):
-    '''
-    This is very similar to loadCustomTalosSuites and is to deal with branches that are not in project_branches.py
-    but in config.py. Both functions could be unified later on when we do further refactoring.
-    '''
-    coallesceJobs = BRANCHES[branch].get('coallesce_jobs', True)
-    for suite in SUITES.keys():
-        if not SUITES[suite]['enable_by_default']:
-            # Suites that are turned off by default
-            BRANCHES[branch][suite + '_tests'] = (0, coallesceJobs) + SUITES[suite]['options']
-        else:
-            # Suites that are turned on by default
-            BRANCHES[branch][suite + '_tests'] = (1, coallesceJobs) + SUITES[suite]['options']
-
-
 def loadCustomUnittestSuites(BRANCHES, branch, branchConfig):
     # If you want a project branch to have a different set of unit tests you can
     # do the following:
     #  - add a key called "add_test_suites"
     #  - add a tuple for each test suite with the following format:
     #      ('OS_nick', 'platform', 'opt|debug', 'new or existing group', 'suite name')
     #      e.g. ('macosx64', 'snowleopard', 'debug', 'mochitest-other', 'a11y')
     #
@@ -574,209 +392,16 @@ def nested_haskey(dictionary, *keys):
     else:
         #recurse
         key, keys = keys[0], keys[1:]
         if key in dictionary:
             return nested_haskey(dictionary[key], *keys)
         else:
             return False
 
-ANDROID_UNITTEST_DICT = {
-    'opt_unittest_suites': [
-        ('mochitest-1', (
-            {'suite': 'mochitest-plain',
-             'testManifest': 'android.json',
-             'totalChunks': 8,
-             'thisChunk': 1,
-             },
-        )),
-        ('mochitest-2', (
-            {'suite': 'mochitest-plain',
-             'testManifest': 'android.json',
-             'totalChunks': 8,
-             'thisChunk': 2,
-             },
-        )),
-        ('mochitest-3', (
-            {'suite': 'mochitest-plain',
-             'testManifest': 'android.json',
-             'totalChunks': 8,
-             'thisChunk': 3,
-             },
-        )),
-        ('mochitest-4', (
-            {'suite': 'mochitest-plain',
-             'testManifest': 'android.json',
-             'totalChunks': 8,
-             'thisChunk': 4,
-             },
-        )),
-        ('mochitest-5', (
-            {'suite': 'mochitest-plain',
-             'testManifest': 'android.json',
-             'totalChunks': 8,
-             'thisChunk': 5,
-             },
-        )),
-        ('mochitest-6', (
-            {'suite': 'mochitest-plain',
-             'testManifest': 'android.json',
-             'totalChunks': 8,
-             'thisChunk': 6,
-             },
-        )),
-        ('mochitest-7', (
-            {'suite': 'mochitest-plain',
-             'testManifest': 'android.json',
-             'totalChunks': 8,
-             'thisChunk': 7,
-             },
-        )),
-        ('mochitest-8', (
-            {'suite': 'mochitest-plain',
-             'testManifest': 'android.json',
-             'totalChunks': 8,
-             'thisChunk': 8,
-             },
-        )),
-        ('reftest-1', (
-            {'suite': 'reftest',
-             'totalChunks': 4,
-             'thisChunk': 1,
-             },
-        )),
-        ('reftest-2', (
-            {'suite': 'reftest',
-             'totalChunks': 4,
-             'thisChunk': 2,
-             },
-        )),
-        ('reftest-3', (
-            {'suite': 'reftest',
-             'totalChunks': 4,
-             'thisChunk': 3,
-             },
-        )),
-        ('reftest-4', (
-            {'suite': 'reftest',
-             'totalChunks': 4,
-             'thisChunk': 4,
-             },
-        )),
-        # disabled for constant timeouts, bug 728119
-        # ('crashtest-1', (
-        #     {'suite': 'crashtest',
-        #      'totalChunks': 3,
-        #      'thisChunk': 1,
-        #      },
-        # )),
-        ('crashtest-2', (
-            {'suite': 'crashtest',
-             'totalChunks': 3,
-             'thisChunk': 2,
-             },
-        )),
-        ('crashtest-3', (
-            {'suite': 'crashtest',
-             'totalChunks': 3,
-             'thisChunk': 3,
-             },
-        )),
-        ('jsreftest-1', (
-            {'suite': 'jsreftest',
-             'totalChunks': 3,
-             'thisChunk': 1,
-             },
-        )),
-        ('jsreftest-2', (
-            {'suite': 'jsreftest',
-             'totalChunks': 3,
-             'thisChunk': 2,
-             },
-        )),
-        ('jsreftest-3', (
-            {'suite': 'jsreftest',
-             'totalChunks': 3,
-             'thisChunk': 3,
-             },
-        )),
-        ('robocop', (
-            {'suite': 'mochitest-robocop',
-             },
-        )),
-    ],
-    'debug_unittest_suites': [],
-}
-
-ANDROID_NOION_UNITTEST_DICT = {
-    'opt_unittest_suites': [],
-    'debug_unittest_suites': [],
-}
-for suite in ANDROID_UNITTEST_DICT['opt_unittest_suites']:
-    if not suite[0].startswith('jsreftest'):
-        continue
-    ANDROID_NOION_UNITTEST_DICT['opt_unittest_suites'].append(suite)
-
-ANDROID_ARMV6_UNITTEST_DICT = deepcopy(ANDROID_UNITTEST_DICT)
-
-ANDROID_PLAIN_UNITTEST_DICT = {
-    'opt_unittest_suites': [],
-    'debug_unittest_suites': [],
-}
-
-ANDROID_PLAIN_REFTEST_DICT = {
-    'opt_unittest_suites': [
-        ('plain-reftest-1', (
-            {'suite': 'reftestsmall',
-             'totalChunks': 4,
-             'thisChunk': 1,
-             'extra_args': '--ignore-window-size'
-             },
-        )),
-        ('plain-reftest-2', (
-            {'suite': 'reftestsmall',
-             'totalChunks': 4,
-             'thisChunk': 2,
-             'extra_args': '--ignore-window-size'
-             },
-        )),
-        ('plain-reftest-3', (
-            {'suite': 'reftestsmall',
-             'totalChunks': 4,
-             'thisChunk': 3,
-             'extra_args': '--ignore-window-size'
-             },
-        )),
-        ('plain-reftest-4', (
-            {'suite': 'reftestsmall',
-             'totalChunks': 4,
-             'thisChunk': 4,
-             'extra_args': '--ignore-window-size'
-             },
-        )),
-    ],
-}
-
-
-for suite in ANDROID_UNITTEST_DICT['opt_unittest_suites']:
-    if suite[0].startswith('reftest'):
-        continue
-    ANDROID_PLAIN_UNITTEST_DICT['opt_unittest_suites'].append(suite)
-
-for suite in ANDROID_PLAIN_REFTEST_DICT['opt_unittest_suites']:
-    ANDROID_PLAIN_UNITTEST_DICT['opt_unittest_suites'].append(suite)
-ANDROID_PANDA_UNITTEST_DICT = {
-    'opt_unittest_suites': [],
-    'debug_unittest_suites': [],
-}
-for suite in ANDROID_PLAIN_UNITTEST_DICT['opt_unittest_suites']:
-    if suite[0].startswith('reftest') or suite[0].startswith('plain-reftest'):
-        continue
-    ANDROID_PANDA_UNITTEST_DICT['opt_unittest_suites'].append(suite)
-
 # You must define opt_unittest_suites when enable_opt_unittests is True for a
 # platform. Likewise debug_unittest_suites for enable_debug_unittests
 PLATFORM_UNITTEST_VARS = {
     'linux': {
         'product_name': 'firefox',
         'app_name': 'browser',
         'brand_name': 'Minefield',
         'builds_before_reboot': 1,
@@ -785,17 +410,16 @@ PLATFORM_UNITTEST_VARS = {
         'enable_debug_unittests': True,
         'fedora': {
             'opt_unittest_suites': UNITTEST_SUITES['opt_unittest_suites'][:] + [
                 ('reftest-ipc', ['reftest-ipc']),
                 ('reftest-no-accel', ['opengl-no-accel']),
                 ('crashtest-ipc', ['crashtest-ipc'])
             ],
             'debug_unittest_suites': UNITTEST_SUITES['debug_unittest_suites'][:],
-            'mobile_unittest_suites': UNITTEST_SUITES['mobile_unittest_suites'][:],
         },
         'ubuntu32': {
             'opt_unittest_suites': UNITTEST_SUITES['opt_unittest_suites'][:] + [
                 ('reftest-ipc', ['reftest-ipc']),
                 ('reftest-no-accel', ['opengl-no-accel']),
                 ('crashtest-ipc', ['crashtest-ipc'])
             ],
             'debug_unittest_suites': UNITTEST_SUITES['debug_unittest_suites'][:],
@@ -869,50 +493,16 @@ PLATFORM_UNITTEST_VARS = {
             'opt_unittest_suites': removeSuite('mochitest-a11y', UNITTEST_SUITES['opt_unittest_suites'][:]),
             'debug_unittest_suites': removeSuite('mochitest-a11y', UNITTEST_SUITES['debug_unittest_suites'][:]),
         },
         'mountainlion': {
             'opt_unittest_suites': removeSuite('mochitest-a11y', UNITTEST_SUITES['opt_unittest_suites'][:]),
             'debug_unittest_suites': removeSuite('mochitest-a11y', UNITTEST_SUITES['debug_unittest_suites'][:]),
         },
     },
-    'android': {
-        'product_name': 'fennec',
-        'app_name': 'browser',
-        'brand_name': 'Minefield',
-        'is_remote': True,
-        'host_utils_url': 'http://bm-remote.build.mozilla.org/tegra/tegra-host-utils.%%(foopy_type)s.742597.zip',
-        'enable_opt_unittests': True,
-        'enable_debug_unittests': False,
-        'remote_extras': ANDROID_UNITTEST_REMOTE_EXTRAS,
-        'tegra_android': deepcopy(ANDROID_PLAIN_UNITTEST_DICT),
-        'panda_android': deepcopy(ANDROID_PANDA_UNITTEST_DICT),
-    },
-    'android-armv6': {
-        'product_name': 'fennec',
-        'app_name': 'browser',
-        'brand_name': 'Minefield',
-        'is_remote': True,
-        'host_utils_url': 'http://bm-remote.build.mozilla.org/tegra/tegra-host-utils.%%(foopy_type)s.742597.zip',
-        'enable_opt_unittests': True,
-        'enable_debug_unittests': False,
-        'remote_extras': ANDROID_UNITTEST_REMOTE_EXTRAS,
-        'tegra_android-armv6': deepcopy(ANDROID_ARMV6_UNITTEST_DICT),
-    },
-    'android-noion': {
-        'product_name': 'fennec',
-        'app_name': 'browser',
-        'brand_name': 'Minefield',
-        'is_remote': True,
-        'host_utils_url': 'http://bm-remote.build.mozilla.org/tegra/tegra-host-utils.%%(foopy_type)s.742597.zip',
-        'enable_opt_unittests': True,
-        'enable_debug_unittests': False,
-        'remote_extras': ANDROID_UNITTEST_REMOTE_EXTRAS,
-        'tegra_android-noion': deepcopy(ANDROID_NOION_UNITTEST_DICT),
-    },
 }
 
 # Copy project branches into BRANCHES keys
 for branch in ACTIVE_PROJECT_BRANCHES:
     BRANCHES[branch] = deepcopy(PROJECT_BRANCHES[branch])
 
 # Copy unittest vars in first, then platform vars
 for branch in BRANCHES.keys():
@@ -1012,50 +602,44 @@ for k, v in localconfig.PROJECTS.items()
 # - Whether queue merging is on
 # - TalosFactory options
 # - Which platforms to run on
 
 # Let's load the defaults
 for branch in BRANCHES.keys():
     BRANCHES[branch]['repo_path'] = branch
     BRANCHES[branch]['branch_name'] = branch.title()
-    BRANCHES[branch]['mobile_branch_name'] = branch.title()
     BRANCHES[branch]['build_branch'] = branch.title()
     BRANCHES[branch]['enable_unittests'] = True
     BRANCHES[branch]['talos_command'] = TALOS_CMD
     BRANCHES[branch]['fetch_symbols'] = True
     BRANCHES[branch]['fetch_release_symbols'] = False
     BRANCHES[branch]['talos_from_source_code'] = True
     BRANCHES[branch]['support_url_base'] = 'http://build.mozilla.org/talos'
     loadTalosSuites(BRANCHES, SUITES, branch)
     BRANCHES[branch]['pgo_strategy'] = None
     BRANCHES[branch]['pgo_platforms'] = ['linux', 'linux64', 'win32']
 
 # The following are exceptions to the defaults
 
 ######## mozilla-central
 BRANCHES['mozilla-central']['branch_name'] = "Firefox"
 BRANCHES['mozilla-central']['repo_path'] = "mozilla-central"
-BRANCHES['mozilla-central']['mobile_branch_name'] = "Mobile"
-BRANCHES['mozilla-central']['mobile_talos_branch'] = "mobile"
 BRANCHES['mozilla-central']['build_branch'] = "1.9.2"
 BRANCHES['mozilla-central']['pgo_strategy'] = 'periodic'
-BRANCHES['mozilla-central']['platforms']['android']['enable_debug_unittests'] = True
 BRANCHES['mozilla-central']['xperf_tests'] = (1, True, TALOS_TP_NEW_OPTS, WIN7_ONLY)
 
 ######### mozilla-release
 BRANCHES['mozilla-release']['release_tests'] = 5
 BRANCHES['mozilla-release']['repo_path'] = "releases/mozilla-release"
-BRANCHES['mozilla-release']['platforms']['linux']['enable_mobile_unittests'] = True
 BRANCHES['mozilla-release']['pgo_strategy'] = 'per-checkin'
 
 ######### mozilla-beta
 BRANCHES['mozilla-beta']['release_tests'] = 5
 BRANCHES['mozilla-beta']['repo_path'] = "releases/mozilla-beta"
-BRANCHES['mozilla-beta']['platforms']['linux']['enable_mobile_unittests'] = True
 BRANCHES['mozilla-beta']['pgo_strategy'] = 'per-checkin'
 
 ######### mozilla-aurora
 BRANCHES['mozilla-aurora']['repo_path'] = "releases/mozilla-aurora"
 BRANCHES['mozilla-aurora']['pgo_strategy'] = 'per-checkin'
 
 ######## mozilla-esr10
 BRANCHES['mozilla-esr10']['pgo_strategy'] = 'per-checkin'
@@ -1095,62 +679,39 @@ BRANCHES['mozilla-b2g18_v1_0_0']['pgo_st
 
 ######### mozilla-b2g18_v1_0_1
 BRANCHES['mozilla-b2g18_v1_0_1']['release_tests'] = 5
 BRANCHES['mozilla-b2g18_v1_0_1']['repo_path'] = "releases/mozilla-b2g18_v1_0_1"
 BRANCHES['mozilla-b2g18_v1_0_1']['pgo_strategy'] = 'per-checkin'
 
 ######## try
 BRANCHES['try']['xperf_tests'] = (1, False, TALOS_TP_NEW_OPTS, WIN7_ONLY)
-BRANCHES['try']['platforms']['android']['enable_debug_unittests'] = True
 BRANCHES['try']['pgo_strategy'] = 'try'
 BRANCHES['try']['enable_try'] = True
 
 # Let's load jetpack for the following branches:
 for branch in ('mozilla-central', 'mozilla-aurora', 'try', 'mozilla-inbound', 'ionmonkey', 'birch', ):
     for pf in PLATFORMS:
-        if 'android' in pf:
-            continue
         for slave_pf in PLATFORMS[pf]['slave_platforms']:
             # These two mac exceptions are because we have been adding debug jetpack to macosx/leopard-o
             # and opt jetpack to macosx64/leopard. This probably was not correct but that's how it came about
             # XXX clean this mess in the next refactoring patch
             if pf == "macosx" and slave_pf == "leopard-o":
                 BRANCHES[branch]['platforms'][pf][slave_pf]['debug_unittest_suites'] += [('jetpack', ['jetpack'])]
                 continue
             if pf == "macosx64" and slave_pf == "leopard":
                 BRANCHES[branch]['platforms'][pf][slave_pf]['opt_unittest_suites'] += [('jetpack', ['jetpack'])]
                 continue
             BRANCHES[branch]['platforms'][pf][slave_pf]['opt_unittest_suites'] += [('jetpack', ['jetpack'])]
             BRANCHES[branch]['platforms'][pf][slave_pf]['debug_unittest_suites'] += [('jetpack', ['jetpack'])]
 
 
-#-------------------------------------------------------------------------
-# MERGE day - Load reftests small for m-c based branches and exclude them for the rest
-#-------------------------------------------------------------------------
-for branch in ('mozilla-aurora', 'mozilla-beta', 'mozilla-release'):
-    BRANCHES[branch]["platforms"]["android"]["panda_android"]["opt_unittest_suites"] = deepcopy(ANDROID_UNITTEST_DICT["opt_unittest_suites"])
-    BRANCHES[branch]["platforms"]["android"]["tegra_android"]["opt_unittest_suites"] = deepcopy(ANDROID_UNITTEST_DICT["opt_unittest_suites"])
-#-------------------------------------------------------------------------
-# End Load reftests small for m-c based branches and exclude them for the rest
-#-------------------------------------------------------------------------
-
-
-#exclude android builds from running on non-cedar branches on pandas
-for branch in BRANCHES.keys():
-    if 'android' in BRANCHES[branch]['platforms'] and branch not in ("cedar", "mozilla-central", "try", "mozilla-inbound"):
-        del BRANCHES[branch]['platforms']['android']['panda_android']
-        BRANCHES[branch]['platforms']['android']['slave_platforms'] = ['tegra_android']
-
 # Let's load Marionette for the following branches:
 for branch in ('mozilla-central', 'mozilla-inbound', 'try', 'fx-team', 'services-central', ):
     for pf in PLATFORMS:
-        if 'android' in pf:
-            # this is just for desktop Firefox
-            continue
         config_file = "marionette/prod_config.py"
         if pf.startswith('win'):
             if branch != 'try':
                 # for now, only run windows tests on try because of bug 795513
                 continue
             config_file = "marionette/windows_config.py"
         for slave_pf in PLATFORMS[pf]['slave_platforms']:
             if pf == "macosx" and slave_pf in ("leopard-o", "leopard"):
@@ -1187,18 +748,16 @@ mozharness_unittest_suites = [
     {'suite_name': 'reftest-no-accel', 'suite_category': 'reftest', 'sub_categories': ['reftest-no-accel'], 'platforms': ['linux'], 'test_types': ['opt']},
     {'suite_name': 'crashtest-ipc', 'suite_category': 'reftest', 'sub_categories': ['crashtest-ipc'], 'platforms': ['linux'], 'test_types': ['opt']},
     {'suite_name': 'xpcshell', 'suite_category': 'xpcshell', 'sub_categories': ['xpcshell']},
 ]
 for branch in BRANCHES:
     if BRANCHES[branch].get('mozharness_unittests'):
         for pf in PLATFORMS:
             hg_bin = 'hg'
-            if 'android' in pf:
-                continue
             if pf.startswith("win"):
                 config_file = "unittests/win_unittest.py"
             elif pf.startswith("mac"):
                 config_file = "unittests/mac_unittest.py"
             else:
                 config_file = "unittests/linux_unittest.py"
             for slave_pf in PLATFORMS[pf]['slave_platforms']:
                 if pf == "macosx" and slave_pf == "leopard-o":
@@ -1288,49 +847,28 @@ for branch in set(BRANCHES.keys()) - set
                         BRANCHES[branch]['platforms'][p][ubuntu][suite_type].remove(suite)
                     else:
                         try:
                             BRANCHES[branch]['platforms'][p][fedora][suite_type].remove(suite)
                         except KeyError:
                             pass
 
 
-#-------------------------------------------------------------------------
-# MERGE day - only enable android-armv6 tests for FF16 onwards
-# Delete whole block when we drop esr10
-#-------------------------------------------------------------------------
-for branch in ['mozilla-esr10']:
-    if 'android-armv6' in BRANCHES[branch]['platforms']:
-        del BRANCHES[branch]['platforms']['android-armv6']
-#-------------------------------------------------------------------------
-# End enable android-armv6 tests for FF16 onwards
-#-------------------------------------------------------------------------
-
-# XXX Bug 789373 hack - add android-noion until we have b2g testing
-# Delete all references to android-noion once we have b2g jsreftests not in an emulator.
-for branch in BRANCHES:
-    if branch not in ('mozilla-central', 'mozilla-inbound', 'mozilla-b2g18',
-                      'mozilla-b2g18_v1_0_0', 'mozilla-b2g18_v1_0_1', 'try'
-                      ):
-        if 'android-noion' in BRANCHES[branch]['platforms']:
-            del BRANCHES[branch]['platforms']['android-noion']
-
-
 if __name__ == "__main__":
     import sys
     import pprint
 
     args = sys.argv[1:]
 
     if len(args) > 0:
         items = dict([(b, BRANCHES[b]) for b in args])
     else:
         items = dict(BRANCHES.items() + PROJECTS.items())
 
     for k, v in sorted(items.iteritems()):
         out = pprint.pformat(v)
         for l in out.splitlines():
             print '%s: %s' % (k, l)
 
-    for suite in SUITES:
+    for suite in sorted(SUITES):
         out = pprint.pformat(SUITES[suite])
         for l in out.splitlines():
             print '%s: %s' % (suite, l)
new file mode 100644
--- /dev/null
+++ b/mozilla-tests/config_common.py
@@ -0,0 +1,67 @@
+from copy import deepcopy
+
+from buildbot.steps.shell import WithProperties
+
+TALOS_CMD = ['python', 'run_tests.py', '--noisy', WithProperties('%(configFile)s')]
+
+
+def loadDefaultValues(BRANCHES, branch, branchConfig):
+    BRANCHES[branch]['repo_path'] = branchConfig.get('repo_path', 'projects/' + branch)
+    BRANCHES[branch]['branch_name'] = branchConfig.get('branch_name', branch.title())
+    BRANCHES[branch]['build_branch'] = branchConfig.get('build_branch', branch.title())
+    BRANCHES[branch]['talos_command'] = branchConfig.get('talos_cmd', TALOS_CMD)
+    BRANCHES[branch]['fetch_symbols'] = branchConfig.get('fetch_symbols', True)
+    BRANCHES[branch]['talos_from_source_code'] = branchConfig.get('talos_from_source_code', True)
+    BRANCHES[branch]['support_url_base'] = branchConfig.get('support_url_base', 'http://build.mozilla.org/talos')
+    BRANCHES[branch]['enable_unittests'] = branchConfig.get('enable_unittests', True)
+    BRANCHES[branch]['pgo_strategy'] = branchConfig.get('pgo_strategy', None)
+
+
+def loadCustomTalosSuites(BRANCHES, SUITES, branch, branchConfig):
+    coallesceJobs = branchConfig.get('coallesce_jobs', True)
+    BRANCHES[branch]['suites'] = deepcopy(SUITES)
+    # Check if Talos is enabled, if False, set 0 runs for all suites
+    if branchConfig.get('enable_talos') is False:
+        branchConfig['talos_suites'] = {}
+        for suite in SUITES.keys():
+            branchConfig['talos_suites'][suite] = 0
+
+    # Want to turn on/off a talos suite? Set it in the PROJECT_BRANCHES[branch]['talos_suites']
+    # This is the default and will make all talosConfig.get(key,0) calls
+    # to default to 0 a.k.a. disabled suite
+    talosConfig = {}
+    if branchConfig.get('talos_suites'):
+        for suite, settings in branchConfig['talos_suites'].items():
+            # Normally the setting is just 0 or 1 for talosConfig to enable/disable a test
+            # If there's a list, value[0] is the enabling flag and [1] is a dict of customization
+            if isinstance(settings, list):
+                talosConfig[suite] = settings[0]
+                # append anything new in 'suites' for a talos_suite
+                for key, value in settings[1].items():
+                    if suite in SUITES.keys():
+                        BRANCHES[branch]['suites'][suite][key] += value
+            else:
+                talosConfig[suite] = settings
+
+    for suite in SUITES.keys():
+        if not SUITES[suite]['enable_by_default']:
+            # Suites that are turned off by default
+            BRANCHES[branch][suite + '_tests'] = (talosConfig.get(suite, 0), coallesceJobs) + SUITES[suite]['options']
+        else:
+            # Suites that are turned on by default
+            BRANCHES[branch][suite + '_tests'] = (talosConfig.get(suite, 1), coallesceJobs) + SUITES[suite]['options']
+
+
+def loadTalosSuites(BRANCHES, SUITES, branch):
+    '''
+    This is very similar to loadCustomTalosSuites and is to deal with branches that are not in project_branches.py
+    but in config.py. Both functions could be unified later on when we do further refactoring.
+    '''
+    coallesceJobs = BRANCHES[branch].get('coallesce_jobs', True)
+    for suite in SUITES.keys():
+        if not SUITES[suite]['enable_by_default']:
+            # Suites that are turned off by default
+            BRANCHES[branch][suite + '_tests'] = (0, coallesceJobs) + SUITES[suite]['options']
+        else:
+            # Suites that are turned on by default
+            BRANCHES[branch][suite + '_tests'] = (1, coallesceJobs) + SUITES[suite]['options']
new file mode 100644
--- /dev/null
+++ b/mozilla-tests/mobile_config.py
@@ -0,0 +1,613 @@
+from copy import deepcopy
+
+import config_common
+reload(config_common)
+from config_common import TALOS_CMD, loadDefaultValues, loadCustomTalosSuites, loadTalosSuites
+
+import project_branches
+reload(project_branches)
+from project_branches import PROJECT_BRANCHES, ACTIVE_PROJECT_BRANCHES
+
+import localconfig
+reload(localconfig)
+from localconfig import SLAVES, TRY_SLAVES, GLOBAL_VARS, GRAPH_CONFIG
+
+REMOTE_PROCESS_NAMES = {'default': 'org.mozilla.fennec',
+                        'mozilla-beta': 'org.mozilla.firefox_beta',
+                        'mozilla-aurora': 'org.mozilla.fennec_aurora',
+                        'mozilla-release': 'org.mozilla.firefox',
+                        'release-mozilla-beta': 'org.mozilla.firefox_beta',
+                        'release-mozilla-release': 'org.mozilla.firefox',
+                        }
+
+TALOS_REMOTE_FENNEC_OPTS = {'productName': 'fennec',
+                            'remoteTests': True,
+                            'remoteExtras': {'options': ['--sampleConfig', 'remote.config',
+                                                         '--output', 'local.yml',
+                                                         '--webServer', 'bm-remote.build.mozilla.org',
+                                                         '--browserWait', '60',
+                                                         ],
+                                             'processName': REMOTE_PROCESS_NAMES,
+                                             },
+                            }
+
+UNITTEST_REMOTE_EXTRAS = {'processName': REMOTE_PROCESS_NAMES}
+ANDROID_UNITTEST_REMOTE_EXTRAS = deepcopy(UNITTEST_REMOTE_EXTRAS)
+ANDROID_UNITTEST_REMOTE_EXTRAS['cmdOptions'] = ['--bootstrap']
+
+BRANCHES = {
+    'mozilla-central':     {},
+    'mozilla-aurora':      {},
+    'mozilla-release':     {},
+    'mozilla-beta':        {},
+    'mozilla-esr10':       {
+        'datazilla_url': None,
+        'platforms': {},
+        'lock_platforms': True,
+    },
+    'mozilla-esr17':       {
+        'datazilla_url': None,
+        'platforms': {},
+        'lock_platforms': True,
+    },
+    'mozilla-b2g18': {
+        'datazilla_url': None,
+        'platforms': {
+            'android-noion': {},
+        },
+        'lock_platforms': True,
+    },
+    'mozilla-b2g18_v1_0_0': {
+        'datazilla_url': None,
+        'platforms': {
+            'android-noion': {},
+        },
+        'lock_platforms': True,
+    },
+    'mozilla-b2g18_v1_0_1': {
+        'datazilla_url': None,
+        'platforms': {
+            'android-noion': {},
+        },
+        'lock_platforms': True,
+    },
+    'try': {'coallesce_jobs': False},
+}
+
+# Talos
+PLATFORMS = {
+    'android': {},
+    'android-armv6': {},
+    'android-noion': {},
+}
+
+PLATFORMS['android']['slave_platforms'] = ['tegra_android', 'panda_android']
+PLATFORMS['android']['env_name'] = 'android-perf'
+PLATFORMS['android']['is_mobile'] = True
+PLATFORMS['android']['tegra_android'] = {'name': "Android Tegra 250"}
+PLATFORMS['android']['panda_android'] = {'name': "Android 4.0 Panda"}
+PLATFORMS['android']['stage_product'] = 'mobile'
+PLATFORMS['android']['mozharness_config'] = {}
+
+PLATFORMS['android-armv6']['slave_platforms'] = ['tegra_android-armv6']
+PLATFORMS['android-armv6']['env_name'] = 'android-perf'
+PLATFORMS['android-armv6']['is_mobile'] = True
+PLATFORMS['android-armv6']['tegra_android-armv6'] = {'name': "Android Armv6 Tegra 250"}
+PLATFORMS['android-armv6']['stage_product'] = 'mobile'
+PLATFORMS['android-armv6']['mozharness_config'] = {}
+
+PLATFORMS['android-noion']['slave_platforms'] = ['tegra_android-noion']
+PLATFORMS['android-noion']['env_name'] = 'android-perf'
+PLATFORMS['android-noion']['is_mobile'] = True
+PLATFORMS['android-noion']['tegra_android-noion'] = {'name': "Android no-ionmonkey Tegra 250"}
+PLATFORMS['android-noion']['stage_product'] = 'mobile'
+PLATFORMS['android-noion']['mozharness_python'] = '/tools/buildbot/bin/python'
+
+
+# Lets be explicit instead of magical.  leopard-o should be a second
+# entry in the SLAVE dict
+for platform, platform_config in PLATFORMS.items():
+    for slave_platform in platform_config['slave_platforms']:
+        platform_config[slave_platform]['slaves'] = sorted(SLAVES[slave_platform])
+        if slave_platform in TRY_SLAVES:
+            platform_config[slave_platform]['try_slaves'] = sorted(TRY_SLAVES[slave_platform])
+        else:
+            platform_config[slave_platform]['try_slaves'] = platform_config[slave_platform]['slaves']
+
+ANDROID = PLATFORMS['android']['slave_platforms']
+
+SUITES = {
+    'remote-ts': {
+        'enable_by_default': True,
+        'suites': GRAPH_CONFIG + ['--activeTests', 'ts', '--mozAfterPaint', '--noChrome'],
+        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
+    },
+    'remote-tsvg': {
+        'enable_by_default': True,
+        'suites': GRAPH_CONFIG + ['--activeTests', 'tsvg', '--noChrome'],
+        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
+    },
+    'remote-tsspider': {
+        'enable_by_default': False,
+        'suites': GRAPH_CONFIG + ['--activeTests', 'tsspider', '--noChrome'],
+        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
+    },
+    'remote-trobopan': {
+        'enable_by_default': True,
+        'suites': GRAPH_CONFIG + ['--activeTests', 'trobopan', '--noChrome', '--fennecIDs', '../fennec_ids.txt'],
+        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
+    },
+    'remote-trobocheck': {
+        'enable_by_default': True,
+        'suites': GRAPH_CONFIG + ['--activeTests', 'tcheckerboard', '--noChrome', '--fennecIDs', '../fennec_ids.txt'],
+        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
+    },
+    'remote-troboprovider': {
+        'enable_by_default': True,
+        'suites': GRAPH_CONFIG + ['--activeTests', 'tprovider', '--noChrome', '--fennecIDs', '../fennec_ids.txt'],
+        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
+    },
+    'remote-trobocheck2': {
+        'enable_by_default': True,
+        'suites': GRAPH_CONFIG + ['--activeTests', 'tcheck2', '--noChrome', '--fennecIDs', '../fennec_ids.txt'],
+        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
+    },
+    'remote-tp4m_nochrome': {
+        'enable_by_default': True,
+        'suites': GRAPH_CONFIG + ['--activeTests', 'tp4m', '--noChrome', '--rss'],
+        'options': (TALOS_REMOTE_FENNEC_OPTS, ANDROID),
+    },
+}
+
+BRANCH_UNITTEST_VARS = {
+    'hghost': 'hg.mozilla.org',
+    # turn on platforms as we get them running
+    'platforms': {
+        'android': {},
+        'android-armv6': {},
+        'android-noion': {},
+    },
+}
+
+
+ANDROID_UNITTEST_DICT = {
+    'opt_unittest_suites': [
+        ('mochitest-1', (
+            {'suite': 'mochitest-plain',
+             'testManifest': 'android.json',
+             'totalChunks': 8,
+             'thisChunk': 1,
+             },
+        )),
+        ('mochitest-2', (
+            {'suite': 'mochitest-plain',
+             'testManifest': 'android.json',
+             'totalChunks': 8,
+             'thisChunk': 2,
+             },
+        )),
+        ('mochitest-3', (
+            {'suite': 'mochitest-plain',
+             'testManifest': 'android.json',
+             'totalChunks': 8,
+             'thisChunk': 3,
+             },
+        )),
+        ('mochitest-4', (
+            {'suite': 'mochitest-plain',
+             'testManifest': 'android.json',
+             'totalChunks': 8,
+             'thisChunk': 4,
+             },
+        )),
+        ('mochitest-5', (
+            {'suite': 'mochitest-plain',
+             'testManifest': 'android.json',
+             'totalChunks': 8,
+             'thisChunk': 5,
+             },
+        )),
+        ('mochitest-6', (
+            {'suite': 'mochitest-plain',
+             'testManifest': 'android.json',
+             'totalChunks': 8,
+             'thisChunk': 6,
+             },
+        )),
+        ('mochitest-7', (
+            {'suite': 'mochitest-plain',
+             'testManifest': 'android.json',
+             'totalChunks': 8,
+             'thisChunk': 7,
+             },
+        )),
+        ('mochitest-8', (
+            {'suite': 'mochitest-plain',
+             'testManifest': 'android.json',
+             'totalChunks': 8,
+             'thisChunk': 8,
+             },
+        )),
+        ('reftest-1', (
+            {'suite': 'reftest',
+             'totalChunks': 4,
+             'thisChunk': 1,
+             },
+        )),
+        ('reftest-2', (
+            {'suite': 'reftest',
+             'totalChunks': 4,
+             'thisChunk': 2,
+             },
+        )),
+        ('reftest-3', (
+            {'suite': 'reftest',
+             'totalChunks': 4,
+             'thisChunk': 3,
+             },
+        )),
+        ('reftest-4', (
+            {'suite': 'reftest',
+             'totalChunks': 4,
+             'thisChunk': 4,
+             },
+        )),
+        # disabled for constant timeouts, bug 728119
+        # ('crashtest-1', (
+        #     {'suite': 'crashtest',
+        #      'totalChunks': 3,
+        #      'thisChunk': 1,
+        #      },
+        # )),
+        ('crashtest-2', (
+            {'suite': 'crashtest',
+             'totalChunks': 3,
+             'thisChunk': 2,
+             },
+        )),
+        ('crashtest-3', (
+            {'suite': 'crashtest',
+             'totalChunks': 3,
+             'thisChunk': 3,
+             },
+        )),
+        ('jsreftest-1', (
+            {'suite': 'jsreftest',
+             'totalChunks': 3,
+             'thisChunk': 1,
+             },
+        )),
+        ('jsreftest-2', (
+            {'suite': 'jsreftest',
+             'totalChunks': 3,
+             'thisChunk': 2,
+             },
+        )),
+        ('jsreftest-3', (
+            {'suite': 'jsreftest',
+             'totalChunks': 3,
+             'thisChunk': 3,
+             },
+        )),
+        ('robocop', (
+            {'suite': 'mochitest-robocop',
+             },
+        )),
+    ],
+    'debug_unittest_suites': [],
+}
+
+ANDROID_NOION_UNITTEST_DICT = {
+    'opt_unittest_suites': [],
+    'debug_unittest_suites': [],
+}
+for suite in ANDROID_UNITTEST_DICT['opt_unittest_suites']:
+    if not suite[0].startswith('jsreftest'):
+        continue
+    ANDROID_NOION_UNITTEST_DICT['opt_unittest_suites'].append(suite)
+
+ANDROID_ARMV6_UNITTEST_DICT = deepcopy(ANDROID_UNITTEST_DICT)
+
+ANDROID_PLAIN_UNITTEST_DICT = {
+    'opt_unittest_suites': [],
+    'debug_unittest_suites': [],
+}
+
+ANDROID_PLAIN_REFTEST_DICT = {
+    'opt_unittest_suites': [
+        ('plain-reftest-1', (
+            {'suite': 'reftestsmall',
+             'totalChunks': 4,
+             'thisChunk': 1,
+             'extra_args': '--ignore-window-size'
+             },
+        )),
+        ('plain-reftest-2', (
+            {'suite': 'reftestsmall',
+             'totalChunks': 4,
+             'thisChunk': 2,
+             'extra_args': '--ignore-window-size'
+             },
+        )),
+        ('plain-reftest-3', (
+            {'suite': 'reftestsmall',
+             'totalChunks': 4,
+             'thisChunk': 3,
+             'extra_args': '--ignore-window-size'
+             },
+        )),
+        ('plain-reftest-4', (
+            {'suite': 'reftestsmall',
+             'totalChunks': 4,
+             'thisChunk': 4,
+             'extra_args': '--ignore-window-size'
+             },
+        )),
+    ],
+}
+
+
+for suite in ANDROID_UNITTEST_DICT['opt_unittest_suites']:
+    if suite[0].startswith('reftest'):
+        continue
+    ANDROID_PLAIN_UNITTEST_DICT['opt_unittest_suites'].append(suite)
+
+for suite in ANDROID_PLAIN_REFTEST_DICT['opt_unittest_suites']:
+    ANDROID_PLAIN_UNITTEST_DICT['opt_unittest_suites'].append(suite)
+ANDROID_PANDA_UNITTEST_DICT = {
+    'opt_unittest_suites': [],
+    'debug_unittest_suites': [],
+}
+for suite in ANDROID_PLAIN_UNITTEST_DICT['opt_unittest_suites']:
+    if suite[0].startswith('reftest') or suite[0].startswith('plain-reftest'):
+        continue
+    ANDROID_PANDA_UNITTEST_DICT['opt_unittest_suites'].append(suite)
+
+# You must define opt_unittest_suites when enable_opt_unittests is True for a
+# platform. Likewise debug_unittest_suites for enable_debug_unittests
+PLATFORM_UNITTEST_VARS = {
+    'android': {
+        'product_name': 'fennec',
+        'app_name': 'browser',
+        'brand_name': 'Minefield',
+        'is_remote': True,
+        'host_utils_url': 'http://bm-remote.build.mozilla.org/tegra/tegra-host-utils.%%(foopy_type)s.742597.zip',
+        'enable_opt_unittests': True,
+        'enable_debug_unittests': False,
+        'remote_extras': ANDROID_UNITTEST_REMOTE_EXTRAS,
+        'tegra_android': deepcopy(ANDROID_PLAIN_UNITTEST_DICT),
+        'panda_android': deepcopy(ANDROID_PANDA_UNITTEST_DICT),
+    },
+    'android-armv6': {
+        'product_name': 'fennec',
+        'app_name': 'browser',
+        'brand_name': 'Minefield',
+        'is_remote': True,
+        'host_utils_url': 'http://bm-remote.build.mozilla.org/tegra/tegra-host-utils.%%(foopy_type)s.742597.zip',
+        'enable_opt_unittests': True,
+        'enable_debug_unittests': False,
+        'remote_extras': ANDROID_UNITTEST_REMOTE_EXTRAS,
+        'tegra_android-armv6': deepcopy(ANDROID_ARMV6_UNITTEST_DICT),
+    },
+    'android-noion': {
+        'product_name': 'fennec',
+        'app_name': 'browser',
+        'brand_name': 'Minefield',
+        'is_remote': True,
+        'host_utils_url': 'http://bm-remote.build.mozilla.org/tegra/tegra-host-utils.%%(foopy_type)s.742597.zip',
+        'enable_opt_unittests': True,
+        'enable_debug_unittests': False,
+        'remote_extras': ANDROID_UNITTEST_REMOTE_EXTRAS,
+        'tegra_android-noion': deepcopy(ANDROID_NOION_UNITTEST_DICT),
+    },
+}
+
+# Copy project branches into BRANCHES keys
+for branch in ACTIVE_PROJECT_BRANCHES:
+    BRANCHES[branch] = deepcopy(PROJECT_BRANCHES[branch])
+    if BRANCHES[branch].get('mobile_platforms'):
+        BRANCHES[branch]['platforms'] = deepcopy(BRANCHES[branch]['mobile_platforms'])
+
+# Copy unittest vars in first, then platform vars
+for branch in BRANCHES.keys():
+    for key, value in GLOBAL_VARS.items():
+        # In order to have things ride the trains we need to be able to
+        # override "global" things. Therefore, we shouldn't override anything
+        # that's already been set.
+        if key in BRANCHES[branch]:
+            continue
+        BRANCHES[branch][key] = deepcopy(value)
+
+    for key, value in BRANCH_UNITTEST_VARS.items():
+        # Don't override platforms if it's set and locked
+        if key == 'platforms' and 'platforms' in BRANCHES[branch] and BRANCHES[branch].get('lock_platforms'):
+            continue
+        BRANCHES[branch][key] = deepcopy(value)
+
+    for platform, platform_config in PLATFORM_UNITTEST_VARS.items():
+        if platform in BRANCHES[branch]['platforms']:
+            for key, value in platform_config.items():
+                value = deepcopy(value)
+                if isinstance(value, str):
+                    value = value % locals()
+                BRANCHES[branch]['platforms'][platform][key] = value
+
+    # Copy in local config
+    if branch in localconfig.BRANCHES:
+        for key, value in localconfig.BRANCHES[branch].items():
+            if key == 'platforms':
+                # Merge in these values
+                if 'platforms' not in BRANCHES[branch]:
+                    BRANCHES[branch]['platforms'] = {}
+
+                for platform, platform_config in value.items():
+                    for key, value in platform_config.items():
+                        value = deepcopy(value)
+                        if isinstance(value, str):
+                            value = value % locals()
+                        BRANCHES[branch]['platforms'][platform][key] = value
+            else:
+                BRANCHES[branch][key] = deepcopy(value)
+
+    # Merge in any project branch config for platforms
+    if branch in ACTIVE_PROJECT_BRANCHES and 'mobile_platforms' in PROJECT_BRANCHES[branch]:
+        for platform, platform_config in PROJECT_BRANCHES[branch]['mobile_platforms'].items():
+            if platform in PLATFORMS:
+                for key, value in platform_config.items():
+                    value = deepcopy(value)
+                    if isinstance(value, str):
+                        value = value % locals()
+                    BRANCHES[branch]['platforms'][platform][key] = value
+
+    for platform, platform_config in localconfig.PLATFORM_VARS.items():
+        if platform in BRANCHES[branch]['platforms']:
+            for key, value in platform_config.items():
+                value = deepcopy(value)
+                if isinstance(value, str):
+                    value = value % locals()
+                BRANCHES[branch]['platforms'][platform][key] = value
+
+########
+# Entries in BRANCHES for tests should be a tuple of:
+# - Number of tests to run per build
+# - Whether queue merging is on
+# - TalosFactory options
+# - Which platforms to run on
+
+# Let's load the defaults
+for branch in BRANCHES.keys():
+    BRANCHES[branch]['repo_path'] = branch
+    BRANCHES[branch]['branch_name'] = branch.title()
+    BRANCHES[branch]['mobile_branch_name'] = branch.title()
+    BRANCHES[branch]['build_branch'] = branch.title()
+    BRANCHES[branch]['enable_unittests'] = True
+    BRANCHES[branch]['talos_command'] = TALOS_CMD
+    BRANCHES[branch]['fetch_symbols'] = True
+    BRANCHES[branch]['fetch_release_symbols'] = False
+    BRANCHES[branch]['talos_from_source_code'] = True
+    BRANCHES[branch]['support_url_base'] = 'http://build.mozilla.org/talos'
+    loadTalosSuites(BRANCHES, SUITES, branch)
+    BRANCHES[branch]['pgo_strategy'] = None
+    BRANCHES[branch]['pgo_platforms'] = []
+
+# The following are exceptions to the defaults
+
+######## mozilla-central
+BRANCHES['mozilla-central']['branch_name'] = "Firefox"
+BRANCHES['mozilla-central']['repo_path'] = "mozilla-central"
+BRANCHES['mozilla-central']['mobile_branch_name'] = "Mobile"
+BRANCHES['mozilla-central']['mobile_talos_branch'] = "mobile"
+BRANCHES['mozilla-central']['build_branch'] = "1.9.2"
+BRANCHES['mozilla-central']['pgo_strategy'] = 'periodic'
+BRANCHES['mozilla-central']['pgo_platforms'] = []
+BRANCHES['mozilla-central']['platforms']['android']['enable_debug_unittests'] = True
+
+######### mozilla-release
+BRANCHES['mozilla-release']['release_tests'] = 5
+BRANCHES['mozilla-release']['repo_path'] = "releases/mozilla-release"
+BRANCHES['mozilla-release']['pgo_strategy'] = 'per-checkin'
+BRANCHES['mozilla-release']['pgo_platforms'] = []
+
+######### mozilla-beta
+BRANCHES['mozilla-beta']['release_tests'] = 5
+BRANCHES['mozilla-beta']['repo_path'] = "releases/mozilla-beta"
+BRANCHES['mozilla-beta']['pgo_strategy'] = 'per-checkin'
+BRANCHES['mozilla-beta']['pgo_platforms'] = []
+
+######### mozilla-aurora
+BRANCHES['mozilla-aurora']['repo_path'] = "releases/mozilla-aurora"
+BRANCHES['mozilla-aurora']['pgo_strategy'] = 'per-checkin'
+BRANCHES['mozilla-aurora']['pgo_platforms'] = []
+
+######## mozilla-esr10
+BRANCHES['mozilla-esr10']['pgo_strategy'] = 'per-checkin'
+BRANCHES['mozilla-esr10']['pgo_platforms'] = []
+BRANCHES['mozilla-esr10']['talos_from_source_code'] = False
+BRANCHES['mozilla-esr10']['release_tests'] = 5
+BRANCHES['mozilla-esr10']['repo_path'] = "releases/mozilla-esr10"
+
+######### mozilla-esr17
+BRANCHES['mozilla-esr17']['release_tests'] = 5
+BRANCHES['mozilla-esr17']['repo_path'] = "releases/mozilla-esr17"
+BRANCHES['mozilla-esr17']['pgo_strategy'] = 'per-checkin'
+BRANCHES['mozilla-esr17']['pgo_platforms'] = []
+
+######### mozilla-b2g18
+BRANCHES['mozilla-b2g18']['release_tests'] = 5
+BRANCHES['mozilla-b2g18']['repo_path'] = "releases/mozilla-b2g18"
+BRANCHES['mozilla-b2g18']['pgo_strategy'] = 'per-checkin'
+BRANCHES['mozilla-b2g18']['pgo_platforms'] = []
+
+######### mozilla-b2g18_v1_0_0
+BRANCHES['mozilla-b2g18_v1_0_0']['release_tests'] = 5
+BRANCHES['mozilla-b2g18_v1_0_0']['repo_path'] = "releases/mozilla-b2g18_v1_0_0"
+BRANCHES['mozilla-b2g18_v1_0_0']['pgo_strategy'] = 'per-checkin'
+BRANCHES['mozilla-b2g18_v1_0_0']['pgo_platforms'] = []
+
+######### mozilla-b2g18_v1_0_1
+BRANCHES['mozilla-b2g18_v1_0_1']['release_tests'] = 5
+BRANCHES['mozilla-b2g18_v1_0_1']['repo_path'] = "releases/mozilla-b2g18_v1_0_1"
+BRANCHES['mozilla-b2g18_v1_0_1']['pgo_strategy'] = 'per-checkin'
+BRANCHES['mozilla-b2g18_v1_0_1']['pgo_platforms'] = []
+
+######## try
+BRANCHES['try']['platforms']['android']['enable_debug_unittests'] = True
+BRANCHES['try']['pgo_strategy'] = 'try'
+BRANCHES['try']['pgo_platforms'] = []
+BRANCHES['try']['enable_try'] = True
+
+
+#-------------------------------------------------------------------------
+# MERGE day - Load reftests small for m-c based branches and exclude them for the rest
+#-------------------------------------------------------------------------
+for branch in ('mozilla-aurora', 'mozilla-beta', 'mozilla-release'):
+    BRANCHES[branch]["platforms"]["android"]["panda_android"]["opt_unittest_suites"] = deepcopy(ANDROID_UNITTEST_DICT["opt_unittest_suites"])
+    BRANCHES[branch]["platforms"]["android"]["tegra_android"]["opt_unittest_suites"] = deepcopy(ANDROID_UNITTEST_DICT["opt_unittest_suites"])
+#-------------------------------------------------------------------------
+# End Load reftests small for m-c based branches and exclude them for the rest
+#-------------------------------------------------------------------------
+
+
+#exclude android builds from running on non-cedar branches on pandas
+for branch in BRANCHES.keys():
+    if 'android' in BRANCHES[branch]['platforms'] and branch not in ("cedar", "mozilla-central", "try", "mozilla-inbound"):
+        del BRANCHES[branch]['platforms']['android']['panda_android']
+        BRANCHES[branch]['platforms']['android']['slave_platforms'] = ['tegra_android']
+
+######## generic branch variables for project branches
+for projectBranch in ACTIVE_PROJECT_BRANCHES:
+    branchConfig = PROJECT_BRANCHES[projectBranch]
+    loadDefaultValues(BRANCHES, projectBranch, branchConfig)
+    loadCustomTalosSuites(BRANCHES, SUITES, projectBranch, branchConfig)
+
+
+# XXX Bug 789373 hack - add android-noion until we have b2g testing
+# Delete all references to android-noion once we have b2g jsreftests not in an emulator.
+for branch in BRANCHES:
+    if branch not in ('mozilla-central', 'mozilla-inbound', 'mozilla-b2g18',
+                      'mozilla-b2g18_v1_0_0', 'mozilla-b2g18_v1_0_1', 'try'
+                      ):
+        if 'android-noion' in BRANCHES[branch]['platforms']:
+            del BRANCHES[branch]['platforms']['android-noion']
+
+
+if __name__ == "__main__":
+    import sys
+    import pprint
+
+    args = sys.argv[1:]
+
+    if len(args) > 0:
+        items = dict([(b, BRANCHES[b]) for b in args])
+    else:
+        items = dict(BRANCHES.items())
+
+    for k, v in sorted(items.iteritems()):
+        out = pprint.pformat(v)
+        for l in out.splitlines():
+            print '%s: %s' % (k, l)
+
+    for suite in sorted(SUITES):
+        out = pprint.pformat(SUITES[suite])
+        for l in out.splitlines():
+            print '%s: %s' % (suite, l)
--- a/mozilla-tests/preproduction_tests_master_localconfig.py
+++ b/mozilla-tests/preproduction_tests_master_localconfig.py
@@ -1,26 +1,28 @@
 c = BuildmasterConfig = {}
 c['slavePortnum'] = 9012
 
 from buildbot.status.html import WebStatus
 c['status'] = [
-        WebStatus(http_port=8012, allowForce=True)
+    WebStatus(http_port=8012, allowForce=True)
 ]
 
 c['buildbotURL'] = 'http://preproduction-master.srv.releng.scl3.mozilla.com:8012/'
 
 from buildbot import manhole
 c['manhole'] = manhole.PasswordManhole("tcp:1236:interface=127.0.0.1", "cltbld", "password")
 
 from config import BRANCHES, PLATFORMS, PROJECTS
 import thunderbird_config
 import b2g_config
+import mobile_config
 # Do everything!
 ACTIVE_BRANCHES = BRANCHES.keys()
 ACTIVE_THUNDERBIRD_BRANCHES = thunderbird_config.BRANCHES.keys()
 ACTIVE_B2G_BRANCHES = b2g_config.BRANCHES.keys()
+ACTIVE_MOBILE_BRANCHES = mobile_config.BRANCHES.keys()
 ACTIVE_PLATFORMS = dict((platform, None) for platform in PLATFORMS.keys())
 ACTIVE_THUNDERBIRD_PLATFORMS = dict((platform, None) for platform in thunderbird_config.PLATFORMS.keys())
-ACTIVE_B2G_PLATFORMS = dict((platform, None) for platform in b2g_config.PLATFORMS.keys())
+ACTIVE_MOBILE_PLATFORMS = dict((platform, None) for platform in mobile_config.PLATFORMS.keys())
 ACTIVE_PROJECTS = PROJECTS.keys()
 
 QUEUEDIR = "/dev/shm/queue"
--- a/mozilla-tests/preproduction_tests_scheduler_master_localconfig.py
+++ b/mozilla-tests/preproduction_tests_scheduler_master_localconfig.py
@@ -1,19 +1,22 @@
 c = BuildmasterConfig = {}
-c['slavePortnum'] = 9008 # No slaves should be connecting here
+c['slavePortnum'] = 9008  # No slaves should be connecting here
 
 from buildbot import manhole
 c['manhole'] = manhole.PasswordManhole("tcp:1233:interface=127.0.0.1", "cltbld", "password")
 
 from config import BRANCHES, PLATFORMS, PROJECTS
 import thunderbird_config
 import b2g_config
+import mobile_config
 # Do everything!
 ACTIVE_BRANCHES = BRANCHES.keys()
 ACTIVE_THUNDERBIRD_BRANCHES = thunderbird_config.BRANCHES.keys()
 ACTIVE_B2G_BRANCHES = b2g_config.BRANCHES.keys()
+ACTIVE_MOBILE_BRANCHES = mobile_config.BRANCHES.keys()
 ACTIVE_PLATFORMS = dict((platform, None) for platform in PLATFORMS.keys())
 ACTIVE_THUNDERBIRD_PLATFORMS = dict((platform, None) for platform in thunderbird_config.PLATFORMS.keys())
 ACTIVE_B2G_PLATFORMS = dict((platform, None) for platform in b2g_config.PLATFORMS.keys())
+ACTIVE_MOBILE_PLATFORMS = dict((platform, None) for platform in mobile_config.PLATFORMS.keys())
 ACTIVE_PROJECTS = PROJECTS.keys()
 
 QUEUEDIR = "/dev/shm/queue"
--- a/mozilla-tests/scheduler_localconfig.py
+++ b/mozilla-tests/scheduler_localconfig.py
@@ -3,24 +3,26 @@ from buildbot import manhole
 
 master_config = json.load(open('master_config.json'))
 
 c = BuildmasterConfig = {}
 c['slavePortnum'] = master_config.get('pb_port', None)
 
 if 'ssh_port' in master_config:
     c['manhole'] = manhole.PasswordManhole(
-            "tcp:%(ssh_port)i:interface=127.0.0.1" % master_config,
-            "cltbld", "password")
+        "tcp:%(ssh_port)i:interface=127.0.0.1" % master_config,
+        "cltbld", "password")
 
 from config import BRANCHES, PLATFORMS, PROJECTS
 import thunderbird_config
 import b2g_config
+import mobile_config
 # Do everything!
 ACTIVE_BRANCHES = BRANCHES.keys()
 ACTIVE_THUNDERBIRD_BRANCHES = thunderbird_config.BRANCHES.keys()
 ACTIVE_B2G_BRANCHES = b2g_config.BRANCHES.keys()
+ACTIVE_MOBILE_BRANCHES = mobile_config.BRANCHES.keys()
 ACTIVE_PLATFORMS = dict((platform, None) for platform in PLATFORMS.keys())
 ACTIVE_THUNDERBIRD_PLATFORMS = dict((platform, None) for platform in thunderbird_config.PLATFORMS.keys())
-ACTIVE_B2G_PLATFORMS = dict((platform, None) for platform in b2g_config.PLATFORMS.keys())
+ACTIVE_MOBILE_PLATFORMS = dict((platform, None) for platform in mobile_config.PLATFORMS.keys())
 ACTIVE_PROJECTS = PROJECTS.keys()
 
 QUEUEDIR = "/dev/shm/queue"
--- a/mozilla-tests/scheduler_master.cfg
+++ b/mozilla-tests/scheduler_master.cfg
@@ -2,22 +2,24 @@
 from copy import deepcopy
 
 # import/reload dance so that reconfigs work
 import buildbotcustom.misc
 import master_common
 import config
 import thunderbird_config
 import b2g_config
+import mobile_config
 import master_localconfig
 reload(buildbotcustom.misc)
 reload(master_common)
 reload(config)
 reload(thunderbird_config)
 reload(b2g_config)
+reload(mobile_config)
 reload(master_localconfig)
 
 from master_common import BuildmasterConfig
 c = BuildmasterConfig
 for key, value in master_localconfig.BuildmasterConfig.items():
     if key in c:
         c[key].extend(value)
     else:
@@ -32,49 +34,63 @@ from config import BRANCHES, PLATFORMS, 
 from thunderbird_config import BRANCHES as THUNDERBIRD_BRANCHES
 from thunderbird_config import PLATFORMS as THUNDERBIRD_PLATFORMS
 from thunderbird_config import SUITES as THUNDERBIRD_SUITES
 from thunderbird_config import BRANCH_UNITTEST_VARS as THUNDERBIRD_BRANCH_UNITTEST_VARS
 from b2g_config import BRANCHES as B2G_BRANCHES
 from b2g_config import PLATFORMS as B2G_PLATFORMS
 from b2g_config import SUITES as B2G_SUITES
 from b2g_config import BRANCH_UNITTEST_VARS as B2G_BRANCH_UNITTEST_VARS
+from mobile_config import BRANCHES as MOBILE_BRANCHES
+from mobile_config import PLATFORMS as MOBILE_PLATFORMS
+from mobile_config import SUITES as MOBILE_SUITES
+from mobile_config import BRANCH_UNITTEST_VARS as MOBILE_BRANCH_UNITTEST_VARS
 from master_localconfig import ACTIVE_BRANCHES, ACTIVE_PLATFORMS, ACTIVE_PROJECTS, \
     ACTIVE_THUNDERBIRD_BRANCHES, ACTIVE_THUNDERBIRD_PLATFORMS, \
-    ACTIVE_B2G_BRANCHES, ACTIVE_B2G_PLATFORMS
+    ACTIVE_B2G_BRANCHES, ACTIVE_B2G_PLATFORMS, \
+    ACTIVE_MOBILE_BRANCHES, ACTIVE_MOBILE_PLATFORMS
 
 from buildbotcustom.misc import generateTalosBranchObjects, generateProjectObjects, mergeBuildObjects
 
 for p in ACTIVE_PLATFORMS.keys():
     ACTIVE_PLATFORMS[p] = deepcopy(PLATFORMS[p])
 
 for p in ACTIVE_THUNDERBIRD_PLATFORMS.keys():
     ACTIVE_THUNDERBIRD_PLATFORMS[p] = deepcopy(THUNDERBIRD_PLATFORMS[p])
 
 for p in ACTIVE_B2G_PLATFORMS.keys():
     ACTIVE_B2G_PLATFORMS[p] = deepcopy(B2G_PLATFORMS[p])
 
+for p in ACTIVE_MOBILE_PLATFORMS.keys():
+    ACTIVE_MOBILE_PLATFORMS[p] = deepcopy(MOBILE_PLATFORMS[p])
+
 buildObjects = {}
 
 for branch in ACTIVE_BRANCHES:
     talosObjects = generateTalosBranchObjects(branch, BRANCHES[branch],
-                                               ACTIVE_PLATFORMS, SUITES,
-                                               BRANCH_UNITTEST_VARS['platforms'])
+                                              ACTIVE_PLATFORMS, SUITES,
+                                              BRANCH_UNITTEST_VARS['platforms'])
     buildObjects = mergeBuildObjects(buildObjects, talosObjects)
 
 for branch in ACTIVE_THUNDERBIRD_BRANCHES:
     talosObjects = generateTalosBranchObjects(branch, THUNDERBIRD_BRANCHES[branch],
-                                               ACTIVE_THUNDERBIRD_PLATFORMS, THUNDERBIRD_SUITES,
-                                               THUNDERBIRD_BRANCH_UNITTEST_VARS['platforms'])
+                                              ACTIVE_THUNDERBIRD_PLATFORMS, THUNDERBIRD_SUITES,
+                                              THUNDERBIRD_BRANCH_UNITTEST_VARS['platforms'])
     buildObjects = mergeBuildObjects(buildObjects, talosObjects)
 
 for branch in ACTIVE_B2G_BRANCHES:
     talosObjects = generateTalosBranchObjects(branch, B2G_BRANCHES[branch],
-                                               ACTIVE_B2G_PLATFORMS, B2G_SUITES,
-                                               B2G_BRANCH_UNITTEST_VARS['platforms'])
+                                              ACTIVE_B2G_PLATFORMS, B2G_SUITES,
+                                              B2G_BRANCH_UNITTEST_VARS['platforms'])
+    buildObjects = mergeBuildObjects(buildObjects, talosObjects)
+
+for branch in ACTIVE_MOBILE_BRANCHES:
+    talosObjects = generateTalosBranchObjects(branch, MOBILE_BRANCHES[branch],
+                                              ACTIVE_MOBILE_PLATFORMS, MOBILE_SUITES,
+                                              MOBILE_BRANCH_UNITTEST_VARS['platforms'])
     buildObjects = mergeBuildObjects(buildObjects, talosObjects)
 
 for project in ACTIVE_PROJECTS:
     projectObjects = generateProjectObjects(project, PROJECTS[project], SLAVES)
     buildObjects = mergeBuildObjects(buildObjects, projectObjects)
 
 # We only want the schedulers and change sources
 c['schedulers'].extend(buildObjects['schedulers'])
@@ -96,13 +112,13 @@ if hasattr(passwords, 'PULSE_PASSWORD'):
     import re
     import buildbotcustom.status.pulse
     reload(buildbotcustom.status.pulse)
     from buildbotcustom.status.pulse import PulseStatus
     c['status'].append(PulseStatus(
         pulseQueue,
         ignoreBuilders=[re.compile('fuzzer-.*')],
         send_logs=False,
-        ))
+    ))
 
 # c is shorthand for BuildmasterConfig, so make sure they still refer to the
 # same thing
 assert c is BuildmasterConfig
--- a/mozilla-tests/tests_localconfig.py
+++ b/mozilla-tests/tests_localconfig.py
@@ -1,44 +1,51 @@
 from buildbot.util import json
 from buildbot.status.html import WebStatus
 from buildbot import manhole
 from thunderbird_config import PLATFORMS as THUNDERBIRD_PLATFORMS
 from b2g_config import PLATFORMS as B2G_PLATFORMS
+from mobile_config import PLATFORMS as MOBILE_PLATFORMS
 
 master_config = json.load(open('master_config.json'))
 
 c = BuildmasterConfig = {}
 c['slavePortnum'] = master_config.get('pb_port', None)
 c['status'] = []
 
 if 'http_port' in master_config:
     c['status'].append(
-            WebStatus(http_port=master_config['http_port'], allowForce=True))
+        WebStatus(http_port=master_config['http_port'], allowForce=True))
     c['buildbotURL'] = 'http://%(hostname)s:%(http_port)i/' % master_config
 
 if 'ssh_port' in master_config:
     c['manhole'] = manhole.PasswordManhole(
-            "tcp:%(ssh_port)i:interface=127.0.0.1" % master_config,
-            "cltbld", "password")
+        "tcp:%(ssh_port)i:interface=127.0.0.1" % master_config,
+        "cltbld", "password")
 
 from config import BRANCHES, PLATFORMS, PROJECTS
 import thunderbird_config
 import b2g_config
+import mobile_config
 # Do everything!
 ACTIVE_BRANCHES = BRANCHES.keys()
 ACTIVE_THUNDERBIRD_BRANCHES = thunderbird_config.BRANCHES.keys()
 ACTIVE_B2G_BRANCHES = b2g_config.BRANCHES.keys()
+ACTIVE_MOBILE_BRANCHES = mobile_config.BRANCHES.keys()
 if 'limit_fx_platforms' in master_config:
-    ACTIVE_PLATFORMS = dict((p,None) for p in master_config['limit_fx_platforms'])
+    ACTIVE_PLATFORMS = dict((p, None) for p in master_config['limit_fx_platforms'])
 else:
-    ACTIVE_PLATFORMS = dict((k,None) for k in PLATFORMS.keys())
+    ACTIVE_PLATFORMS = dict((k, None) for k in PLATFORMS.keys())
 if 'limit_tb_platforms' in master_config:
-    ACTIVE_THUNDERBIRD_PLATFORMS = dict((p,None) for p in master_config['limit_tb_platforms'])
+    ACTIVE_THUNDERBIRD_PLATFORMS = dict((p, None) for p in master_config['limit_tb_platforms'])
 else:
-    ACTIVE_THUNDERBIRD_PLATFORMS = dict((k,None) for k in THUNDERBIRD_PLATFORMS.keys())
+    ACTIVE_THUNDERBIRD_PLATFORMS = dict((k, None) for k in THUNDERBIRD_PLATFORMS.keys())
 if 'limit_b2g_platforms' in master_config:
-    ACTIVE_B2G_PLATFORMS = dict((p,None) for p in master_config['limit_b2g_platforms'])
+    ACTIVE_B2G_PLATFORMS = dict((p, None) for p in master_config['limit_b2g_platforms'])
 else:
-    ACTIVE_B2G_PLATFORMS = dict((k,None) for k in B2G_PLATFORMS.keys())
+    ACTIVE_B2G_PLATFORMS = dict((k, None) for k in B2G_PLATFORMS.keys())
+if 'limit_mobile_platforms' in master_config:
+    ACTIVE_MOBILE_PLATFORMS = dict((p, None) for p in master_config['limit_mobile_platforms'])
+else:
+    ACTIVE_MOBILE_PLATFORMS = dict((k, None) for k in MOBILE_PLATFORMS.keys())
 ACTIVE_PROJECTS = PROJECTS.keys()
 
 QUEUEDIR = master_config.get("queuedir", "/dev/shm/queue")
--- a/mozilla-tests/tests_master.cfg
+++ b/mozilla-tests/tests_master.cfg
@@ -1,26 +1,29 @@
 # vim: ft=python
-import os, sys
+import os
+import sys
 from copy import deepcopy
 
 # import/reload dance so that reconfigs work
 import buildbotcustom.misc
 import buildbotcustom.status.queued_command
 import master_common
 import config
 import thunderbird_config
 import b2g_config
+import mobile_config
 import master_localconfig
 reload(buildbotcustom.misc)
 reload(buildbotcustom.status.queued_command)
 reload(master_common)
 reload(config)
 reload(thunderbird_config)
 reload(b2g_config)
+reload(mobile_config)
 reload(master_localconfig)
 
 from master_common import BuildmasterConfig
 c = BuildmasterConfig
 for key, value in master_localconfig.BuildmasterConfig.items():
     if key in c:
         c[key].extend(value)
     else:
@@ -40,97 +43,117 @@ from config import BRANCHES, PLATFORMS, 
 from thunderbird_config import BRANCHES as THUNDERBIRD_BRANCHES
 from thunderbird_config import PLATFORMS as THUNDERBIRD_PLATFORMS
 from thunderbird_config import SUITES as THUNDERBIRD_SUITES
 from thunderbird_config import BRANCH_UNITTEST_VARS as THUNDERBIRD_BRANCH_UNITTEST_VARS
 from b2g_config import BRANCHES as B2G_BRANCHES
 from b2g_config import PLATFORMS as B2G_PLATFORMS
 from b2g_config import SUITES as B2G_SUITES
 from b2g_config import BRANCH_UNITTEST_VARS as B2G_BRANCH_UNITTEST_VARS
+from mobile_config import BRANCHES as MOBILE_BRANCHES
+from mobile_config import PLATFORMS as MOBILE_PLATFORMS
+from mobile_config import SUITES as MOBILE_SUITES
+from mobile_config import BRANCH_UNITTEST_VARS as MOBILE_BRANCH_UNITTEST_VARS
 from master_localconfig import ACTIVE_BRANCHES, ACTIVE_PLATFORMS, ACTIVE_PROJECTS, \
     ACTIVE_THUNDERBIRD_BRANCHES, ACTIVE_THUNDERBIRD_PLATFORMS, \
-    ACTIVE_B2G_BRANCHES, ACTIVE_B2G_PLATFORMS
+    ACTIVE_B2G_BRANCHES, ACTIVE_B2G_PLATFORMS, \
+    ACTIVE_MOBILE_BRANCHES, ACTIVE_MOBILE_PLATFORMS
 
 import BuildSlaves
 reload(BuildSlaves)
 from BuildSlaves import SlavePasswords
 from buildbot.buildslave import BuildSlave
 
 # Handle active platforms - Firefox
 all_slave_platforms = []
 for p in ACTIVE_PLATFORMS.keys():
-     ACTIVE_PLATFORMS[p] = deepcopy(PLATFORMS[p])
-     all_slave_platforms.extend(PLATFORMS[p]['slave_platforms'])
+    ACTIVE_PLATFORMS[p] = deepcopy(PLATFORMS[p])
+    all_slave_platforms.extend(PLATFORMS[p]['slave_platforms'])
 
 # Handle active platforms - Thunderbird
 tb_all_slave_platforms = []
 for p in ACTIVE_THUNDERBIRD_PLATFORMS.keys():
     #XXX we shouldn't have to filter these platforms
     if p in THUNDERBIRD_PLATFORMS:
         ACTIVE_THUNDERBIRD_PLATFORMS[p] = deepcopy(THUNDERBIRD_PLATFORMS[p])
         tb_all_slave_platforms.extend(THUNDERBIRD_PLATFORMS[p]['slave_platforms'])
 
 # Handle active platforms - B2G
 b2g_all_slave_platforms = []
 for p in ACTIVE_B2G_PLATFORMS.keys():
     #XXX we shouldn't have to filter these platforms
     if p in B2G_PLATFORMS:
         ACTIVE_B2G_PLATFORMS[p] = deepcopy(B2G_PLATFORMS[p])
-        tb_all_slave_platforms.extend(B2G_PLATFORMS[p]['slave_platforms'])
+        b2g_all_slave_platforms.extend(B2G_PLATFORMS[p]['slave_platforms'])
+
+# Handle active platforms - MOBILE
+mobile_all_slave_platforms = []
+for p in ACTIVE_MOBILE_PLATFORMS.keys():
+    #XXX we shouldn't have to filter these platforms
+    if p in MOBILE_PLATFORMS:
+        ACTIVE_MOBILE_PLATFORMS[p] = deepcopy(MOBILE_PLATFORMS[p])
+        mobile_all_slave_platforms.extend(MOBILE_PLATFORMS[p]['slave_platforms'])
 
 # Remove non-active platform entries for projects - Firefox only
 for p in PROJECTS:
     if 'platforms' in PROJECTS[p]:
         for project_slave_platform in PROJECTS[p]['platforms'].keys():
             if project_slave_platform not in all_slave_platforms:
                 del PROJECTS[p]['platforms'][project_slave_platform]
 
 for slave_platform, slaves in SLAVES.items():
     # If this platform isn't active, skip it!
-    if slave_platform not in all_slave_platforms + tb_all_slave_platforms + b2g_all_slave_platforms:
+    if slave_platform not in all_slave_platforms + tb_all_slave_platforms + b2g_all_slave_platforms + mobile_all_slave_platforms:
         continue
     for name in sorted(slaves.keys()):
         c['slaves'].append(BuildSlave(name, SlavePasswords[slave_platform], max_builds=1,
                                       properties=slaves[name]))
 
 # I have no idea why this block exists - bhearsum
 if 'try' in ACTIVE_BRANCHES:
     for slave_platform, slaves in TRY_SLAVES.items():
         # If this platform isn't active, skip it!
-        if slave_platform not in all_slave_platforms + tb_all_slave_platforms + b2g_all_slave_platforms:
+        if slave_platform not in all_slave_platforms + tb_all_slave_platforms + b2g_all_slave_platforms + mobile_all_slave_platforms:
             continue
         for name in sorted(slaves.keys()):
             c['slaves'].append(BuildSlave(name, SlavePasswords[slave_platform], max_builds=1,
                                           properties=slaves[name]))
 
 from buildbotcustom.misc import generateTalosBranchObjects, generateProjectObjects, \
-         mergeBuildObjects
+    mergeBuildObjects
 
 from buildbot.schedulers.triggerable import Triggerable
 
 buildObjects = {}
 
 for branch in ACTIVE_BRANCHES:
     talosObjects = generateTalosBranchObjects(branch, BRANCHES[branch],
-                                                ACTIVE_PLATFORMS, BRANCHES[branch].get('suites', SUITES),
-                                                BRANCH_UNITTEST_VARS['platforms'])
+                                              ACTIVE_PLATFORMS, BRANCHES[branch].get('suites', SUITES),
+                                              BRANCH_UNITTEST_VARS['platforms'])
     buildObjects = mergeBuildObjects(buildObjects, talosObjects)
 
 for branch in ACTIVE_THUNDERBIRD_BRANCHES:
     talosObjects = generateTalosBranchObjects(branch, THUNDERBIRD_BRANCHES[branch],
-                                                ACTIVE_THUNDERBIRD_PLATFORMS,
-                                                THUNDERBIRD_BRANCHES[branch].get('suites', THUNDERBIRD_SUITES),
-                                                THUNDERBIRD_BRANCH_UNITTEST_VARS['platforms'])
+                                              ACTIVE_THUNDERBIRD_PLATFORMS,
+                                              THUNDERBIRD_BRANCHES[branch].get('suites', THUNDERBIRD_SUITES),
+                                              THUNDERBIRD_BRANCH_UNITTEST_VARS['platforms'])
     buildObjects = mergeBuildObjects(buildObjects, talosObjects)
 
 for branch in ACTIVE_B2G_BRANCHES:
     talosObjects = generateTalosBranchObjects(branch, B2G_BRANCHES[branch],
-                                                ACTIVE_B2G_PLATFORMS,
-                                                B2G_BRANCHES[branch].get('suites', B2G_SUITES),
-                                                B2G_BRANCH_UNITTEST_VARS['platforms'])
+                                              ACTIVE_B2G_PLATFORMS,
+                                              B2G_BRANCHES[branch].get('suites', B2G_SUITES),
+                                              B2G_BRANCH_UNITTEST_VARS['platforms'])
+    buildObjects = mergeBuildObjects(buildObjects, talosObjects)
+
+for branch in ACTIVE_MOBILE_BRANCHES:
+    talosObjects = generateTalosBranchObjects(branch, MOBILE_BRANCHES[branch],
+                                              ACTIVE_MOBILE_PLATFORMS,
+                                              MOBILE_BRANCHES[branch].get('suites', MOBILE_SUITES),
+                                              MOBILE_BRANCH_UNITTEST_VARS['platforms'])
     buildObjects = mergeBuildObjects(buildObjects, talosObjects)
 
 for project in ACTIVE_PROJECTS:
     projectObjects = generateProjectObjects(project, PROJECTS[project], SLAVES)
     buildObjects = mergeBuildObjects(buildObjects, projectObjects)
 
 # We only want builders, status objects
 c['builders'].extend(buildObjects['builders'])
@@ -159,17 +182,17 @@ if hasattr(passwords, 'PULSE_PASSWORD'):
     import re
     import buildbotcustom.status.pulse
     reload(buildbotcustom.status.pulse)
     from buildbotcustom.status.pulse import PulseStatus
     c['status'].append(PulseStatus(
         pulseQueue,
         ignoreBuilders=[re.compile('fuzzer-.*')],
         send_logs=False,
-        ))
+    ))
 
 # c is shorthand for BuildmasterConfig, so make sure they still refer to the
 # same thing
 assert c is BuildmasterConfig
 
 # Check that all our builders have branch, platform and product set
 for b in c['builders']:
     assert 'properties' in b, b
--- a/mozilla-tests/thunderbird_config.py
+++ b/mozilla-tests/thunderbird_config.py
@@ -427,32 +427,25 @@ for branch in ['comm-central', 'try-comm
         BRANCHES[branch]['platforms']['macosx64']['slave_platforms'] = ['snowleopard', 'lion', 'mountainlion']
 #-------------------------------------------------------------------------
 # End disable leopard tests for TB17 onwards
 #-------------------------------------------------------------------------
 
 if __name__ == "__main__":
     import sys
     import pprint
-    from buildbot.process.properties import WithProperties
-
-    class BBPrettyPrinter(pprint.PrettyPrinter):
-        def format(self, object, context, maxlevels, level):
-            if isinstance(object, WithProperties):
-                return pprint.PrettyPrinter.format(self, object.fmtstring, context, maxlevels, level)
-            return pprint.PrettyPrinter.format(self, object, context, maxlevels, level)
 
     args = sys.argv[1:]
 
     if len(args) > 0:
-        branches = args
+        items = dict([(b, BRANCHES[b]) for b in args])
     else:
-        branches = BRANCHES.keys()
+        items = dict(BRANCHES.items())
 
-    pp = BBPrettyPrinter()
-    for branch in branches:
-        print branch
-        pp.pprint(BRANCHES[branch])
+    for k, v in sorted(items.iteritems()):
+        out = pprint.pformat(v)
+        for l in out.splitlines():
+            print '%s: %s' % (k, l)
 
-    for suite in SUITES:
-        print suite
-        pp.pprint(SUITES[suite])
-
+    for suite in sorted(SUITES):
+        out = pprint.pformat(SUITES[suite])
+        for l in out.splitlines():
+            print '%s: %s' % (suite, l)
--- a/mozilla-tests/universal_master_sqlite.cfg
+++ b/mozilla-tests/universal_master_sqlite.cfg
@@ -1,26 +1,29 @@
 # vim: ft=python
-import os, sys
+import os
+import sys
 from copy import deepcopy
 
 # import/reload dance so that reconfigs work
 import buildbotcustom.misc
 import buildbotcustom.status.queued_command
 import master_common
 import config
 import thunderbird_config
 import b2g_config
+import mobile_config
 import master_localconfig
 reload(buildbotcustom.misc)
 reload(buildbotcustom.status.queued_command)
 reload(master_common)
 reload(config)
 reload(thunderbird_config)
 reload(b2g_config)
+reload(mobile_config)
 reload(master_localconfig)
 
 from master_common import BuildmasterConfig
 c = BuildmasterConfig
 for key, value in master_localconfig.BuildmasterConfig.items():
     if key in c:
         c[key].extend(value)
     else:
@@ -40,94 +43,114 @@ from config import BRANCHES, PLATFORMS, 
 from thunderbird_config import BRANCHES as THUNDERBIRD_BRANCHES
 from thunderbird_config import PLATFORMS as THUNDERBIRD_PLATFORMS
 from thunderbird_config import BRANCH_UNITTEST_VARS as THUNDERBIRD_BRANCH_UNITTEST_VARS
 from thunderbird_config import SUITES as THUNDERBIRD_SUITES
 from b2g_config import BRANCHES as B2G_BRANCHES
 from b2g_config import PLATFORMS as B2G_PLATFORMS
 from b2g_config import BRANCH_UNITTEST_VARS as B2G_BRANCH_UNITTEST_VARS
 from b2g_config import SUITES as B2G_SUITES
+from mobile_config import BRANCHES as MOBILE_BRANCHES
+from mobile_config import PLATFORMS as MOBILE_PLATFORMS
+from mobile_config import BRANCH_UNITTEST_VARS as MOBILE_BRANCH_UNITTEST_VARS
+from mobile_config import SUITES as MOBILE_SUITES
 from master_localconfig import ACTIVE_BRANCHES, ACTIVE_PLATFORMS, ACTIVE_PROJECTS, \
     ACTIVE_THUNDERBIRD_BRANCHES, ACTIVE_THUNDERBIRD_PLATFORMS, \
-    ACTIVE_B2G_BRANCHES, ACTIVE_B2G_PLATFORMS
+    ACTIVE_B2G_BRANCHES, ACTIVE_B2G_PLATFORMS, \
+    ACTIVE_MOBILE_BRANCHES, ACTIVE_MOBILE_PLATFORMS
 
 import BuildSlaves
 reload(BuildSlaves)
 from BuildSlaves import SlavePasswords
 from buildbot.buildslave import BuildSlave
 
 # Handle active platforms - Firefox
 all_slave_platforms = []
 for p in ACTIVE_PLATFORMS.keys():
-     ACTIVE_PLATFORMS[p] = deepcopy(PLATFORMS[p])
-     all_slave_platforms.extend(PLATFORMS[p]['slave_platforms'])
+    ACTIVE_PLATFORMS[p] = deepcopy(PLATFORMS[p])
+    all_slave_platforms.extend(PLATFORMS[p]['slave_platforms'])
 
 # Handle active platforms - Thunderbird
 tb_all_slave_platforms = []
 for p in ACTIVE_THUNDERBIRD_PLATFORMS.keys():
-     #XXX we shouldn't have to filter these platforms
-     if p in THUNDERBIRD_PLATFORMS:
-         ACTIVE_THUNDERBIRD_PLATFORMS[p] = deepcopy(THUNDERBIRD_PLATFORMS[p])
-         tb_all_slave_platforms.extend(THUNDERBIRD_PLATFORMS[p]['slave_platforms'])
+    #XXX we shouldn't have to filter these platforms
+    if p in THUNDERBIRD_PLATFORMS:
+        ACTIVE_THUNDERBIRD_PLATFORMS[p] = deepcopy(THUNDERBIRD_PLATFORMS[p])
+        tb_all_slave_platforms.extend(THUNDERBIRD_PLATFORMS[p]['slave_platforms'])
 
 # Handle active platforms - B2G
 b2g_all_slave_platforms = []
 for p in ACTIVE_B2G_PLATFORMS.keys():
-     #XXX we shouldn't have to filter these platforms
-     if p in B2G_PLATFORMS:
-         ACTIVE_B2G_PLATFORMS[p] = deepcopy(B2G_PLATFORMS[p])
-         b2g_all_slave_platforms.extend(B2G_PLATFORMS[p]['slave_platforms'])
+    #XXX we shouldn't have to filter these platforms
+    if p in B2G_PLATFORMS:
+        ACTIVE_B2G_PLATFORMS[p] = deepcopy(B2G_PLATFORMS[p])
+        b2g_all_slave_platforms.extend(B2G_PLATFORMS[p]['slave_platforms'])
+
+# Handle active platforms - MOBILE
+mobile_all_slave_platforms = []
+for p in ACTIVE_MOBILE_PLATFORMS.keys():
+    #XXX we shouldn't have to filter these platforms
+    if p in MOBILE_PLATFORMS:
+        ACTIVE_MOBILE_PLATFORMS[p] = deepcopy(MOBILE_PLATFORMS[p])
+        mobile_all_slave_platforms.extend(MOBILE_PLATFORMS[p]['slave_platforms'])
 
 # Remove non-active platform entries for projects
 for p in PROJECTS:
     if 'platforms' in PROJECTS[p]:
         for project_slave_platform in PROJECTS[p]['platforms'].keys():
             if project_slave_platform not in all_slave_platforms:
                 del PROJECTS[p]['platforms'][project_slave_platform]
 
 for slave_platform, slaves in SLAVES.items():
     # If this platform isn't active, skip it!
-    if slave_platform not in all_slave_platforms + tb_all_slave_platforms + b2g_all_slave_platforms:
+    if slave_platform not in all_slave_platforms + tb_all_slave_platforms + b2g_all_slave_platforms + mobile_all_slave_platforms:
         continue
     for name in sorted(slaves.keys()):
         c['slaves'].append(BuildSlave(name, SlavePasswords[slave_platform], max_builds=1,
                                       properties=slaves[name]))
 
 if 'try' in ACTIVE_BRANCHES:
     for slave_platform, slaves in TRY_SLAVES.items():
         # If this platform isn't active, skip it!
-        if slave_platform not in all_slave_platforms + tb_all_slave_platforms + b2g_all_slave_platforms:
+        if slave_platform not in all_slave_platforms + tb_all_slave_platforms + b2g_all_slave_platforms + mobile_all_slave_platforms:
             continue
         for name in sorted(slaves.keys()):
             c['slaves'].append(BuildSlave(name, SlavePasswords[slave_platform], max_builds=1,
                                           properties=slaves[name]))
 
 from buildbotcustom.misc import generateTalosBranchObjects, generateProjectObjects, \
-         mergeBuildObjects
+    mergeBuildObjects
 
 buildObjects = {}
 
 for branch in ACTIVE_BRANCHES:
     talosObjects = generateTalosBranchObjects(branch, BRANCHES[branch],
-                                                ACTIVE_PLATFORMS, BRANCHES[branch].get('suites', SUITES),
-                                                BRANCH_UNITTEST_VARS['platforms'])
+                                              ACTIVE_PLATFORMS, BRANCHES[branch].get('suites', SUITES),
+                                              BRANCH_UNITTEST_VARS['platforms'])
     buildObjects = mergeBuildObjects(buildObjects, talosObjects)
 
 for branch in ACTIVE_THUNDERBIRD_BRANCHES:
     talosObjects = generateTalosBranchObjects(branch, THUNDERBIRD_BRANCHES[branch],
-                                                ACTIVE_THUNDERBIRD_PLATFORMS,
-                                                THUNDERBIRD_BRANCHES[branch].get('suites', THUNDERBIRD_SUITES),
-                                                THUNDERBIRD_BRANCH_UNITTEST_VARS['platforms'])
+                                              ACTIVE_THUNDERBIRD_PLATFORMS,
+                                              THUNDERBIRD_BRANCHES[branch].get('suites', THUNDERBIRD_SUITES),
+                                              THUNDERBIRD_BRANCH_UNITTEST_VARS['platforms'])
     buildObjects = mergeBuildObjects(buildObjects, talosObjects)
 
 for branch in ACTIVE_B2G_BRANCHES:
     talosObjects = generateTalosBranchObjects(branch, B2G_BRANCHES[branch],
-                                                ACTIVE_B2G_PLATFORMS,
-                                                B2G_BRANCHES[branch].get('suites', B2G_SUITES),
-                                                B2G_BRANCH_UNITTEST_VARS['platforms'])
+                                              ACTIVE_B2G_PLATFORMS,
+                                              B2G_BRANCHES[branch].get('suites', B2G_SUITES),
+                                              B2G_BRANCH_UNITTEST_VARS['platforms'])
+    buildObjects = mergeBuildObjects(buildObjects, talosObjects)
+
+for branch in ACTIVE_MOBILE_BRANCHES:
+    talosObjects = generateTalosBranchObjects(branch, MOBILE_BRANCHES[branch],
+                                              ACTIVE_MOBILE_PLATFORMS,
+                                              MOBILE_BRANCHES[branch].get('suites', MOBILE_SUITES),
+                                              MOBILE_BRANCH_UNITTEST_VARS['platforms'])
     buildObjects = mergeBuildObjects(buildObjects, talosObjects)
 
 for project in ACTIVE_PROJECTS:
     projectObjects = generateProjectObjects(project, PROJECTS[project], SLAVES)
     buildObjects = mergeBuildObjects(buildObjects, projectObjects)
 
 c['builders'].extend(buildObjects['builders'])
 c['status'].extend(buildObjects['status'])
@@ -150,17 +173,17 @@ if hasattr(passwords, 'PULSE_PASSWORD'):
     import re
     import buildbotcustom.status.pulse
     reload(buildbotcustom.status.pulse)
     from buildbotcustom.status.pulse import PulseStatus
     c['status'].append(PulseStatus(
         pulseQueue,
         ignoreBuilders=[re.compile('fuzzer-.*')],
         send_logs=False,
-        ))
+    ))
 
 # c is shorthand for BuildmasterConfig, so make sure they still refer to the
 # same thing
 assert c is BuildmasterConfig
 
 # Check that all our builders have branch, platform and product set
 for b in c['builders']:
     assert 'properties' in b, b
@@ -173,13 +196,13 @@ for b in c['builders']:
 for b in c['builders']:
     for s in b['slavenames']:
         _buildersBySlave[s] = _buildersBySlave.get(s, 0) + 1
 
 for s, count in _buildersBySlave.items():
     # There are around 12 other PB refs used between the master and slave that
     # aren't builders
     builderLimit = 2048 - 12
-    pct_of_max = int(float(count)/float(builderLimit)*100)
+    pct_of_max = int(float(count) / float(builderLimit) * 100)
     print "%s has %i builders; limit is %i; %d percent of max" % (s, count, builderLimit, pct_of_max)
     assert count <= builderLimit, "%s has %i builders; limit is %i" % (s, count, builderLimit)
 
 del _buildersBySlave
--- a/mozilla/b2g_config.py
+++ b/mozilla/b2g_config.py
@@ -1064,12 +1064,12 @@ if __name__ == "__main__":
 
     args = sys.argv[1:]
 
     if len(args) > 0:
         items = dict([(b, BRANCHES[b]) for b in args])
     else:
         items = BRANCHES
 
-    for k, v in items.iteritems():
+    for k, v in sorted(items.iteritems()):
         out = pprint.pformat(v)
         for l in out.splitlines():
              print '%s: %s' % (k, l)
--- a/mozilla/config.py
+++ b/mozilla/config.py
@@ -1309,25 +1309,28 @@ BRANCHES = {
     },
     'try': {
     },
 }
 
 # Copy project branches into BRANCHES keys
 for branch in ACTIVE_PROJECT_BRANCHES:
     BRANCHES[branch] = deepcopy(PROJECT_BRANCHES[branch])
+    if 'mobile_platforms' in BRANCHES[branch]:
+        if 'platforms' not in BRANCHES[branch]:
+            BRANCHES[branch]['platforms'] = deepcopy(BRANCHES[branch]['mobile_platforms'])
+        else:
+            BRANCHES[branch]['platforms'].update(deepcopy(BRANCHES[branch]['mobile_platforms']))
 
 # Copy global vars in first, then platform vars
 for branch in BRANCHES.keys():
     for key, value in GLOBAL_VARS.items():
         # Don't override platforms if it's set and locked
         if key == 'platforms' and 'platforms' in BRANCHES[branch] and BRANCHES[branch].get('lock_platforms'):
             continue
-        elif key == 'mobile_platforms' and 'mobile_platforms' in BRANCHES[branch]:
-            continue
         # Don't override something that's set
         elif key in ('enable_weekly_bundle',) and key in BRANCHES[branch]:
             continue
         # If the key is already set then we won't override with GLOBAL_VARS
         # The "platforms" key is handle separatedely (see next for loop)
         elif key in BRANCHES[branch] and key != 'platforms':
             continue
         else:
@@ -1382,17 +1385,17 @@ for branch in BRANCHES.keys():
                 value = deepcopy(value)
                 if isinstance(value, str):
                     value = value % locals()
                 BRANCHES[branch]['platforms'][platform][key] = value
 
     # Check for project branch removing a platform from default platforms
     if branch in ACTIVE_PROJECT_BRANCHES:
         for key, value in PROJECT_BRANCHES[branch].items():
-            if key == 'platforms':
+            if key in ('platforms', 'mobile_platforms'):
                 for platform, platform_config in value.items():
                     if platform_config.get('dont_build'):
                         del BRANCHES[branch]['platforms'][platform]
 
 
 # Point projects to BRANCHES values
 for v in PROJECTS.values():
     if 'branch' in v:
@@ -1896,22 +1899,16 @@ for branch in ACTIVE_PROJECT_BRANCHES:
     BRANCHES[branch]['brand_name']   = branchConfig.get('brand_name', None)
     BRANCHES[branch]['repo_path'] = branchConfig.get('repo_path', 'projects/' + branch)
     BRANCHES[branch]['enabled_products'] = branchConfig.get('enabled_products',
                                                             GLOBAL_VARS['enabled_products'])
     BRANCHES[branch]['enable_nightly'] =  branchConfig.get('enable_nightly', False)
     BRANCHES[branch]['enable_mobile'] = branchConfig.get('enable_mobile', True)
     BRANCHES[branch]['pgo_strategy'] = branchConfig.get('pgo_strategy', None)
     BRANCHES[branch]['periodic_pgo_interval'] = branchConfig.get('periodic_pgo_interval', 6)
-    if BRANCHES[branch]['enable_mobile']:
-        if branchConfig.get('mobile_platforms'):
-            for platform, platform_config in branchConfig['mobile_platforms'].items():
-                BRANCHES[branch]['mobile_platforms'][platform]['env']['MOZ_SYMBOLS_EXTRA_BUILDID'] = branch
-                for key, value in platform_config.items():
-                    BRANCHES[branch]['mobile_platforms'][platform][key] = deepcopy(value)
     BRANCHES[branch]['start_hour'] = branchConfig.get('start_hour', [4])
     BRANCHES[branch]['start_minute'] = branchConfig.get('start_minute', [2])
     # Disable XULRunner / SDK builds
     BRANCHES[branch]['enable_xulrunner'] = branchConfig.get('enable_xulrunner', False)
     # Enable unit tests
     BRANCHES[branch]['enable_mac_a11y'] = branchConfig.get('enable_mac_a11y', True)
     BRANCHES[branch]['unittest_build_space'] = branchConfig.get('unittest_build_space', 6)
     # L10n configuration is not set up for project_branches
@@ -2034,12 +2031,12 @@ if __name__ == "__main__":
     import pprint
     args = sys.argv[1:]
 
     if len(args) > 0:
         items = dict([(b, BRANCHES[b]) for b in args])
     else:
         items = dict(BRANCHES.items() + PROJECTS.items())
 
-    for k, v in items.iteritems():
+    for k, v in sorted(items.iteritems()):
         out = pprint.pformat(v)
         for l in out.splitlines():
-             print '%s: %s' % (k, l)
+            print '%s: %s' % (k, l)
--- a/mozilla/project_branches.py
+++ b/mozilla/project_branches.py
@@ -33,16 +33,18 @@ PROJECT_BRANCHES = {
     },
     'devtools': {
         'enable_nightly': True,
         'enabled_products': ['firefox'],
         'platforms': {
             'macosx64': {
                 'slave_platforms': ['snowleopard', 'lion', 'mountainlion'],
             },
+        },
+        'mobile_platforms': {
             'android': {
                 'enable_opt_unittests': False,
                 'enable_debug_unittests': False,
                 'tegra_android': {},
             },
             'android-armv6': {
                 'enable_opt_unittests': False,
                 'enable_debug_unittests': False,
@@ -150,16 +152,18 @@ PROJECT_BRANCHES = {
                 'enable_debug_unittests': False,
             },
             'win32': {
                 'nightly_signing_servers': 'nightly-signing',
             },
             'win64': {
                 'nightly_signing_servers': 'nightly-signing',
             },
+        },
+        'mobile_platforms': {
             'android-debug': {
                 'dont_build': True,
                 'enable_debug_unittests': False,
             },
         },
     },
     'services-central': {
         'repo_path': 'services/services-central',
@@ -210,17 +214,18 @@ PROJECT_BRANCHES = {
             'win64': {
                 'dont_build': True,
             },
         },
     },
     #####  TWIGS aka RENTABLE BRANCHES
     # customizations while booked for bug 687570 - WebRTC project
     'alder': {
-        'platforms': {
+        'platforms': {},
+        'mobile_platforms': {
             'android': {
                 'enable_opt_unittests': False,
                 'enable_debug_unittests': False,
                 'enable_talos': False,
                 'tegra_android': {},
             },
             'android-armv6': {
                 'enable_opt_unittests': False,
@@ -243,16 +248,18 @@ PROJECT_BRANCHES = {
             'win32': {},
             'win64': {},
             'macosx64': {},
             'linux-debug': {},
             'linux64-debug': {},
             'macosx-debug': {},
             'macosx64-debug': {},
             'win32-debug': {},
+        },
+        'mobile_platforms': {
             'android': {
                 'slave_platforms': ['panda_android'],
             },
         },
     },
     'birch': {
         'enable_talos': False,
         'enabled_products': ['firefox'],
@@ -268,16 +275,18 @@ PROJECT_BRANCHES = {
             'win32': {},
             'win64': {},
             'macosx64': {},
             'linux-debug': {},
             'linux64-debug': {},
             'macosx-debug': {},
             'macosx64-debug': {},
             'win32-debug': {},
+        },
+        'mobile_platforms': {
             'android': {
                 'slave_platforms': ['panda_android'],
             },
         },
     },
     # Customizations for b2g 1.1 work (bug 822783 & bug 819368)
     'date': {
         'lock_platforms': True,
@@ -285,16 +294,18 @@ PROJECT_BRANCHES = {
             'linux': {},
             'linux64': {},
             'win32': {},
             'macosx64': {},
             'linux-debug': {},
             'linux64-debug': {},
             'macosx64-debug': {},
             'win32-debug': {},
+        },
+        'mobile_platforms': {
             'android-noion': {},
         },
     },
     # customizations for windows update service changes (bug 481815)
     'elm': {
         'enable_nightly': True,
         'enable_weekly_bundle': True,
         'create_snippet': True,
@@ -307,16 +318,18 @@ PROJECT_BRANCHES = {
             'linux64': {},
             'linux64-debug': {},
             'macosx64-debug': {},
             'macosx64': {},
             'win32': {
                 'nightly_signing_servers': 'nightly-signing',
             },
             'win32-debug': {},
+        },
+        'mobile_platforms': {
             'android': {},
             'android-debug': {},
             'android-armv6': {},
             'android-x86': {},
         },
     },
     'fig': {},
     'gum': {},
--- a/mozilla/thunderbird_config.py
+++ b/mozilla/thunderbird_config.py
@@ -1143,12 +1143,12 @@ if __name__ == "__main__":
     import pprint
     args = sys.argv[1:]
 
     if len(args) > 0:
         items = dict([(b, BRANCHES[b]) for b in args])
     else:
         items = BRANCHES
 
-    for k, v in items.iteritems():
+    for k, v in sorted(items.iteritems()):
         out = pprint.pformat(v)
         for l in out.splitlines():
-             print '%s: %s' % (k, l)
+            print '%s: %s' % (k, l)
--- a/setup-master.py
+++ b/setup-master.py
@@ -165,17 +165,17 @@ def load_masters_json(masters_json, role
             environment_config = 'staging_config.py'
         elif m['environment'] == 'preproduction':
             environment_config = 'preproduction_config.py'
         c = MasterConfig(name=m['name'],
                 globs=[
                     'config.py',
                     'thunderbird_config.py',
                     '*_config.py',
-                    'master_common.py',
+                    '*_common.py',
                     'b2g_project_branches.py',
                     'project_branches.py',
                     ],
                 renames=[
                     ('BuildSlaves.py.template', 'BuildSlaves.py'),
                     ('passwords.py.template', 'passwords.py'),
                     ],
                 local_links=[