Index: trunk/src/VBox/ValidationKit/testmanager/batch/add_build.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/batch/add_build.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/batch/add_build.py	(revision 70660)
@@ -34,5 +34,5 @@
 import sys;
 import os;
-from optparse import OptionParser;
+from optparse import OptionParser;  # pylint: disable=deprecated-module
 
 # Add Test Manager's modules path
Index: trunk/src/VBox/ValidationKit/testmanager/batch/check_for_deleted_builds.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/batch/check_for_deleted_builds.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/batch/check_for_deleted_builds.py	(revision 70660)
@@ -12,4 +12,6 @@
 bisecting problems.
 """
+
+from __future__ import print_function;
 
 __copyright__ = \
@@ -39,5 +41,5 @@
 import sys;
 import os;
-from optparse import OptionParser;
+from optparse import OptionParser;  # pylint: disable=deprecated-module
 
 # Add Test Manager's modules path
@@ -48,4 +50,6 @@
 from testmanager.core.db    import TMDatabaseConnection;
 from testmanager.core.build import BuildLogic;
+
+
 
 class BuildChecker(object): # pylint: disable=R0903
@@ -70,7 +74,7 @@
         if not self.oConfig.fQuiet:
             if not self.oConfig.fRealRun:
-                print 'Dry run.';
+                print('Dry run.');
             else:
-                print 'Real run! Will commit findings!';
+                print('Real run! Will commit findings!');
 
 
@@ -88,5 +92,5 @@
             aoBuilds = oBuildLogic.fetchForListing(iStart, cMaxRows, tsNow);
             if not self.oConfig.fQuiet and aoBuilds:
-                print 'Processing builds #%s thru #%s' % (aoBuilds[0].idBuild, aoBuilds[-1].idBuild);
+                print('Processing builds #%s thru #%s' % (aoBuilds[0].idBuild, aoBuilds[-1].idBuild));
 
             for oBuild in aoBuilds:
@@ -95,15 +99,15 @@
                     if rc is False:
                         if not self.oConfig.fQuiet:
-                            print 'missing files for build #%s / r%s / %s / %s / %s / %s / %s' \
-                                % (oBuild.idBuild, oBuild.iRevision, oBuild.sVersion, oBuild.oCat.sType,
-                                   oBuild.oCat.sBranch, oBuild.oCat.sProduct, oBuild.oCat.asOsArches,);
-                            print '  %s' % (oBuild.sBinaries,);
+                            print('missing files for build #%s / r%s / %s / %s / %s / %s / %s'
+                                  % (oBuild.idBuild, oBuild.iRevision, oBuild.sVersion, oBuild.oCat.sType,
+                                     oBuild.oCat.sBranch, oBuild.oCat.sProduct, oBuild.oCat.asOsArches,));
+                            print('  %s' % (oBuild.sBinaries,));
                         if self.oConfig.fRealRun is True:
                             oBuild.fBinariesDeleted = True;
                             oBuildLogic.editEntry(oBuild, fCommit = True);
                     elif rc is True and not self.oConfig.fQuiet:
-                        print 'build #%s still have its files' % (oBuild.idBuild,);
+                        print('build #%s still have its files' % (oBuild.idBuild,));
                     elif rc is None and not self.oConfig.fQuiet:
-                        print 'Unable to determine state of build #%s' % (oBuild.idBuild,);
+                        print('Unable to determine state of build #%s' % (oBuild.idBuild,));
 
             # advance
Index: trunk/src/VBox/ValidationKit/testmanager/batch/close_orphaned_testsets.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/batch/close_orphaned_testsets.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/batch/close_orphaned_testsets.py	(revision 70660)
@@ -7,4 +7,6 @@
 Maintenance tool for closing orphaned testsets.
 """
+
+from __future__ import print_function;
 
 __copyright__ = \
@@ -34,5 +36,5 @@
 import sys
 import os
