diff --git a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py
index 20f9aec6e030665f118198b800d9a53fac0b77ad..ca57806650a14ed39d9d92753515936eb037d1eb 100644
--- a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py
+++ b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py
@@ -2,6 +2,473 @@
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaCommon.SystemOfUnits import MeV
+from AthenaCommon.Constants import VERBOSE
+
+def caloTopoCoolFolderCfg(configFlags):
+    result=ComponentAccumulator()
+    from IOVDbSvc.IOVDbSvcConfig import addFolders, IOVDbSvcCfg
+    result.mergeAll(IOVDbSvcCfg(configFlags))
+    # rely on global tag for both MC and data; do not specify folder tags
+    # use CALO_OFL only for GEO>=18
+    hadCalibFolders = [
+        "HadCalibration2/CaloEMFrac",
+        "HadCalibration2/H1ClusterCellWeights",
+        "HadCalibration2/CaloOutOfCluster",
+        "HadCalibration2/CaloOutOfClusterPi0",
+        "HadCalibration2/CaloDMCorr2"
+        ]
+    hadCalibPrefix = "/CALO/"
+    hadCalibDB = "CALO_ONL"
+    if configFlags.Input.isMC:
+        hadCalibPrefix = "/CALO/Ofl/"
+        hadCalibDB = "CALO_OFL"
+    hadCalibFolders = [ hadCalibPrefix + foldername for foldername in hadCalibFolders ]
+    result.merge(addFolders(configFlags, hadCalibFolders, hadCalibDB, className="CaloLocalHadCoeff"))
+
+    return result
+
+def getTopoClusterLocalCalibTools(configFlags, theCaloNoiseTool):
+    from CaloUtils.CaloUtilsConf import CaloLCClassificationTool, CaloLCWeightTool, CaloLCOutOfClusterTool, CaloLCDeadMaterialTool
+    from CaloClusterCorrection.CaloClusterCorrectionConf import CaloClusterLocalCalib
+    # Local cell weights
+    LCClassify   = CaloLCClassificationTool("LCClassify")
+    LCClassify.ClassificationKey   = "EMFracClassify"
+    LCClassify.UseSpread = False
+    LCClassify.MaxProbability = 0.5
+    # add the moments EM_PROBABILITY, HAD_WEIGHT, OOC_WEIGHT, DM_WEIGHT to the AOD:
+    LCClassify.StoreClassificationProbabilityInAOD = True
+    LCClassify.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    LCWeight = CaloLCWeightTool("LCWeight")
+    LCWeight.CorrectionKey       = "H1ClusterCellWeights"
+    LCWeight.SignalOverNoiseCut  = 2.0
+    # *****
+    # Needs calo noise tool config
+    LCWeight.CaloNoiseTool       = theCaloNoiseTool
+    # *****
+    LCWeight.UseHadProbability   = True
+
+    LocalCalib = CaloClusterLocalCalib ("LocalCalib")
+    LocalCalib.ClusterClassificationTool     = [LCClassify]
+    LocalCalib.ClusterRecoStatus             = [1,2]
+    LocalCalib.LocalCalibTools               = [LCWeight]
+    LocalCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    # Out-of-cluster corrections
+    LCOut     = CaloLCOutOfClusterTool("LCOut")
+    LCOut.CorrectionKey       = "OOCCorrection"
+    LCOut.UseEmProbability    = False
+    LCOut.UseHadProbability   = True
+
+    OOCCalib   = CaloClusterLocalCalib ("OOCCalib")
+    OOCCalib.ClusterRecoStatus   = [1,2]
+    OOCCalib.LocalCalibTools     = [LCOut]
+    OOCCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    LCOutPi0  = CaloLCOutOfClusterTool("LCOutPi0")
+    LCOutPi0.CorrectionKey    = "OOCPi0Correction"
+    LCOutPi0.UseEmProbability  = True
+    LCOutPi0.UseHadProbability = False
+
+    OOCPi0Calib   = CaloClusterLocalCalib ("OOCPi0Calib")
+    OOCPi0Calib.ClusterRecoStatus   = [1,2]
+    OOCPi0Calib.LocalCalibTools     = [LCOutPi0]
+
+    OOCPi0Calib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    # Dead material corrections
+    LCDeadMaterial   = CaloLCDeadMaterialTool("LCDeadMaterial")
+    LCDeadMaterial.HadDMCoeffKey       = "HadDMCoeff2"
+    LCDeadMaterial.ClusterRecoStatus   = 0
+    LCDeadMaterial.WeightModeDM        = 2 
+    LCDeadMaterial.UseHadProbability   = True
+    LCDeadMaterial.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    DMCalib    = CaloClusterLocalCalib ("DMCalib")
+    DMCalib.ClusterRecoStatus   = [1,2]
+    DMCalib.LocalCalibTools      = [LCDeadMaterial]
+
+    DMCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    lccalibtools = [
+        LocalCalib,
+        OOCCalib,
+        OOCPi0Calib,
+        DMCalib]
+    return lccalibtools
+
+def getTopoMoments(configFlags,theCaloNoiseTool):
+    from CaloRec.CaloRecConf import CaloClusterMomentsMaker
+    TopoMoments = CaloClusterMomentsMaker ("TopoMoments")
+    TopoMoments.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+    from AthenaCommon.SystemOfUnits import deg
+    TopoMoments.MaxAxisAngle = 20*deg
+    TopoMoments.CaloNoiseTool = theCaloNoiseTool
+    TopoMoments.UsePileUpNoise = True
+    TopoMoments.TwoGaussianNoise = configFlags.Calo.TopoCluster.doTwoGaussianNoise
+    TopoMoments.MinBadLArQuality = 4000
+    TopoMoments.MomentsNames = ["FIRST_PHI" 
+                                ,"FIRST_ETA"
+                                ,"SECOND_R" 
+                                ,"SECOND_LAMBDA"
+                                ,"DELTA_PHI"
+                                ,"DELTA_THETA"
+                                ,"DELTA_ALPHA" 
+                                ,"CENTER_X"
+                                ,"CENTER_Y"
+                                ,"CENTER_Z"
+                                ,"CENTER_MAG"
+                                ,"CENTER_LAMBDA"
+                                ,"LATERAL"
+                                ,"LONGITUDINAL"
+                                ,"FIRST_ENG_DENS" 
+                                ,"ENG_FRAC_EM" 
+                                ,"ENG_FRAC_MAX" 
+                                ,"ENG_FRAC_CORE" 
+                                ,"FIRST_ENG_DENS" 
+                                ,"SECOND_ENG_DENS" 
+                                ,"ISOLATION"
+                                ,"ENG_BAD_CELLS"
+                                ,"N_BAD_CELLS"
+                                ,"N_BAD_CELLS_CORR"
+                                ,"BAD_CELLS_CORR_E"
+                                ,"BADLARQ_FRAC"
+                                ,"ENG_POS"
+                                ,"SIGNIFICANCE"
+                                ,"CELL_SIGNIFICANCE"
+                                ,"CELL_SIG_SAMPLING"
+                                ,"AVG_LAR_Q"
+                                ,"AVG_TILE_Q"
+                                ,"PTD"
+                                ,"MASS"
+                                ]
+
+    # *****
+    # Is this still right?
+    # only add HV related moments if it is offline.
+    # from IOVDbSvc.CondDB import conddb
+    # if not conddb.isOnline:
+    from LArCellRec.LArCellRecConf import LArHVFraction
+    if configFlags.Input.isMC:
+        TopoMoments.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorr")
+    else:
+        TopoMoments.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorrRecomputed")
+    TopoMoments.MomentsNames += ["ENG_BAD_HV_CELLS"
+                                 ,"N_BAD_HV_CELLS"
+                                 ]
+
+    return TopoMoments
+
+# a.k.a. DigiTruth
+def getTopoTruthMoments(configFlags,theCaloNoiseTool):
+    from CaloRec.CaloRecConf import CaloClusterMomentsMaker
+    TopoMoments_Truth = CaloClusterMomentsMaker_DigiHSTruth ("TopoMoments_Truth")
+    from LArCellRec.LArCellRecConf import LArHVFraction
+    TopoMoments_Truth.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorr")
+    TopoMoments_Truth.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+    from AthenaCommon.SystemOfUnits import deg
+    TopoMoments_Truth.MaxAxisAngle = 20*deg
+    TopoMoments_Truth.CaloNoiseTool = theCaloNoiseTool
+    TopoMoments_Truth.UsePileUpNoise = True
+    TopoMoments_Truth.TwoGaussianNoise = configFlags.Calo,TopoCluster.doTwoGaussianNoise
+    TopoMoments_Truth.MinBadLArQuality = 4000
+    TopoMoments_Truth.MomentsNames = ["FIRST_PHI_DigiHSTruth"
+                                      ,"FIRST_ETA_DigiHSTruth"
+                                      ,"SECOND_R_DigiHSTruth"
+                                      ,"SECOND_LAMBDA_DigiHSTruth"
+                                      ,"DELTA_PHI_DigiHSTruth"
+                                      ,"DELTA_THETA_DigiHSTruth"
+                                      ,"DELTA_ALPHA_DigiHSTruth"
+                                      ,"CENTER_X_DigiHSTruth"
+                                      ,"CENTER_Y_DigiHSTruth"
+                                      ,"CENTER_Z_DigiHSTruth"
+                                      ,"CENTER_MAG_DigiHSTruth"
+                                      ,"CENTER_LAMBDA_DigiHSTruth"
+                                      ,"LATERAL_DigiHSTruth"
+                                      ,"LONGITUDINAL_DigiHSTruth"
+                                      ,"ENG_FRAC_CORE_DigiHSTruth"
+                                      ,"FIRST_ENG_DENS_DigiHSTruth"
+                                      ,"SECOND_ENG_DENS_DigiHSTruth"
+                                      ,"ISOLATION_DigiHSTruth"
+                                      ,"BAD_CELLS_CORR_E_DigiHSTruth"
+                                      ,"ENG_POS_DigiHSTruth"
+                                      ,"SIGNIFICANCE_DigiHSTruth"
+                                      ,"CELL_SIGNIFICANCE_DigiHSTruth"
+                                      ,"CELL_SIG_SAMPLING_DigiHSTruth"
+                                      ,"AVG_LAR_Q_DigiHSTruth"
+                                      ,"AVG_TILE_Q_DigiHSTruth"
+                                      ,"ENERGY_DigiHSTruth"
+                                      ,"PHI_DigiHSTruth"
+                                      ,"ETA_DigiHSTruth"
+                                      ]
+    return TopoMoments_Truth
+
+def getTopoCalibMoments(configFlags):
+    from CaloCalibHitRec.CaloCalibHitRecConf import CaloCalibClusterMomentsMaker2
+    TopoCalibMoments = CaloCalibClusterMomentsMaker2 ("TopoCalibMoments")
+    TopoCalibMoments.MomentsNames = ["ENG_CALIB_TOT"
+                                     ,"ENG_CALIB_OUT_L"
+                                     #,"ENG_CALIB_OUT_M"
+                                     # ,"ENG_CALIB_OUT_T"
+                                     # ,"ENG_CALIB_DEAD_L"
+                                     # ,"ENG_CALIB_DEAD_M"
+                                     # ,"ENG_CALIB_DEAD_T"
+                                     ,"ENG_CALIB_EMB0"
+                                     ,"ENG_CALIB_EME0"
+                                     ,"ENG_CALIB_TILEG3"
+                                     ,"ENG_CALIB_DEAD_TOT"
+                                     ,"ENG_CALIB_DEAD_EMB0"
+                                     ,"ENG_CALIB_DEAD_TILE0"
+                                     ,"ENG_CALIB_DEAD_TILEG3"
+                                     ,"ENG_CALIB_DEAD_EME0"
+                                     ,"ENG_CALIB_DEAD_HEC0"
+                                     ,"ENG_CALIB_DEAD_FCAL"
+                                     ,"ENG_CALIB_DEAD_LEAKAGE"
+                                     ,"ENG_CALIB_DEAD_UNCLASS"
+                                     ,"ENG_CALIB_FRAC_EM"
+                                     ,"ENG_CALIB_FRAC_HAD"
+                                     ,"ENG_CALIB_FRAC_REST"]
+    
+    TopoCalibMoments.CalibrationHitContainerNames = ["LArCalibrationHitInactive"
+                                                     ,"LArCalibrationHitActive"
+                                                     ,"TileCalibHitActiveCell"
+                                                     ,"TileCalibHitInactiveCell"]
+    TopoCalibMoments.DMCalibrationHitContainerNames = ["LArCalibrationHitDeadMaterial"
+                                                       ,"TileCalibHitDeadMaterial"]
+    return TopoCalibMOments
+
+def caloTopoCoolFolderCfg(configFlags):
+    result=ComponentAccumulator()
+    from IOVDbSvc.IOVDbSvcConfig import addFolders, IOVDbSvcCfg
+    result.mergeAll(IOVDbSvcCfg(configFlags))
+    # rely on global tag for both MC and data; do not specify folder tags
+    # use CALO_OFL only for GEO>=18
+    hadCalibFolders = [
+        "HadCalibration2/CaloEMFrac",
+        "HadCalibration2/H1ClusterCellWeights",
+        "HadCalibration2/CaloOutOfCluster",
+        "HadCalibration2/CaloOutOfClusterPi0",
+        "HadCalibration2/CaloDMCorr2"
+        ]
+    hadCalibPrefix = "/CALO/"
+    hadCalibDB = "CALO_ONL"
+    if configFlags.Input.isMC:
+        hadCalibPrefix = "/CALO/Ofl/"
+        hadCalibDB = "CALO_OFL"
+    hadCalibFolders = [ hadCalibPrefix + foldername for foldername in hadCalibFolders ]
+    result.merge(addFolders(configFlags, hadCalibFolders, hadCalibDB, className="CaloLocalHadCoeff"))
+
+    return result
+
+def getTopoClusterLocalCalibTools(configFlags, theCaloNoiseTool):
+    from CaloUtils.CaloUtilsConf import CaloLCClassificationTool, CaloLCWeightTool, CaloLCOutOfClusterTool, CaloLCDeadMaterialTool
+    from CaloClusterCorrection.CaloClusterCorrectionConf import CaloClusterLocalCalib
+    # Local cell weights
+    LCClassify   = CaloLCClassificationTool("LCClassify")
+    LCClassify.ClassificationKey   = "EMFracClassify"
+    LCClassify.UseSpread = False
+    LCClassify.MaxProbability = 0.5
+    # add the moments EM_PROBABILITY, HAD_WEIGHT, OOC_WEIGHT, DM_WEIGHT to the AOD:
+    LCClassify.StoreClassificationProbabilityInAOD = True
+    LCClassify.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    LCWeight = CaloLCWeightTool("LCWeight")
+    LCWeight.CorrectionKey       = "H1ClusterCellWeights"
+    LCWeight.SignalOverNoiseCut  = 2.0
+    # *****
+    # Needs calo noise tool config
+    LCWeight.CaloNoiseTool       = theCaloNoiseTool
+    # *****
+    LCWeight.UseHadProbability   = True
+
+    LocalCalib = CaloClusterLocalCalib ("LocalCalib")
+    LocalCalib.ClusterClassificationTool     = [LCClassify]
+    LocalCalib.ClusterRecoStatus             = [1,2]
+    LocalCalib.LocalCalibTools               = [LCWeight]
+    LocalCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    # Out-of-cluster corrections
+    LCOut     = CaloLCOutOfClusterTool("LCOut")
+    LCOut.CorrectionKey       = "OOCCorrection"
+    LCOut.UseEmProbability    = False
+    LCOut.UseHadProbability   = True
+
+    OOCCalib   = CaloClusterLocalCalib ("OOCCalib")
+    OOCCalib.ClusterRecoStatus   = [1,2]
+    OOCCalib.LocalCalibTools     = [LCOut]
+    OOCCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    LCOutPi0  = CaloLCOutOfClusterTool("LCOutPi0")
+    LCOutPi0.CorrectionKey    = "OOCPi0Correction"
+    LCOutPi0.UseEmProbability  = True
+    LCOutPi0.UseHadProbability = False
+
+    OOCPi0Calib   = CaloClusterLocalCalib ("OOCPi0Calib")
+    OOCPi0Calib.ClusterRecoStatus   = [1,2]
+    OOCPi0Calib.LocalCalibTools     = [LCOutPi0]
+
+    OOCPi0Calib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    # Dead material corrections
+    LCDeadMaterial   = CaloLCDeadMaterialTool("LCDeadMaterial")
+    LCDeadMaterial.HadDMCoeffKey       = "HadDMCoeff2"
+    LCDeadMaterial.ClusterRecoStatus   = 0
+    LCDeadMaterial.WeightModeDM        = 2 
+    LCDeadMaterial.UseHadProbability   = True
+    LCDeadMaterial.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    DMCalib    = CaloClusterLocalCalib ("DMCalib")
+    DMCalib.ClusterRecoStatus   = [1,2]
+    DMCalib.LocalCalibTools      = [LCDeadMaterial]
+
+    DMCalib.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+
+    lccalibtools = [
+        LocalCalib,
+        OOCCalib,
+        OOCPi0Calib,
+        DMCalib]
+    return lccalibtools
+
+def getTopoMoments(configFlags,theCaloNoiseTool):
+    from CaloRec.CaloRecConf import CaloClusterMomentsMaker
+    TopoMoments = CaloClusterMomentsMaker ("TopoMoments")
+    TopoMoments.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+    from AthenaCommon.SystemOfUnits import deg
+    TopoMoments.MaxAxisAngle = 20*deg
+    TopoMoments.CaloNoiseTool = theCaloNoiseTool
+    TopoMoments.UsePileUpNoise = True
+    TopoMoments.TwoGaussianNoise = configFlags.Calo.TopoCluster.doTwoGaussianNoise
+    TopoMoments.MinBadLArQuality = 4000
+    TopoMoments.MomentsNames = ["FIRST_PHI" 
+                                ,"FIRST_ETA"
+                                ,"SECOND_R" 
+                                ,"SECOND_LAMBDA"
+                                ,"DELTA_PHI"
+                                ,"DELTA_THETA"
+                                ,"DELTA_ALPHA" 
+                                ,"CENTER_X"
+                                ,"CENTER_Y"
+                                ,"CENTER_Z"
+                                ,"CENTER_MAG"
+                                ,"CENTER_LAMBDA"
+                                ,"LATERAL"
+                                ,"LONGITUDINAL"
+                                ,"FIRST_ENG_DENS" 
+                                ,"ENG_FRAC_EM" 
+                                ,"ENG_FRAC_MAX" 
+                                ,"ENG_FRAC_CORE" 
+                                ,"FIRST_ENG_DENS" 
+                                ,"SECOND_ENG_DENS" 
+                                ,"ISOLATION"
+                                ,"ENG_BAD_CELLS"
+                                ,"N_BAD_CELLS"
+                                ,"N_BAD_CELLS_CORR"
+                                ,"BAD_CELLS_CORR_E"
+                                ,"BADLARQ_FRAC"
+                                ,"ENG_POS"
+                                ,"SIGNIFICANCE"
+                                ,"CELL_SIGNIFICANCE"
+                                ,"CELL_SIG_SAMPLING"
+                                ,"AVG_LAR_Q"
+                                ,"AVG_TILE_Q"
+                                ,"PTD"
+                                ,"MASS"
+                                ]
+
+    # *****
+    # Is this still right?
+    # only add HV related moments if it is offline.
+    # from IOVDbSvc.CondDB import conddb
+    # if not conddb.isOnline:
+    from LArCellRec.LArCellRecConf import LArHVFraction
+    if configFlags.Input.isMC:
+        TopoMoments.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorr")
+    else:
+        TopoMoments.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorrRecomputed")
+    TopoMoments.MomentsNames += ["ENG_BAD_HV_CELLS"
+                                 ,"N_BAD_HV_CELLS"
+                                 ]
+
+    return TopoMoments
+
+# a.k.a. DigiTruth
+def getTopoTruthMoments(configFlags,theCaloNoiseTool):
+    from CaloRec.CaloRecConf import CaloClusterMomentsMaker
+    TopoMoments_Truth = CaloClusterMomentsMaker_DigiHSTruth ("TopoMoments_Truth")
+    from LArCellRec.LArCellRecConf import LArHVFraction
+    TopoMoments_Truth.LArHVFraction=LArHVFraction(HVScaleCorrKey="LArHVScaleCorr")
+    TopoMoments_Truth.WeightingOfNegClusters = configFlags.Calo.TopoCluster.doTreatEnergyCutAsAbsolute
+    from AthenaCommon.SystemOfUnits import deg
+    TopoMoments_Truth.MaxAxisAngle = 20*deg
+    TopoMoments_Truth.CaloNoiseTool = theCaloNoiseTool
+    TopoMoments_Truth.UsePileUpNoise = True
+    TopoMoments_Truth.TwoGaussianNoise = configFlags.Calo,TopoCluster.doTwoGaussianNoise
+    TopoMoments_Truth.MinBadLArQuality = 4000
+    TopoMoments_Truth.MomentsNames = ["FIRST_PHI_DigiHSTruth"
+                                      ,"FIRST_ETA_DigiHSTruth"
+                                      ,"SECOND_R_DigiHSTruth"
+                                      ,"SECOND_LAMBDA_DigiHSTruth"
+                                      ,"DELTA_PHI_DigiHSTruth"
+                                      ,"DELTA_THETA_DigiHSTruth"
+                                      ,"DELTA_ALPHA_DigiHSTruth"
+                                      ,"CENTER_X_DigiHSTruth"
+                                      ,"CENTER_Y_DigiHSTruth"
+                                      ,"CENTER_Z_DigiHSTruth"
+                                      ,"CENTER_MAG_DigiHSTruth"
+                                      ,"CENTER_LAMBDA_DigiHSTruth"
+                                      ,"LATERAL_DigiHSTruth"
+                                      ,"LONGITUDINAL_DigiHSTruth"
+                                      ,"ENG_FRAC_CORE_DigiHSTruth"
+                                      ,"FIRST_ENG_DENS_DigiHSTruth"
+                                      ,"SECOND_ENG_DENS_DigiHSTruth"
+                                      ,"ISOLATION_DigiHSTruth"
+                                      ,"BAD_CELLS_CORR_E_DigiHSTruth"
+                                      ,"ENG_POS_DigiHSTruth"
+                                      ,"SIGNIFICANCE_DigiHSTruth"
+                                      ,"CELL_SIGNIFICANCE_DigiHSTruth"
+                                      ,"CELL_SIG_SAMPLING_DigiHSTruth"
+                                      ,"AVG_LAR_Q_DigiHSTruth"
+                                      ,"AVG_TILE_Q_DigiHSTruth"
+                                      ,"ENERGY_DigiHSTruth"
+                                      ,"PHI_DigiHSTruth"
+                                      ,"ETA_DigiHSTruth"
+                                      ]
+    return TopoMoments_Truth
+
+def getTopoCalibMoments(configFlags):
+    from CaloCalibHitRec.CaloCalibHitRecConf import CaloCalibClusterMomentsMaker2
+    TopoCalibMoments = CaloCalibClusterMomentsMaker2 ("TopoCalibMoments")
+    TopoCalibMoments.MomentsNames = ["ENG_CALIB_TOT"
+                                     ,"ENG_CALIB_OUT_L"
+                                     #,"ENG_CALIB_OUT_M"
+                                     # ,"ENG_CALIB_OUT_T"
+                                     # ,"ENG_CALIB_DEAD_L"
+                                     # ,"ENG_CALIB_DEAD_M"
+                                     # ,"ENG_CALIB_DEAD_T"
+                                     ,"ENG_CALIB_EMB0"
+                                     ,"ENG_CALIB_EME0"
+                                     ,"ENG_CALIB_TILEG3"
+                                     ,"ENG_CALIB_DEAD_TOT"
+                                     ,"ENG_CALIB_DEAD_EMB0"
+                                     ,"ENG_CALIB_DEAD_TILE0"
+                                     ,"ENG_CALIB_DEAD_TILEG3"
+                                     ,"ENG_CALIB_DEAD_EME0"
+                                     ,"ENG_CALIB_DEAD_HEC0"
+                                     ,"ENG_CALIB_DEAD_FCAL"
+                                     ,"ENG_CALIB_DEAD_LEAKAGE"
+                                     ,"ENG_CALIB_DEAD_UNCLASS"
+                                     ,"ENG_CALIB_FRAC_EM"
+                                     ,"ENG_CALIB_FRAC_HAD"
+                                     ,"ENG_CALIB_FRAC_REST"]
+    
+    TopoCalibMoments.CalibrationHitContainerNames = ["LArCalibrationHitInactive"
+                                                     ,"LArCalibrationHitActive"
+                                                     ,"TileCalibHitActiveCell"
+                                                     ,"TileCalibHitInactiveCell"]
+    TopoCalibMoments.DMCalibrationHitContainerNames = ["LArCalibrationHitDeadMaterial"
+                                                       ,"TileCalibHitDeadMaterial"]
+    return TopoCalibMOments
 
 def CaloTopoClusterCfg(configFlags):
     result=ComponentAccumulator()
