Index: /trunk/src/VBox/ValidationKit/testmanager/core/report.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/core/report.py	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/core/report.py	(revision 61255)
@@ -340,30 +340,4 @@
         oSet = ReportFailureReasonSet();
         for iPeriod in xrange(self.cPeriods):
-            #cHoursStarted = (self.cPeriods - iPeriod) * self.cHoursPerPeriod;
-            #if self.tsNow is None:
-            #    sTsFirst = '(CURRENT_TIMESTAMP - interval \'%u hours\')' % (cHoursStarted,);
-            #
-            #else:
-            #    sTsFirst = '(%s - interval \'%u hours\')' \
-            #             % ( self._oDb.formatBindArgs('%s::TIMESTAMP', (self.tsNow,)), cHoursStarted,) ;
-            #
-            #self._oDb.execute('SELECT   TestResultFailures.idFailureReason,\n'
-            #                  '         COUNT(TestResultFailures.idTestResult),\n'
-            #                  '         MIN(TestSets.tsDone),\n'
-            #                  '         MAX(TestSets.tsDone)\n'
-            #                  'FROM     TestResultFailures,\n'
-            #                  '         TestResults,\n'
-            #                  '         TestSets' + self.getExtraSubjectTables() + '\n'
-            #                  'WHERE    TestResultFailures.idTestResult = TestResults.idTestResult\n'
-            #                  '     AND TestResultFailures.tsExpire = \'infinity\'::TIMESTAMP\n'
-            #                  '     AND TestResultFailures.tsEffective >= ' + sTsFirst + '\n'
-            #                  '     AND TestResults.enmStatus <> \'running\'\n'
-            #                  '     AND TestResults.enmStatus <> \'success\'\n'
-            #                  '     AND TestResults.tsCreated >= ' + sTsFirst + '\n'
-            #                  '     AND TestResults.idTestSet = TestSets.idTestSet\n'
-            #                + self.getExtraSubjectWhereExpr()
-            #                + self.getExtraWhereExprForPeriod(iPeriod)
-            #                + 'GROUP BY TestResultFailures.idFailureReason\n');
-
             self._oDb.execute('SELECT   idFailureReason,\n'
                               '         COUNT(idTestResult),\n'
@@ -374,5 +348,4 @@
                             + self.getExtraWhereExprForPeriod(iPeriod).replace('TestSets.', '')
                             + 'GROUP BY idFailureReason\n');
-
             aaoRows = self._oDb.fetchAll()
 
@@ -400,4 +373,29 @@
                     oPeriod.tsMax = oPeriodRow.tsMax;
             oSet.cHits += oPeriod.cHits;
+
+            ## Count how many test sets we've got without any reason associated with them.
+            #self._oDb.execute('SELECT   COUNT(idTestSet)\n'
+            #                  'FROM     TestSets,\n'
+            #                  '         Test'
+            #                  'WHERE    TRUE\n'
+            #                  + self.getExtraWhereExprForPeriod(iPeriod) +
+            #                  '     AND TestSets.enmStatus          <> \'running\'\n'
+            #                  '     AND TestSets.enmStatus          <> \'success\'\n'
+            #
+            #                  'WHERE    TestResultFailures.idTestResult = TestResults.idTestResult\n'
+            #                  '     AND TestResultFailures.tsExpire     = \'infinity\'::TIMESTAMP\n'
+            #                  '     AND TestResultFailures.tsEffective >= ' + sTsFirst + '\n'
+            #                  '     AND TestResults.enmStatus          <> \'running\'\n'
+            #                  '     AND TestResults.enmStatus          <> \'success\'\n'
+            #                  '     AND TestResults.tsCreated          >= ' + sTsFirst + '\n'
+            #                  '     AND TestResults.tsCreated          <  ' + sTsNow + '\n'
+            #                  '     AND TestResults.idTestSet           = TestSets.idTestSet\n'
+            #                  '     AND TestSets.tsDone                >= ' + sTsFirst + '\n'
+            #                  '     AND TestSets.tsDone                <  ' + sTsNow + '\n'
+            #
+            #                + self.getExtraWhereExprForPeriod(iPeriod).replace('TestSets.', '')
+            #                + 'GROUP BY idFailureReason\n');
+            #aaoRows = self._oDb.fetchAll()
+
 
         #
Index: /trunk/src/VBox/ValidationKit/testmanager/core/testcase.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/core/testcase.py	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/core/testcase.py	(revision 61255)
@@ -1154,8 +1154,8 @@
             self._oDb.execute('INSERT INTO TestCaseArgs (\n'
                              '          idTestCase, uidAuthor, sArgs, cSecTimeout,\n'
-                              '         sTestBoxReqExpr, sBuildReqExpr, cGangMembers)\n'
-                              'VALUES   (%s, %s, %s, %s, %s, %s, %s)'
+                              '         sTestBoxReqExpr, sBuildReqExpr, cGangMembers, sSubName)\n'
+                              'VALUES   (%s, %s, %s, %s, %s, %s, %s, %s)'
                               , ( oData.idTestCase, uidAuthor, oVar.sArgs, oVar.cSecTimeout,
-                                  oVar.sTestBoxReqExpr, oVar.sBuildReqExpr, oVar.cGangMembers,));
+                                  oVar.sTestBoxReqExpr, oVar.sBuildReqExpr, oVar.cGangMembers, oVar.sSubName, ));
 
         self._oDb.maybeCommit(fCommit);
