diff --git a/tests/unit/test_model.py b/tests/unit/test_model.py
index 628a45c..63e9aaa 100644
--- a/tests/unit/test_model.py
+++ b/tests/unit/test_model.py
@@ -170,185 +170,6 @@
                 "Unable to modify final job"):
             job.applyVariant(bad_final)
 
-    def test_job_inheritance_configloader(self):
-        # TODO(jeblair): move this to a configloader test
-        tenant = model.Tenant('tenant')
-        layout = model.Layout(tenant)
-
-        pipeline = model.Pipeline('gate', layout)
-        layout.addPipeline(pipeline)
-        queue = model.ChangeQueue(pipeline)
-        project = model.Project('project', self.source)
-        tpc = model.TenantProjectConfig(project)
-        tenant.addUntrustedProject(tpc)
-
-        base = configloader.JobParser.fromYaml(tenant, layout, {
-            '_source_context': self.context,
-            '_start_mark': self.start_mark,
-            'name': 'base',
-            'parent': None,
-            'timeout': 30,
-            'pre-run': 'base-pre',
-            'post-run': 'base-post',
-            'nodeset': {
-                'nodes': [{
-                    'name': 'controller',
-                    'label': 'base',
-                }],
-            },
-        })
-        layout.addJob(base)
-        python27 = configloader.JobParser.fromYaml(tenant, layout, {
-            '_source_context': self.context,
-            '_start_mark': self.start_mark,
-            'name': 'python27',
-            'parent': 'base',
-            'pre-run': 'py27-pre',
-            'post-run': ['py27-post-a', 'py27-post-b'],
-            'nodeset': {
-                'nodes': [{
-                    'name': 'controller',
-                    'label': 'new',
-                }],
-            },
-            'timeout': 40,
-        })
-        layout.addJob(python27)
-        python27diablo = configloader.JobParser.fromYaml(tenant, layout, {
-            '_source_context': self.context,
-            '_start_mark': self.start_mark,
-            'name': 'python27',
-            'branches': [
-                'stable/diablo'
-            ],
-            'pre-run': 'py27-diablo-pre',
-            'run': 'py27-diablo',
-            'post-run': 'py27-diablo-post',
-            'nodeset': {
-                'nodes': [{
-                    'name': 'controller',
-                    'label': 'old',
-                }],
-            },
-            'timeout': 50,
-        })
-        layout.addJob(python27diablo)
-
-        python27essex = configloader.JobParser.fromYaml(tenant, layout, {
-            '_source_context': self.context,
-            '_start_mark': self.start_mark,
-            'name': 'python27',
-            'branches': [
-                'stable/essex'
-            ],
-            'pre-run': 'py27-essex-pre',
-            'post-run': 'py27-essex-post',
-        })
-        layout.addJob(python27essex)
-
-        project_template_parser = configloader.ProjectTemplateParser(
-            tenant, layout)
-        project_parser = configloader.ProjectParser(
-            tenant, layout, project_template_parser)
-        project_config = project_parser.fromYaml([{
-            '_source_context': self.context,
-            '_start_mark': self.start_mark,
-            'name': 'project',
-            'gate': {
-                'jobs': [
-                    'python27'
-                ]
-            }
-        }])
-        layout.addProjectConfig(project_config)
-
-        change = model.Change(project)
-        # Test master
-        change.branch = 'master'
-        item = queue.enqueueChange(change)
-        item.layout = layout
-
-        self.assertTrue(base.changeMatches(change))
-        self.assertTrue(python27.changeMatches(change))
-        self.assertFalse(python27diablo.changeMatches(change))
-        self.assertFalse(python27essex.changeMatches(change))
-
-        item.freezeJobGraph()
-        self.assertEqual(len(item.getJobs()), 1)
-        job = item.getJobs()[0]
-        self.assertEqual(job.name, 'python27')
-        self.assertEqual(job.timeout, 40)
-        nodes = job.nodeset.getNodes()
-        self.assertEqual(len(nodes), 1)
-        self.assertEqual(nodes[0].label, 'new')
-        self.assertEqual([x.path for x in job.pre_run],
-                         ['base-pre',
-                          'py27-pre'])
-        self.assertEqual([x.path for x in job.post_run],
-                         ['py27-post-a',
-                          'py27-post-b',
-                          'base-post'])
-        self.assertEqual([x.path for x in job.run],
-                         ['playbooks/python27',
-                          'playbooks/base'])
-
-        # Test diablo
-        change.branch = 'stable/diablo'
-        item = queue.enqueueChange(change)
-        item.layout = layout
-
-        self.assertTrue(base.changeMatches(change))
-        self.assertTrue(python27.changeMatches(change))
-        self.assertTrue(python27diablo.changeMatches(change))
-        self.assertFalse(python27essex.changeMatches(change))
-
-        item.freezeJobGraph()
-        self.assertEqual(len(item.getJobs()), 1)
-        job = item.getJobs()[0]
-        self.assertEqual(job.name, 'python27')
-        self.assertEqual(job.timeout, 50)
-        nodes = job.nodeset.getNodes()
-        self.assertEqual(len(nodes), 1)
-        self.assertEqual(nodes[0].label, 'old')
-        self.assertEqual([x.path for x in job.pre_run],
-                         ['base-pre',
-                          'py27-pre',
-                          'py27-diablo-pre'])
-        self.assertEqual([x.path for x in job.post_run],
-                         ['py27-diablo-post',
-                          'py27-post-a',
-                          'py27-post-b',
-                          'base-post'])
-        self.assertEqual([x.path for x in job.run],
-                         ['py27-diablo']),
-
-        # Test essex
-        change.branch = 'stable/essex'
-        item = queue.enqueueChange(change)
-        item.layout = layout
-
-        self.assertTrue(base.changeMatches(change))
-        self.assertTrue(python27.changeMatches(change))
-        self.assertFalse(python27diablo.changeMatches(change))
-        self.assertTrue(python27essex.changeMatches(change))
-
-        item.freezeJobGraph()
-        self.assertEqual(len(item.getJobs()), 1)
-        job = item.getJobs()[0]
-        self.assertEqual(job.name, 'python27')
-        self.assertEqual([x.path for x in job.pre_run],
-                         ['base-pre',
-                          'py27-pre',
-                          'py27-essex-pre'])
-        self.assertEqual([x.path for x in job.post_run],
-                         ['py27-essex-post',
-                          'py27-post-a',
-                          'py27-post-b',
-                          'base-post'])
-        self.assertEqual([x.path for x in job.run],
-                         ['playbooks/python27',
-                          'playbooks/base'])
-
     def test_job_auth_inheritance(self):
         tenant = self.tenant
         layout = self.layout