@@ -16,13 +483,22 @@ def CaloTopoClusterCfg(configFlags):
     from CaloClusterCorrection.CaloClusterCorrectionConf import CaloClusterCellWeightCalib
     from CaloRec.CaloRecConf import CaloTopoClusterMaker, CaloTopoClusterSplitter, CaloClusterMomentsMaker, CaloClusterMaker, CaloClusterSnapshot #, CaloClusterLockVars, CaloClusterPrinter
 
-    
     result.merge(LArGMCfg(configFlags))
+
+    from LArBadChannelTool.LArBadChannelConfig import LArBadChannelCfg
+    result.merge(LArBadChannelCfg(configFlags))
+    from LArCalibUtils.LArHVScaleConfig import LArHVScaleCfg
+    result.merge(LArHVScaleCfg(configFlags))
+
     result.merge(TileGMCfg(configFlags))
+    from TileConditions.TileConditionsConfig import tileCondCfg
+    result.merge(tileCondCfg(configFlags))
 
     #Get CaloNoiseTool
     acc,theCaloNoiseTool=CaloNoiseToolCfg(configFlags)
     result.merge(acc)
+    
+    theCaloClusterSnapshot=CaloClusterSnapshot(OutputName="CaloTopoCluster",SetCrossLinks=True)
 
     # maker tools
     TopoMaker = CaloTopoClusterMaker("TopoMaker")
