diff --git a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py
index 7f7ba9fc88693cc729039ca3cfca5abaa8f7c03d..604fe60492f9fd06b882ea0a157d162d7d0f4f7d 100644
--- a/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py
+++ b/Calorimeter/CaloRec/python/CaloTopoClusterConfig.py
@@ -231,9 +231,15 @@ def getTopoCalibMoments(configFlags):
                                                        ,"TileCalibHitDeadMaterial"]
     return TopoCalibMoments
 
-def CaloTopoClusterCfg(configFlags):
+# Steering options for trigger
+# Maybe offline reco options should be extracted from flags elsewhere
+def CaloTopoClusterCfg(configFlags,cellsname="AllCalo",clustersname="",doLCCalib=None,sequenceName='AthAlgSeq'):
     result=ComponentAccumulator()
-    
+    from AthenaCommon.AlgSequence import AthSequencer
+    result.addSequence(AthSequencer(sequenceName))
+
+    if not clustersname: clustersname = "CaloTopoClusters"
+
     from LArGeoAlgsNV.LArGMConfig import LArGMCfg
     from TileGeoModel.TileGMConfig import TileGMCfg
     from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
@@ -259,12 +265,12 @@ def CaloTopoClusterCfg(configFlags):
     from TileConditions.TileConditionsConfig import tileCondCfg
     result.merge(tileCondCfg(configFlags))
 
-    theCaloClusterSnapshot=CaloClusterSnapshot(OutputName="CaloTopoClusters",SetCrossLinks=True)
+    theCaloClusterSnapshot=CaloClusterSnapshot(OutputName=clustersname,SetCrossLinks=True)
 
     # maker tools
     TopoMaker = CaloTopoClusterMaker("TopoMaker")
         