-from optparse import OptionParser
+from optparse import OptionParser;  # pylint: disable=deprecated-module
 
 # Add Test Manager's modules path
@@ -72,18 +74,18 @@
             # Complete them.
             if self.oConfig.fJustDoIt:
-                print 'Completing %u test sets as abandoned:' % (len(aoOrphans),);
+                print('Completing %u test sets as abandoned:' % (len(aoOrphans),));
                 for oTestSet in aoOrphans:
-                    print '#%-7u: idTestBox=%-3u tsCreated=%s tsDone=%s' \
-                        % (oTestSet.idTestSet, oTestSet.idTestBox, oTestSet.tsCreated, oTestSet.tsDone);
+                    print('#%-7u: idTestBox=%-3u tsCreated=%s tsDone=%s'
+                          % (oTestSet.idTestSet, oTestSet.idTestBox, oTestSet.tsCreated, oTestSet.tsDone));
                     oLogic.completeAsAbandoned(oTestSet.idTestSet);
-                print 'Committing...';
+                print('Committing...');
                 oDb.commit();
             else:
                 for oTestSet in aoOrphans:
-                    print '#%-7u: idTestBox=%-3u tsCreated=%s tsDone=%s' \
-                        % (oTestSet.idTestSet, oTestSet.idTestBox, oTestSet.tsCreated, oTestSet.tsDone);
-                print 'Not completing any testsets without seeing the --just-do-it option.'
+                    print('#%-7u: idTestBox=%-3u tsCreated=%s tsDone=%s'
+                          % (oTestSet.idTestSet, oTestSet.idTestBox, oTestSet.tsCreated, oTestSet.tsDone));
+                print('Not completing any testsets without seeing the --just-do-it option.');
         else:
-            print 'No orphaned test sets.\n'
+            print('No orphaned test sets.\n');
         return 0;
 
Index: trunk/src/VBox/ValidationKit/testmanager/batch/del_build.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/batch/del_build.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/batch/del_build.py	(revision 70660)
@@ -8,4 +8,6 @@
 deleted.
 """
+
+from __future__ import print_function;
 
 __copyright__ = \
@@ -35,5 +37,5 @@
 import sys
 import os
-from optparse import OptionParser
+from optparse import OptionParser;  # pylint: disable=deprecated-module
 
 # Add Test Manager's modules path
@@ -74,5 +76,5 @@
         else:
             if not oConfig.fQuiet:
-                print "del_build.py: Marked %u builds associated with '%s' as deleted." % (cBuilds, sBuildBin,);
+                print("del_build.py: Marked %u builds associated with '%s' as deleted." % (cBuilds, sBuildBin,));
 
     oDb.close()
Index: trunk/src/VBox/ValidationKit/testmanager/batch/filearchiver.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/batch/filearchiver.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/batch/filearchiver.py	(revision 70660)
@@ -8,4 +8,6 @@
 g_ksZipFileAreaRootDir storage area.
 """
+
+from __future__ import print_function;
 
 __copyright__ = \
@@ -35,5 +37,5 @@
 import sys
 import os
-from optparse import OptionParser
+from optparse import OptionParser;  # pylint: disable=deprecated-module
 import time;
 import zipfile;
@@ -48,4 +50,6 @@
 from testmanager.core.db        import TMDatabaseConnection;
 from testmanager.core.testset   import TestSetData, TestSetLogic;
+
+
 
 class FileArchiverBatchJob(object): # pylint: disable=R0903
@@ -68,10 +72,10 @@
         """ Verbose output. """
         if self.fVerbose:
-            print sText;
+            print(sText);
         return True;
 
     def warning(self, sText):
         """Prints a warning."""
-        print sText;
+        print(sText);
         return True;
 