@@ -1277,8 +1277,8 @@
                 self._oDb.execute('INSERT INTO TestCaseArgs (\n'
                                  '          idTestCase, uidAuthor, sArgs, cSecTimeout,\n'
-                                  '         sTestBoxReqExpr, sBuildReqExpr, cGangMembers)\n'
-                                  'VALUES   (%s, %s, %s, %s, %s, %s, %s)'
+                                  '         sTestBoxReqExpr, sBuildReqExpr, cGangMembers, sSubName)\n'
+                                  'VALUES   (%s, %s, %s, %s, %s, %s, %s, %s)'
                                   , ( oData.idTestCase, uidAuthor, oNewVar.sArgs, oNewVar.cSecTimeout,
-                                      oNewVar.sTestBoxReqExpr, oNewVar.sBuildReqExpr, oNewVar.cGangMembers,));
+                                      oNewVar.sTestBoxReqExpr, oNewVar.sBuildReqExpr, oNewVar.cGangMembers, oNewVar.sSubName));
             else:
                 oCurVar = TestCaseArgsData().initFromDbRow(aoRow);
@@ -1288,5 +1288,6 @@
                       and oNewVar.sTestBoxReqExpr == oCurVar.sTestBoxReqExpr \
                       and oNewVar.sBuildReqExpr   == oCurVar.sBuildReqExpr \
-                      and oNewVar.cGangMembers    == oCurVar.cGangMembers:
+                      and oNewVar.cGangMembers    == oCurVar.cGangMembers \
+                      and oNewVar.sSubName        == oCurVar.sSubName:
                         oNewVar.idTestCaseArgs    = oCurVar.idTestCaseArgs;
                         oNewVar.idGenTestCaseArgs = oCurVar.idGenTestCaseArgs;
@@ -1299,9 +1300,9 @@
                 self._oDb.execute('INSERT INTO TestCaseArgs (\n'
                                   '         idTestCaseArgs, idTestCase, uidAuthor, sArgs, cSecTimeout,\n'
-                                  '         sTestBoxReqExpr, sBuildReqExpr, cGangMembers)\n'
-                                  'VALUES   (%s, %s, %s, %s, %s, %s, %s, %s)\n'
+                                  '         sTestBoxReqExpr, sBuildReqExpr, cGangMembers, sSubName)\n'
+                                  'VALUES   (%s, %s, %s, %s, %s, %s, %s, %s, %s)\n'
                                   'RETURNING idGenTestCaseArgs\n'
                                   , ( oCurVar.idTestCaseArgs, oData.idTestCase, uidAuthor, oNewVar.sArgs, oNewVar.cSecTimeout,
-                                      oNewVar.sTestBoxReqExpr, oNewVar.sBuildReqExpr, oNewVar.cGangMembers,));
+                                      oNewVar.sTestBoxReqExpr, oNewVar.sBuildReqExpr, oNewVar.cGangMembers, oNewVar.sSubName));
                 oNewVar.idGenTestCaseArgs = self._oDb.fetchOne()[0];
 
Index: /trunk/src/VBox/ValidationKit/testmanager/core/testcaseargs.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/core/testcaseargs.py	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/core/testcaseargs.py	(revision 61255)
@@ -64,7 +64,10 @@
     ksParam_sBuildReqExpr      = 'TestCaseArgs_sBuildReqExpr';
     ksParam_cGangMembers       = 'TestCaseArgs_cGangMembers';
+    ksParam_sSubName           = 'TestCaseArgs_sSubName';
+
+    kcDbColumns                 = 12;
 
     kasAllowNullAttributes      = [ 'idTestCase', 'idTestCaseArgs', 'tsEffective', 'tsExpire', 'uidAuthor', 'idGenTestCaseArgs',
-                                    'cSecTimeout', 'sTestBoxReqExpr', 'sBuildReqExpr', ];
+                                    'cSecTimeout', 'sTestBoxReqExpr', 'sBuildReqExpr', 'sSubName', ];
 
     def __init__(self):
@@ -86,4 +89,5 @@
         self.sBuildReqExpr      = None;
         self.cGangMembers       = 1;
+        self.sSubName           = None;
 
     def initFromDbRow(self, aoRow):
@@ -106,4 +110,5 @@
         self.sBuildReqExpr      = aoRow[9];
         self.cGangMembers       = aoRow[10];
+        self.sSubName           = aoRow[11];
         return self;
 
