diff --git a/scheduler/fedora_openqa_schedule/consumer.py b/scheduler/fedora_openqa_schedule/consumer.py
--- a/scheduler/fedora_openqa_schedule/consumer.py
+++ b/scheduler/fedora_openqa_schedule/consumer.py
@@ -25,6 +25,7 @@
 
 import fedmsg.consumers
 import fedora_openqa_schedule.schedule as schedule
+import fedora_openqa_schedule.report as report
 
 
 class OpenQAConsumer(fedmsg.consumers.FedmsgConsumer):
@@ -75,3 +76,66 @@
             return
 
         return
+
+
+class OpenQAWikiConsumer(fedmsg.consumers.FedmsgConsumer):
+    """A fedmsg consumer that reports openQA results to Wikitcms when
+    a job completes. This is a parent class for prod, stg and test
+    variants, it is not complete in itself. Whichever child you use,
+    make sure the openQA client client.conf is pointed at the same
+    openQA instance that produces the fedmsgs you're listening for,
+    or things will get weird (you'll be getting job IDs from one
+    openQA but retrieving the jobs with those same IDs from the other
+    openQA).
+    """
+
+    def consume(self, message):
+        """Consume incoming message."""
+        job = message['body']['msg']['id']
+        self.log.info("%s: reporting results for %s", self.__class__.__name__, job)
+        results = report.wait_and_report(
+            self.url, job_ids=[job], do_report=self.report, waittime=0)
+        if not self.report:
+            for res in results:
+                self.log.info("%s: would report %s", self.__class__.__name__, res)
+
+
+class OpenQAProductionWikiConsumer(OpenQAWikiConsumer):
+    """A result reporting consumer that listens for production fedmsgs
+    and reports to the production wiki. Only one of these should ever
+    be running at one time; it'd be particularly bad if we had two
+    running with different FAS accounts, all results would be duped.
+    Please don't enable this consumer unless you're sure you know what
+    you're doing.
+    """
+    topic = "org.fedoraproject.prod.openqa.job.done"
+    config_key = "fedora_openqa_schedule.wiki.consumer.prod.enabled"
+    url = "fedoraproject.org"
+    report = True
+
+
+class OpenQAStagingWikiConsumer(OpenQAWikiConsumer):
+    """A result reporting consumer that listens for staging fedmsgs
+    and reports to the staging wiki. Only one of these should ever
+    be running at one time; it'd be particularly bad if we had two
+    running with different FAS accounts, all results would be duped.
+    Please don't enable this consumer unless you're sure you know what
+    you're doing.
+    """
+    topic = "org.fedoraproject.stg.openqa.job.done"
+    config_key = "fedora_openqa_schedule.wiki.consumer.stg.enabled"
+    url = "stg.fedoraproject.org"
+    report = True
+
+
+class OpenQATestWikiConsumer(OpenQAWikiConsumer):
+    """A result reporting consumer that listens for dev fedmsgs (so it
+    will catch ones produced by fedmsg-dg-replay) and does not really
+    report results, it should log the produced ResTuples instead. This
+    is the one you should use to test stuff, go nuts with it.
+    """
+    topic = "org.fedoraproject.dev.openqa.job.done"
+    validate_signatures = False
+    config_key = "fedora_openqa_schedule.wiki.consumer.test.enabled"
+    url = "stg.fedoraproject.org"
+    report = False
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
@@ -135,14 +135,16 @@
     if not job_ids and not build:
         raise ValueError("wait_and_report requires either job_ids or build.")
 
+    ret = []
     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()
     # iterate_jobs can work on jobs or build; whichever is set will be used
     for joblist in client.iterate_jobs(jobs=job_ids, build=build, waittime=waittime):
-        report_results(joblist, wiki_url, do_report=do_report)
+        ret.extend(report_results(joblist, wiki_url, do_report=do_report))
+    return ret
 
 
 def report_results(jobs, wiki_url, do_report=None):
@@ -174,6 +176,8 @@
         for insuff in insuffs:
             tmpl = "insufficient data for test %s, env %s! Will not report."
             logger.info(tmpl, insuff.testcase, insuff.env)
+        return []
 
     else:
         logger.warning("no reporting is done")
+        return passed_testcases
diff --git a/scheduler/setup.py b/scheduler/setup.py
--- a/scheduler/setup.py
+++ b/scheduler/setup.py
@@ -18,6 +18,9 @@
         ],
         'moksha.consumer': [
             'fedora_openqa_schedule.consumer = fedora_openqa_schedule.consumer:OpenQAConsumer',
+            'fedora_openqa_schedule.wiki.consumer.prod = fedora_openqa_schedule.consumer:OpenQAProductionWikiConsumer',
+            'fedora_openqa_schedule.wiki.consumer.stg = fedora_openqa_schedule.consumer:OpenQAStagingWikiConsumer',
+            'fedora_openqa_schedule.wiki.consumer.test = fedora_openqa_schedule.consumer:OpenQATestWikiConsumer',
         ],
     },
     author = "Fedora QA devel team",