@@ -92,10 +568,26 @@ def CaloTopoClusterCfg(configFlags):
         
 
     CaloTopoCluster=CaloClusterMaker("CaloTopoCluster")
-    CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters"   
+    CaloTopoCluster.ClustersOutputName="CaloTopoClusters"
+    if configFlags.Calo.TopoCluster.doTopoClusterLocalCalib:
+        CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters"
 
     CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
     
+    from CaloClusterCorrection.CaloClusterBadChannelListCorr import CaloClusterBadChannelListCorr
+    BadChannelListCorr = CaloClusterBadChannelListCorr()
+    CaloTopoCluster.ClusterCorrectionTools += [BadChannelListCorr]
+
+    CaloTopoCluster.ClusterCorrectionTools += [getTopoMoments(configFlags,theCaloNoiseTool)]
+
+    CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
+
+    if configFlags.Calo.TopoCluster.doTopoClusterLocalCalib:
+        CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters"
+        CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(configFlags,theCaloNoiseTool)
+
+        result.merge(caloTopoCoolFolderCfg(configFlags))
+
     return result,CaloTopoCluster
 
 
@@ -108,17 +600,24 @@ if __name__=="__main__":
     from AthenaCommon.Constants import DEBUG
     from AthenaConfiguration.AllConfigFlags import ConfigFlags
 