@@ -132,5 +137,5 @@
     def initFromValues(self, sArgs, cSecTimeout = None, sTestBoxReqExpr = None, sBuildReqExpr = None,  # pylint: disable=R0913
                        cGangMembers = 1, idTestCase = None, idTestCaseArgs = None, tsEffective = None, tsExpire = None,
-                       uidAuthor = None, idGenTestCaseArgs = None):
+                       uidAuthor = None, idGenTestCaseArgs = None, sSubName = None):
         """
         Reinitialize from values.
@@ -148,4 +153,5 @@
         self.sBuildReqExpr      = sBuildReqExpr;
         self.cGangMembers       = cGangMembers;
+        self.sSubName           = sSubName;
         return self;
 
Index: /trunk/src/VBox/ValidationKit/testmanager/core/testresults.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/core/testresults.py	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/core/testresults.py	(revision 61255)
@@ -441,4 +441,5 @@
     ksParam_tsExpire            = 'TestResultFailure_tsExpire';
     ksParam_uidAuthor           = 'TestResultFailure_uidAuthor';
+    ksParam_idTestSet           = 'TestResultFailure_idTestSet';
     ksParam_idFailureReason     = 'TestResultFailure_idFailureReason';
     ksParam_sComment            = 'TestResultFailure_sComment';
@@ -446,5 +447,5 @@
     kasAllowNullAttributes      = ['tsEffective', 'tsExpire', 'uidAuthor', 'sComment' ];
 
-    kcDbColumns                 = 6;
+    kcDbColumns                 = 7;
 
     def __init__(self):
@@ -454,4 +455,5 @@
         self.tsExpire           = None;
         self.uidAuthor          = None;
+        self.idTestSet          = None;
         self.idFailureReason    = None;
         self.sComment           = None;
@@ -469,6 +471,7 @@
         self.tsExpire           = aoRow[2];
         self.uidAuthor          = aoRow[3];
-        self.idFailureReason    = aoRow[4];
-        self.sComment           = aoRow[5];
+        self.idTestSet          = aoRow[4];
+        self.idFailureReason    = aoRow[5];
+        self.sComment           = aoRow[6];
         return self;
 
@@ -2080,4 +2083,5 @@
                                      'Perhaps someone else beat you to it? Or did you try resubmit?'
                                      % (oData.idTestResult, oOldData));
+        oData = self._resolveSetTestIdIfMissing(oData);
 
         #
@@ -2102,4 +2106,5 @@
 
         oOldData = self.getById(oData.idTestResult)
+        oData.idTestSet = oOldData.idTestSet;
 
         #
@@ -2147,10 +2152,12 @@
                           '         tsEffective,\n'
                           '         idTestResult,\n'
+                          '         idTestSet,\n'
                           '         idFailureReason,\n'
                           '         sComment)\n'
-                          'VALUES (%s, %s, %s, %s, %s)\n'
+                          'VALUES (%s, %s, %s, %s, %s, %s)\n'
                           , ( uidAuthor,
                               tsEffective,
                               oData.idTestResult,
+                              oData.idTestSet,
                               oData.idFailureReason,
                               oData.sComment,) );
@@ -2170,4 +2177,12 @@
 
 
+    def _resolveSetTestIdIfMissing(self, oData):
+        """ Resolve any missing idTestSet reference (it's a duplicate for speed efficiency). """
+        if oData.idTestSet is None and oData.idTestResult is not None :
+            self._oDb.execute('SELECT idTestSet FROM TestResults WHERE idTestResult = %s', (oData.idTestResult,));
+            oData.idTestResult = self._oDb.fetchOne()[0];
+        return oData;
+
+
 
 #
Index: /trunk/src/VBox/ValidationKit/testmanager/db/TestManagerDatabaseInit.pgsql
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/db/TestManagerDatabaseInit.pgsql	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/db/TestManagerDatabaseInit.pgsql	(revision 61255)
@@ -402,4 +402,6 @@
     --- Number of testboxes required (gang scheduling).
     cGangMembers        SMALLINT    DEFAULT 1  NOT NULL  CHECK (cGangMembers > 0 AND cGangMembers < 1024),
+    --- Optional variation sub-name.
+    sSubName            TEXT        DEFAULT NULL,
 
     --- The arguments are part of the primary key for several reasons.
@@ -957,4 +959,9 @@
     -- Non-unique foreign key: Users(uid)
     uidAuthor           INTEGER     NOT NULL,
+    --- The testsest this result is a part of.
+    -- This is mainly an aid for bypassing the enormous TestResults table.
+    -- Note! This is a foreign key, but we have to add it after TestSets has
+    --       been created, see further down.
+    idTestSet           INTEGER     NOT NULL,
 
     --- The suggested failure reason.
@@ -966,5 +973,7 @@
     PRIMARY KEY (idTestResult, tsExpire)
 );