diff --git a/tests/unit/test_scheduler.py b/tests/unit/test_scheduler.py
index a97e47e..22d1139 100755
--- a/tests/unit/test_scheduler.py
+++ b/tests/unit/test_scheduler.py
@@ -2430,6 +2430,62 @@
         self.assertEqual(rp, set(['org/project', 'org/project0',
                                   'org/project3']))
 
+    @simple_layout('layouts/job-variants.yaml')
+    def test_job_branch_variants(self):
+        self.create_branch('org/project', 'stable/diablo')
+        self.create_branch('org/project', 'stable/essex')
+        A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
+        self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
+        self.waitUntilSettled()
+
+        B = self.fake_gerrit.addFakeChange('org/project', 'stable/diablo', 'B')
+        self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
+        self.waitUntilSettled()
+
+        C = self.fake_gerrit.addFakeChange('org/project', 'stable/essex', 'C')
+        self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
+        self.waitUntilSettled()
+        self.assertHistory([
+            dict(name='python27', result='SUCCESS'),
+            dict(name='python27', result='SUCCESS'),
+            dict(name='python27', result='SUCCESS'),
+        ])
+
+        p = self.history[0].parameters
+        self.assertEqual(p['timeout'], 40)
+        self.assertEqual(len(p['nodes']), 1)
+        self.assertEqual(p['nodes'][0]['label'], 'new')
+        self.assertEqual([x['path'] for x in p['pre_playbooks']],
+                         ['base-pre', 'py27-pre'])
+        self.assertEqual([x['path'] for x in p['post_playbooks']],
+                         ['py27-post-a', 'py27-post-b', 'base-post'])
+        self.assertEqual([x['path'] for x in p['playbooks']],
+                         ['playbooks/python27', 'playbooks/base'])
+
+        p = self.history[1].parameters
+        self.assertEqual(p['timeout'], 50)
+        self.assertEqual(len(p['nodes']), 1)
+        self.assertEqual(p['nodes'][0]['label'], 'old')
+        self.assertEqual([x['path'] for x in p['pre_playbooks']],
+                         ['base-pre', 'py27-pre', 'py27-diablo-pre'])
+        self.assertEqual([x['path'] for x in p['post_playbooks']],
+                         ['py27-diablo-post', 'py27-post-a', 'py27-post-b',
+                          'base-post'])
+        self.assertEqual([x['path'] for x in p['playbooks']],
+                         ['py27-diablo'])
+
+        p = self.history[2].parameters
+        self.assertEqual(p['timeout'], 40)
+        self.assertEqual(len(p['nodes']), 1)
+        self.assertEqual(p['nodes'][0]['label'], 'new')
+        self.assertEqual([x['path'] for x in p['pre_playbooks']],
+                         ['base-pre', 'py27-pre', 'py27-essex-pre'])
+        self.assertEqual([x['path'] for x in p['post_playbooks']],
+                         ['py27-essex-post', 'py27-post-a', 'py27-post-b',
+                          'base-post'])
+        self.assertEqual([x['path'] for x in p['playbooks']],
+                         ['playbooks/python27', 'playbooks/base'])
+
     def test_queue_names(self):
         "Test shared change queue names"
         tenant = self.sched.abide.tenants.get('tenant-one')