-    log.setLevel(DEBUG)
+    #log.setLevel(DEBUG)
+
+    ConfigFlags.Input.Files = ["myESD-data.pool.root"]
+#    ConfigFlags.Output.ESDFileName="esdOut.pool.root"
+
+    nThreads=1
+    ConfigFlags.Concurrency.NumThreads = nThreads
+    if nThreads>0:
+        ConfigFlags.Scheduler.ShowDataDeps = True
+        ConfigFlags.Scheduler.ShowDataFlow = True
+        ConfigFlags.Scheduler.ShowControlFlow = True
+        ConfigFlags.Concurrency.NumConcurrentEvents = nThreads
 
-    ConfigFlags.Input.isMC = False
-    ConfigFlags.Input.Files = ["myESD.pool.root"]
-    ConfigFlags.Output.ESDFileName="esdOut.pool.root"
     ConfigFlags.lock()
 
-    from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg 
+    from AthenaConfiguration.MainServicesConfig import MainServicesThreadedCfg 
     from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
-    #cfg=ComponentAccumulator()
-    cfg=MainServicesSerialCfg() 
+    cfg=MainServicesThreadedCfg(ConfigFlags)
     cfg.merge(PoolReadCfg(ConfigFlags))
     
     theKey="CaloCalTopoClustersNew"