Index: trunk/src/VBox/ValidationKit/testmanager/batch/regen_sched_queues.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/batch/regen_sched_queues.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/batch/regen_sched_queues.py	(revision 70660)
@@ -7,4 +7,6 @@
 Interface used by the admin to regenerate scheduling queues.
 """
+
+from __future__ import print_function;
 
 __copyright__ = \
@@ -34,5 +36,5 @@
 import sys;
 import os;
-from optparse import OptionParser;
+from optparse import OptionParser;  # pylint: disable=deprecated-module
 
 # Add Test Manager's modules path
@@ -44,4 +46,6 @@
 from testmanager.core.schedulerbase import SchedulerBase;
 from testmanager.core.schedgroup    import SchedGroupLogic;
+
+
 
 class RegenSchedQueues(object): # pylint: disable=R0903
@@ -76,26 +80,26 @@
         for oGroup in aoGroups:
             if not self.oConfig.fQuiet:
-                print '%s (ID %#d):' % (oGroup.sName, oGroup.idSchedGroup,);
+                print('%s (ID %#d):' % (oGroup.sName, oGroup.idSchedGroup,));
             try:
                 (aoErrors, asMessages) = SchedulerBase.recreateQueue(oDb, self.oConfig.uid, oGroup.idSchedGroup, 2);
             except Exception as oXcpt:
                 oDb.rollback();
-                print '  !!Hit exception processing "%s": %s' % (oGroup.sName, oXcpt,);
+                print('  !!Hit exception processing "%s": %s' % (oGroup.sName, oXcpt,));
             else:
                 if not aoErrors:
                     if not self.oConfig.fQuiet:
-                        print '  Successfully regenerated.';
+                        print('  Successfully regenerated.');
                 else:
                     iRc = 1;
-                    print '  %d errors:' % (len(aoErrors,));
+                    print('  %d errors:' % (len(aoErrors,)));
                     for oError in aoErrors:
                         if oError[1]  is None:
-                            print '  !!%s' % (oError[0],);
+                            print('  !!%s' % (oError[0],));
                         else:
-                            print '  !!%s (%s)' % (oError[0], oError[1]);
+                            print('  !!%s (%s)' % (oError[0], oError[1]));
                 if asMessages and not self.oConfig.fQuiet:
-                    print '  %d messages:' % (len(asMessages),);
+                    print('  %d messages:' % (len(asMessages),));
                     for sMsg in asMessages:
-                        print '  ##%s' % (sMsg,);
+                        print('  ##%s' % (sMsg,));
         return iRc;
 
Index: trunk/src/VBox/ValidationKit/testmanager/batch/vcs_import.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/batch/vcs_import.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/batch/vcs_import.py	(revision 70660)
@@ -7,4 +7,6 @@
 Cron job for importing revision history for a repository.
 """
+
+from __future__ import print_function;
 
 __copyright__ = \
@@ -34,5 +36,5 @@
 import sys;
 import os;
-from optparse import OptionParser;
+from optparse import OptionParser; # pylint: disable=deprecated-module
 import xml.etree.ElementTree as ET;
 
@@ -111,5 +113,5 @@
         asArgs.append(self.oConfig.sUrl);
         if not self.oConfig.fQuiet:
-            print 'Executing: %s' % (asArgs,);
+            print('Executing: %s' % (asArgs,));
         sLogXml = utils.processOutputChecked(asArgs);
 
@@ -127,5 +129,5 @@
                 sMessage = ' ';
             if not self.oConfig.fQuiet:
-                print 'sDate=%s iRev=%u sAuthor=%s sMsg[%s]=%s' % (sDate, iRevision, sAuthor, type(sMessage).__name__, sMessage);
+                print('sDate=%s iRev=%u sAuthor=%s sMsg[%s]=%s' % (sDate, iRevision, sAuthor, type(sMessage).__name__, sMessage));
             oData = VcsRevisionData().initFromValues(self.oConfig.sRepository, iRevision, sDate, sAuthor, sMessage);
             oLogic.addVcsRevision(oData);
