diff --git a/DataQuality/DataQualityUtils/python/DQHistogramMergeMod.py b/DataQuality/DataQualityUtils/python/DQHistogramMergeMod.py
index f764a21d5753206c7fd2600f255a1fef1275a840..07212e69aff551b7d7ebcee8e046ac9648391814 100644
--- a/DataQuality/DataQualityUtils/python/DQHistogramMergeMod.py
+++ b/DataQuality/DataQualityUtils/python/DQHistogramMergeMod.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 import os
 ## Needed to correct ROOT behavior; see below
@@ -23,7 +23,7 @@ MODVERSION = '$Id: DQHistogramMergeMod.py,v 1.8 2009-05-12 11:38:35 ponyisi Exp
 
 DoProcMon=False
 if DoProcMon:
-    import DQProcMonitor
+    from . import DQProcMonitor
     DQProcMonitor.startProcMonThread()
   
 def DQHistogramMerge( listFileName, outFileName, runPostProcessing, directoryRegularExpression=".*", histogramRegularExpression=".*", isIncremental=False, compressionLevel=1,debugLevel=0 ):
@@ -38,5 +38,5 @@ def DQHistogramMerge( listFileName, outFileName, runPostProcessing, directoryReg
     mf.mergeLBintervals( outFileName )
   
     if runPostProcessing:
-        import DQPostProcessMod
+        from . import DQPostProcessMod
         DQPostProcessMod.DQPostProcess( outFileName, isIncremental )
diff --git a/DataQuality/DataQualityUtils/python/DQPostProcessMod.py b/DataQuality/DataQualityUtils/python/DQPostProcessMod.py
index 7364c5256caea11e89887d13fb50640080a6fafd..17d173638ca1088d6c945a7d093713019c00a60e 100644
--- a/DataQuality/DataQualityUtils/python/DQPostProcessMod.py
+++ b/DataQuality/DataQualityUtils/python/DQPostProcessMod.py
@@ -3,7 +3,7 @@ from __future__ import print_function
 
 import shutil, re
 
-from dqu_subprocess import apply as _local_apply
+from .dqu_subprocess import apply as _local_apply
 
 def _dolsrwrapper(fname):
     import ROOT
diff --git a/DataQuality/DataQualityUtils/python/DQProcMonitor.py b/DataQuality/DataQualityUtils/python/DQProcMonitor.py
index 897a1e9144d9d1d15b39b33feea0c8b5902c46af..806e0d6da2eb38677bd1f0651edb5e414e9252dd 100644
--- a/DataQuality/DataQualityUtils/python/DQProcMonitor.py
+++ b/DataQuality/DataQualityUtils/python/DQProcMonitor.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 from __future__ import print_function
 
 #python 2.6 is buggy, it can't import modules in deamon threads one has to import them in to global 
@@ -11,7 +11,7 @@ def formatRusage(rusage):
     fieldnames=["utime","stime","maxrss","shrmem","ushrmem","ushrstk","minflt",
                  "majflt","nswap","inblock","oublock","msgsnd","msgrcv",
                  "nsignals","nvcontsw","nivcontsw"]
-    return ", ".join(["=".join([n,"%s"%v] if type(v) is int else [n,"%f"%v]) for n,v in zip(fieldnames,rusage)])
+    return ", ".join(["=".join([n,"%s"%v] if isinstance(v, int) else [n,"%f"%v]) for n,v in zip(fieldnames,rusage)])
 
 def DQProcMon(*args,**kwargs):
     #    from resource import getrusage, RUSAGE_SELF, RUSAGE_CHILDREN
diff --git a/DataQuality/DataQualityUtils/python/DQWebDisplayMod.py b/DataQuality/DataQualityUtils/python/DQWebDisplayMod.py
index 51b1fd0d66e4dab0654796d9b46e18726c468795..33d77d0155b6b9a0e9bb0b054d5b42c85f521c82 100755
--- a/DataQuality/DataQualityUtils/python/DQWebDisplayMod.py
+++ b/DataQuality/DataQualityUtils/python/DQWebDisplayMod.py
@@ -58,7 +58,7 @@ def DQWebDisplay( inputFilePath, runAccumulating, c ):
     # we use the multiprocessing module to isolate code that possibly
     # has memory leaks, so they don't build up over time
 
-    if type(c.server) == str:
+    if isinstance(c.server, str):
         if c.server == '':
             c.server = []
         else:
@@ -601,13 +601,14 @@ def findCacheFile( inputFilePath, run, stream, cache ):
 
 
 def transferDirectoryToHandoffDir( dirName, localDir, targetDir, config ):
-    import time, ConfigParser, shutil, glob
+    import time, shutil, glob
+    import six.moves.configparser as configparser
     targetfname = repr(int(time.time())) + '-' + repr(os.getpid()) \
                   + '-' + os.uname()[1]  + '.tgz'
     targetfile = os.path.join(targetDir, targetfname)
 
     print('Creating tarball', targetfname, '...')
-    parser = ConfigParser.ConfigParser()
+    parser = configparser.ConfigParser()
     parser.set('DEFAULT', 'target', config.htmlDir)
     parser.add_section('execute')
     parser.set('execute', 'command', config.htmlDir + '/generateDQIndexFiles.py')
@@ -762,7 +763,7 @@ def importConfiguration(modname):
 def email(msg, subject, whofrom, addressees):
     import smtplib
     from email.mime.text import MIMEText
-    if type(addressees) == str:
+    if isinstance(addressees, str):
         addressees = [addressees]
     email = MIMEText(msg)
     email['Subject'] = subject
diff --git a/DataQuality/DataQualityUtils/python/TestCases.py b/DataQuality/DataQualityUtils/python/TestCases.py
index dd7d251bcd67e6e2842273075b19bb1ab2d01286..0bc117b418601923dcd53f9446ab11a123a70417 100644
--- a/DataQuality/DataQualityUtils/python/TestCases.py
+++ b/DataQuality/DataQualityUtils/python/TestCases.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 # None of this works, but keep it around in case someone wants to resurrect it later...
 # - PO 20180419
@@ -23,7 +23,7 @@ class DQUTestCase(unittest.TestCase):
         inlist = os.path.join(TESTING_DIR, 'test_merging')
         self.outfile = os.path.join(outdir, 'data09_calophys.00128005.physics_CosmicMuons.root')
         rv = os.system('cd %s ; DQHistogramMerge.py %s %s True' % (outdir, inlist, self.outfile))
-        self.failUnless(rv==0, "DQHistogramMerge.py return code is nonzero")
+        self.assertTrue(rv==0, "DQHistogramMerge.py return code is nonzero")
         
     def test02_WebDisplay(self):
         '''Test that a terminal web display job works'''
@@ -34,7 +34,7 @@ class DQUTestCase(unittest.TestCase):
         outdir = os.environ.get('TMPDIR', '.')
         infile = os.path.join(TESTING_DIR, 'data09_calophys.00128005.physics_CosmicMuons.root')
         rv = os.system('cd %s ; DQWebDisplay.py %s TestDisplay 123' % (outdir, infile))
-        self.failUnless(rv==0, "DQWebDisplay.py return code is nonzero")
+        self.assertTrue(rv==0, "DQWebDisplay.py return code is nonzero")
         
     def test_03_WebDisplay(self):
         '''Test that a terminal web display job works in temporary accumulation mode'''
@@ -55,7 +55,7 @@ class DQUTestCase(unittest.TestCase):
         shutil.copy(infile, os.path.join(cachedir, cachefilename))
 
         rv = os.system('cd %s ; DQWebDisplay.py %s TestDisplay 123 True' % (outdir, infile))
-        self.failUnless(rv==0, "DQWebDisplay.py return code is nonzero")
+        self.assertTrue(rv==0, "DQWebDisplay.py return code is nonzero")
 
     def tearDown(self):
         try:
diff --git a/DataQuality/DataQualityUtils/python/detmaskmod.py b/DataQuality/DataQualityUtils/python/detmaskmod.py
index 3dacb9a9c20700c0af1194a2f1e50d65985381b2..e3a6095728f25d84b0d4044743d0ad01363a7202 100644
--- a/DataQuality/DataQualityUtils/python/detmaskmod.py
+++ b/DataQuality/DataQualityUtils/python/detmaskmod.py
@@ -88,12 +88,12 @@ def decode(mask):
     dm = eformat.helper.DetectorMask(mask)
     rv = []
     for keys, value in detmaskmap.items():
-        if type(keys) == str:
+        if isinstance(keys, str):
             keys = [keys]
         if reduce(operator.or_,
                   [dm.is_set(getSubDetectorObj(key)) for key in keys]):
             flags = value
-            if type(flags) == str:
+            if isinstance(flags, str):
                 flags = [flags]
             rv += list(flags)
 
@@ -104,12 +104,12 @@ def decodeBlack(mask, defects=False):
     rv = []
     dmap = detmaskmap if not defects else detmaskmap_defects
     for keys, value in sorted(dmap.items()):
-        if type(keys) == str:
+        if isinstance(keys, str):
             keys = [keys]
         if reduce(operator.and_,
                   [not dm.is_set(getSubDetectorObj(key)) for key in keys]):
             flags = value
-            if type(flags) == str:
+            if isinstance(flags, str):
                 flags = [flags]
             rv += list(flags)
 
diff --git a/DataQuality/DataQualityUtils/python/doZLumi.py b/DataQuality/DataQualityUtils/python/doZLumi.py
index 605c4a763fe700e4df20dc5abdbbf59f207ee576..617008858c91bba12e7c363bfdd305eb3b748eba 100644
--- a/DataQuality/DataQualityUtils/python/doZLumi.py
+++ b/DataQuality/DataQualityUtils/python/doZLumi.py
@@ -45,7 +45,7 @@ def makeGRL(run, defect, fname):
     print('done')
     print('Query defects...', end='')
     ddb = DQDefects.DefectsDB('COOLOFL_GLOBAL/%s' % dbinstance, tag=tag)
-    ignores = set([_ for _ in ddb.defect_names if 'UNCHECKED' in _])
+    ignores = {_ for _ in ddb.defect_names if 'UNCHECKED' in _}
     try:
         defectiovs = ddb.retrieve(since = min(runs) << 32 | 1,
                                   until = max(runs) << 32 | 0xffffffff,
diff --git a/DataQuality/DataQualityUtils/python/dqu_subprocess.py b/DataQuality/DataQualityUtils/python/dqu_subprocess.py
index 08b0d793483494322945c369657da92a73ee0ac1..6b3e2eecabffc0de7a190f58b61b1cce243d56f1 100644
--- a/DataQuality/DataQualityUtils/python/dqu_subprocess.py
+++ b/DataQuality/DataQualityUtils/python/dqu_subprocess.py
@@ -10,7 +10,7 @@ def _local_apply_core(func, args, q):
         os._exit(1)
 
 def apply(func, args):
-    from Queue import Empty
+    from six.moves.queue import Empty
     from multiprocessing import Process
     from multiprocessing.managers import SyncManager
     import tempfile
@@ -34,7 +34,7 @@ def apply(func, args):
     try:
         rv = q.get(False)
     except Empty:
-        raise RuntimeError('daughter died while trying to execute %s%s' % (func.func_name, args))
+        raise RuntimeError('daughter died while trying to execute %s%s' % (func.__name__, args))
     if isinstance(rv, BaseException):
         if isinstance(rv, SystemExit):
             print('SystemExit raised by daughter; ignoring')
diff --git a/DataQuality/DataQualityUtils/python/hancool_histo_mod.py b/DataQuality/DataQualityUtils/python/hancool_histo_mod.py
index 572064dc18f945efbad6c0ed5c0df535fca48d33..5d3aa1db40163c0257c96020a95b69796859864a 100644
--- a/DataQuality/DataQualityUtils/python/hancool_histo_mod.py
+++ b/DataQuality/DataQualityUtils/python/hancool_histo_mod.py
@@ -82,7 +82,7 @@ def stringGetInfo(file, rootFolder):
 def ListHistoAssessments(xml, channel):
     the_result_histo = "Undefined"
     g = open(xml, 'r')
-    while 1:
+    while True:
         line = g.readline()
         if not line:
             break
@@ -160,7 +160,7 @@ def hancool_histo(inputFilePath="", input_run=-1, dbConnectionHisto="", dqmfOflH
     filename = "run_"+str(run)+"_han.root"
 
     # filling OFLH DB for histos (global run)
-    for pair in folderMapHisto.iteritems():
+    for pair in folderMapHisto.items():
         i = 0
         number = 0
         print(pair[0], pair[1])
diff --git a/DataQuality/DataQualityUtils/python/hancoolmod.py b/DataQuality/DataQualityUtils/python/hancoolmod.py
index 02073e0d605164a1fd02817173ad6e88f0eac728..d53a947a4e559399558206b8295bf0bb6cbd1cbc 100644
--- a/DataQuality/DataQualityUtils/python/hancoolmod.py
+++ b/DataQuality/DataQualityUtils/python/hancoolmod.py
@@ -136,7 +136,7 @@ intervalType = {
 def getLimits(name):
     try:
         import re
-        import detmaskmod
+        from . import detmaskmod
         runNumber = re.match(r'run_(\d+)_.*han.root', name).group(1)
         max_hi_limit = detmaskmod.getNumLumiBlocks(int(runNumber))+1
         if (name.find('minutes10_') > -1):
@@ -287,7 +287,7 @@ def hancool(runNumber=3070,
 
 
 def detmask_defects(runNumber, ddb):
-    import detmaskmod
+    from . import detmaskmod
     blacks = detmaskmod.decodeBlack(detmaskmod.getRunMask(runNumber),
                                     defects=True)
     nlbs = detmaskmod.getNumLumiBlocks(runNumber)
@@ -340,7 +340,7 @@ def ctp_defects(d, i, runNumber):
             rv.append(defect_iov(mapping[defect], message, False, lb, lb+1))
         if overflow_bad_lbs[defect]:
             message += '; defect occurred past end of monitoring histogram, marking end of run as bad'
-            import detmaskmod  # ugly: could happen for more than one defect - should be cheap though
+            from . import detmaskmod  # ugly: could happen for more than one defect - should be cheap though
             nlbs = detmaskmod.getNumLumiBlocks(runNumber)
             rv.append(defect_iov(defect, message,
                                  False, when.GetNbinsX(), nlbs+1))
@@ -413,7 +413,7 @@ def sct_perlb_defects(d, i, runNumber):
             rv.append(defect_iov(dname, message, False, lb, lb+1))
         if overflow_bad_lbs[dname]:
             message += '; defect occurred past end of monitoring histogram, marking end of run as bad'
-            import detmaskmod  # ugly: could happen for more than one defect - should be cheap though
+            from . import detmaskmod  # ugly: could happen for more than one defect - should be cheap though
             nlbs = detmaskmod.getNumLumiBlocks(runNumber)
             rv.append(defect_iov(dname, message,
                                  False, when.GetNbinsX(), nlbs+1))
@@ -452,7 +452,7 @@ def sct_eff_defect(d, i, runNumber):
     h2 = d.Get('InnerDetector/SCT/Summary/SctTotalEff_/Results/Status')
     if not h1 or not h2:
         return None
-    badstatuses = set(['Yellow', 'Red'])
+    badstatuses = {'Yellow', 'Red'}
     statuscheck = []
     for h in h1, h2:
         status = set(x.GetName() for x in h.GetListOfKeys())
@@ -486,7 +486,7 @@ def dqmf_node_defect(node, defect, badstatuses=['Red']):
 
 
 def hancool_defects(runNumber, filePath="./", dbConnection="", db_tag='HEAD', isESn=True):
-    import pix_defect
+    from . import pix_defect
     analyzers = []
     if isESn:
         # CTP
diff --git a/DataQuality/DataQualityUtils/python/handimod.py b/DataQuality/DataQualityUtils/python/handimod.py
index 355354073132ca7ca68d0d6014f78419ea9ff205..94189b976b7197a4f533320d51563787e5ad4eab 100644
--- a/DataQuality/DataQualityUtils/python/handimod.py
+++ b/DataQuality/DataQualityUtils/python/handimod.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 from __future__ import print_function
 
 import os
@@ -606,7 +606,7 @@ def makeOneHistFile(htmlDir, name, subname, sp, runlistLoc, compare, jsRoot):
                 else:
                     name = ' '.join([namecache[-1]])
                     namecache = []
-                import urllib
+                from six.moves import urllib
                 resultname = name.rsplit(':', 1)[0]
                 resultval = sp[cc-1]
                 if algorithm == 'RepeatAlgorithm' and resultname.endswith('|Status'):
@@ -615,15 +615,15 @@ def makeOneHistFile(htmlDir, name, subname, sp, runlistLoc, compare, jsRoot):
                 if compare and run is not None:
                     if period_type == 'run':
                         queryurl = 'http://atlasdqm.cern.ch:8080/dqmfquery/query?histogram=%s&result=%s&error=&stream=%s&period_type=%s&source=tier0&proc_ver=%s&low_run=%s&high_run=&low_y=&high_y=&outputtype=png' % (
-                            urllib.quote_plus(subname+'/'+sp[0]), urllib.quote_plus(resultname), stream.strip(), period_type, proc_ver, int(run)-1000)
+                            urllib.parse.quote_plus(subname+'/'+sp[0]), urllib.parse.quote_plus(resultname), stream.strip(), period_type, proc_ver, int(run)-1000)
                         k.write(
                             '<tr><td align="right"><b><a href="%s">%s</a>:</b></td>' % (queryurl, resultname))
                         k.write('<td>'+resultval+'</td></tr>\n')
                     else:
                         queryurl1 = 'http://atlasdqm.cern.ch:8080/dqmfquery/query?histogram=%s&result=%s&error=&stream=%s&period_type=%s&source=tier0&proc_ver=%s&low_run=%s&high_run=&low_y=&high_y=&outputtype=png' % (
-                            urllib.quote_plus(subname+'/'+sp[0]), urllib.quote_plus(resultname), stream.strip(), period_type, proc_ver, int(run)-1000)
+                            urllib.parse.quote_plus(subname+'/'+sp[0]), urllib.parse.quote_plus(resultname), stream.strip(), period_type, proc_ver, int(run)-1000)
                         queryurl2 = 'http://atlasdqm.cern.ch:8080/dqmfquery/query?histogram=%s&result=%s&error=&stream=%s&period_type=%s&source=tier0&proc_ver=%s&low_run=%s&high_run=%s&low_y=&high_y=&outputtype=png' % (
-                            urllib.quote_plus(subname+'/'+sp[0]), urllib.quote_plus(resultname), stream.strip(), period_type, proc_ver, run, run)
+                            urllib.parse.quote_plus(subname+'/'+sp[0]), urllib.parse.quote_plus(resultname), stream.strip(), period_type, proc_ver, run, run)
                         k.write(
                             '<tr><td align="right"><b><a href="%s">%s</a>:</b></td>' % (queryurl1, resultname))
                         k.write(
diff --git a/DataQuality/DataQualityUtils/python/hanwriter.py b/DataQuality/DataQualityUtils/python/hanwriter.py
index 3995982cf990dccc17dd01c43d072881e633bdc0..66d2677c1efdb371fee99d45296fee0b40757251 100755
--- a/DataQuality/DataQualityUtils/python/hanwriter.py
+++ b/DataQuality/DataQualityUtils/python/hanwriter.py
@@ -114,7 +114,7 @@ class Node(DQHanConfMaker.Node):
         if self.nodeType != Node.DOCUMENT:
             writer.write(" { %s" % (newl))
         if self.attributes:
-            for key, attribute in self.attributes.iteritems():
+            for key, attribute in self.attributes.items():
                 writer.write("%s %s = %s%s" % (indent, key, attribute, newl))
         if self.subnodes:
             for node in self.subnodes:
@@ -707,7 +707,7 @@ def _findAllDQBaseObjects(rootlist):
         if not isinstance(dqbase, DQBase):
             raise ValueError(
                 '%s is not a valid DQBase object; this should never happen' % dqbase)
-        retset = set([dqbase])
+        retset = {dqbase}
         for rel in dqbase.getAllRelatedObjects():
             retset |= recurse(rel)
         return retset
diff --git a/DataQuality/DataQualityUtils/python/messaging_listen.py b/DataQuality/DataQualityUtils/python/messaging_listen.py
index 5137d0fd2938ff09b69b3d35ec047aca2741184b..6b1080ef9052fca73a53058b4814f28e09dc6369 100644
--- a/DataQuality/DataQualityUtils/python/messaging_listen.py
+++ b/DataQuality/DataQualityUtils/python/messaging_listen.py
@@ -28,7 +28,7 @@ class ATLASDQMListener(object):
                                                      socket.AF_INET, 
                                                      socket.SOCK_STREAM)]
         
-        import stompconfig
+        from . import stompconfig
         self.conns = []
         if hasattr(self.listener, 'conn'):
             self.listener.conn=[]
@@ -66,7 +66,7 @@ class ATLASDQMListener(object):
                                                      socket.AF_INET, 
                                                      socket.SOCK_STREAM)]
         
-        import stompconfig
+        from . import stompconfig
         self.conns = []
         if hasattr(self.listener, 'conn'):
             self.listener.conn=[]
diff --git a/DataQuality/DataQualityUtils/python/panic.py b/DataQuality/DataQualityUtils/python/panic.py
index b92e312d49bd4b143e497646be932fb18af9a725..b0efb85a371b79651c3c7844a25989382c5aa03f 100644
--- a/DataQuality/DataQualityUtils/python/panic.py
+++ b/DataQuality/DataQualityUtils/python/panic.py
@@ -1,11 +1,11 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
 
 DEST='/queue/atlas.dqm.panic'
 
 def panic(msg):
     import stomp
     import json
-    import stompconfig
+    from . import stompconfig
     import sys, os
     import traceback
     import time