@@ -130,14 +629,28 @@ if __name__=="__main__":
     cfg.addEventAlgo(topoAlg,sequenceName="AthAlgSeq")
 
     from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
-    cfg.merge(OutputStreamCfg(ConfigFlags,"ESD", ItemList=["xAOD::CaloClusterContainer#"+theKey,
-                                                            "xAOD::CaloClusterAuxContainer#"+theKey+"Aux.",
-                                                            "CaloClusterCellLinkContainer#"+theKey+"_links"]))
+    cfg.merge(OutputStreamCfg(ConfigFlags,"xAOD", ItemList=["xAOD::CaloClusterContainer#CaloCalTopoClusters*",#+theKey,
+                                                           "xAOD::CaloClusterAuxContainer#*CaloCalTopoClusters*Aux.",#+theKey+"Aux.",
+                                                           # "CaloClusterCellLinkContainer#"+theKey+"_links"
+                                                           ]))
+    cfg.getEventAlgo("OutputStreamxAOD").ForceRead=True
+
+    from AthenaServices.AthenaServicesConf import ThinningSvc, ThinningOutputTool
+    cfg.addService(ThinningSvc())
+    tot = ThinningOutputTool("Thin_xAOD",ThinningSvc = cfg.getService("ThinningSvc"))
+    cfg.getEventAlgo("OutputStreamxAOD").HelperTools += [tot]
 
+    from ThinningUtils.ThinningUtilsConf import ThinNegativeEnergyCaloClustersAlg
+    theNegativeEnergyCaloClustersThinner = ThinNegativeEnergyCaloClustersAlg(
+        "ThinNegativeEnergyCaloClustersAlg",
+        CaloClustersKey=theKey,
+        ThinNegativeEnergyCaloClusters = True,
+        )
+    cfg.addEventAlgo(theNegativeEnergyCaloClustersThinner,"AthAlgSeq")
   
-    cfg.getService("StoreGateSvc").Dump=True
+#    cfg.getService("StoreGateSvc").Dump=True
 
-    cfg.run()
+    cfg.run(10)
     #f=open("CaloTopoCluster.pkl","w")
     #cfg.store(f)
     #f.close()
diff --git a/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py b/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py
index d3e6c0010ed0e80cc1703777dc35915274b90312..3d9b79b0042b982d209038f8c7c70a941707d702 100644
--- a/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py
+++ b/Calorimeter/CaloTools/python/CaloNoiseToolConfig.py
@@ -1,3 +1,4 @@
+
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from IOVDbSvc.IOVDbSvcConfig import addFolders
 from CaloTools.CaloToolsConf import CaloNoiseToolDB
@@ -18,7 +19,7 @@ def CaloNoiseToolCfg(configFlags):
     if configFlags.Common.isOnline:
         #online mode:
         folder  = "/CALO/Noise/CellNoise"
-        result.merge(addFolders(configFlags,inputFlags,folder,'CALO_ONL'))
+        result.merge(addFolders(configFlags,folder,'CALO_ONL'))
         caloNoiseToolDB.FolderNames=[folder,]
         if fixedLumi >= 0 :
             caloNoiseToolDB.Luminosity = fixedLumi
@@ -35,7 +36,7 @@ def CaloNoiseToolCfg(configFlags):
                 log.info("online mode: ignore pileup noise")
                 pass
         result.addPublicTool(caloNoiseToolDB)
-        return result
+        return result, caloNoiseToolDB
 
     #The not-online case:
     if isMC:
@@ -75,7 +76,7 @@ def CaloNoiseToolCfg(configFlags):
                 lumiFolder = '/TRIGGER/LUMI/LBLESTONL'
                 result.merge(addFolders(configFlags,lumiFolder,'TRIGGER_ONL'))
                 log.info("offline mode: use luminosity = f(Lumiblock) to scale pileup noise")
