diff --git a/DataQuality/DataQualityConfigurations/python/base_data.py b/DataQuality/DataQualityConfigurations/python/base_data.py
index c081d6b3994fb476b492df1aae2e48ec8a10adc6..e25d1750a9c62000c4e2f185074f2aa7613d07ca 100644
--- a/DataQuality/DataQualityConfigurations/python/base_data.py
+++ b/DataQuality/DataQualityConfigurations/python/base_data.py
@@ -27,6 +27,7 @@ dqconfig.filemap        = { 'RPCDQMFOFFLINE.db': '/afs/cern.ch/user/m/muoncali/w
                             'MDTDQMFOFFLINE_NOISY.db': '/afs/cern.ch/user/m/muoncali/w0/RPC/DQAresults',
                             'zrate.csv': 'root://eosatlas.cern.ch//eos/atlas/atlascerngroupdisk/data-dqm/zlumi',
                             'zlumi.root': 'root://eosatlas.cern.ch//eos/atlas/atlascerngroupdisk/data-dqm/zlumi',
+                            'zlumi.root_lumicomp.eps': 'root://eosatlas.cern.ch//eos/atlas/atlascerngroupdisk/data-dqm/zlumi',
                             }
 
 dqconfig.dbConnection  = "oracle://ATLAS_COOLWRITE;schema=ATLAS_COOLOFL_GLOBAL;dbname=CONDBR2;"