-
+CREATE INDEX TestResultFailureIdx  ON TestResultFailures (idTestSet, tsExpire DESC, tsEffective ASC);
+CREATE INDEX TestResultFailureIdx2 ON TestResultFailures (idTestResult, tsExpire DESC, tsEffective ASC);
+CREATE INDEX TestResultFailureIdx3 ON TestResultFailures (idFailureReason, idTestResult, tsExpire DESC, tsEffective ASC);
 
 
@@ -1309,5 +1318,8 @@
                OR (cErrors = 0 AND enmStatus IN ('running'::TestStatus_T, 'success'::TestStatus_T,
                                                  'skipped'::TestStatus_T, 'aborted'::TestStatus_T, 'bad-testbox'::TestStatus_T))
-              )
+              ),
+    -- The following is for the TestResultFailures foreign key.
+    -- Note! This was added with the name TestResults_idTestResult_idTestSet_key in the tmdb-r16 update script.
+    UNIQUE (idTestResult, idTestSet)
 );
 
@@ -1318,6 +1330,6 @@
 CREATE INDEX TestResultsNameIdx2 ON TestResults (idTestResult, idStrName);
 
-ALTER TABLE TestResultFailures
-    ADD CONSTRAINT idTestResultFk FOREIGN KEY (idTestResult) REFERENCES TestResults(idTestResult) MATCH FULL;
+ALTER TABLE TestResultFailures ADD CONSTRAINT TestResultFailures_idTestResult_idTestSet_fkey 
+    FOREIGN KEY (idTestResult, idTestSet) REFERENCES TestResults(idTestResult, idTestSet) MATCH FULL;
 
 
@@ -1557,4 +1569,5 @@
 ALTER TABLE TestResults      ADD FOREIGN KEY (idTestSet) REFERENCES TestSets(idTestSet) MATCH FULL;
 ALTER TABLE TestResultValues ADD FOREIGN KEY (idTestSet) REFERENCES TestSets(idTestSet) MATCH FULL;
