diff --git a/fedora_openqa_schedule/cli.py b/fedora_openqa_schedule/cli.py
--- a/fedora_openqa_schedule/cli.py
+++ b/fedora_openqa_schedule/cli.py
@@ -50,7 +50,7 @@
     relval/wikitcms.
     """
     try:
-        jobs = schedule.jobs_from_compose(
+        (ff_rel, jobs) = schedule.jobs_from_compose(
             args.release, args.milestone, args.compose, arches=args.arch, force=args.force,
             wait=args.wait)
 
@@ -68,7 +68,8 @@
         sys.exit(1)
 
     if jobs:
-        report.report_results(jobs, wiki=wiki, report=args.submit)
+        build = '_'.join((ff_rel.release, ff_rel.milestone, ff_rel.compose))
+        report.wait_and_report(build=build, wiki=wiki, report=args.submit)
     else:
         msg = "No jobs run!"
         if not args.force:
@@ -86,14 +87,15 @@
     """
     logger.info("running on current release")
     try:
-        jobs = schedule.jobs_from_current(wiki)
+        (ff_rel, jobs) = schedule.jobs_from_current(wiki)
     except schedule.TriggerException as e:
         logger.debug("No jobs run: %s", e)
         sys.exit(1)
     # wait for jobs to finish and display results
     if jobs:
-        logger.info("waiting for jobs: %s", ' '.join(str(j) for j in jobs))
-        report.report_results(jobs, wiki=wiki, report=args.submit)
+        logger.info("waiting for jobs")
+        build = '_'.join((ff_rel.release, ff_rel.milestone, ff_rel.compose))
+        report.wait_and_report(build=build, wiki=wiki, report=args.submit)
     logger.debug("finished")
     sys.exit()
 
@@ -103,8 +105,8 @@
     results to the wiki.
     """
     try:
-        report.report_results(
-            args.jobs, wiki=wiki, report=args.submit)
+        report.wait_and_report(
+            job_ids=args.jobs, wiki=wiki, report=args.submit)
     except report.LoginError:
         # Module logs for us, no need to dupe it.
         sys.exit(1)
diff --git a/fedora_openqa_schedule/report.py b/fedora_openqa_schedule/report.py
--- a/fedora_openqa_schedule/report.py
+++ b/fedora_openqa_schedule/report.py
@@ -44,18 +44,11 @@
     pass
 
 
-def get_passed_testcases(job_ids, waittime=None):
+def get_passed_testcases(jobs):
+    """Given an iterable of job dicts - any waiting, filtering and so
+    on is assumed to have already happened - returns a list of
+    wikitcms ResTuples derived from any passed tests.
     """
-    job_ids ~ list of int (job ids)
-    waittime ~ int or None - how long to wait for jobs, None == read from config
-    Returns ~ list of str - names of passed testcases
-    """
-    if waittime is None:
-        waittime = CONFIG.getint('report', 'jobs-wait')
-    # Use the openQA client lib to wait for jobs to be done. Will
-    # raise an openQA client error on wait expiry.
-    client = OpenQA_Client()
-    jobs = client.wait_jobs(job_ids, waittime=waittime)
     passed_testcases = set()
     for job in jobs:
         if job['result'] == 'passed':
@@ -98,13 +91,40 @@
     return sorted(list(passed_testcases), key=attrgetter('testcase'))
 
 
-def report_results(job_ids, wiki=None, report=None):
-    """Report results from a list of openQA job IDs to Wikitcms. If
-    report is False, will just print out the python-wikitcms ResTups
-    for inspection. If report is None, will read the setting from the
-    config file; if no config file is present, default is True.
+def wait_and_report(job_ids=None, build=None, wiki=None, report=None, waittime=None):
+    """Find some openQA jobs and report the results to Wikitcms (via
+    report_results). Either job_ids (an iterable of IDs) or build (an
+    openQA BUILD string) is required. wiki and report are passed to
+    report_results and documented there. waittime (int) is how long to
+    wait for jobs to complete before giving up; if 'build' is used,
+    will also wait for jobs to appear. If jobs are not present and
+    complete when waittime expires,
+    openqa_client.exceptions.WaitException will be raised. If waittime
+    is 0, no waiting is done, and if jobs are not complete, the
+    exception will raise immediately.
+    """
+    if waittime is None:
+        waittime = CONFIG.getint('report', 'jobs-wait')
+    # Use the openQA client lib to wait for jobs to be done. Will
+    # raise an openQA client error on wait expiry.
+    client = OpenQA_Client()
+    if job_ids:
+        jobs = client.wait_jobs(job_ids, waittime=waittime)
+    elif build:
+        jobs = client.wait_build_jobs(build, waittime=waittime)
+    else:
+        raise ValueError("wait_and_report requires either job_ids or build.")
+    return report_results(jobs, wiki=wiki, report=report)
+
+
+def report_results(jobs, wiki=None, report=None):
+    """Report results from openQA jobs to Wikitcms. jobs is an
+    iterable of openQA job dicts. If report is False, will just print
+    out the python-wikitcms ResTups for inspection. If report is None,
+    will read the setting from the config file; if no config file is
+    present, default is True.
     """
-    passed_testcases = get_passed_testcases(job_ids)
+    passed_testcases = get_passed_testcases(jobs)
     logger.info("passed testcases: %s", passed_testcases)
     if report is None:
         report = CONFIG.getboolean('report', 'submit')
diff --git a/fedora_openqa_schedule/schedule.py b/fedora_openqa_schedule/schedule.py
--- a/fedora_openqa_schedule/schedule.py
+++ b/fedora_openqa_schedule/schedule.py
@@ -183,7 +183,7 @@
     f.close()
     logger.debug("written info about newest version")
 
-    return jobs
+    return (currev.ff_release, jobs)
 
 
 def jobs_from_compose(release='', milestone='', compose='', arches=None, force=False, wait=None):
@@ -227,7 +227,7 @@
 
     jobs = jobs_from_fedfind(ff_release, arches=arches, force=force)
     logger.info("jobs_from_compose: planned jobs: %s", ' '.join(str(j) for j in jobs))
-    return jobs
+    return (ff_release, jobs)
 
 
 def jobs_from_fedfind(ff_release, force=False, arches=None, imagetypes=None, payloads=None):