Index: trunk/src/VBox/ValidationKit/testmanager/batch/virtual_test_sheriff.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/batch/virtual_test_sheriff.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/batch/virtual_test_sheriff.py	(revision 70660)
@@ -12,4 +12,6 @@
 
 """
+
+from __future__ import print_function;
 
 __copyright__ = \
@@ -41,7 +43,10 @@
 import os;
 import hashlib;
-import StringIO;
-from optparse import OptionParser;
-from PIL import Image;                  # pylint: disable=import-error
+if sys.version_info[0] >= 3:
+    from io       import StringIO as StringIO;      # pylint: disable=import-error,no-name-in-module
+else:
+    from StringIO import StringIO as StringIO;      # pylint: disable=import-error,no-name-in-module
+from optparse import OptionParser;                  # pylint: disable=deprecated-module
+from PIL import Image;                              # pylint: disable=import-error
 
 # Add Test Manager's modules path
@@ -60,4 +65,8 @@
 from testmanager.core.testresultfailures    import TestResultFailureLogic, TestResultFailureData;
 from testmanager.core.useraccount           import UserAccountLogic;
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    xrange = range; # pylint: disable=redefined-builtin,invalid-name
 
 
@@ -224,5 +233,5 @@
         else:
             try:
-                oImage = Image.open(StringIO.StringIO(abImageFile));
+                oImage = Image.open(StringIO(abImageFile));
             except Exception as oXcpt:
                 self.oSheriff.vprint(u'Error opening the "%s" image bytes using PIL.Image.open: %s' % (oFile.sFile, oXcpt,))
@@ -302,5 +311,5 @@
         Returns 1 (for exit code usage.)
         """
-        print 'error: %s' % (sText,);
+        print('error: %s' % (sText,));
         if self.oLogFile is not None:
             self.oLogFile.write((u'error: %s\n' % (sText,)).encode('utf-8'));
@@ -313,5 +322,5 @@
         if self.oConfig.fDebug:
             if not self.oConfig.fQuiet:
-                print 'debug: %s' % (sText, );
+                print('debug: %s' % (sText, ));
             if self.oLogFile is not None:
                 self.oLogFile.write((u'debug: %s\n' % (sText,)).encode('utf-8'));