diff --git a/DataQuality/DataQualityTools/CMakeLists.txt b/DataQuality/DataQualityTools/CMakeLists.txt
index a09be2c190264094ebbf19486d349a33a0154231..585a4f51fea8af3ce3916710f8576f53b37b7348 100644
--- a/DataQuality/DataQualityTools/CMakeLists.txt
+++ b/DataQuality/DataQualityTools/CMakeLists.txt
@@ -66,4 +66,3 @@ atlas_add_component( DataQualityTools
 # Install files from the package:
 #atlas_install_headers( DataQualityTools )
 atlas_install_joboptions( share/*.py )
-atlas_install_scripts( scripts/*.py )
\ No newline at end of file
diff --git a/DataQuality/DataQualityUtils/CMakeLists.txt b/DataQuality/DataQualityUtils/CMakeLists.txt
index 55f000783ba80cf1c70e8e74fef726e7b770f451..50b3c6c4b1c53279345edf7215b34bb290d851d3 100644
--- a/DataQuality/DataQualityUtils/CMakeLists.txt
+++ b/DataQuality/DataQualityUtils/CMakeLists.txt
@@ -7,7 +7,8 @@ atlas_subdir( DataQualityUtils )
 
 # Declare the package's dependencies:
 atlas_depends_on_subdirs( PRIVATE
-                          DataQuality/DataQualityInterfaces )
+                          DataQuality/DataQualityInterfaces
+                          DataQuality/ZLumiScripts )
 
 # External dependencies:
 find_package( Boost COMPONENTS regex filesystem thread system )
diff --git a/DataQuality/DataQualityUtils/python/doZLumi.py b/DataQuality/DataQualityUtils/python/doZLumi.py
index e3fc8b3f56f4936cd412260c1ad65b36da2683ae..116febf4ec25d5080084ea8e8f92c02e11ca6b88 100644
--- a/DataQuality/DataQualityUtils/python/doZLumi.py
+++ b/DataQuality/DataQualityUtils/python/doZLumi.py
@@ -28,6 +28,63 @@ def copyPlot(infname, outfname):
                 d.WriteTObject(obj)
     fin.Close(); fout.Close()
             
+def makeGRL(run, defect, fname):
+    from ROOT import Root, TString
+    import DQUtils, DQDefects
+    import os
+    tgrl = Root.TGoodRunsList(defect)
+
+    tag = 'HEAD'
+    runs = [run]
+    print 'Query run information...',
+    from DQUtils.db import fetch_iovs
+    dbinstance = 'CONDBR2'
+    eor = fetch_iovs('EOR', (min(runs) << 32) | 1,
+                     (max(runs) << 32) | 0xFFFFFFFF,
+                     with_channel=False, what=[], database='COOLONL_TDAQ/%s' % dbinstance)
+    eor = eor.trim_iovs
+    eor = DQUtils.IOVSet(iov for iov in eor if iov.since.run in runs)
+    print 'done'
+    print 'Query defects...',
+    ddb = DQDefects.DefectsDB('COOLOFL_GLOBAL/%s' % dbinstance, tag=tag)
+    ignores = set([_ for _ in ddb.defect_names if 'UNCHECKED' in _])
+    try:
+        defectiovs = ddb.retrieve(since = min(runs) << 32 | 1,
+                                  until = max(runs) << 32 | 0xffffffff,
+                                  channels = [defect],
+                                  evaluate_full = False,
+                                  ignore=ignores)
+    except Exception, e:
+        print e
+        raise
+    print 'Doing exclusions...',
+    okiovs = eor.logical_and(eor, defectiovs.logical_not())
+    print 'done'
+
+    dibr = okiovs.by_run
+
+    print 'Generating GRL...',
+    for run, iovs in dibr.items():
+        if run not in runs: continue
+        tgr = Root.TGoodRun(run)
+        for iov in iovs:
+            #print iov.since.run, iov.since.lumi, iov.until.run, iov.until.lumi
+            tgr.push_back(Root.TLumiBlockRange(iov.since.lumi, iov.until.lumi-1))
+        tgrl[run] = tgr
+
+    tgrl.AddMetaData(TString('Query'), TString('dummy'))
+    tgrl.AddMetaData(TString('ARQEquivalentQuery'), TString('dummy'))
+    tgrl.SetVersion(TString('2.1'))
+    tgrl.AddMetaData(TString('RunList'), TString(','.join(map(str, tgrl.GetRunlist()))))
+    tgrl.Summary()
+    tgrlw = Root.TGoodRunsListWriter(tgrl, TString(''))
+    rv = tgrlw.GetXMLString()
+    if not rv:
+        print 'Looks like we have an empty string'
+        return ""
+    print 'done'
+    with open(fname, 'w') as outf:
+        outf.write(rv.Data()[:])
 
 def go(fname):
     import subprocess, os, shutil
@@ -38,7 +95,14 @@ def go(fname):
     if 'DISPLAY' in os.environ: del os.environ['DISPLAY']
     runno = getRun(fname)
     print 'Seen run', runno
-    subprocess.call(['dqt_zlumi_compute_lumi.py', fname, '--out', 'zlumiraw.root', '--plotdir', ''])
+    grlcmd = []
+    if runno >= 325000:
+        makeGRL(runno, 'PHYS_StandardGRL_All_Good', 'grl.xml')
+        grlcmd = ['--grl', 'grl.xml']
+    else:
+        print 'Run number', runno, 'not 2017 data'
+
+    subprocess.call(['dqt_zlumi_compute_lumi.py', fname, '--out', 'zlumiraw.root', '--dblivetime', '--plotdir', ''] + grlcmd)
     subprocess.call(['dqt_zlumi_alleff_HIST.py', fname, '--out', 'zlumieff.root'])
     subprocess.call(['dqt_zlumi_combine_lumi.py', 'zlumiraw.root', 'zlumieff.root', 'zlumi.root'])
     subprocess.call(['dqt_zlumi_display_z_rate.py', 'zlumi.root'])
diff --git a/DataQuality/ZLumiScripts/CMakeLists.txt b/DataQuality/ZLumiScripts/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..b658acb5bba60af166e5ece565628c9b784817fd
--- /dev/null
+++ b/DataQuality/ZLumiScripts/CMakeLists.txt
@@ -0,0 +1,15 @@
+################################################################################
+# Package: ZLumiScripts
+################################################################################
+
+# Declare the package name:
+atlas_subdir( ZLumiScripts )
+
+# Declare the package's dependencies:
+#atlas_depends_on_subdirs( )
+
+# External dependencies:
+find_package( ROOT COMPONENTS Core Tree MathCore Hist RIO pthread )
+
+# Install files from the package:
+atlas_install_scripts( scripts/*.py )
diff --git a/DataQuality/DataQualityTools/scripts/dqt_zlumi_alleff_HIST.py b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_alleff_HIST.py
similarity index 95%
rename from DataQuality/DataQualityTools/scripts/dqt_zlumi_alleff_HIST.py
rename to DataQuality/ZLumiScripts/scripts/dqt_zlumi_alleff_HIST.py
index 8682ab42229a547f1f313b944e91a7b6fa61b933..753c52e7dbc8f32373fa23d38db749b01b0b7a3c 100755
--- a/DataQuality/DataQualityTools/scripts/dqt_zlumi_alleff_HIST.py
+++ b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_alleff_HIST.py
@@ -11,6 +11,7 @@ import argparse
 parser = argparse.ArgumentParser()
 parser.add_argument('infile', type=str, help='input HIST file')
 parser.add_argument('--out', type=str, help='output ROOT file')
+parser.add_argument('--debug', action='store_true', help='Be verbose in output')
 
 args = parser.parse_args()
 
@@ -114,11 +115,12 @@ for lb in sorted(lbdirs):
     matchss, matchsserr = extract(hms)
     nomatchos, nomatchoserr = extract(hno)
     nomatchss, nomatchsserr = extract(hns)
-    print lb
-    print ' ->', matchos, matchoserr
-    print ' ->', matchss, matchsserr
-    print ' ->', nomatchos, nomatchoserr
-    print ' ->', nomatchss, nomatchsserr
+    if args.debug:
+        print lb
+        print ' ->', matchos, matchoserr
+        print ' ->', matchss, matchsserr
+        print ' ->', nomatchos, nomatchoserr
+        print ' ->', nomatchss, nomatchsserr
     A = float(matchos-matchss)
     Aerr = (matchoserr**2+matchsserr**2)**.5
     B = float(nomatchos-nomatchss)
diff --git a/DataQuality/DataQualityTools/scripts/dqt_zlumi_combine_lumi.py b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_combine_lumi.py
similarity index 97%
rename from DataQuality/DataQualityTools/scripts/dqt_zlumi_combine_lumi.py
rename to DataQuality/ZLumiScripts/scripts/dqt_zlumi_combine_lumi.py
index 95a5b307bd1f223cd096654011d44205a433a180..08c4994b875a82ebbfc4bcbd5ca06ddae23b3350 100755
--- a/DataQuality/DataQualityTools/scripts/dqt_zlumi_combine_lumi.py
+++ b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_combine_lumi.py
@@ -121,6 +121,11 @@ for entry, entryval in sorted(entrydict.items()):
         if o_zlumi[0] < 4 or o_zlumi[0] > 15:
             print o_lb[0], o_zlumi[0], entryval['zcount'], eff, entryval['livetime']
         t.Fill()
-t.Write()
+#t.Write()
+newrzt = recoztree.CloneTree()
+newrzt.SetName("recolumitree")
+newezt = effztree.CloneTree()
+newezt.SetName("efflumitree")
+fout.Write()
 fout.Close()
         
diff --git a/DataQuality/DataQualityTools/scripts/dqt_zlumi_compute_lumi.py b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_compute_lumi.py
similarity index 100%
rename from DataQuality/DataQualityTools/scripts/dqt_zlumi_compute_lumi.py
rename to DataQuality/ZLumiScripts/scripts/dqt_zlumi_compute_lumi.py
diff --git a/DataQuality/DataQualityTools/scripts/dqt_zlumi_display_z_rate.py b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_display_z_rate.py
similarity index 65%
rename from DataQuality/DataQualityTools/scripts/dqt_zlumi_display_z_rate.py
rename to DataQuality/ZLumiScripts/scripts/dqt_zlumi_display_z_rate.py
index 145bccccbfda3d22a503976bce0cf2ca4e6a051e..e1222cb326a9728a96770e6c5c793eab8f017bdc 100755
--- a/DataQuality/DataQualityTools/scripts/dqt_zlumi_display_z_rate.py
+++ b/DataQuality/ZLumiScripts/scripts/dqt_zlumi_display_z_rate.py
@@ -3,11 +3,24 @@
 
 import ROOT
 import sys
+import array
 
 runnum = sys.argv[1].split('_')[0]
 f = ROOT.TFile.Open(sys.argv[1], 'UPDATE')
 c1 = ROOT.TCanvas()
 lumitree = f.lumitree
+#get range
+runs=[0,1]; fills=[0,1]
+lumitree.Draw("run:lhcfill", "", "goff")
+if lumitree.GetSelectedRows() > 0:
+    runs = list(lumitree.GetV1()[_] for _ in xrange(lumitree.GetSelectedRows()))
+    fills = list(lumitree.GetV2()[_] for _ in xrange(lumitree.GetSelectedRows()))
+titlestr = ''
+if min(fills)==max(fills):
+    titlestr += 'Fill %d' % min(fills)
+if min(runs) == max(runs):
+    titlestr += ' Run %d' % min(runs)
+
 lumitree.Draw("zrate:lb+10:zratestat", "", "goff")
 print 'Selected rows', lumitree.GetSelectedRows()
 if lumitree.GetSelectedRows() > 0: 
@@ -44,24 +57,40 @@ csvout.close()
 lumitree.Draw("zlumi:lb+10:zlumistat", "", "goff")
 if lumitree.GetSelectedRows() > 0:
     gr = ROOT.TGraphErrors(lumitree.GetSelectedRows(), lumitree.GetV2(), lumitree.GetV1(), ROOT.nullptr, lumitree.GetV3())
+    zlumi = list(lumitree.GetV1()[_] for _ in xrange(lumitree.GetSelectedRows())); 
+    zlumierr = list(lumitree.GetV3()[_] for _ in xrange(lumitree.GetSelectedRows()))
     gr.Draw("ap")
     gr.GetHistogram().SetXTitle('LB')
     gr.GetHistogram().SetYTitle('Luminosity (x10^{33})')
     gr.SetMarkerStyle(20)
-    gr.SetTitle('')
+    gr.SetTitle(titlestr)
     f.WriteTObject(gr, 'z_lumi')
     lumitree.Draw("offlumi:lb+10", "", "goff")
     gr2 = ROOT.TGraphErrors(lumitree.GetSelectedRows(), lumitree.GetV2(), lumitree.GetV1())
+    offlumi = list(lumitree.GetV1()[_] for _ in xrange(lumitree.GetSelectedRows()))
     gr2.SetMarkerStyle(21)
     gr2.SetMarkerSize(0.5)
     gr2.SetMarkerColor(ROOT.kRed)
-    gr2.Draw('same,pl')
-    f.WriteTObject(gr, 'official_lumi')
+    gr2.SetLineColor(ROOT.kRed)
+    gr2.Draw('same,l')
+    f.WriteTObject(gr2, 'official_lumi')
     leg = ROOT.TLegend(0.65, 0.7, 0.89, 0.89)
     leg.SetBorderSize(0)
     leg.AddEntry(gr, 'Z luminosity', 'pl')
-    leg.AddEntry(gr2, '-005 calibration', 'pl')
+    leg.AddEntry(gr2, 'Official', 'l')
     leg.Draw()
     c1.Update()
     c1.Print('%s_lumicomp.eps' % runnum)
     f.WriteTObject(c1, 'lumicomp_canvas')
+    zlumirat = array.array('d', [_[0]/_[1] for _ in zip(zlumi, offlumi)])
+    zlumiraterr = array.array('d', [_[0]/_[1] for _ in zip(zlumierr, offlumi)])
+    gr3 = ROOT.TGraphErrors(lumitree.GetSelectedRows(), lumitree.GetV2(), zlumirat, ROOT.nullptr, zlumiraterr)
+    c1.Clear()
+    gr3.SetMarkerStyle(20)
+    gr3.Draw('ap')
+    gr3.SetTitle(titlestr)
+    gr3.GetHistogram().SetXTitle('LB')
+    gr3.GetHistogram().SetYTitle('Z Counting/Official Lumi')
+    c1.Print('%s_lumicompratio.eps' % runnum)
+    f.WriteTObject(c1, 'lumicompratio_canvas')
+