diff --git a/scheduler/fedora_openqa_schedule/cli.py b/scheduler/fedora_openqa_schedule/cli.py
--- a/scheduler/fedora_openqa_schedule/cli.py
+++ b/scheduler/fedora_openqa_schedule/cli.py
@@ -42,8 +42,12 @@
     results if a matching wikitcms ValidationEvent is found by
     relval/wikitcms.
     """
+    extraparams = None
+    if args.updates:
+        extraparams = {'GRUBADD': "inst.updates={0}".format(args.updates)}
     try:
-        (compose, jobs) = schedule.jobs_from_compose(args.location, force=args.force)
+        (compose, jobs) = schedule.jobs_from_compose(
+            args.location, force=args.force, extraparams=extraparams)
     except schedule.TriggerException as err:
         logger.warning("No jobs run! %s", err)
         sys.exit(1)
@@ -121,6 +125,9 @@
     parser_compose.add_argument(
         '--force', '-f', help="For each ISO/flavor combination, schedule jobs even if there "
         "are existing, non-cancelled jobs for that combination", action='store_true')
+    parser_compose.add_argument(
+        '--updates', '-u', help="URL to an updates image to load for all tests. The tests that "
+        "test updates image loading will fail when you use this")
     parser_compose.set_defaults(func=command_compose)
 
     parser_report = subparsers.add_parser(
diff --git a/scheduler/fedora_openqa_schedule/report.py b/scheduler/fedora_openqa_schedule/report.py
--- a/scheduler/fedora_openqa_schedule/report.py
+++ b/scheduler/fedora_openqa_schedule/report.py
@@ -94,6 +94,12 @@
             # it's wikitcms' job to take a compose ID and figure out
             # what the validation event for it is.
             composeid = job['settings']['BUILD']
+            if composeid.endswith('EXTRA'):
+                # this is a 'dirty' test run with extra parameters
+                # (usually a test with an updates.img), we never want
+                # to report results for these
+                logger.debug("Job was run with extra params! Will not report")
+                continue
             testsuite = job['settings']['TEST']
             # There usually ought to be an entry in TESTSUITES for all
             # tests, but just in case someone messed up, let's be safe
diff --git a/scheduler/fedora_openqa_schedule/schedule.py b/scheduler/fedora_openqa_schedule/schedule.py
--- a/scheduler/fedora_openqa_schedule/schedule.py
+++ b/scheduler/fedora_openqa_schedule/schedule.py
@@ -124,13 +124,18 @@
     return images
 
 
-def run_openqa_jobs(url, flavor, arch, build, force=False):
+def run_openqa_jobs(url, flavor, arch, build, force=False, extraparams=None):
     """# run OpenQA 'isos' job on ISO at 'url', with given arch
     and a build identifier. **NOTE**: 'build' is passed to openQA as
     BUILD and is later retrieved and parsed by report.py for wiki
     report generation. Returns list of job IDs. If force is False,
     jobs will only be scheduled if there are no existing,
-    non-cancelled jobs for the same ISO and flavor.
+    non-cancelled jobs for the same ISO and flavor. If extraparams
+    is specified, it must be a dict or something else that can be
+    combined with a dict using `update`; it adds additional parameters
+    (usually openQA variables) to the POST request. When extraparams
+    is used, the BUILD value has '-EXTRA' appended to signify that
+    this should not be considered a clean test run for the build.
     """
     logger.info("sending jobs to openQA")
     # find current and previous releases; these are used to determine
@@ -155,6 +160,10 @@
         'CURRREL': currrel,
         'PREVREL': prevrel,
     }
+    if extraparams:
+        params.update(extraparams)
+        # mung the BUILD so this is not considered a 'real' test run
+        params['BUILD'] = "{0}-EXTRA".format(params['BUILD'])
     client = OpenQA_Client()
     if not force:
         isoname = url.split('/')[-1]
@@ -179,7 +188,7 @@
     return output["ids"]
 
 
-def jobs_from_compose(location, wanted=WANTED, force=False):
+def jobs_from_compose(location, wanted=WANTED, force=False, extraparams=None):
     """Schedule jobs against a specific compose. Returns a 2-tuple
     of the compose ID and the list of job IDs.
 
@@ -198,6 +207,11 @@
     If force is False, for each ISO, jobs will only be scheduled if
     there are no existing, non-cancelled jobs for the same ISO and
     flavor.
+
+    extraparams is passed through to `run_openqa_jobs()`. It can be
+    a dict (or anything else that can be passed to `dict.update()`)
+    containing arbitrary extra parameters to be included in the ISO
+    post request (usually this will be to specify extra openQA vars).
     """
     location = location.strip('/')
     # trigger ugly special-casing for non-Pungi4-ified Two Week Atomic
@@ -218,14 +232,16 @@
     # schedule per-image jobs, keeping track of the highest score
     # per arch along the way
     for (url, flavor, arch, score) in images:
-        jobs.extend(run_openqa_jobs(url, flavor, arch, build=compose, force=force))
+        jobs.extend(run_openqa_jobs(url, flavor, arch, build=compose, force=force,
+                                    extraparams=extraparams))
         if score > univs.get(arch, ['', 0])[1]:
             univs[arch] = (url, score)
 
     # now schedule universal jobs
     if univs:
         for (arch, (url, _)) in univs.items():
             logger.info("running universal tests for %s with %s", arch, url)
-            jobs.extend(run_openqa_jobs(url, 'universal', arch, build=compose, force=force))
+            jobs.extend(run_openqa_jobs(url, 'universal', arch, build=compose, force=force,
+                                        extraparams=extraparams))
 
     return (compose, jobs)

