diff --git a/fedora_openqa_schedule/conf_test_suites.py b/fedora_openqa_schedule/conf_test_suites.py
--- a/fedora_openqa_schedule/conf_test_suites.py
+++ b/fedora_openqa_schedule/conf_test_suites.py
@@ -23,28 +23,22 @@
 instances.
 """
 
-def default_install_cb(flavor):
-    """Figure out the correct test case name for a default_boot_and_
-    install pass for a given flavor.
-    """
-    # We REALLY should not have used _ as the separator for flavors,
-    # because fedfind and the image naming policy use it as a
-    # within-field word separator. This hack will hold together so
-    # long as we have no imagetypes with _ in them.
-    (payload, imagetype) = flavor.rsplit('_', 1)
-    imagetype = imagetype.replace('boot', 'netinst')
-    imagetype = imagetype.replace('dvd', 'offline')
-    return "{0} {1}".format(payload, imagetype)
-
 TESTCASES = {
-    # env: variable - columns in table
-    #   $RUNARCH_OR_UEFI$ - i386, x86_64, UEFI
-    #   $RUNARCH$         - i386, x86_64
-    #   $BOOTMETHOD$      - x86 BIOS, x86 UEFI
-    #   $PAYLOAD$         - Server, Workstation, KDE...generic will be reported as Server
+    # the following strings in values will be replaced with strings
+    # derived from openQA job settings, this is used for e.g. to get
+    # the correct 'environment' or 'testname'.
+    #
+    #   special value       replacement
+    #
+    #   $RUNARCH_OR_UEFI$ - "i386", "x86_64", or "UEFI" for x86_64 UEFI
+    #   $RUNARCH$         - "i386", "x86_64"
+    #   $BOOTMETHOD$      - "x86 BIOS", "x86 UEFI"
+    #   $PAYLOAD$         - fedfind 'payload': "Server", "KDE"..."generic" is changed to "Server"
+    #   $IMAGETYPE$       - fedfind 'imagetype': "netinst", "live"... "boot" -> "netinst", "dvd" -> "offline"
+    #   $FS$              - filesystem: "ext3", "btrfs"... expected to be last element of openQA test name
 
     "QA:Testcase_Boot_default_install": {
-        "name_cb": default_install_cb,
+        "name": "$PAYLOAD$_$IMAGETYPE$",
         "section": 'Default boot and install',
         "env": "$RUNARCH_OR_UEFI$",
         "type": "Installation",
@@ -224,8 +218,8 @@
         "type": "Base",
     },
     #        "": {
-    # "name_cb": callbackfunc # optional, called with 'flavor'
-    #            "section": "",
+    #            "name": "", # optional, use when same testcase occurs on multiple rows with different link text
+    #            "section": "", # optional, some result pages have no sections
     #            "env": "x86",
     #            "type": "Installation",
     #            },
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,6 +44,40 @@
     pass
 
 
+def _uniqueres_replacements(job, uniqueres):
+    """Replace some magic values in the 'uniqueres' dict with test job
+    properties; this is to distinguish between environments for a test
+    case, or tests with the same test case but different test names,
+    and so on. Returns nothing because it modifies the uniqueres dict
+    in place.
+    """
+    arch = job['settings']['ARCH']
+    flavor = job['settings']['FLAVOR']
+    fs = job['settings']['TEST'].split('_')[-1]
+    # We REALLY should not have used _ as the separator for flavors,
+    # because fedfind and the image naming policy use it as a
+    # within-field word separator. This hack will hold together so
+    # long as we have no imagetypes with _ in them.
+    (payload, imagetype) = flavor.rsplit('_', 1)
+    imagetype = imagetype.replace('boot', 'netinst')
+    imagetype = imagetype.replace('dvd', 'offline')
+    if payload.lower() == 'generic':
+        payload = 'Server'
+    if job['settings'].has_key('UEFI'):
+        uefi = 'UEFI'
+        bootmethod = 'x86 UEFI'
+    else:
+        uefi = arch
+        bootmethod = 'x86 BIOS'
+
+    for key in uniqueres:
+        uniqueres[key] = uniqueres[key].replace('$RUNARCH_OR_UEFI$', uefi)
+        uniqueres[key] = uniqueres[key].replace('$FS$', fs)
+        uniqueres[key] = uniqueres[key].replace('$RUNARCH$', arch)
+        uniqueres[key] = uniqueres[key].replace('$BOOTMETHOD$', bootmethod)
+        uniqueres[key] = uniqueres[key].replace('$PAYLOAD$', payload)
+        uniqueres[key] = uniqueres[key].replace('$IMAGETYPE$', imagetype)
+
 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
@@ -54,10 +88,6 @@
         if job['result'] == 'passed':
             (release, milestone, compose) = job['settings']['BUILD'].split('_')
             testsuite = job['settings']['TEST']
-            # We need to differentiate tests with UEFI from BIOS
-            uefi = job['settings'].has_key('UEFI')
-            arch = job['settings']['ARCH']
-            flavor = job['settings']['FLAVOR']
             # There usually ought to be an entry in TESTSUITES for all
             # tests, but just in case someone messed up, let's be safe
             if not testsuite in conf_test_suites.TESTSUITES:
@@ -70,35 +100,13 @@
                 # there is more than one for a testcase) and environment for which the result
                 # should be filed.
                 uniqueres = conf_test_suites.TESTCASES[testcase]
-                testname = ''
-                if 'name_cb' in uniqueres:
-                    testname = uniqueres['name_cb'](flavor)
-                # Decide what column should be used for report.
-                # Testcases with more columns now have to use $variable$ so it
-                # could be decided where to report the result
-                if uniqueres['env'] == '$RUNARCH_OR_UEFI$':
-                    env = 'UEFI' if uefi else arch
-                elif uniqueres['env'] == '$FS$':
-                    env = testsuite.split('_')[-1]
-                elif uniqueres['env'] == '$RUNARCH$':
-                    env = arch
-                elif uniqueres['env'] == '$BOOTMETHOD$':
-                    env = 'x86 UEFI' if uefi else 'x86 BIOS'
-                elif uniqueres['env'] == '$PAYLOAD$':
-                    # FIXME: we should drop default_install_cb() and generalize
-                    # this approach to other keys instead, so we don't duplicate
-                    # this code
-                    (payload, _) = flavor.rsplit('_', 1)
-                    if payload.lower() == 'generic':
-                        env = 'Server'
-                    else:
-                        env = payload.capitalize()
-                else:
-                    env = uniqueres['env']
+                # replace $FOO$ values in uniqueres
+                _uniqueres_replacements(job, uniqueres)
                 result = ResTuple(
                     testtype=uniqueres['type'], release=release, milestone=milestone,
                     compose=compose, testcase=testcase, section=uniqueres.get('section'),
-                    testname=testname, env=env, status='pass', bot=True)
+                    testname=uniqueres.get('name', ''), env=uniqueres.get('env', ''),
+                    status='pass', bot=True)
                 passed_testcases.add(result)
 
     return sorted(list(passed_testcases), key=attrgetter('testcase'))