-    TopoMaker.CellsName = "AllCalo"
+    TopoMaker.CellsName = cellsname
     TopoMaker.CalorimeterNames=["LAREM",
                                 "LARHEC",
                                 "LARFCAL",
@@ -325,8 +331,8 @@ def CaloTopoClusterCfg(configFlags):
     # EnergyCut                     = 500*MeV,
         
 
-    CaloTopoCluster=CaloClusterMaker("CaloTopoCluster")
-    CaloTopoCluster.ClustersOutputName="CaloTopoCluster"
+    CaloTopoCluster=CaloClusterMaker(clustersname)
+    CaloTopoCluster.ClustersOutputName=clustersname
 
     CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
     
@@ -336,16 +342,18 @@ def CaloTopoClusterCfg(configFlags):
 
     CaloTopoCluster.ClusterCorrectionTools += [getTopoMoments(configFlags)]
 
-    CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
-
-    if configFlags.Calo.TopoCluster.doTopoClusterLocalCalib:
-        CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters"
+    if doLCCalib==None:
+        doLCCalib = configFlags.Calo.TopoCluster.doTopoClusterLocalCalib
+    if doLCCalib:
+        CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
+        if not clustersname:
+            CaloTopoCluster.ClustersOutputName="CaloCalTopoClusters"
         CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(configFlags)
 
         # Needed?
         from CaloRec import CaloClusterTopoCoolFolder
 
-    result.addEventAlgo(CaloTopoCluster,primary=True)
+    result.addEventAlgo(CaloTopoCluster,primary=True,sequenceName=sequenceName)
 
     return result
 
diff --git a/Control/AthenaConfiguration/python/AllConfigFlags.py b/Control/AthenaConfiguration/python/AllConfigFlags.py
index 5bf80a583f74bf153dfddf58ed5781b8f57b6772..889f8a4906f3559edbff8c585d9576df2292de16 100644
--- a/Control/AthenaConfiguration/python/AllConfigFlags.py
+++ b/Control/AthenaConfiguration/python/AllConfigFlags.py
@@ -28,7 +28,7 @@ def _createCfgFlags():
     acf.addFlag('Input.ProjectName', lambda prevFlags : GetFileMD(prevFlags.Input.Files).get("Project","data17_13TeV") ) # former global.ProjectName
 
     def _inputCollections(inputFile):
-        rawCollections = GetFileMD(inputFile).get("SGKeys").split()
+        rawCollections = GetFileMD(inputFile).get("SGKeys","").split()
         collections = filter(lambda col: not col.endswith('Aux.'), rawCollections)
         return collections
 
diff --git a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/python/LArGMConfig.py b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/python/LArGMConfig.py
index 8b0298b4e607570e8fd9ca7193c00130d7a758ce..e09712c13456da17f34e7d43ed6d290a407225f8 100644
--- a/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/python/LArGMConfig.py
+++ b/LArCalorimeter/LArGeoModel/LArGeoAlgsNV/python/LArGMConfig.py
@@ -10,6 +10,8 @@ def LArGMCfg(configFlags):
     
     from LArGeoAlgsNV.LArGeoAlgsNVConf import LArDetectorToolNV
     result.getPrimary().DetectorTools += [ LArDetectorToolNV(ApplyAlignments=doAlignment) ]
+    if not configFlags.Detector.SimulateCalo:
+        result.getPrimary().DetectorTools["LArDetectorToolNV"].GeometryConfig = "RECO"
 
     if doAlignment:
         if configFlags.Input.isMC:
diff --git a/Reconstruction/Jet/JetCalibTools/python/JetCalibToolsConfig.py b/Reconstruction/Jet/JetCalibTools/python/JetCalibToolsConfig.py
index 6e8660d39bd6a4fde19517f7d70cbd8fb1c7aa37..d0756da2af0356c1e9d02099f5496786dc28eb61 100644
--- a/Reconstruction/Jet/JetCalibTools/python/JetCalibToolsConfig.py
+++ b/Reconstruction/Jet/JetCalibTools/python/JetCalibToolsConfig.py
@@ -148,10 +148,11 @@ def getJetCalibToolPrereqs(modspec,jetdef):
     prereqs.append("mod:ConstitFourMom")
     if "JetArea" in calibseq:
         prereqs.append("input:EventDensity")
-    prereqs += ["mod:CaloEnergies"]
     if "GSC" in calibseq:
-        prereqs += ["mod:TrackMoments",
-                    "ghost:MuonSegment"]
+        prereqs += ["mod:CaloEnergies"]
+        if calibcontext != "TrigRun2": # No track/MS GSC for trigger w/o FTK
+            prereqs += ["mod:TrackMoments",
+                        "ghost:MuonSegment"]
     jetcaliblog.debug("Prereqs for calibseq '{0}': {1}".format(calibseq,str(prereqs)))
     return prereqs
 
diff --git a/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py b/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py
index 769ccca1c49cb1d781a4f3ce8457044386e7b46c..50b09e6a6df3cc416fba8160fce01cbc5872c33e 100644
--- a/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py
+++ b/Reconstruction/Jet/JetRecConfig/python/JetRecConfig.py
@@ -232,18 +232,17 @@ def JetInputCfg(inputdeps, configFlags, sequenceName):
     jetlog.info("Setting up jet inputs.")
     components = ComponentAccumulator(sequenceName)
 
-    jetlog.info("Inspecting first input file")
+    jetlog.info("Inspecting input file contents")
     # Get the list of SG keys for the first input file
     # I consider it silly to run on a set of mixed file types
     firstinput = configFlags.Input.Files[0]
     import os, pickle
-    from AthenaConfiguration.AutoConfigFlags import GetFileMD
     # PeekFiles returns a dict for each input file
-    filecontents = GetFileMD([firstinput])["SGKeys"].split(' ')
+    filecontents = configFlags.Input.Collections
     
     constit = inputdeps[0]
     # Truth and track particle inputs are handled later
-    if constit.basetype not in [xAODType.TruthParticle, xAODType.TrackParticle]:
+    if constit.basetype not in [xAODType.TruthParticle, xAODType.TrackParticle] and constit.inputname!=constit.rawname:
         # Protection against reproduction of existing containers
         if constit.inputname in filecontents:
             jetlog.debug("Input container {0} for label {1} already in input file.".format(constit.inputname, constit.label))
diff --git a/TileCalorimeter/TileGeoModel/python/TileGMConfig.py b/TileCalorimeter/TileGeoModel/python/TileGMConfig.py
index 09abf446a680245206c2dc2f2c28f4dda21ab5ee..12ba7101236eb06ee44149ec54cecd82d485d9ec 100644
--- a/TileCalorimeter/TileGeoModel/python/TileGMConfig.py
+++ b/TileCalorimeter/TileGeoModel/python/TileGMConfig.py
@@ -8,6 +8,8 @@ def TileGMCfg(configFlags):
 
     from TileGeoModel.TileGeoModelConf import TileDetectorTool
     result.getPrimary().DetectorTools += [ TileDetectorTool() ]
+    if not configFlags.Detector.SimulateCalo:
+        result.getPrimary().DetectorTools["TileDetectorTool"].GeometryConfig = "RECO"
 
     return result
 
diff --git a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py
index de12451e15ec101bfa36268baa633555052591ea..19779b812eea3c2d363eace6c429790c3a3609c1 100644
--- a/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py
+++ b/Trigger/TrigAlgorithms/TrigT2CaloCommon/python/TrigCaloDataAccessConfig.py
@@ -42,7 +42,6 @@ def trigCaloDataAccessSvcCfg( flags ):
 
     from TileGeoModel.TileGMConfig import TileGMCfg    
     acc.merge( TileGMCfg( flags ) )
-    acc.getService('GeoModelSvc').DetectorTools['TileDetectorTool'].GeometryConfig = 'RECO'
 
     from RegionSelector.RegSelConfig import regSelCfg
     acc.merge( regSelCfg( flags ) )
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref
index 1e27e6878acfebec8f29f79b19aaacdbaec0b317..d00a03b825ab987d054de691810d67d6973ff1fd 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/newJO_build.ref
@@ -3,6 +3,8 @@ Py:Athena            INFO now loading newJOtest.pkl  ...
 TrigSignatureMo...   INFO Chains passing step (1st row events & 2nd row decision counts):
 TrigSignatureMo...   INFO Chain name                   L1,      AfterPS,  step1     step2     Output
 TrigSignatureMo...   INFO All                           10        10        0         0         2         
+TrigSignatureMo...   INFO HLT_2j35_L1J20                10        10        0         0         0         
+TrigSignatureMo...   INFO HLT_2j35_L1J20 decisions                          0         0         
 TrigSignatureMo...   INFO HLT_e3_etcut_L1EM3            10        10        6         0         0         
 TrigSignatureMo...   INFO HLT_e3_etcut_L1EM3 decisions                      15        0         
 TrigSignatureMo...   INFO HLT_e5_etcut_L1EM3            10        10        4         0         0         
@@ -13,6 +15,10 @@ TrigSignatureMo...   INFO HLT_g10_etcut_L1EM7           10        10        2
 TrigSignatureMo...   INFO HLT_g10_etcut_L1EM7 decisions                     4         4         
 TrigSignatureMo...   INFO HLT_g15_etcut_L1EM12          10        10        2         2         2         
 TrigSignatureMo...   INFO HLT_g15_etcut_L1EM12 decisions                    3         3         
+TrigSignatureMo...   INFO HLT_j45_L1J20                 10        10        0         0         0         
+TrigSignatureMo...   INFO HLT_j45_L1J20 decisions                           0         0         
+TrigSignatureMo...   INFO HLT_j85_L1J20                 10        10        0         0         0         
+TrigSignatureMo...   INFO HLT_j85_L1J20 decisions                           0         0         
 TrigSignatureMo...   INFO HLT_mu10_L1MU10               10        10        0         0         0         
 TrigSignatureMo...   INFO HLT_mu10_L1MU10 decisions                         0         0         
 TrigSignatureMo...   INFO HLT_mu20_L1MU20               10        10        0         0         0         
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/MenuConfigFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/MenuConfigFlags.py
index d50d4661bdd71d9885aed2ae1207a6c4f406f209..11f83493ccb19216cab9562d540147b596c8bbd3 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/MenuConfigFlags.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/MenuConfigFlags.py
@@ -16,6 +16,7 @@ def createMenuFlags():
     flags.addFlag('Trigger.menu.muon', [])
     flags.addFlag('Trigger.menu.electron', [])
     flags.addFlag('Trigger.menu.photon', [])
+    flags.addFlag('Trigger.menu.jet', [])
     flags.addFlag('Trigger.menu.combined', [])
 
     return flags
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Jet/generateJet.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Jet/generateJet.py
new file mode 100644
index 0000000000000000000000000000000000000000..13b6ec6e5c2264682990b160b369dcc3c870d92d
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Jet/generateJet.py
@@ -0,0 +1,83 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import MenuSequence, ChainStep, Chain, InEventReco, getChainStepName, createStepView
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+
+
+def generateChains( flags, chainDict ):
+
+    stepName = getChainStepName('Jet', 1)
+    stepReco, stepView = createStepView(stepName)
+
+    acc = ComponentAccumulator()
+    acc.addSequence(stepView)
+
+    # All this should be some common FS cell module?
+    from TrigT2CaloCommon.TrigCaloDataAccessConfig import trigCaloDataAccessSvcCfg
+    acc.merge( trigCaloDataAccessSvcCfg(flags) )
+    cdaSvc = acc.getService("TrigCaloDataAccessSvc") # should be made primary component
+
+    acc.printConfig()
+
+    from TrigT2CaloCommon.CaloDef import clusterFSInputMaker
+    inEventReco = InEventReco("JetReco",inputMaker=clusterFSInputMaker())
+
+    cellsname = "CaloCellsFS"
+    clustersname = "HLT_CaloTopoClustersFS"
+
+    from TrigCaloRec.TrigCaloRecConfig import HLTCaloCellMaker
+    cellmaker=HLTCaloCellMaker("HLTCaloCellMaker_FS")
+    cellmaker.RoIs="FSJETRoI"
+    cellmaker.TrigDataAccessMT=cdaSvc
+    cellmaker.CellsName=cellsname
+
+    inEventReco.addRecoAlg(cellmaker)
+
+    from CaloRec.CaloTopoClusterConfig import CaloTopoClusterCfg
+    inEventReco.mergeReco( CaloTopoClusterCfg(flags,cellsname=cellsname,clustersname=clustersname,doLCCalib=False,sequenceName=inEventReco.recoSeq.name()) )
+
+    #sequencing of actual jet reconstruction
+    from JetRecConfig import JetRecConfig
+    from JetRecConfig.JetDefinition import JetConstit, JetDefinition, xAODType
+   
+    #hardcoded jet collection for now 
+    clustermods = ["ECPSFrac","ClusterMoments"]
+    trigMinPt = 7e3
+    TrigEMTopo = JetConstit( xAODType.CaloCluster, ["EM"])
+    TrigEMTopo.rawname = clustersname
+    TrigEMTopo.inputname = clustersname
+    TrigAntiKt4EMTopoSubJES = JetDefinition( "AntiKt", 0.4, TrigEMTopo, ptmin=trigMinPt,ptminfilter=trigMinPt)
+    TrigAntiKt4EMTopoSubJES.modifiers = ["Calib:TrigRun2:data:JetArea_EtaJES_GSC_Insitu","Sort"] + clustermods 
+
+    #TODO: modify jet constituent configs to override offline configs for trigger calo cluster input.
+    jetprefix="Trig"
+    jetsuffix="subjesIS"
+    jetRecoComps = JetRecConfig.JetRecCfg(TrigAntiKt4EMTopoSubJES, flags, jetprefix, jetsuffix)
+    inEventReco.mergeReco(jetRecoComps)    
+
+    acc.merge(inEventReco,stepReco.getName())
+
+    #hypo
+    from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigJetHypoAlgMT
+    from TrigHLTJetHypo.TrigJetHypoToolConfig import trigJetHypoToolFromDict
+    hypo = TrigJetHypoAlgMT("TrigJetHypoAlgMT_a4tcem_subjesIS")
+    jetsfullname = jetprefix+TrigAntiKt4EMTopoSubJES.basename+jetsuffix+"Jets"
+    hypo.Jets = jetsfullname
+    acc.addEventAlgo(hypo)
+
+    jetSequence = MenuSequence( Sequence    = inEventReco.sequence(),
+                                Maker       = inEventReco.inputMaker(),
+                                Hypo        = hypo,
+                                HypoToolGen = trigJetHypoToolFromDict,
+                                CA = acc)
+
+    jetStep = ChainStep(stepName, [jetSequence])
+
+    import pprint
+    pprint.pprint(chainDict)
+
+    acc.printConfig()
+
+    chain = Chain( chainDict['chainName'], chainDict['L1item'], [ jetStep ] )
+
+    return chain
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py
index 8add498930e67e6e948e6d0c8a38717ff0642a14..a8ca18e1bcd9a280afb47d7edfa35188da6803d8 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py
@@ -28,17 +28,23 @@ def stepCF_ControlFlow_to_dot(stepCF):
         return o
 
     def _parOR (seq):
-        if seq.ModeOR is True:
-            if seq.Sequential is False:
-                if seq.StopOverride is True:
-                    return True
+        try:
+            if seq.ModeOR is True:
+                if seq.Sequential is False:
+                    if seq.StopOverride is True:
+                        return True
+        except AttributeError:
+            return False # Offline sequence may not have these set
         return False
 
     def _seqAND(seq):
-        if seq.ModeOR is False:
-            if seq.Sequential is True:
-                if seq.StopOverride is False:
-                    return True
+        try:
+            if seq.ModeOR is False:
+                if seq.Sequential is True:
+                    if seq.StopOverride is False:
+                        return True
+        except AttributeError:
+            return False # Offline sequence may not have these set
         return False
 
     def _seqColor(seq):
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py
index 54f095bd8563be9e19d8c4c16c6902832117dee9..fec61a36e88963592cb099e3788431d1697fc1df 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1_newJO.py
@@ -48,6 +48,12 @@ def setupMenu(flags):
        get_flag_item('HLT_g15_etcut_L1EM12', [], ['RATE:SinglePhoton', 'BW:Photon'])
     ]
 