+ALTER TABLE TestResultFailures ADD CONSTRAINT idTestSetFk FOREIGN KEY (idTestSet) REFERENCES TestSets(idTestSet) MATCH FULL;
 
 
Index: /trunk/src/VBox/ValidationKit/testmanager/db/tmdb-r16-testcaseargs-1-testresultfailures-1.pgsql
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/db/tmdb-r16-testcaseargs-1-testresultfailures-1.pgsql	(revision 61255)
+++ /trunk/src/VBox/ValidationKit/testmanager/db/tmdb-r16-testcaseargs-1-testresultfailures-1.pgsql	(revision 61255)
@@ -0,0 +1,113 @@
+-- $Id$
+--- @file
+-- VBox Test Manager Database - Adds sName to TestCaseArgs, idTestSet 
+-- to TestResultFailures and add some indexes to the latter as well.
+--
+
+--
+-- Copyright (C) 2013-2016 Oracle Corporation
+--
+-- This file is part of VirtualBox Open Source Edition (OSE), as
+-- available from http://www.virtualbox.org. This file is free software;
+-- you can redistribute it and/or modify it under the terms of the GNU
+-- General Public License (GPL) as published by the Free Software
+-- Foundation, in version 2 as it comes in the "COPYING" file of the
+-- VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+-- hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+--
+-- The contents of this file may alternatively be used under the terms
+-- of the Common Development and Distribution License Version 1.0
+-- (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+-- VirtualBox OSE distribution, in which case the provisions of the
+-- CDDL are applicable instead of those of the GPL.
+--
+-- You may elect to license modified versions of this file under the
+-- terms and conditions of either the GPL or the CDDL or both.
+--
+
+
+DROP TABLE OldTestCaseArgs;
+DROP TABLE NewTestCaseArgs;
+
+
+\set ON_ERROR_STOP 1
+\set AUTOCOMMIT 0
+
+LOCK TABLE TestBoxStatuses    IN ACCESS EXCLUSIVE MODE;
+LOCK TABLE TestSets           IN ACCESS EXCLUSIVE MODE;
+LOCK TABLE TestCaseArgs       IN ACCESS EXCLUSIVE MODE;
+LOCK TABLE TestResultFailures IN ACCESS EXCLUSIVE MODE;
+
+--
+-- TestCaseArgs is simple and we can use ALTER TABLE for a change.
+--
+\d TestCaseArgs;
+ALTER TABLE TestCaseArgs ADD COLUMN sSubName text DEFAULT NULL;
+\d TestCaseArgs;
+
+
+--
+-- Rename the original table, drop constrains and foreign key references so we
+-- get the right name automatic when creating the new one.
+--
+\d TestResultFailures;
+ALTER TABLE TestResultFailures DROP CONSTRAINT idTestResultFk;
+ALTER TABLE TestResultFailures RENAME TO OldTestResultFailures;
+
+DROP INDEX IF EXISTS TestResultFailureIdx;
+DROP INDEX IF EXISTS TestResultFailureIdx2;
+DROP INDEX IF EXISTS TestResultFailureIdx3;
+
+
+CREATE TABLE TestResultFailures (
+    --- The test result we're disucssing.
+    -- @note The foreign key is declared after TestResults (further down).
+    idTestResult        INTEGER     NOT NULL,
+    --- When this row starts taking effect (inclusive).
+    tsEffective         TIMESTAMP WITH TIME ZONE  DEFAULT current_timestamp  NOT NULL,
+    --- When this row stops being tsEffective (exclusive).
+    tsExpire            TIMESTAMP WITH TIME ZONE  DEFAULT TIMESTAMP WITH TIME ZONE 'infinity'  NOT NULL,
+    --- The user id of the one who created/modified this entry.
+    -- Non-unique foreign key: Users(uid)
+    uidAuthor           INTEGER     NOT NULL,
+    --- The testsest this result is a part of.
+    -- This is mainly an aid for bypassing the enormous TestResults table.
+    -- Note! This is a foreign key, but we have to add it after TestSets has
+    --       been created, see further down.
+    idTestSet           INTEGER     NOT NULL,
+
+    --- The suggested failure reason.
+    -- Non-unique foreign key: FailureReasons(idFailureReason)
+    idFailureReason     INTEGER     NOT NULL,
+    --- Optional comment.
+    sComment            text        DEFAULT NULL,
+
+    PRIMARY KEY (idTestResult, tsExpire)
+);
+
+INSERT INTO TestResultFailures ( idTestResult, tsEffective, tsExpire, uidAuthor, idTestSet, idFailureReason, sComment )
+    SELECT o.idTestResult, o.tsEffective, o.tsExpire, o.uidAuthor, tr.idTestSet, o.idFailureReason, sComment
+    FROM   OldTestResultFailures o,
+           TestResults tr
+    WHERE  o.idTestResult = tr.idTestResult;
+   
+-- Add unique constraint to TestResult for our new foreign key.
+ALTER TABLE TestResults ADD CONSTRAINT TestResults_idTestResult_idTestSet_key UNIQUE (idTestResult, idTestSet);
+    FOREIGN KEY (idTestResult, idTestSet) REFERENCES TestResults(idTestResult, idTestSet) MATCH FULL;
+
+-- Restore foreign key.
+ALTER TABLE TestResultFailures ADD CONSTRAINT TestResultFailures_idTestResult_idTestSet_fkey 
+    FOREIGN KEY (idTestResult, idTestSet) REFERENCES TestResults(idTestResult, idTestSet) MATCH FULL;
+
+-- Add new indexes.
+CREATE INDEX TestResultFailureIdx  ON TestResultFailures (idTestSet, tsExpire DESC, tsEffective ASC);
+CREATE INDEX TestResultFailureIdx2 ON TestResultFailures (idTestResult, tsExpire DESC, tsEffective ASC);
+CREATE INDEX TestResultFailureIdx3 ON TestResultFailures (idFailureReason, idTestResult, tsExpire DESC, tsEffective ASC);
+
+-- Drop the old table.
+DROP TABLE OldTestResultFailures;
+
+COMMIT;
+
+\d TestResultFailures;
+
Index: /trunk/src/VBox/ValidationKit/testmanager/htdocs/css/common.css
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/htdocs/css/common.css	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/htdocs/css/common.css	(revision 61255)
@@ -586,4 +586,8 @@
 }
 