@@ -323,5 +332,5 @@
         """
         if not self.oConfig.fQuiet:
-            print 'info: %s' % (sText,);
+            print('info: %s' % (sText,));
         if self.oLogFile is not None:
             self.oLogFile.write((u'info: %s\n' % (sText,)).encode('utf-8'));
Index: trunk/src/VBox/ValidationKit/testmanager/core/db.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/db.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/db.py	(revision 70660)
@@ -45,4 +45,7 @@
     psycopg2.extensions.register_type(psycopg2.extensions.UNICODE);
     psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY);
+else:
+    unicode = str;  # pylint: disable=redefined-builtin,invalid-name
+
 
 
Index: trunk/src/VBox/ValidationKit/testmanager/core/failurecategory.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/failurecategory.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/failurecategory.py	(revision 70660)
@@ -30,8 +30,15 @@
 
 
+# Standard Python imports.
+import sys;
+
 # Validation Kit imports.
 from testmanager.core.base          import ModelDataBase, ModelLogicBase, TMRowInUse, TMInvalidData, TMRowNotFound, \
                                            ChangeLogEntry, AttributeChangeEntry;
 from testmanager.core.useraccount   import UserAccountLogic;
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    xrange = range; # pylint: disable=redefined-builtin,invalid-name
 
 
Index: trunk/src/VBox/ValidationKit/testmanager/core/failurereason.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/failurereason.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/failurereason.py	(revision 70660)
@@ -30,4 +30,7 @@
 
 
+# Standard Python imports.
+import sys;
+
 # Validation Kit imports.
 from testmanager.core.base              import ModelDataBase, ModelLogicBase, TMRowNotFound, TMInvalidData, TMRowInUse, \
@@ -35,4 +38,7 @@
 from testmanager.core.useraccount       import UserAccountLogic;
 
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    xrange = range; # pylint: disable=redefined-builtin,invalid-name
 
 
Index: trunk/src/VBox/ValidationKit/testmanager/core/report.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/report.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/report.py	(revision 70660)
@@ -29,4 +29,7 @@
 __version__ = "$Revision$"
 
+
+# Standard Python imports.
+import sys;
 
 # Validation Kit imports.
@@ -40,4 +43,8 @@
 from testmanager.core.testresults   import TestResultLogic, TestResultFilter;
 from common                         import constants;
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    xrange = range; # pylint: disable=redefined-builtin,invalid-name
 
 
Index: trunk/src/VBox/ValidationKit/testmanager/core/schedulerbase.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/schedulerbase.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/schedulerbase.py	(revision 70660)
@@ -33,4 +33,5 @@
 
 # Standard python imports.
+import sys;
 import unittest;
 
@@ -49,4 +50,9 @@
 from testmanager.core.testcaseargs      import TestCaseArgsDataEx, TestCaseArgsLogic;
 from testmanager.core.testset           import TestSetData, TestSetLogic;
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    xrange = range; # pylint: disable=redefined-builtin,invalid-name
+
 
 
@@ -303,7 +309,4 @@
 
 
-        return True;
-
-
 
 class SchedQueueData(ModelDataBase):
@@ -420,5 +423,5 @@
                 return self;
 
-            def next(self):
+            def __next__(self):
                 """Returns the next build, raises StopIteration when the end has been reached."""
                 while True:
@@ -432,5 +435,9 @@
                     if not oEntry.fRemoved:
                         return oEntry;
-                # end
+                return None; # not reached, but make pylint happy (for now).
+
+            def next(self):
+                """ For python 2.x. """
+                return self.__next__();
 
         class BuildCacheEntry(object):
Index: trunk/src/VBox/ValidationKit/testmanager/core/testbox.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/testbox.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/testbox.py	(revision 70660)
@@ -32,4 +32,5 @@
 # Standard python imports.
 import copy;
+import sys;
 import unittest;
 
@@ -40,4 +41,8 @@
                                            ChangeLogEntry, AttributeChangeEntry, AttributeChangeEntryPre;
 from testmanager.core.useraccount   import UserAccountLogic;
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    xrange = range; # pylint: disable=redefined-builtin,invalid-name
 
 
Index: trunk/src/VBox/ValidationKit/testmanager/core/testcase.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/testcase.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/testcase.py	(revision 70660)
@@ -33,4 +33,5 @@
 # Standard python imports.
 import copy;
+import sys;
 import unittest;
 
@@ -41,4 +42,8 @@
 from testmanager.core.globalresource    import GlobalResourceData;
 from testmanager.core.useraccount       import UserAccountLogic;
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    long = int;     # pylint: disable=redefined-builtin,invalid-name
 
 
@@ -872,5 +877,5 @@
                         oTestCase.idTestCase = int(oTestCase.idTestCase);
                         oTestCase.initFromDbWithId(oDb, oTestCase.idTestCase);
-                    except Exception, oXcpt:
+                    except Exception as oXcpt:
                         asErrors.append('Test case dependency #%s: %s' % (oTestCase.idTestCase, oXcpt));
                 aoNewValues.append(oTestCase);
@@ -883,5 +888,5 @@
                         oGlobalRsrc.idTestCase = int(oGlobalRsrc.idGlobalRsrc);
                         oGlobalRsrc.initFromDbWithId(oDb, oGlobalRsrc.idGlobalRsrc);
-                    except Exception, oXcpt:
+                    except Exception as oXcpt:
                         asErrors.append('Resource dependency #%s: %s' % (oGlobalRsrc.idGlobalRsrc, oXcpt));
                 aoNewValues.append(oGlobalRsrc);
Index: trunk/src/VBox/ValidationKit/testmanager/core/testresultfailures.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/testresultfailures.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/testresultfailures.py	(revision 70660)
@@ -31,5 +31,7 @@
 """
 __version__ = "$Revision$"
