diff --git a/Trigger/TriggerCommon/TriggerMenu/CMakeLists.txt b/Trigger/TriggerCommon/TriggerMenu/CMakeLists.txt
index 3e6a1e8098c3b82b16d01f13198eb1ff4ead9cff..40b7e5e6d0d8aa352a65c4eea07203b958191743 100644
--- a/Trigger/TriggerCommon/TriggerMenu/CMakeLists.txt
+++ b/Trigger/TriggerCommon/TriggerMenu/CMakeLists.txt
@@ -54,11 +54,6 @@ function( atlas_run_lowestunprescaled )
       ${CMAKE_CURRENT_BINARY_DIR}/LowestUnprescaledLists/unprescaled
       COMMAND ${CMAKE_BINARY_DIR}/atlas_build_run.sh
       ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/generateUnprescaledLists.py ${CMAKE_CURRENT_BINARY_DIR}/LowestUnprescaledLists/unprescaled
-      COMMAND ${CMAKE_COMMAND} -E make_directory
-      ${CMAKE_PYTHON_OUTPUT_DIRECTORY}/TriggerMenu
-      COMMAND ${CMAKE_COMMAND} -E copy_directory
-      ${CMAKE_CURRENT_BINARY_DIR}/LowestUnprescaledLists/unprescaled/
-      ${CMAKE_PYTHON_OUTPUT_DIRECTORY}/TriggerMenu/api/
       COMMAND ${CMAKE_COMMAND} -E touch
       ${CMAKE_CURRENT_BINARY_DIR}/unprescaled.stamp
       DEPENDS "Package_$<JOIN:$<TARGET_PROPERTY:ATLAS_PACKAGES_TARGET,ATLAS_PACKAGES>,;Package_>" )
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerAPI.py b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerAPI.py
index 88f82f294e977818ae88ddb07303d3c3b74c999b..574352a540db7030ca3b991da88034ca2bc47a30 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerAPI.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerAPI.py
@@ -17,6 +17,7 @@ class TriggerAPI:
     dbQueries = {}
     privatedbQueries = {}
     customGRL = None
+    release   = None
     log = logging.getLogger( 'TriggerMenu.api.TriggerAPI.py' )
 
     @classmethod
@@ -41,6 +42,14 @@ class TriggerAPI:
         except IOError:
             pass
 
+    @classmethod
+    def setRelease(cls, release):
+        import re
+        if release and re.match('21\.1(\.[0-9]+)+$',release):
+            cls.release = release
+        else:
+            cls.log.warning("Release doesn't seem to be a well-formed 21.1 release, ignoring: "+release)
+
     @classmethod
     def setCustomGRL(cls, grl):
         if TriggerInfo.testCustomGRL(grl):
@@ -145,7 +154,7 @@ class TriggerAPI:
         if not period & TriggerPeriod.future: cls.init()
         if (period,cls.customGRL) not in cls.dbQueries:
             if TriggerPeriod.isRunNumber(period) or (isinstance(period,TriggerPeriod) and period.isBasePeriod()):
-                cls.dbQueries[(period,cls.customGRL)] = TriggerInfo(period,cls.customGRL)
+                cls.dbQueries[(period,cls.customGRL)] = TriggerInfo(period,cls.customGRL,cls.release)
                 cls.privatedbQueries[(period,cls.customGRL)] = cls.dbQueries[(period,cls.customGRL)]
                 if not period & TriggerPeriod.future or TriggerPeriod.isRunNumber(period): 
                     #Don't pickle TM information since it can change, very cheap to retrieve anyway
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerDataAccess.py b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerDataAccess.py
index f8857c04a7b9e6f47b5e6de434a97ee5974f8f29..46d88ced6c74ff7743371f7581b91561d307e2ca 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerDataAccess.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerDataAccess.py
@@ -289,12 +289,20 @@ def getHLTmap_fromDB(period, customGRL):
 
     return hltMap, lbCount
 
