Index: /trunk/src/VBox/ValidationKit/common/utils.py
===================================================================
--- /trunk/src/VBox/ValidationKit/common/utils.py	(revision 70565)
+++ /trunk/src/VBox/ValidationKit/common/utils.py	(revision 70566)
@@ -104,5 +104,5 @@
             else:
                 try:
-                    sArch = processOutputChecked(['/usr/bin/isainfo', '-n',]);
+                    sArch = str(processOutputChecked(['/usr/bin/isainfo', '-n',]));
                 except:
                     pass;
@@ -586,5 +586,10 @@
     Wrapper around subprocess.check_output to deal with its absense in older
     python versions.
-    """
+    Extra keyword: sEncoding='utf-8; for specifying now output is to be decoded.
+    """
+    sEncoding = dKeywordArgs.get('sEncoding');
+    if sEncoding is not None:   del dKeywordArgs['sEncoding'];
+    else:                       sEncoding = 'utf-8';
+
     _processFixPythonInterpreter(aPositionalArgs, dKeywordArgs);
     oProcess = processPopenSafe(stdout=subprocess.PIPE, *aPositionalArgs, **dKeywordArgs);
@@ -600,5 +605,5 @@
         raise subprocess.CalledProcessError(iExitCode, asArgs);
 
-    return str(sOutput); # str() make pylint happy.
+    return sOutput.decode(sEncoding);
 
 g_fOldSudo = None;
@@ -625,5 +630,5 @@
         if g_fOldSudo is None:
             try:
-                sVersion = processOutputChecked(['sudo', '-V']);
+                sVersion = str(processOutputChecked(['sudo', '-V']));
             except:
                 sVersion = '1.7.0';
Index: /trunk/src/VBox/ValidationKit/testboxscript/testboxconnection.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testboxscript/testboxconnection.py	(revision 70565)
+++ /trunk/src/VBox/ValidationKit/testboxscript/testboxconnection.py	(revision 70566)
@@ -32,11 +32,12 @@
 # Standard python imports.
 import sys;
-import urllib
 if sys.version_info[0] >= 3:
-    import http.client as httplib;      # pylint: disable=import-error,no-name-in-module
-    import urllib.parse as urlparse;    # pylint: disable=import-error,no-name-in-module
+    import http.client as httplib;                          # pylint: disable=import-error,no-name-in-module
+    import urllib.parse as urlparse;                        # pylint: disable=import-error,no-name-in-module
+    from urllib.parse import urlencode as urllib_urlencode; # pylint: disable=import-error,no-name-in-module
 else:
-    import httplib;                     # pylint: disable=import-error
-    import urlparse;                    # pylint: disable=import-error
+    import httplib;                                         # pylint: disable=import-error
+    import urlparse;                                        # pylint: disable=import-error
+    from urllib import urlencode as urllib_urlencode;       # pylint: disable=import-error
 
 # Validation Kit imports.
@@ -59,4 +60,5 @@
             # Read the whole response (so we can log it).
             sBody = oResponse.read();
+            sBody = sBody.decode('utf-8');
 
             # Check the content type.
@@ -199,5 +201,5 @@
         sServerPath = '/%s/testboxdisp.py' % (self._oParsedUrl.path.strip('/'),); # pylint: disable=E1101
         dParams[constants.tbreq.ALL_PARAM_ACTION] = sAction;
-        sBody = urllib.urlencode(dParams);
+        sBody = urllib_urlencode(dParams);
         ##testboxcommons.log2('sServerPath=%s' % (sServerPath,));
         try:
Index: /trunk/src/VBox/ValidationKit/testboxscript/testboxtasks.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testboxscript/testboxtasks.py	(revision 70565)
+++ /trunk/src/VBox/ValidationKit/testboxscript/testboxtasks.py	(revision 70566)
@@ -642,4 +642,5 @@
             oFile = open(sPath, "rb");
             sStr = oFile.read();
+            sStr = sStr.decode('utf-8');
             oFile.close();
             return sStr.strip();
@@ -779,5 +780,5 @@
         try:
             oFile = open(sPath, "wb");
-            oFile.write(sContent);
+            oFile.write(sContent.encode('utf-8'));
             oFile.flush();
             try:     os.fsync(oFile.fileno());
Index: /trunk/src/VBox/ValidationKit/testdriver/reporter.py
===================================================================
--- /trunk/src/VBox/ValidationKit/testdriver/reporter.py	(revision 70565)
+++ /trunk/src/VBox/ValidationKit/testdriver/reporter.py	(revision 70566)
@@ -658,12 +658,18 @@
 
         # Prepare the TM connecting.
-        import urlparse;
-        import httplib;
-        import urllib;
         from common import constants;
-
-        self._fnUrlEncode       = urllib.urlencode;
-        self._fnUrlParseQs      = urlparse.parse_qs;
-        self._oParsedTmUrl      = urlparse.urlparse(self.sTestManagerUrl);
+        if sys.version_info[0] >= 3:
+            import urllib;
+            self._fnUrlEncode       = urllib.parse.urlencode;                       # pylint: disable=no-member
+            self._fnUrlParseQs      = urllib.parse.parse_qs;                        # pylint: disable=no-member
+            self._oParsedTmUrl      = urllib.parse.urlparse(self.sTestManagerUrl);  # pylint: disable=no-member
+            import http.client as httplib;                                      # pylint: disable=no-name-in-module,import-error
+        else:
+            import urllib;
+            self._fnUrlEncode       = urllib.urlencode;                             # pylint: disable=no-member
+            import urlparse;                                                        # pylint: disable=import-error
+            self._fnUrlParseQs      = urlparse.parse_qs;                            # pylint: disable=no-member
+            self._oParsedTmUrl      = urlparse.urlparse(self.sTestManagerUrl);      # pylint: disable=no-member
+            import httplib;                                                     # pylint: disable=no-name-in-module,import-error
 
         if     sys.version_info[0] >= 3 \
@@ -697,5 +703,5 @@
         self._sTmServerPath = '/%s/testboxdisp.py?%s' \
                             % ( self._oParsedTmUrl.path.strip('/'), # pylint: disable=E1101
-                                urllib.urlencode(dParams), );
+                                self._fnUrlEncode(dParams), );
 
     def __del__(self):