+.tmform-field-subname input {
+    width:          10em;
+}
+
 .tmform-field-timestamp input {
     width:          20em;
Index: /trunk/src/VBox/ValidationKit/testmanager/webui/wuiadmintestcase.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/webui/wuiadmintestcase.py	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/webui/wuiadmintestcase.py	(revision 61255)
@@ -69,22 +69,37 @@
         # Base command and variations.
         fNoGang = True;
+        fNoSubName = True;
+        fAllDefaultTimeouts = True;
         for oVar in oEntry.aoTestCaseArgs:
+            if fNoSubName and oVar.sSubName is not None and len(oVar.sSubName.strip()) > 0:
+                fNoSubName = False;
             if oVar.cGangMembers > 1:
                 fNoGang = False;
-                break;
+            if oVar.cSecTimeout is not None:
+                fAllDefaultTimeouts = False;
+
         sHtml  = '  <table class="tminnertbl" width=100%>\n' \
                  '    <tr>\n' \
-                 '      <th>';
+                 '      ';
+        if not fNoSubName:
+            sHtml += '<th class="tmtcasubname">Sub-name</th>';
         if not fNoGang:
-            sHtml += '<th>Gang Size</th>';
-        sHtml += 'Timeout</th><th>Additional Arguments</b></th>\n' \
+            sHtml += '<th class="tmtcagangsize">Gang Size</th>';
+        if not fAllDefaultTimeouts:
+            sHtml += '<th class="tmtcatimeout">Timeout</th>';
+        sHtml += '<th>Additional Arguments</b></th>\n' \
                  '    </tr>\n'
         for oTmp in oEntry.aoTestCaseArgs:
             sHtml += '<tr>';
+            if not fNoSubName:
+                sHtml += '<td>%s</td>' % (webutils.escapeElem(oTmp.sSubName) if oTmp.sSubName is not None else '');
             if not fNoGang:
                 sHtml += '<td>%d</td>' % (oTmp.cGangMembers,)
-            sHtml += '<td>%s</td><td>%s</td></tr>\n' \
-                   % ( utils.formatIntervalSeconds(oTmp.cSecTimeout) if oTmp.cSecTimeout is not None else 'Default',
-                       webutils.escapeElem(oTmp.sArgs.replace('-', u'\u2011')),)
+            if not fAllDefaultTimeouts:
+                sHtml += '<td>%s</td>' \
+                       % (utils.formatIntervalSeconds(oTmp.cSecTimeout) if oTmp.cSecTimeout is not None else 'Default',)
+            sHtml += u'<td>%s</td></tr>' \
+                % ( webutils.escapeElem(oTmp.sArgs.replace('-', u'\u2011')) if len(oTmp.sArgs) > 0 else u'\u2011',);
+            sHtml += '</tr>\n';
         sHtml += '  </table>'
 
Index: /trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py	(revision 61255)
@@ -452,5 +452,5 @@
             sHtml += u'}\n';
             sHtml += u'\n';
-            sHtml += u'function %s_extendListEx(cGangMembers, cSecTimeout, sArgs, sTestBoxReqExpr, sBuildReqExpr)\n' % (sName,);
+            sHtml += u'function %s_extendListEx(sSubName, cGangMembers, cSecTimeout, sArgs, sTestBoxReqExpr, sBuildReqExpr)\n' % (sName,);
             sHtml += u'{\n';
             sHtml += u'    var oElement = document.getElementById(\'%s\');\n' % (sTableId,);
@@ -466,4 +466,8 @@
             sHtml += u'\n';
             sHtml += u'    sHtml += \'<tr class="tmform-testcasevars-first-row">\';\n';
+            sHtml += u'    sHtml += \'  <td>Sub-Name:</td>\';\n';
+            sHtml += u'    sHtml += \'  <td class="tmform-field-subname">' \
+                      '<input name="%s[\' + sId + \'][%s]" id="%s[\' + sId + \'][0]" value="\' + sSubName + \'"></td>\';\n' \
+                   % (sName, TestCaseArgsData.ksParam_sSubName, sName,);
             sHtml += u'    sHtml += \'  <td>Gang Members:</td>\';\n';
             sHtml += u'    sHtml += \'  <td class="tmform-field-tiny-int">' \
@@ -481,5 +485,5 @@
             sHtml += u'    sHtml += \'<tr class="tmform-testcasevars-inner-row">\';\n';
             sHtml += u'    sHtml += \'  <td>Arguments:</td>\';\n';
-            sHtml += u'    sHtml += \'  <td class="tmform-field-wide100" colspan="4">' \
+            sHtml += u'    sHtml += \'  <td class="tmform-field-wide100" colspan="6">' \
                      u'<input name="%s[\' + sId + \'][%s]" id="%s[\' + sId + \'][2]" value="\' + sArgs + \'"></td>\';\n' \
                    % (sName, TestCaseArgsData.ksParam_sArgs, sName,);
@@ -489,5 +493,5 @@
             sHtml += u'    sHtml += \'<tr class="tmform-testcasevars-inner-row">\';\n';
             sHtml += u'    sHtml += \'  <td>TestBox Reqs:</td>\';\n';
-            sHtml += u'    sHtml += \'  <td class="tmform-field-wide100" colspan="4">' \
+            sHtml += u'    sHtml += \'  <td class="tmform-field-wide100" colspan="6">' \
                      u'<input name="%s[\' + sId + \'][%s]" id="%s[\' + sId + \'][2]" value="\' + sTestBoxReqExpr' \
                      u' + \'"></td>\';\n' \
@@ -498,5 +502,5 @@
             sHtml += u'    sHtml += \'<tr class="tmform-testcasevars-final-row">\';\n';
             sHtml += u'    sHtml += \'  <td>Build Reqs:</td>\';\n';
-            sHtml += u'    sHtml += \'  <td class="tmform-field-wide100" colspan="4">' \
+            sHtml += u'    sHtml += \'  <td class="tmform-field-wide100" colspan="6">' \
                      u'<input name="%s[\' + sId + \'][%s]" id="%s[\' + sId + \'][2]" value="\' + sBuildReqExpr + \'"></td>\';\n' \
                    % (sName, TestCaseArgsData.ksParam_sBuildReqExpr, sName,);
@@ -515,8 +519,8 @@
             sHtml += u'function %s_extendList()\n' % (sName,);
             sHtml += u'{\n';
-            sHtml += u'    %s_extendListEx("%s", "%s", "%s", "%s", "%s");\n' % (sName,
-                escapeAttr(unicode(oVarDefaults.cGangMembers)), escapeAttr(unicode(oVarDefaults.cSecTimeout)),
-                escapeAttr(oVarDefaults.sArgs), escapeAttr(oVarDefaults.sTestBoxReqExpr),
-                escapeAttr(oVarDefaults.sBuildReqExpr), );
+            sHtml += u'    %s_extendListEx("%s", "%s", "%s", "%s", "%s", "%s");\n' % (sName,
+                escapeAttr(unicode(oVarDefaults.sSubName)), escapeAttr(unicode(oVarDefaults.cGangMembers)),
+                escapeAttr(unicode(oVarDefaults.cSecTimeout)), escapeAttr(oVarDefaults.sArgs),
+                escapeAttr(oVarDefaults.sTestBoxReqExpr), escapeAttr(oVarDefaults.sBuildReqExpr), );
             sHtml += u'}\n';
             if config.g_kfVBoxSpecific:
@@ -524,31 +528,31 @@
                 sHtml += u'function vbox_%s_add_uni()\n' % (sName,);
                 sHtml += u'{\n';
-                sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes raw", ' \
+                sHtml += u'    %s_extendListEx("uni-raw", "1", "%s", "--cpu-counts 1 --virt-modes raw", ' \
                          u' "", "");\n' % (sName, sSecTimeoutDef);
-                sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes hwvirt", ' \
+                sHtml += u'    %s_extendListEx("uni-hw", "1", "%s", "--cpu-counts 1 --virt-modes hwvirt", ' \
                          u' "fCpuHwVirt is True", "");\n' % (sName, sSecTimeoutDef);
-                sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes hwvirt-np", ' \
+                sHtml += u'    %s_extendListEx("uni-np", "1", "%s", "--cpu-counts 1 --virt-modes hwvirt-np", ' \
                          u' "fCpuNestedPaging is True", "");\n' % (sName, sSecTimeoutDef);
                 sHtml += u'}\n';
                 sHtml += u'function vbox_%s_add_uni_amd64()\n' % (sName,);
                 sHtml += u'{\n';
-                sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes hwvirt", ' \
+                sHtml += u'    %s_extendListEx("uni-64-hw", "1", "%s", "--cpu-counts 1 --virt-modes hwvirt", ' \
                          u' "fCpuHwVirt is True", "");\n' % (sName, sSecTimeoutDef);
-                sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 1 --virt-modes hwvirt-np", ' \
+                sHtml += u'    %s_extendListEx("uni-64-np", "%s", "--cpu-counts 1 --virt-modes hwvirt-np", ' \
                          u' "fCpuNestedPaging is True", "");\n' % (sName, sSecTimeoutDef);
                 sHtml += u'}\n';
                 sHtml += u'function vbox_%s_add_smp()\n' % (sName,);
                 sHtml += u'{\n';
-                sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 2 --virt-modes hwvirt",' \
+                sHtml += u'    %s_extendListEx("smp2-hw", "1", "%s", "--cpu-counts 2 --virt-modes hwvirt",' \
                          u' "fCpuHwVirt is True and cCpus >= 2", "");\n' % (sName, sSecTimeoutDef);
-                sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 2 --virt-modes hwvirt-np",' \
+                sHtml += u'    %s_extendListEx("smp2-np", "1", "%s", "--cpu-counts 2 --virt-modes hwvirt-np",' \
                          u' "fCpuNestedPaging is True and cCpus >= 2", "");\n' % (sName, sSecTimeoutDef);
-                sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 3 --virt-modes hwvirt",' \
+                sHtml += u'    %s_extendListEx("smp3-hw", "1", "%s", "--cpu-counts 3 --virt-modes hwvirt",' \
                          u' "fCpuHwVirt is True and cCpus >= 3", "");\n' % (sName, sSecTimeoutDef);
-                sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 4 --virt-modes hwvirt-np ",' \
+                sHtml += u'    %s_extendListEx("smp4-np", "1", "%s", "--cpu-counts 4 --virt-modes hwvirt-np ",' \
                          u' "fCpuNestedPaging is True and cCpus >= 4", "");\n' % (sName, sSecTimeoutDef);
-                #sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 6 --virt-modes hwvirt",' \
+                #sHtml += u'    %s_extendListEx("smp6-hw", "1", "%s", "--cpu-counts 6 --virt-modes hwvirt",' \
                 #         u' "fCpuHwVirt is True and cCpus >= 6", "");\n' % (sName, sSecTimeoutDef);
-                #sHtml += u'    %s_extendListEx("1", "%s", "--cpu-counts 8 --virt-modes hwvirt-np",' \
+                #sHtml += u'    %s_extendListEx("smp8-np", "1", "%s", "--cpu-counts 8 --virt-modes hwvirt-np",' \
                 #         u' "fCpuNestedPaging is True and cCpus >= 8", "");\n' % (sName, sSecTimeoutDef);
                 sHtml += u'}\n';
@@ -581,9 +585,12 @@
             sHtml += u'<tbody id="%s[%s][6]">\n' % (sName, iVar,)
             sHtml += u'  <tr class="tmform-testcasevars-first-row">\n' \
+                     u'    <td>Sub-name:</td>' \
+                     u'    <td class="tmform-field-subname"><input name="%s[%s][%s]" id="%s[%s][1]" value="%s"%s></td>\n' \
                      u'    <td>Gang Members:</td>' \
                      u'    <td class="tmform-field-tiny-int"><input name="%s[%s][%s]" id="%s[%s][1]" value="%s"%s></td>\n' \
                      u'    <td>Timeout:</td>' \
                      u'    <td class="tmform-field-int"><input name="%s[%s][%s]" id="%s[%s][2]" value="%s"%s></td>\n' \
-                   % ( sName, iVar, TestCaseArgsData.ksParam_cGangMembers, sName, iVar, oVar.cGangMembers, sReadOnlyAttr,
+                   % ( sName, iVar, TestCaseArgsData.ksParam_sSubName, sName, iVar, oVar.sSubName, sReadOnlyAttr,
+                       sName, iVar, TestCaseArgsData.ksParam_cGangMembers, sName, iVar, oVar.cGangMembers, sReadOnlyAttr,
                        sName, iVar, TestCaseArgsData.ksParam_cSecTimeout,  sName, iVar,
                        utils.formatIntervalSeconds2(oVar.cSecTimeout), sReadOnlyAttr, );
@@ -598,5 +605,5 @@
             sHtml += u'  <tr class="tmform-testcasevars-inner-row">\n' \
                      u'    <td>Arguments:</td>' \
-                     u'    <td class="tmform-field-wide100" colspan="4">' \
+                     u'    <td class="tmform-field-wide100" colspan="6">' \
                      u'<input name="%s[%s][%s]" id="%s[%s][3]" value="%s"%s></td>\n' \
                      u'    <td></td>\n' \
@@ -606,5 +613,5 @@
             sHtml += u'  <tr class="tmform-testcasevars-inner-row">\n' \
                      u'    <td>TestBox Reqs:</td>' \
-                     u'    <td class="tmform-field-wide100" colspan="4">' \
+                     u'    <td class="tmform-field-wide100" colspan="6">' \
                      u'<input name="%s[%s][%s]" id="%s[%s][4]" value="%s"%s></td>\n' \
                      u'    <td></td>\n' \
@@ -615,5 +622,5 @@
             sHtml += u'  <tr class="tmform-testcasevars-final-row">\n' \
                      u'    <td>Build Reqs:</td>' \
-                     u'    <td class="tmform-field-wide100" colspan="4">' \
+                     u'    <td class="tmform-field-wide100" colspan="6">' \
                      u'<input name="%s[%s][%s]" id="%s[%s][5]" value="%s"%s></td>\n' \
                      u'    <td></td>\n' \
Index: /trunk/src/VBox/ValidationKit/testmanager/webui/wuitestresult.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/webui/wuitestresult.py	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/webui/wuitestresult.py	(revision 61255)
@@ -392,4 +392,5 @@
                 oForm.addTextHidden(TestResultFailureData.ksParam_tsExpire, oData.tsExpire);
                 oForm.addTextHidden(TestResultFailureData.ksParam_uidAuthor, oData.uidAuthor);
+                oForm.addTextHidden(TestResultFailureData.ksParam_idTestSet, oData.idTestSet);
                 oForm.addSubmit('Change Reason');
 
@@ -401,4 +402,5 @@
                 oForm.addTextHidden(TestResultFailureData.ksParam_tsExpire, '');
                 oForm.addTextHidden(TestResultFailureData.ksParam_uidAuthor, '');
+                oForm.addTextHidden(TestResultFailureData.ksParam_idTestSet, oData.idTestSet);
                 oForm.addSubmit('Add Reason');
 
Index: /trunk/src/VBox/ValidationKit/testmanager/webui/wuitestresultfailure.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testmanager/webui/wuitestresultfailure.py	(revision 61254)
+++ /trunk/src/VBox/ValidationKit/testmanager/webui/wuitestresultfailure.py	(revision 61255)
@@ -79,4 +79,5 @@
         oForm.addMultilineText(TestResultFailureData.ksParam_sComment,   oData.sComment,     'Comment');
         oForm.addIntRO(      TestResultFailureData.ksParam_idTestResult, oData.idTestResult, 'Test Result ID');
+        oForm.addIntRO(      TestResultFailureData.ksParam_idTestSet,    oData.idTestSet,    'Test Set ID');
         oForm.addTimestampRO(TestResultFailureData.ksParam_tsEffective,  oData.tsEffective,  'Effective Date');
         oForm.addTimestampRO(TestResultFailureData.ksParam_tsExpire,     oData.tsExpire,     'Expire (excl)');