+    flags.Trigger.menu.jet = [
+       get_flag_item('HLT_j45_L1J20', [], ['RATE:SingleJet', 'BW:Jet']),
+       get_flag_item('HLT_j85_L1J20', [], ['RATE:SingleJet', 'BW:Jet']),
+       get_flag_item('HLT_2j35_L1J20', [], ['RATE:SingleJet', 'BW:Jet']),
+    ]
+
     # flags.Trigger.menu.combined = [
     #     get_flag_item('HLT_e8_mu8_L1EM6_MU6', [], ['RATE:SingleMuon', 'BW:Muon'])
     # ]
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
index 5baceed10a73ae8d872499f5e62340f76276aacc..eb07c7b0b2f0df524d80e122e081094240014617 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
@@ -564,8 +564,41 @@ class ChainStep(object):
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 class InEventReco( ComponentAccumulator ):
     """ Class to handle in-event reco """
+    def __init__(self, name, inputMaker=None):
+        super( InEventReco, self ).__init__()
+        self.name = name
+        from AthenaCommon.CFElements import parOR, seqAND
+        self.mainSeq = seqAND( name )
+        self.addSequence( self.mainSeq )
+
+        # Details below to be checked
+        self.inputMakerAlg = inputMaker
+
+        # Avoid registering a duplicate
+        self.addEventAlgo( self.inputMakerAlg, self.mainSeq.name() )
+        self.recoSeq = parOR( "InputSeq_"+self.inputMakerAlg.name())
+        self.addSequence( self.recoSeq, self.mainSeq.name() )
     pass
 
+    def mergeReco( self, ca ):
+        """ Merged CA movnig reconstruction algorithms into the right sequence """
+        return self.merge( ca, sequenceName=self.recoSeq.getName() )
+
+    def addRecoAlg( self, alg ):
+        """Reconstruction alg to be run per event"""
+        log.warning( "InViewReco.addRecoAlgo: consider using mergeReco that takes care of the CA accumulation and moving algorithms" )
+        self.addEventAlgo( alg, self.recoSeq.name() )
+
+    def addHypoAlg(self, alg):
+        self.addEventAlgo( alg, self.mainSeq.name() )
+
+    def sequence( self ):
+        return self.mainSeq
+
+    def inputMaker( self ):
+        return self.inputMakerAlg
+
+
 
 class InViewReco( ComponentAccumulator ):
     """ Class to handle in-view reco, sets up the View maker if not provided and exposes InputMaker so that more inputs to it can be added in the process of assembling the menu """