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
@@ -86,7 +86,7 @@
                 report.wiki_report(wiki_url, jobs=jobs, do_report=True)
             if args.resultsdb:
                 report.resultsdb_report(
-                    resultsdb_url, jobs=jobs, resultsdb_job_id=args.resultsdb_job_id, do_report=True)
+                    resultsdb_url, jobs=jobs, do_report=True, resultsdb_job_id=args.resultsdb_job_id)
             if not args.wiki and not args.resultsdb:
                 # use wiki_report to only print results
                 report.wiki_report(wiki_url, jobs=jobs, do_report=False)
@@ -99,7 +99,7 @@
                     report.wiki_report(wiki_url, build=build, do_report=True)
                 if args.resultsdb:
                     report.resultsdb_report(
-                        resultsdb_url, build=build, resultsdb_job_id=args.resultsdb_job_id, do_report=True)
+                        resultsdb_url, build=build, do_report=True, resultsdb_job_id=args.resultsdb_job_id)
                 if not args.wiki and not args.resultsdb:
                     # use wiki_report to only print results
                     report.wiki_report(wiki_url, build=build, do_report=False)
diff --git a/scheduler/fedora_openqa_schedule/config.py b/scheduler/fedora_openqa_schedule/config.py
--- a/scheduler/fedora_openqa_schedule/config.py
+++ b/scheduler/fedora_openqa_schedule/config.py
@@ -42,7 +42,7 @@
 CONFIG.set('report', 'submit_wiki', 'true')
 CONFIG.set('report', 'submit_resultsdb', 'true')
 CONFIG.set('report', 'openqa_url', 'http://localhost')
-CONFIG.set('report', 'resultsdb_url', 'http://localhost:5001/api/v1.0/')
+CONFIG.set('report', 'resultsdb_url', 'http://localhost:5001/api/v2.0/')
 CONFIG.set('report', 'wiki_url', 'https://fedoraproject.org/wiki')
 CONFIG.set('report', 'wiki_stg_url', 'https://stg.fedoraproject.org/wiki')
 CONFIG.read('/etc/fedora-openqa/schedule.conf')
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
@@ -34,6 +34,7 @@
 import mwclient.errors
 from openqa_client.client import OpenQA_Client
 from resultsdb_api import ResultsDBapi, ResultsDBapiException
+import resultsdb_conventions
 from wikitcms.wiki import Wiki, ResTuple
 
 # Internal dependencies
@@ -189,11 +190,12 @@
             # we only get here if all the conditions are satisfied
             passed.append(testcase)
 
-    else: # isdict - this is the simple list case.
+    else:  # isdict - this is the simple list case.
         passed = testsuite
 
     return passed
 