+
 # Standard python imports.
+import sys;
 import unittest;
 
@@ -40,4 +42,7 @@
 from testmanager.core.useraccount   import UserAccountLogic;
 
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    xrange = range; # pylint: disable=redefined-builtin,invalid-name
 
 
Index: trunk/src/VBox/ValidationKit/testmanager/core/testresults.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/testresults.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/testresults.py	(revision 70660)
@@ -31,5 +31,8 @@
 """
 __version__ = "$Revision$"
+
+
 # Standard python imports.
+import sys;
 import unittest;
 
@@ -49,4 +52,8 @@
 from testmanager.core.testresultfailures    import TestResultFailureDataEx;
 from testmanager.core.useraccount           import UserAccountLogic;
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    long = int;     # pylint: disable=redefined-builtin,invalid-name
 
 
Index: trunk/src/VBox/ValidationKit/testmanager/core/webservergluebase.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/core/webservergluebase.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/core/webservergluebase.py	(revision 70660)
@@ -546,5 +546,6 @@
         dInfo['sys.hexversion']             = sys.hexversion;
         dInfo['sys.api_version']            = sys.api_version;
-        dInfo['sys.subversion']             = sys.subversion;
+        if hasattr(sys, 'subversion'):
+            dInfo['sys.subversion']         = sys.subversion;   # pylint: disable=no-member
         dInfo['sys.platform']               = sys.platform;
         dInfo['sys.executable']             = sys.executable;
Index: trunk/src/VBox/ValidationKit/testmanager/debug/cgiprofiling.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/debug/cgiprofiling.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/debug/cgiprofiling.py	(revision 70660)
@@ -52,5 +52,5 @@
     try:
         oProfiler.print_stats(sort = sSort);
-    except Exception, oXcpt:
+    except Exception as oXcpt:
         print('<p><pre>%s</pre></p>\n' % (oXcpt,));
     else:
Index: trunk/src/VBox/ValidationKit/testmanager/webui/wuiadminfailurecategory.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/webui/wuiadminfailurecategory.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/webui/wuiadminfailurecategory.py	(revision 70660)
@@ -47,5 +47,6 @@
                            dParams = { WuiAdmin.ksParamAction: WuiAdmin.ksActionFailureCategoryDetails,
                                        FailureCategoryData.ksParam_idFailureCategory: idFailureCategory, },
-                           fBracketed = fBracketed);
+                           fBracketed = fBracketed,
+                           sTitle = sTitle);
         self.idFailureCategory = idFailureCategory;
 
Index: trunk/src/VBox/ValidationKit/testmanager/webui/wuibase.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/webui/wuibase.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/webui/wuibase.py	(revision 70660)
@@ -42,4 +42,9 @@
 from testmanager.core.systemlog   import SystemLogLogic, SystemLogData;
 from testmanager.core.useraccount import UserAccountLogic
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    unicode = str;  # pylint: disable=redefined-builtin,invalid-name
+    long = int;     # pylint: disable=redefined-builtin,invalid-name
 
 
@@ -280,5 +285,5 @@
         if self._dSideMenuFormAttrs:
             dReplacements['@@SIDE_MENU_FORM_ATTRS@@'] = ' '.join(['%s="%s"' % (sKey, webutils.escapeAttr(sValue))
-                                                                  for sKey, sValue in self._dSideMenuFormAttrs.iteritems()]);
+                                                                  for sKey, sValue in self._dSideMenuFormAttrs.items()]);
 
         # Special current user handling.
Index: trunk/src/VBox/ValidationKit/testmanager/webui/wuicontentbase.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/webui/wuicontentbase.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/webui/wuicontentbase.py	(revision 70660)
@@ -32,4 +32,5 @@
 # Standard python imports.
 import copy;
+import sys;
 
 # Validation Kit imports.
@@ -40,4 +41,8 @@
 from testmanager.core               import db;
 from testmanager.core.base          import AttributeChangeEntryPre;
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    unicode = str;  # pylint: disable=redefined-builtin,invalid-name
 
 
@@ -691,5 +696,5 @@
             if self._sRedirectTo is not None:
                 oForm.addTextHidden(self._oDisp.ksParamRedirectTo, self._sRedirectTo);
-        except WuiException, oXcpt:
+        except WuiException as oXcpt:
             sContent = unicode(oXcpt)
         else:
Index: trunk/src/VBox/ValidationKit/testmanager/webui/wuigraphwiz.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/webui/wuigraphwiz.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/webui/wuigraphwiz.py	(revision 70660)
@@ -104,5 +104,5 @@
                 else:
                     daTestBoxes[oSeries.idTestBox] = [oSeries,];
-            for _, aoSeriesPerTestBox in daTestBoxes.iteritems():
+            for aoSeriesPerTestBox in daTestBoxes.values():
                 if len(aoSeriesPerTestBox) >= 0:
                     asOsArches = aoSeriesPerTestBox[0].oBuildCategory.asOsArches;
Index: trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py	(revision 70660)
@@ -31,4 +31,5 @@
 # Standard python imports.
 import copy;
+import sys;
 
 # Validation Kit imports.
@@ -39,4 +40,8 @@
 from testmanager.core.testcaseargs  import TestCaseArgsData;
 from testmanager.core.testgroup     import TestGroupMemberData, TestGroupDataEx;
+
+# Python 3 hacks:
+if sys.version_info[0] >= 3:
+    unicode = str;  # pylint: disable=redefined-builtin,invalid-name
 
 
Index: trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphmatplotlib.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphmatplotlib.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphmatplotlib.py	(revision 70660)
@@ -31,10 +31,14 @@
 # Standard Python Import and extensions installed on the system.
 import re;
-import StringIO;
-
-import matplotlib;                          # pylint: disable=F0401
+import sys;
+if sys.version_info[0] >= 3:
+    from io       import StringIO as StringIO;  # pylint: disable=import-error,no-name-in-module
+else:
+    from StringIO import StringIO as StringIO;  # pylint: disable=import-error,no-name-in-module
+
+import matplotlib;                              # pylint: disable=F0401
 matplotlib.use('Agg'); # Force backend.
-import matplotlib.pyplot;                   # pylint: disable=F0401
-from numpy import arange as numpy_arange;   # pylint: disable=E0611,E0401
+import matplotlib.pyplot;                       # pylint: disable=F0401
+from numpy import arange as numpy_arange;       # pylint: disable=E0611,E0401
 
 # Validation Kit imports.
@@ -70,5 +74,5 @@
     def _produceSvg(self, oFigure, fTightLayout = True):
         """ Creates an SVG string from the given figure. """
-        oOutput = StringIO.StringIO();
+        oOutput = StringIO();
         if fTightLayout:
             oFigure.tight_layout();
Index: trunk/src/VBox/ValidationKit/testmanager/webui/wuitestresultfailure.py
===================================================================
--- trunk/src/VBox/ValidationKit/testmanager/webui/wuitestresultfailure.py	(revision 69781)
+++ trunk/src/VBox/ValidationKit/testmanager/webui/wuitestresultfailure.py	(revision 70660)
@@ -48,5 +48,6 @@
                            dParams = { WuiMain.ksParamAction: WuiMain.ksActionTestResultFailureDetails,
                                        TestResultFailureData.ksParam_idTestResult: idTestResult, },
-                           fBracketed = fBracketed);
+                           fBracketed = fBracketed,
+                           sTitle = sTitle);
         self.idTestResult = idTestResult;
 