-                caloNoiseToolDB.LumiFolderName = lumiFolder
+            caloNoiseToolDB.LumiFolderName = lumiFolder
 
 
         folders=[("LAR_OFL","/LAR/NoiseOfl/CellNoise"),
@@ -85,8 +86,32 @@ def CaloNoiseToolCfg(configFlags):
         if configFlags.IOVDb.DatabaseInstance=="COMP200":
             folders.append(("CALO_OFL","/CALO/Ofl/Noise/CellNoise")),
         
-        #Fixme: Add rescaling of noise based on HV! 
+        if configFlags.IOVDb.DatabaseInstance=="CONDBR2" and configFlags.Calo.Cell.doLArHVCorr:
+            log.info("Run2 & doLArHVCorr=True: Will rescale noise automatically for HV trips")
+
+            from LArCalibUtils.LArHVScaleConfig import LArHVScaleCfg
+            result.merge( LArHVScaleCfg(configFlags) )
+
+            from LArCondUtils.LArCondUtilsConf import LArHVToolDB
+            theLArHVToolDB = LArHVToolDB("LArHVToolDB")
+            result.addPublicTool( theLArHVToolDB )
 
+            from LArRecUtils.LArRecUtilsConf import LArHVCorrTool
+            theLArHVCorrTool = LArHVCorrTool("LArHVCorrTool")
+            theLArHVCorrTool.keyOutput = "LArHVScaleCorr"
+            theLArHVCorrTool.folderName= "/LAR/ElecCalibFlat/HVScaleCorr"
+            theLArHVCorrTool.doTdrift = False
+            theLArHVCorrTool.DeltaTupdate = 0
+            theLArHVCorrTool.HVTool = theLArHVToolDB
+            result.addPublicTool( theLArHVCorrTool )
+
+            from LArCellRec.LArCellRecConf import LArCellHVCorr
+            theLArCellHVCorr = LArCellHVCorr("LArCellHVCorr")
+            theLArCellHVCorr.HVCorrTool = theLArHVCorrTool
+            result.addPublicTool( theLArCellHVCorr )
+
+            caloNoiseToolDB.RescaleForHV=True
+            caloNoiseToolDB.LArHVCellCorrTool = theLArCellHVCorr
 
         pass #end of real data case
     
@@ -96,7 +121,7 @@ def CaloNoiseToolCfg(configFlags):
     caloNoiseToolDB.FolderNames=[f[1] for f in folders]    
 
     result.addPublicTool(caloNoiseToolDB)
-    
+
     return result,caloNoiseToolDB
 
 if __name__ == "__main__":
diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py
index cbcef7a4e36e3102c365909f8881a12c8fdf9334..3dbc6b7a75c84e0e220d291d95a834f3f65332ec 100644
--- a/Control/AthenaConfiguration/python/AllConfigFlags.py
+++ b/Control/AthenaConfiguration/python/AllConfigFlags.py
@@ -35,8 +35,9 @@ def _createCfgFlags():
 
     # replace global.Beam*
     acf.addFlag('Beam.BunchSpacing', 25) # former global.BunchSpacing
-    acf.addFlag("Beam.NumberOfCollisions",0) # former global.NumberOfCollisions
-    acf.addFlag('Beam.Type', 'collisions') # former global.BeamType
+    acf.addFlag('Beam.Type', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get('beam_type','collisions') )# former global.BeamType
+    acf.addFlag("Beam.NumberOfCollisions", lambda prevFlags : (GetFileMD(prevFlags.Input.Files)["/Digitization/Parameters"]["numberOfCollisions"] if prevFlags.Input.isMC \
+                                                                   else (2. if prevFlags.Beam.Type=='collisions' else 0.))) # former global.NumberOfCollisions
     acf.addFlag('Beam.Energy', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get('BeamEnergy',7*TeV)) # former global.BeamEnergy
     acf.addFlag('Beam.estimatedLuminosity', lambda prevFlags : ( 1E33*(prevFlags.Beam.NumberOfCollisions)/2.3 ) *\
         (25./prevFlags.Beam.BunchSpacing)) # former flobal.estimatedLuminosity
@@ -84,11 +85,14 @@ def _createCfgFlags():
 #CaloNoise Flags
     acf.addFlag("Calo.Noise.fixedLumiForNoise",-1)
     acf.addFlag("Calo.Noise.useCaloNoiseLumi",True)
-                
+
+#CaloCell flags
+    acf.addFlag("Calo.Cell.doLArHVCorr",False) # Disable for now as it is broken...
 
 #TopoCluster Flags:
     acf.addFlag("Calo.TopoCluster.doTwoGaussianNoise",True)
     acf.addFlag("Calo.TopoCluster.doTreatEnergyCutAsAbsolute",False)
+    acf.addFlag("Calo.TopoCluster.doTopoClusterLocalCalib",True)
 
 
     def __trigger():
diff --git a/Control/AthenaConfiguration/python/MainServicesConfig.py b/Control/AthenaConfiguration/python/MainServicesConfig.py
index e230efaf380c9bc0372131d7797a80100e89d1d5..b2f41bb149213242c1195c7bce4dfe3254d81b54 100644
--- a/Control/AthenaConfiguration/python/MainServicesConfig.py
+++ b/Control/AthenaConfiguration/python/MainServicesConfig.py
@@ -14,13 +14,32 @@ def MainServicesMiniCfg(LoopMgr='AthenaEventLoopMgr'):
     cfg.setAppProperty('JobOptionsPreAction', '')
     return cfg
 
+from AthenaConfiguration.AthConfigFlags import AthConfigFlags
 
-def MainServicesSerialCfg(LoopMgr='AthenaEventLoopMgr'):
+def MainServicesSerialCfg():
+    serialflags=AthConfigFlags()
+    serialflags.addFlag('Concurrency.NumProcs', 0)
+    serialflags.addFlag('Concurrency.NumThreads', 0)
+    serialflags.addFlag('Concurrency.NumConcurrentEvents', 0)
+    return MainServicesThreadedCfg(serialflags)
+
+def MainServicesThreadedCfg(cfgFlags):
+
+    # Run a serial job for threads=0
+    LoopMgr = 'AthenaEventLoopMgr'
+    if cfgFlags.Concurrency.NumThreads>0:
+        if cfgFlags.Concurrency.NumConcurrentEvents==0:
+            # In a threaded job this will mess you up because no events will be processed
+            raise Exception("Requested Concurrency.NumThreads>0 and Concurrency.NumConcurrentEvents==0, which will not process events!")
+
+        LoopMgr = "AthenaHiveEventLoopMgr"
+
+    ########################################################################
+    # Core components needed for serial and threaded jobs
     cfg=ComponentAccumulator("AthMasterSeq")
-    cfg.merge(MainServicesMiniCfg(LoopMgr))
+    cfg.merge( MainServicesMiniCfg(LoopMgr) )
     cfg.setAppProperty('TopAlg',['AthSequencer/AthMasterSeq'],overwrite=True)
-    cfg.setAppProperty('OutStreamType', 'AthenaOutputStream')    
-    
+    cfg.setAppProperty('OutStreamType', 'AthenaOutputStream')
 
     #Build standard sequences:
     cfg.addSequence(AthSequencer('AthAlgEvtSeq',Sequential=True, StopOverride=True),parentName="AthMasterSeq") 
@@ -29,9 +48,20 @@ def MainServicesSerialCfg(LoopMgr='AthenaEventLoopMgr'):
 
     cfg.addSequence(AthSequencer('AthBeginSeq',Sequential=True),parentName='AthAlgEvtSeq')
     cfg.addSequence(AthSequencer('AthAllAlgSeq'),parentName='AthAlgEvtSeq') 
-    cfg.addSequence(AthSequencer('AthAlgSeq',IgnoreFilterPassed=True,StopOverride=True),parentName='AthAllAlgSeq')
+
+    if cfgFlags.Concurrency.NumThreads==0:
+        # For serial execution, we need the CondAlgs to execute first.
+        cfg.addSequence(AthSequencer('AthCondSeq'),parentName='AthAllAlgSeq')
+        cfg.addSequence(AthSequencer('AthAlgSeq',IgnoreFilterPassed=True,StopOverride=True),parentName='AthAllAlgSeq')
+    else:
+        # In MT, the order of execution is irrelevant (determined by data deps).
+        # We add the conditions sequence later such that the CondInputLoader gets
+        # initialized after all other user Algorithms for MT, so the base classes
+        # of data deps can be correctly determined. 
+        cfg.addSequence(AthSequencer('AthAlgSeq',IgnoreFilterPassed=True,StopOverride=True),parentName='AthAllAlgSeq')
+        cfg.addSequence(AthSequencer('AthCondSeq'),parentName='AthAllAlgSeq')
+
     cfg.addSequence(AthSequencer('AthEndSeq',Sequential=True),parentName='AthAlgEvtSeq') 
-    cfg.addSequence(AthSequencer('AthCondSeq'),parentName='AthAllAlgSeq')
 
     #Set up incident firing:
     from AthenaServices.AthenaServicesConf import AthIncFirerAlg
@@ -47,97 +77,84 @@ def MainServicesSerialCfg(LoopMgr='AthenaEventLoopMgr'):
     from CLIDComps.CLIDCompsConf import ClassIDSvc
     cfg.addService(ClassIDSvc(CLIDDBFiles= ['clid.db',"Gaudi_clid.db" ]))
 
-
     from StoreGate.StoreGateConf import StoreGateSvc
     cfg.addService(StoreGateSvc())
     cfg.addService(StoreGateSvc("DetectorStore"))
     cfg.addService(StoreGateSvc("HistoryStore"))
     
     cfg.setAppProperty('InitializationLoopCheck',False)
-    return cfg
-    
 
-def MainServicesThreadedCfg(cfgFlags):
-    # Neater ways to set the loop manager? Can't be altered
-    # after setting up the 
-
-    # Run a serial job for threads=0
-    if cfgFlags.Concurrency.NumThreads==0:
-        return MainServicesSerialCfg()
-
-    if cfgFlags.Concurrency.NumConcurrentEvents==0:
-        # In a threaded job this will mess you up because no events will be processed
-        raise Exception("Requested Concurrency.NumThreads>0 and Concurrency.NumConcurrentEvents==0, which will not process events!")
-
-    cfg = MainServicesSerialCfg("AthenaHiveEventLoopMgr")
-
-    # Migrated code from AtlasThreadedJob.py
-    from GaudiCoreSvc.GaudiCoreSvcConf import MessageSvc
-    from GaudiSvc.GaudiSvcConf import StatusCodeSvc, AuditorSvc
-
-    msgsvc = MessageSvc()
-    msgsvc.defaultLimit = 0 
-    #msgFmt = "% F%40W%S%4W%e%s%7W%R%T %0W%M"
-    msgFmt = "% F%18W%S%7W%R%T %0W%M"
-    msgsvc.Format = msgFmt
-    cfg.addService(msgsvc)
-
-    scsvc = StatusCodeSvc()
-    scsvc.AbortOnError = False
-    cfg.addService(scsvc)
-    cfg.setAppProperty('StatusCodeCheck',False)
-
-    from StoreGate.StoreGateConf import SG__HiveMgrSvc
-    hivesvc = SG__HiveMgrSvc("EventDataSvc")
-    hivesvc.NSlots = cfgFlags.Concurrency.NumConcurrentEvents
-    cfg.addService( hivesvc )
-
-    from StoreGate.StoreGateConf import StoreGateSvc
-    cfg.addService( StoreGateSvc("ConditionStore") )
-
-    from GaudiHive.GaudiHiveConf import AlgResourcePool
-    from AthenaCommon.Constants import INFO
-    arp=AlgResourcePool( OutputLevel = INFO )
-    arp.TopAlg=["AthMasterSeq"] #this should enable control flow
-    cfg.addService( arp )
-
-    from GaudiHive.GaudiHiveConf import AvalancheSchedulerSvc
-    scheduler = AvalancheSchedulerSvc()
-    scheduler.CheckDependencies    = cfgFlags.Scheduler.CheckDependencies
-    scheduler.ShowDataDependencies = cfgFlags.Scheduler.ShowDataDeps
-    scheduler.ShowDataFlow         = cfgFlags.Scheduler.ShowDataFlow
-    scheduler.ShowControlFlow      = cfgFlags.Scheduler.ShowControlFlow
-    scheduler.ThreadPoolSize       = cfgFlags.Concurrency.NumThreads
-    cfg.addService(scheduler)
-
-    from SGComps.SGCompsConf import SGInputLoader
-    # FailIfNoProxy=False makes it a warning, not an error, if unmet data
-    # dependencies are not found in the store.  It should probably be changed
-    # to True eventually.
-    inputloader = SGInputLoader (FailIfNoProxy = False)
-    cfg.addEventAlgo( inputloader, "AthAlgSeq" )
-    scheduler.DataLoaderAlg = inputloader.getName()
-
-    from AthenaServices.AthenaServicesConf import AthenaHiveEventLoopMgr
-
-    elmgr = AthenaHiveEventLoopMgr()
-    elmgr.WhiteboardSvc = "EventDataSvc"
-    elmgr.SchedulerSvc = scheduler.getName()
-    cfg.addService( elmgr )
-
-    # enable timeline recording
-    from GaudiHive.GaudiHiveConf import TimelineSvc
-    cfg.addService( TimelineSvc( RecordTimeline = True, Partial = False ) )
-    
-    #
-    ## Setup SGCommitAuditor to sweep new DataObjects at end of Alg execute
-    #
-    
-    auditorsvc = AuditorSvc()
-    from SGComps.SGCompsConf import SGCommitAuditor
-    auditorsvc += SGCommitAuditor()
-    cfg.addService( auditorsvc )
-    cfg.setAppProperty("AuditAlgorithms", True)
+    ########################################################################
+    # Additional components needed for threaded jobs only
+    if cfgFlags.Concurrency.NumThreads>0:
+
+        # Migrated code from AtlasThreadedJob.py
+        from GaudiCoreSvc.GaudiCoreSvcConf import MessageSvc
+        from GaudiSvc.GaudiSvcConf import StatusCodeSvc, AuditorSvc
+
+        msgsvc = MessageSvc()
+        msgsvc.defaultLimit = 0 
+        #msgFmt = "% F%40W%S%4W%e%s%7W%R%T %0W%M"
+        msgFmt = "% F%18W%S%7W%R%T %0W%M"
+        msgsvc.Format = msgFmt
+        cfg.addService(msgsvc)
+
+        scsvc = StatusCodeSvc()
+        scsvc.AbortOnError = False
+        cfg.addService(scsvc)
+        cfg.setAppProperty('StatusCodeCheck',False)
+
+        from StoreGate.StoreGateConf import SG__HiveMgrSvc
+        hivesvc = SG__HiveMgrSvc("EventDataSvc")
+        hivesvc.NSlots = cfgFlags.Concurrency.NumConcurrentEvents
+        cfg.addService( hivesvc )
+
+        from StoreGate.StoreGateConf import StoreGateSvc
+        cfg.addService( StoreGateSvc("ConditionStore") )
+
+        from GaudiHive.GaudiHiveConf import AlgResourcePool
+        from AthenaCommon.Constants import INFO
+        arp=AlgResourcePool( OutputLevel = INFO )
+        arp.TopAlg=["AthMasterSeq"] #this should enable control flow
+        cfg.addService( arp )
+
+        from GaudiHive.GaudiHiveConf import AvalancheSchedulerSvc
+        scheduler = AvalancheSchedulerSvc()
+        scheduler.CheckDependencies    = cfgFlags.Scheduler.CheckDependencies
+        scheduler.ShowDataDependencies = cfgFlags.Scheduler.ShowDataDeps
+        scheduler.ShowDataFlow         = cfgFlags.Scheduler.ShowDataFlow
+        scheduler.ShowControlFlow      = cfgFlags.Scheduler.ShowControlFlow
+        scheduler.ThreadPoolSize       = cfgFlags.Concurrency.NumThreads
+        cfg.addService(scheduler)
+
+        from SGComps.SGCompsConf import SGInputLoader
+        # FailIfNoProxy=False makes it a warning, not an error, if unmet data
+        # dependencies are not found in the store.  It should probably be changed
+        # to True eventually.
+        inputloader = SGInputLoader (FailIfNoProxy = False)
+        cfg.addEventAlgo( inputloader, "AthAlgSeq" )
+        scheduler.DataLoaderAlg = inputloader.getName()
+
+        from AthenaServices.AthenaServicesConf import AthenaHiveEventLoopMgr
+
+        elmgr = AthenaHiveEventLoopMgr()
+        elmgr.WhiteboardSvc = "EventDataSvc"
+        elmgr.SchedulerSvc = scheduler.getName()
+        cfg.addService( elmgr )
+
+        # enable timeline recording
+        from GaudiHive.GaudiHiveConf import TimelineSvc
+        cfg.addService( TimelineSvc( RecordTimeline = True, Partial = False ) )
+
+        #
+        ## Setup SGCommitAuditor to sweep new DataObjects at end of Alg execute
+        #
+
+        auditorsvc = AuditorSvc()
+        from SGComps.SGCompsConf import SGCommitAuditor
+        auditorsvc += SGCommitAuditor()
+        cfg.addService( auditorsvc )
+        cfg.setAppProperty("AuditAlgorithms", True)
 
     return cfg
     
diff --git a/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py b/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py
new file mode 100644
index 0000000000000000000000000000000000000000..fbe52c53e4564898296da689e8021e61578e9ea0
--- /dev/null
+++ b/LArCalorimeter/LArCalibUtils/python/LArHVScaleConfig.py
@@ -0,0 +1,80 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+
+def LArHVScaleCfg(configFlags):
+    result=ComponentAccumulator()
+
+    if configFlags.Input.isMC:
+        result.merge(addFolders(configFlags,["/LAR/IdentifierOfl/HVLineToElectrodeMap<tag>LARHVLineToElectrodeMap-001</tag>"], "LAR_OFL", className="AthenaAttributeList"))
+
+    elif not configFlags.Common.isOnline:
+        from IOVDbSvc.IOVDbSvcConfig import addFolders, IOVDbSvcCfg
+        result.mergeAll(IOVDbSvcCfg(configFlags))
+        result.merge(addFolders(configFlags,["/LAR/DCS/HV/BARREl/I16"], "DCS_OFL", className="CondAttrListCollection"))
+        result.merge(addFolders(configFlags,["/LAR/DCS/HV/BARREL/I8"],  "DCS_OFL", className="CondAttrListCollection"))
+
+        result.merge(addFolders(configFlags,["/LAR/IdentifierOfl/HVLineToElectrodeMap"], "LAR_OFL", className="AthenaAttributeList"))
+        result.merge(addFolders(configFlags,["/LAR/HVPathologiesOfl/Pathologies"], "LAR_OFL", className="AthenaAttributeList"))
+
+        result.merge(addFolders(configFlags,["/LAR/ElecCalibFlat/HVScaleCorr"],"LAR_ONL", className="CondAttrListCollection"))
+
+        from LArBadChannelTool.LArBadChannelConfig import LArBadChannelCfg, LArBadFebCfg
+        result.merge(LArBadChannelCfg(configFlags))
+        result.merge(LArBadFebCfg(configFlags))
+
+        from LArRecUtils.LArRecUtilsConf import LArHVIdMappingAlg
+        hvmapalg = LArHVIdMappingAlg(ReadKey="/LAR/IdentifierOfl/HVLineToElectrodeMap",WriteKey="LArHVIdMap")
+        result.addCondAlgo(hvmapalg)
+
+        from LArRecUtils.LArRecUtilsConf import LArHVPathologyDbCondAlg
+        hvpath = LArHVPathologyDbCondAlg(PathologyFolder="/LAR/HVPathologiesOfl/Pathologies",
+                                         HVMappingKey="LArHVIdMap",
+                                         HVPAthologyKey="LArHVPathology")
+        result.addCondAlgo(hvpath)
+
+        from LArRecUtils.LArRecUtilsConf import LArHVCondAlg
+        hvcond = LArHVCondAlg("LArHVPathologyAlg",HVPathologies="LArHVPathology",OutputHVData="LArHVData")
+        result.addCondAlgo(hvcond)
+
+        from LArRecUtils.LArRecUtilsConf import LArFlatConditionsAlg_LArHVScaleCorrFlat_ as LArHVScaleCorrFlat
+        hvscaleflat = LArHVScaleCorrFlat("LArHVScaleCorrFlat",
+                                         ReadKey="/LAR/ElecCalibFlat/HVScaleCorr",
+                                         WriteKey='LArHVScaleCorr')
+        result.addCondAlgo(hvscaleflat)
+
+        from LArRecUtils.LArRecUtilsConf import LArHVScaleCorrCondAlg
+        hvscalecorrkey = "LArHVScaleCorrRecomputed"
+        if configFlags.Input.isMC:
+            hvscalecorrkey = "LArHVScaleCorr"
+
+        hvscale = LArHVScaleCorrCondAlg(keyHVdata="LArHVData",keyOutputCorr=hvscalecorrkey)
+        hvscale.UndoOnlineHVCorr=True
+        result.addCondAlgo(hvscale)
+
+    return result
+
+if __name__=="__main__":
+    from AthenaCommon.Configurable import Configurable
+    Configurable.configurableRun3Behavior=1
+    from AthenaConfiguration.AllConfigFlags import ConfigFlags
+
+    nThreads=1
+    ConfigFlags.Concurrency.NumThreads = nThreads
+    if nThreads>0:
+        ConfigFlags.Scheduler.ShowDataDeps = True
+        ConfigFlags.Scheduler.ShowDataFlow = True
+        ConfigFlags.Scheduler.ShowControlFlow = True
+        ConfigFlags.Concurrency.NumConcurrentEvents = nThreads
+
+    ConfigFlags.Input.Files = ["myESD-data.pool.root"]
+    ConfigFlags.lock()
+
+    from AthenaConfiguration.MainServicesConfig import MainServicesSerialCfg
+    from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
+    cfg=MainServicesSerialCfg()
+    cfg.merge(PoolReadCfg(ConfigFlags))
+
+    cfg.merge( LArHVScaleCfg(ConfigFlags) )
+
+    cfg.run(10)
diff --git a/LArCalorimeter/LArCalibUtils/src/LArHVCorrMaker.cxx b/LArCalorimeter/LArCalibUtils/src/LArHVCorrMaker.cxx
index 2fc0708ce896c10113c4bac27711d1d1e7c04bfa..2fe8f589b5bdf8cf73e09152afed23aaa62e2d6c 100755
--- a/LArCalorimeter/LArCalibUtils/src/LArHVCorrMaker.cxx
+++ b/LArCalorimeter/LArCalibUtils/src/LArHVCorrMaker.cxx
@@ -14,8 +14,9 @@
 LArHVCorrMaker::LArHVCorrMaker(const std::string& name, ISvcLocator* pSvcLocator) 
   : AthAlgorithm(name, pSvcLocator),
     m_lar_on_id(0),
-    m_hvCorrTool("LArHVCorrTool")
+    m_hvCorrTool("LArHVCorrTool",this)
 {
+  declareProperty("HVCorrTool", m_hvCorrTool);
 }
 
 //---------------------------------------------------------------------------
diff --git a/LArCalorimeter/LArRecUtils/src/LArHVCorrTool.cxx b/LArCalorimeter/LArRecUtils/src/LArHVCorrTool.cxx
index 8893edfe85ac1cb6418984d7252da8a36f9c0120..f16d01686a8a0c13f29d1d442606bdbc095cefa3 100644
--- a/LArCalorimeter/LArRecUtils/src/LArHVCorrTool.cxx
+++ b/LArCalorimeter/LArRecUtils/src/LArHVCorrTool.cxx
@@ -36,7 +36,7 @@ LArHVCorrTool::LArHVCorrTool(const std::string& type,
     m_electrodeID(nullptr),
     m_calodetdescrmgr(nullptr),
     m_cablingService("LArCablingLegacyService"),
-    m_hvtool("LArHVToolMC")
+    m_hvtool("LArHVToolMC",this)
 {
   declareInterface<ILArHVCorrTool>(this);