+
 def get_passed_testcases(jobs, client=None):
     """Given an iterable of job dicts - any waiting, filtering and so
     on is assumed to have already happened - returns a list of
@@ -219,7 +221,7 @@
             passed = _get_passed_tcnames(job, composeid, client)
             for testcase in passed:
                 # skip with warning if testcase is not in TESTCASES
-                if not testcase in conf_test_suites.TESTCASES:
+                if testcase not in conf_test_suites.TESTCASES:
                     logger.warning("No TESTCASES entry found for {0}!".format(testcase))
                     continue
                 # Each testcase name now in the `passed` list is the name of a dict in the
@@ -282,7 +284,7 @@
         return passed_testcases
 
 
-def resultsdb_report(resultsdb_url, jobs=None, build=None, resultsdb_job_id=None, do_report=None):
+def resultsdb_report(resultsdb_url, jobs=None, build=None, do_report=None, resultsdb_job_id=None):
     """Report results from openQA jobs to ResultsDB. Either jobs (an
     iterable of job IDs) or build (an openQA BUILD string, usually a
     Fedora compose ID) is required (if neither is specified, the
@@ -305,48 +307,69 @@
 
     client = OpenQA_Client()
     jobs = client.get_jobs(jobs=jobs, build=build)
-
-    tcname_safeify = re.compile(r"\W+")  # allow only words to be used in testcase name
+    tcname_safeify = re.compile(r"\W+")
+    target_regex = re.compile(r"^(ISO|HDD)(_\d+)?$")
 
     for job in jobs:
-        # ResultsDB's job_id must be set in argument or during test scheduling so we know what job to report to
-        rdb_job_id = resultsdb_job_id if resultsdb_job_id else job['settings'].get('RESULTSDB_JOB_ID', None)
-        if not rdb_job_id:
-            logger.warning("Job %s doesn't have ResultsDB job ID in settings nor was it set by CLI argument", job['id'])
+        # don't report jobs that have clone or user-cancelled jobs
+        if job['clone_id'] is not None or job['result'] == "user_cancelled":
+            continue
+
+        # don't report TEST_TARGET=NONE or jobs that are missing TEST_TARGET
+        if 'TEST_TARGET' not in job['settings']:
+            logger.warning("cannot report job %d because TEST_TARGET variable is missing", job['id'])
             continue
-        testsuite = job['settings']['TEST']
-        if testsuite not in conf_test_suites.TESTSUITES:
-            logger.warning("No TESTSUITES entry found for test {0}!".format(testsuite))
+        if job['settings']['TEST_TARGET'] == "NONE":
             continue
-        # map openQA's result to ResultsDB's result
-        rdb_result = {'passed': "PASSED", 'failed': "FAILED"}.get(job['result'], 'NEEDS_INSPECTION')
-        for testcase in conf_test_suites.TESTSUITES[testsuite]:
-            # create dot-separated and safe name from testcase name from wiki
-            tc_name = tcname_safeify.sub("_", testcase).lower()
-            tc_name = tc_name[len("qa_testcase_"):] if tc_name.startswith("qa_testcase_") else tc_name
-            tc_name = "openqa.%s.%s" % (conf_test_suites.TESTCASES[testcase]['type'].lower(), tc_name)
-
-            # append all extra data that could be useful
-            extradata = {}
-            extradata['arch'] = job['settings'].get('ARCH', None)
-            extradata['firmware'] = 'uefi' if 'UEFI' in job['settings'] else 'bios'
-            extradata['item'] = job['settings'].get('BUILD', None)
-            extradata['type'] = "compose"
-            extradata['subvariant'] = job['settings'].get('SUBVARIANT', None)
-            extradata['imagetype'] = job['settings'].get('IMAGETYPE', None)
-            # append all additional data
-            if testcase in conf_test_suites.TESTCASES_RESULTSDB_EXTRADATA:
-                extradata.update(_uniqueres_replacements(job, conf_test_suites.TESTCASES_RESULTSDB_EXTRADATA[testcase]))
-
-            # create link back to openQA testrun
-            job_url = "%s/tests/%s" % (CONFIG.get('report', 'openqa_url'), job['id'])
-            # create link to testcase page on Fedora wiki
-            testcase_url = "%s/%s" % (CONFIG.get('report', 'wiki_url'), testcase)
-
-            logger.info("ResultsDB: %s, %s, %s, %s", rdb_job_id, tc_name, rdb_result, extradata)
-            if do_report:
-                rdb_instance.create_result(rdb_job_id, tc_name, rdb_result, log_url=job_url, **extradata)
-                # this updates testcase link in ResultsDB with every POST. otherwise we would check whether
-                # this testcase exists in ResultsDB and update link if needed, but it would actually take more
-                # requests than this solution
-                rdb_instance.update_testcase(tc_name, testcase_url)
+
+        try:
+            compose = job['settings']['BUILD']
+            distri = job['settings']['DISTRI']
+            version = job['settings']['VERSION']
+        except KeyError:
+            logger.warning("cannot report job %d because it is missing compose/distri/version", job['id'])
+            continue
+
+        # construct args for resultsdb_conventions Result
+        kwargs = {}
+        tc_name = tcname_safeify.sub("_", job['test']).lower()
+        kwargs["tc_name"] = "compose." + tc_name  # FIXME: this will not be "compose." for update testing...
+        # map openQA's results to resultsdb's outcome
+        kwargs["outcome"] = {
+            'passed': "PASSED",
+            'failed': "FAILED",
+            'softfailed': "INFO"
+        }.get(job['result'], 'NEEDS_INSPECTION')
+        job_url = "%s/tests/%s" % (CONFIG.get('report', 'openqa_url'), job['id'])
+        if job["result"] in ["passed", "softfailed"]:
+            kwargs["tc_url"] = job_url  # point testcase url to latest passed test
+        kwargs["ref_url"] = job_url
+        kwargs["source"] = "openqa"
+
+        # create link to overall url for group ref_url
+        overall_url = "%s/tests/overview?distri=%s&version=%s&build=%s" % (
+            CONFIG.get('report', 'openqa_url'), distri, version, compose)
+
+        # put in the "note" field whether some module failed
+        for module in job["modules"]:
+            if module["result"] == "failed" and ("fatal" in module["flags"] or "important" in module["flags"]):
+                kwargs["note"] = module["name"] + " module failed"
+                break
+            if module["result"] == "failed" and job["result"] == "softfailed":
+                kwargs["note"] = module["name"] + " module softfailed"
+
+        if target_regex.match(job['settings']['TEST_TARGET']):
+            test_target_name = job['settings'][job['settings']['TEST_TARGET']]
+            rdb_object = resultsdb_conventions.FedoraImageResult(compose, test_target_name, **kwargs)
+        elif job['settings']['TEST_TARGET'] == "COMPOSE":
+            rdb_object = resultsdb_conventions.ComposeResult(compose, **kwargs)
+        else:
+            logger.warning("cannot report job %d because TEST_TARGET variable is invalid", job['id'])
+            continue
+
+        rdb_object.extradata.update({
+            'firmware': 'uefi' if 'UEFI' in job['settings'] else 'bios'
+        })
+        # FIXME: use overall_url as a group ref_url
+
+        rdb_object.report(rdb_instance)
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
@@ -35,7 +35,6 @@
 from openqa_client.client import OpenQA_Client
 from six.moves.urllib.request import urlopen
 from six.moves.urllib.error import URLError, HTTPError
-from resultsdb_api import ResultsDBapi, ResultsDBapiException
 
 # Internal dependencies
 from fedora_openqa_schedule.config import CONFIG, WANTED
@@ -70,7 +69,7 @@
         matchdict = wantimg['match'].copy()
         for foundimg in rel.all_images:
             # see if the foundimg matches the wantimg
-            if not all(item in foundimg.items() for item in matchdict.items()): 
+            if not all(item in foundimg.items() for item in matchdict.items()):
                 continue
             score = wantimg.get('score', 0)
             # assign a 'flavor' using fedfind's 'image identifier'
@@ -134,7 +133,7 @@
 
 
 def run_openqa_jobs(param_urls, flavor, arch, subvariant, imagetype, build, version,
-                    location, force=False, extraparams=None, resultsdb_job_id=None):
+                    location, force=False, extraparams=None):
     """# run OpenQA 'isos' job on ISO at urls from 'param_urls', with
     given URLs, flavor, arch, subvariant, imagetype, build identifier,
     and version. **NOTE**: 'build' is passed to openQA as BUILD and is
@@ -178,8 +177,6 @@
         params.update(extraparams)
         # mung the BUILD so this is not considered a 'real' test run
         params['BUILD'] = "{0}-EXTRA".format(params['BUILD'])
-    if resultsdb_job_id:
-        params['RESULTSDB_JOB_ID'] = resultsdb_job_id
 
     params.update(param_urls)
 
@@ -237,29 +234,11 @@
     jobs = []
     univs = {}
 
-    # create jobs instance in resultsdb if necessary
-    rdb_job_id = None
-
-    if create_resultsdb_job is None:
-        create_resultsdb_job = CONFIG.getboolean('report', 'submit_resultsdb')
-
-    if create_resultsdb_job:
-        try:
-            rdb_instance = ResultsDBapi(CONFIG.get('report', 'resultsdb_url'))
-            # add link to page with overall results
-            ref_url = "%s/tests/overview?distri=fedora&version=%s&build=%s" % (CONFIG.get('report', 'openqa_url'),
-                                                                               rel.release, rel.cid)
-            job = rdb_instance.create_job(ref_url=ref_url, name=rel.cid)
-            rdb_job_id = job["id"]
-        except ResultsDBapiException as e:
-            logger.error(e)
-
     # schedule per-image jobs, keeping track of the highest score
     # per arch along the way
     for (flavor, arch, score, param_urls, subvariant, imagetype) in images:
         jobs.extend(run_openqa_jobs(param_urls, flavor, arch, subvariant, imagetype, rel.cid,
-                                    rel.release, location, force=force, extraparams=extraparams,
-                                    resultsdb_job_id=rdb_job_id))
+                                    rel.release, location, force=force, extraparams=extraparams))
         if score > univs.get(arch, [None, 0])[1]:
             univs[arch] = (param_urls, score, subvariant, imagetype)
 
@@ -272,6 +251,6 @@
             logger.info("running universal tests for %s with %s", arch, param_urls['ISO_URL'])
             jobs.extend(run_openqa_jobs(param_urls, 'universal', arch, subvariant, imagetype,
                                         rel.cid, rel.release, location, force=force,
-                                        extraparams=extraparams, resultsdb_job_id=rdb_job_id))
+                                        extraparams=extraparams))
 
     return (rel.cid, jobs)
diff --git a/scheduler/schedule.conf.sample b/scheduler/schedule.conf.sample
--- a/scheduler/schedule.conf.sample
+++ b/scheduler/schedule.conf.sample
@@ -19,6 +19,6 @@
 # URL of openQA instance for creating links in ResultsDB
 openqa_url: http://localhost
 # URL of ResultsDB instance
-resultsdb_url: http://localhost/resultsdb_api/api/v1.0/
+resultsdb_url: http://localhost/resultsdb_api/api/v2.0/
 # URL of Fedora wiki for creating links in ResultsDB
 wiki_url: https://fedoraproject.org/wiki
diff --git a/scheduler/setup.py b/scheduler/setup.py
--- a/scheduler/setup.py
+++ b/scheduler/setup.py
@@ -30,7 +30,8 @@
     keywords = "fedora openqa test qa",
     url = "https://bitbucket.org/rajcze/openqa_fedora_tools",
     packages = ["fedora_openqa_schedule"],
-    install_requires = ['fedfind>=2.5.0', 'fedmsg', 'openqa-client>=1.1', 'setuptools', 'six', 'resultsdb_api'],
+    install_requires = ['fedfind>=2.5.0', 'fedmsg', 'openqa-client>=1.1', 'setuptools',
+                        'six', 'resultsdb_api', 'resultsdb_conventions'],
     long_description=read('README.md'),
     classifiers=[
         "Development Status :: 3 - Alpha",