-def getHLTmap_fromTM(period):
+def getHLTmap_fromTM(period, release):
     ''' Return a map of HLT chain: (L1 seed, active LBs, is-rerun) for a given period
         Only "Future" periods make sense here
         The format is the same as for TriggerDBAccess for compatibility but rerun is always false
     '''
-    from TriggerMenu.menu import Physics_pp_v7
+
+    from os import getenv
+    asetupversion = getenv('AtlasVersion','')
+    forceRel21 = not (asetupversion.startswith("21.1") or asetupversion.startswith("22."))
+    if forceRel21 or release:
+        sys.path.insert(0, getMenuPathFromRelease(release))
+        import Physics_pp_v7
+    else:
+        from TriggerMenu.menu import Physics_pp_v7
     from TriggerJobOpts.TriggerFlags import TriggerFlags
     
     Physics_pp_v7.setupMenu()
@@ -322,7 +330,14 @@ def getHLTmap_fromTM(period):
         
     return hltMap, dummyfutureLBs
 
-def getHLTlist(period, customGRL):
+def getMenuPathFromRelease(release):
+    if release: #already format-proofed in TriggerAPI
+        return "/cvmfs/atlas.cern.ch/repo/sw/software/21.1/AthenaP1/%s/InstallArea/x86_64-slc6-gcc62-opt/python/TriggerMenu/menu"%release
+    #21.1.43 contains the final menu, no need to find the last release
+    return "/cvmfs/atlas.cern.ch/repo/sw/software/21.1/AthenaP1/21.1.43/InstallArea/x86_64-slc6-gcc62-opt/python/TriggerMenu/menu"
+
+
+def getHLTlist(period, customGRL, release):
     ''' For a given period it returns: [HLT chain, L1 seed, average livefraction, active LB, is-rerun], total LB
         The average livefraction is an approximation weighting the PS by number of lumiblocks.
         *** Don't use this number in analysis!!! ***
@@ -331,7 +346,7 @@ def getHLTlist(period, customGRL):
     if not period & TriggerPeriod.future or TriggerPeriod.isRunNumber(period): 
         hltmap, totalLB = getHLTmap_fromDB(period, customGRL)
     else:
-        hltmap, totalLB = getHLTmap_fromTM(period)
+        hltmap, totalLB = getHLTmap_fromTM(period, release)
     
     hltlist = cleanHLTmap(hltmap, totalLB)
     return (hltlist, totalLB)
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerInfo.py b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerInfo.py
index 01ef36d206606805426fb29aed15647995165e04..6bf5236d1da820d5333fffa84137cedad07c72cb 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerInfo.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/api/TriggerInfo.py
@@ -10,14 +10,14 @@ class TriggerInfo:
     ''' Object containing all the HLT information related to a given period.
         Stores a list of TriggerChain objects and the functions to skim them
     '''
-    def __init__(self,period=0, customGRL=None):
+    def __init__(self,period=0, customGRL=None, release=None):
         self.triggerChains = []
         self.period = period
         self.totalLB = 0
 
         if not period: return
         from TriggerDataAccess import getHLTlist
-        HLTlist, totalLB = getHLTlist(period, customGRL)
+        HLTlist, totalLB = getHLTlist(period, customGRL, release)
         self.totalLB = totalLB
         for hlt, l1, livefraction, activeLB, hasRerun in HLTlist:
             self.triggerChains.append( TriggerChain(hlt, l1, livefraction, activeLB, hasRerun))
@@ -95,8 +95,8 @@ class TriggerInfo:
 class TriggerLeg:
     types          = ('e','j','mu','tau','xe','g','ht')
     legpattern     = re.compile('([0-9]*)(%s)([0-9]+)' % '|'.join(types))
-    detailpattern  = re.compile('(?:-?\d+)|(?:[^0-9|-]+)')
-    bjetpattern    = re.compile('bmv|btight|bmedium|bloose')
+    detailpattern  = re.compile('(?:-?\d+)|(?:[^0-9 -]+)') #split into text-only vs number-only
+    bjetpattern    = re.compile('bmv|bhmv|btight|bmedium|bloose')
     bphyspattern   = re.compile('b[A-Z]')
     exoticspattern = re.compile('llp|LLP|muvtx|hiptrt|LATE|NOMATCH')
     afppattern     = re.compile('afp|AFP')
@@ -224,7 +224,7 @@ class TriggerLeg:
                     return 1
             return -9
         compl1seed  = self.compareTags(self.l1seed, other.l1seed, stringSubset=True, debug=debug)
-        compdetails = self.compareTags("".join(self.details), "".join(other.details), debug=debug )
+        compdetails = self.compareTags(" ".join(self.details), " ".join(other.details), debug=debug )
         if self.l1seed == other.l1seed:
             if self.details == other.details: return -1
             if debug: print "compareTags 1:",compdetails
diff --git a/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py b/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py
index aa721712ba5c5757f158273e8ff7639342d4dcdc..8743141cb8b9d387b2e282deeb6bf55c0d329318 100644
--- a/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py
+++ b/Trigger/TriggerCommon/TriggerMenu/python/menu/Physics_pp_v7.py
@@ -3117,11 +3117,11 @@ def setupMenu():
         ['e25_mergedtight_g35_medium_icalovloose_Heg',       'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]],
         ['e25_mergedtight_g35_medium_icalotight_Heg',       'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]],
         ['e25_mergedtight_ivarloose_g35_medium_icalovloose_Heg',       'L1_2EM20VH', [], [PhysicsStream], ['Primary:20000','RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]],
-        ['e25_mergedtight_ivarloose_g35_medium_icalotight_Heg',       'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]],
+        ['e25_mergedtight_ivarloose_g35_medium_icalotight_Heg',       'L1_2EM20VH', [], [PhysicsStream], ['Primary:20000','RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]],
  
         ['e30_mergedtight_g35_medium_icalovloose_Heg',       'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]],
         ['e30_mergedtight_g35_medium_icalotight_Heg',       'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]],
-        ['e30_mergedtight_ivarloose_g35_medium_icalotight_Heg',       'L1_2EM20VH', [], [PhysicsStream], ['RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]],
+        ['e30_mergedtight_ivarloose_g35_medium_icalotight_Heg',       'L1_2EM20VH', [], [PhysicsStream], ['Primary:20000','RATE:ElectronPhoton', 'BW:Egamma'], -1,['parallel',-1,[] ]],
 	# new chain for 2e34 backup (ATR-15225)
         ['e24_lhmedium_nod0_ivarloose_tau35_medium1_tracktwo',  'L1_EM20VHI_TAU20IM_2TAU20_J25_3J20',['L1_EM20VHI','L1_TAU20IM'], [PhysicsStream], ['Primary:20000','RATE:ElectronTau', 'BW:Tau', 'BW:Egamma'], -1,['serial',-1,["e24_lhmedium_nod0_ivarloose","tau35_medium1_tracktwo"]]],
 	                                               
diff --git a/Trigger/TriggerCommon/TriggerMenu/scripts/generateUnprescaledLists.py b/Trigger/TriggerCommon/TriggerMenu/scripts/generateUnprescaledLists.py
index c55787993d9b1cd9b60bccc4412d7f8bc3e87e76..9f474b74489a041c4ba6ad1d59717a07e8fe6f13 100755
--- a/Trigger/TriggerCommon/TriggerMenu/scripts/generateUnprescaledLists.py
+++ b/Trigger/TriggerCommon/TriggerMenu/scripts/generateUnprescaledLists.py
@@ -19,7 +19,7 @@ def main(outfolder):
             outfile.write( to_nice_list( TriggerAPI.getUnprescaled(TriggerPeriod.future2e34, triggerType), triggerType.name ) )
 
 def to_nice_list( alist, name ):
-    thestr = "list_%s = [\n"%name
+    thestr = "%s = [\n"%name
     for i in alist:
         thestr += "\t'%s',\n"%i
     thestr += "]\n\n"