diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py
index 3e90c9a187209c941ee7ff24bff0e2a23e45813a..7fb58271d707592a7a8eb2ca9167f6daf8cf65bd 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py
@@ -182,14 +182,6 @@ print L1UnpackingSeq
 
 ########################## L1 #################################################
 
-# Cati's menu code
-#print "=============== MEOW ================"
-#include("TrigUpgradeTest/TriggerMenuMT.py")
-#genMenu = GenerateMenu()
-#genMenu.generate()
-#print "=============== WOOF ================"
-
-
 # steps: sequential AND of 1=Filter 2=Processing
 # chainstep=single chain step
 # global step=joint for all chains
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/CombinedSliceFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/CombinedSliceFlags.py
index 8d9879af3a6eb0a87b8619c710bbe8287e28067c..0f0fe9cfa2bcd2870b0e0eada358b87c8aa85c0d 100755
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/CombinedSliceFlags.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/CombinedSliceFlags.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
 """ Combined slices specific flags  """
 
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/CommonSignatureFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/CommonSignatureFlags.py
index 9e3b0d84be02c57af1ad683198defffc6c3158e1..f4136ef3e4229ccaa516df0e5d96973b9b3a4e64 100755
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/CommonSignatureFlags.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/CommonSignatureFlags.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
 """ Common signature flags  """
 
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/EgammaSliceFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/EgammaSliceFlags.py
index cca7d203f9bb0201fa7886d86fce24aca0bc9508..508225e48207d0e284d70fbb42ab13b194e0d677 100755
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/EgammaSliceFlags.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/EgammaSliceFlags.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
 """ Egamma slice specific flags  """
 
@@ -107,7 +107,7 @@ from TriggerJobOpts.TriggerFlags import TriggerFlags
 TriggerFlags.add_Container(EgammaSlice)
 
 # add common slice flags
-TriggerFlags.EgammaSlice.import_JobProperties('TriggerMenu.menu.CommonSliceFlags')
+#TriggerFlags.EgammaSlice.import_JobProperties('TriggerJobOpts.CommonSingatureFlags')
 
 for flag in _flags:
     TriggerFlags.EgammaSlice.add_JobProperty(flag)
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/JetSliceFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/JetSliceFlags.py
index 59a60e1e293e54abb0c15e35c32c944863d98d85..d6d4220bd35731373e3b62973c330d9503c73560 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/JetSliceFlags.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/JetSliceFlags.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
 """ Jet slice specific flags  """
 
@@ -27,7 +27,7 @@ from TriggerJobOpts.TriggerFlags import TriggerFlags
 TriggerFlags.add_Container(JetSlice)
 
 # add add common slice flags
-TriggerFlags.JetSlice.import_JobProperties('TriggerJobOpts.CommonSignatureFlags')
+#TriggerFlags.JetSlice.import_JobProperties('TriggerJobOpts.CommonSignatureFlags')
 
 for flag in _flags:
     TriggerFlags.JetSlice.add_JobProperty(flag)
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/MuonSliceFlags.py b/Trigger/TriggerCommon/TriggerJobOpts/python/MuonSliceFlags.py
index 16f08fa34212ab2b7e1d139e0c36a00cacccd6f6..2e7362ef4ac62f20e9f7e1a21a35a5a5d78f38bb 100755
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/MuonSliceFlags.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/MuonSliceFlags.py
@@ -1,8 +1,8 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
 """ Muon slice specific flags  """
 
-from AthenaCommon.JobProperties         import JobProperty, JobPropertyContainer, jobproperties
+from AthenaCommon.JobProperties           import JobProperty, JobPropertyContainer, jobproperties
 from TriggerJobOpts.CommonSignatureHelper import CommonSignatureHelper
 
 
@@ -53,7 +53,7 @@ from TriggerJobOpts.TriggerFlags import TriggerFlags
 TriggerFlags.add_Container(MuonSlice)
 
 # add add common slice flags
-TriggerFlags.MuonSlice.import_JobProperties('TriggerMenu.menu.CommonSliceFlags')
+#TriggerFlags.MuonSlice.import_JobProperties('TriggerJobOpts.CommonSignatureFlags')
 
 for flag in _flags:
     TriggerFlags.MuonSlice.add_JobProperty(flag)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
index e659e3f28db8952155114291fa46ba4ebe1b6bf7..9f3f3365f844b0d1a8a3a54ae4f14b5ae1f91c2f 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
+++ b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
@@ -110,7 +110,7 @@ atlas_install_scripts( scripts/generateL1TopoMenuMT.py )
 
 atlas_install_xmls( data/*.dtd data/*.xml )
 
-#atlas_add_test( generateMenuMT SCRIPT scripts/testMenuMT.sh 
+#atlas_add_test( generateMenuMT SCRIPT scripts/generateMenuMT.sh 
 #                PROPERTIES TIMEOUT 500 
 #                POST_EXEC_SCRIPT "check_log.pl --config checklogTriggerTest.conf generateMenuMT.log"
 #              )
@@ -122,6 +122,16 @@ atlas_add_test( generateMenuMT_newJO SCRIPT python -m TriggerMenuMT.HLTMenuConfi
 
 
 
+#file( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unitTestRun_generateMenu )
+#atlas_add_test( generateMenu
+#                SCRIPT scripts/test_HLTmenu.sh
+#                EXTRA_PATTERNS "-s TriggerSummaryStep.*HLT_.*|TriggerMonitorFinal.*HLT_.*|TrigSignatureMoniMT.*HLT_.*"
+#                PROPERTIES TIMEOUT 500
+#                PROPERTIES WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/unitTestRun_generateMenu
+#              )
+
+
+
 #----------------------------------
 # List of menus to be created:
 atlas_build_lvl1_trigger_menu( LS2_v1 )
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py
new file mode 100644
index 0000000000000000000000000000000000000000..a5b804e581b4a485d21b34a75c4dfb4ac7b605c2
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/ElectronDef.py
@@ -0,0 +1,74 @@
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+
+from AthenaCommon.Logging import logging
+logging.getLogger().info("Importing %s",__name__)
+log = logging.getLogger("TriggerMenuMT.HLTMenuConfig.Egamma.ElectronDef")
+
+
+from TrigUpgradeTest.electronMenuDefs import fastCaloSequence, electronSequence
+from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import Chain, ChainStep
+from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT import TriggerConfigHLT
+
+class Chain_electron:
+
+    def __init__(self, chainDict):
+
+        self.chainSteps = []
+
+        self.chainPart = chainDict['chainParts']
+        self.chainName = chainDict['chainName']
+        self.chainL1Item = chainDict['L1item']        
+        self.chainPartL1Item = self.chainPart['L1item']
+        self.mult = int(self.chainPart['multiplicity'])
+        self.chainPartName = self.chainPart['chainPartName']
+        self.chainPartNameNoMult = self.chainPartName[1:] if self.mult > 1 else self.chainPartName
+        self.chainPartNameNoMult += "_"+self.chainL1Item
+
+
+    def assembleChain(self):                            
+        myStepNames = []
+        chainSteps = []
+        if 'etcut' in self.chainName:
+            myStepNames += ["Step1_etcut"]
+            myStepNames += ["Step2_etcut"]
+            
+            for step in myStepNames: 
+                chainSteps += [self.getStep(step)]
+
+
+        self.chainSteps = chainSteps
+        myChain = Chain(name = 'HLT_'+self.chainName, 
+                        Seed = self.chainL1Item, 
+                        ChainSteps = self.chainSteps)
+        return myChain
+
+
+    def getFastCaloStep(self, stepName):
+        fastCaloStep= fastCaloSequence()
+        step1=ChainStep(stepName, [fastCaloStep])
+        return step1
+
+    def getElectronStep(self, stepName):
+        electronStep= electronSequence()
+        step2=ChainStep(stepName, [electronStep])
+        return step2
+        
+    def getStep(self, name):
+        myTriggerConfigHLT = TriggerConfigHLT.currentTriggerConfig()        
+        if name in myTriggerConfigHLT.allChainSteps:
+            return myTriggerConfigHLT.allChainSteps[name]            
+        log.debug("ChainStep has not been configured so far, add to the list!")
+        if name == "Step1_etcut":
+            chainStep = self.getFastCaloStep(name)
+        elif name == "Step2_etcut":
+            chainStep = self.getElectronStep(name)
+        else:
+            raise RuntimeError("chainStepName unknown: " + name )
+                        
+        myTriggerConfigHLT.allChainSteps[name]= chainStep    
+        return chainStep
+            
+            
+
+        
+                
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/generateElectronChainDefs.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/generateElectronChainDefs.py
new file mode 100644
index 0000000000000000000000000000000000000000..84bc075d92fd3e27c397d09085fa13fddbe58a1d
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Egamma/generateElectronChainDefs.py
@@ -0,0 +1,46 @@
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+
+from TriggerMenuMT.HLTMenuConfig.Egamma.ElectronDef import Chain_electron as Chain_electron
+from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import Chain
+from TriggerMenuMT.HLTMenuConfig.Menu.MenuUtils import splitChainDict
+
+from AthenaCommon.Logging import logging
+log = logging.getLogger( 'TriggerMenuMT.HLTMenuConfig.Egamma.generateChainConfigs' )
+log.info("Importing %s",__name__)
+
+
+
+def generateChainConfigs( chainDict ):
+    import pprint
+    pprint.pprint( chainDict )
+
+    
+    listOfChainDicts = splitChainDict(chainDict)
+    listOfChainDefs = []
+
+    for subChainDict in listOfChainDicts:
+        log.debug("IN ELECTRON GENERATION CODE")
+        Electron = Chain_electron(subChainDict).assembleChain()            
+        log.debug('Electron object: type name of class: %s', Electron.__class__.__name__)
+
+        listOfChainDefs += [Electron]
+        log.debug('length of chaindefs %s', len(listOfChainDefs) )
+        
+
+    if len(listOfChainDefs)>1:
+        log.warning("Implement case for multi-electron chain!!") 
+        theChainDef = listOfChainDefs[0] #needs to be implemented properly
+    else:
+        theChainDef = listOfChainDefs[0]
+
+    log.debug("theChainDef.name: %s" , theChainDef.name)
+    log.debug("theChainDef.seed: %s" , theChainDef.seed)
+    log.debug("theChainDef.ChainSteps: %s" , theChainDef.steps)
+
+    return theChainDef
+
+
+
+    
+
+    
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/__init__.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d0cb751d0f336e3ac36673d3352ecaed8478e92f
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Electron/__init__.py
@@ -0,0 +1 @@
+#Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
index 8e31999aa6b961d5d016522b4665bfad400b808f..41581a8626d3a37e90ecb2bf252f26b483ec4693 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/GenerateMenuMT.py
@@ -1,10 +1,10 @@
 # Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
-from TriggerJobOpts.TriggerFlags                               import TriggerFlags
-from TriggerJobOpts.MuonSliceFlags           import MuonSliceFlags
-from TriggerJobOpts.EgammaSliceFlags       import EgammaSliceFlags
+from TriggerJobOpts.TriggerFlags              import TriggerFlags
+from TriggerJobOpts.MuonSliceFlags            import MuonSliceFlags
+from TriggerJobOpts.EgammaSliceFlags          import EgammaSliceFlags
 from TriggerJobOpts.JetSliceFlags             import JetSliceFlags
-from TriggerJobOpts.CombinedSliceFlags   import CombinedSliceFlags
+from TriggerJobOpts.CombinedSliceFlags        import CombinedSliceFlags
 
 # Configure the scheduler
 from AthenaCommon.AlgScheduler import AlgScheduler
@@ -14,9 +14,14 @@ AlgScheduler.ShowDataFlow( True )
 from AthenaCommon.CFElements import parOR, seqAND, stepSeq
 from AthenaCommon.AlgSequence import AlgSequence, AthSequencer
 
+from TriggerMenuMT.HLTMenuConfig.Menu.TriggerConfigHLT  import TriggerConfigHLT
 from TriggerMenuMT.HLTMenuConfig.Menu.HLTCFConfig import *
 from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import *
-from TriggerMenuMT.HLTMenuConfig.Menu.HLTSignatureConfig import *
+from TriggerMenuMT.HLTMenuConfig.Menu import DictFromChainName
+from TriggerMenuMT.HLTMenuConfig.Menu.MenuUtils import splitInterSignatureChainDict
+from TriggerMenuMT.HLTMenuConfig.Menu.Lumi import lumi
+
+from TriggerMenuMT.HLTMenuConfig.Menu.HLTCFConfig import makeHLTTree
 
 import os, traceback, operator, commands, time
 
@@ -29,11 +34,14 @@ _func_to_modify_signatures = None
 class GenerateMenuMT:   
     
     def __init__(self):
-        self.triggerMTConfig = None
+        self.triggerConfigHLT = None
         self.chains = []
         self.chainDefs = []
         self.listOfErrorChainDefs = []
         self.signaturesOverwritten = False
+        self.L1Prescales = None
+        self.HLTPrescales = None
+
         # flags
         self.doEgammaChains      = True
         self.doJetChains         = True
@@ -41,176 +49,199 @@ class GenerateMenuMT:
         self.doCombinedChains    = True
 
 
+    def setTriggerConfigHLT(self):
+        # setting the hlt menu configuration
+        (HLTPrescales) = self.setupMenu()
+        self.triggerConfigHLT = TriggerConfigHLT(TriggerFlags.outputHLTconfigFile())
+        self.triggerConfigHLT.menuName = TriggerFlags.triggerMenuSetup()
+        log.debug("Working with menu: %s", self.triggerConfigHLT.menuName)
 
-    def getChainDef(self,chainDicts):
-    # get the Chain object from each signature of the form Chain(chainname, L1seed, ChainSteps
-        if self.doMuonChains:
+        
+    def getChainConfig(self, chainDicts):
+        """
+        == Assembles the chain configuration and returns a chain object with (name, L1see and list of ChainSteps)
+        """
+        if self.doEgammaChains:
             try:
-                import TriggerMenu.muon.generateMuonChainDefs 
+                import TriggerMenuMT.HLTMenuConfig.Egamma.generateElectronChainDefs 
             except:
-                log.error('Problems when importing MuonDef.py, disabling muon chains.')
+                log.error('Problems when importing generateElectronChainDefs, disabling egamma chains.')
                 log.info(traceback.print_exc())
-                self.doMuonChains = False
+                self.doEgammaChains = False
                         
-
-        allowedSignatures = ["jet","egamma","muon", "electron", "photon","met","tau", 
-                             "minbias", "heavyion", "cosmic", "calibration", "streaming", "monitoring", "ht", 'bjet','eb']        
-    
-        listOfChainDefs = []
-        chainDicts = TriggerMenuMT.HLTMenuConfig.Menu.MenuUtils.splitInterSignatureChainDict(chainDicts)        
-        log.debug("\n chainDicts2 %s", chainDicts)
+        listOfChainConfigs = []
+        chainDicts = splitInterSignatureChainDict(chainDicts)        
+        if log.isEnabledFor(logging.DEBUG):
+            import pprint
+            pp = pprint.PrettyPrinter(indent=4, depth=8)
+            log.debug('dictionary is: %s', pp.pformat(chainDicts))
 
         for chainDict in chainDicts:
-            chainDef = None
-            print 'checking chainDict for chain %s %s %r' %(chainDict['chainName'],chainDict["signature"], self.doEnhancedBiasChains)
+            chainConfigs = None
+            log.debug('Checking chainDict for chain %s' , chainDict['chainName'])
             
-            if chainDict["signature"] == "Muon" and self.doMuonChains:
+
+            if chainDict["signature"] == "Electron" and self.doEgammaChains:
                 try:
-                    chainDef = TriggerMenuMT.HLTMenuConfig.Muon.generateMuonChainDefs.generateChainDefs(chainDict)
+                    log.debug("Try to get chain config")
+                    chainConfigs = TriggerMenuMT.HLTMenuConfig.Egamma.generateElectronChainDefs.generateChainConfigs(chainDict)
                 except:
                     log.error('Problems creating ChainDef for chain %s ' % (chainDict['chainName']))
                     log.info(traceback.print_exc())
                     continue
-            
             else:
-                log.error('Chain %s ignored - either because the trigger signature ("slice") has been turned off or because the corresponding chain dictionary cannot be read.' %(chainDict['chainName']))
+                log.error('Chain %s ignored - either trigger signature is turned off or the corresponding chain dictionary cannot be read.' %(chainDict['chainName']))
                 log.debug('Chain dictionary of failed chain is %s.', chainDict)
             
-            log.debug(' ChainDef  %s ' % chainDef)
+            log.debug('ChainConfigs  %s ' % chainConfigs)
+
+            log.debug('type of chainconfigs %s' % (type(chainConfigs))) 
+            #for chainConfig in chainConfigs:
+            listOfChainConfigs.append(chainConfigs)
 
 
-        if len(listOfChainDefs) == 0:  
+        if len(listOfChainConfigs) == 0:  
+            log.error('No Chain Configuration found ')
             return False
+        elif len(listOfChainConfigs)>1:
+            if ("mergingStrategy" in chainDicts[0].keys()):
+                log.warning("Need to define merging strategy, returning only first chain part configuration")
+                theChainConfig = listOfChainConfigs[0]
+            else:
+                log.error("No merging strategy specified for combined chain %s" % chainDicts[0]['chainName'])
         else:
-            theChainDef = listOfChainDefs[0]
+            theChainConfig = listOfChainConfigs[0]
             
-        return theChainDef
+        return theChainConfig
 
 
 
-    def writeLvl1EmuFiles(self):
-        data = {'noreco': [';', ';', ';']}  # in the lists there are the events
-        data['emclusters'] = ['eta:1,phi:1,et:180000; eta:1,phi:-1.2,et:35000;',
-                              'eta:0.5,phi:0,et:120000; eta:1,phi:-1.2,et:65000;',
-                              'eta:-0.6,phi:1.7,et:9000;']
-        data['msmu']  = [';',
-                         'eta:-1.2,phi:0.7,pt:6500; eta:-1.1,phi:0.6,pt:8500;',
-                         'eta:-1.7,phi:-0.2,pt:9500;']
-        
-        data['ctp'] = [ 'HLT_g100',  'HLT_2g50 HLT_e20', 'HLT_mu20 HLT_mu8 HLT_2mu8 HLT_mu8_e8' ]
-        
-        data['l1emroi'] = ['1,1,0,EM3,EM7,EM15,EM20,EM50,EM100; 1,-1.2,0,EM3,EM7',
-                           '-0.6,0.2,0,EM3,EM7,EM15,EM20,EM50,EM100; 1,-1.1,0,EM3,EM7,EM15,EM20,EM50',
-                           '-0.6,1.5,0,EM3,EM7,EM7']
-        
-        data['l1muroi'] = ['0,0,0,MU0;',
-                           '-1,0.5,0,MU6,MU8; -1,0.5,0,MU6,MU8,MU10',
-                           '-1.5,-0.1,0,MU6,MU8']
-        
-        data['tracks'] = ['eta:1,phi:1,pt:120000; eta:1,phi:-1.2,et:32000;',
-                          'eta:0.5,phi:0,pt:130000; eta:1,phi:-1.2,pt:60000;eta:-1.2,phi:0.7,pt:6700; eta:-1.1,phi:0.6,pt:8600;',
-                          'eta:-0.6,phi:1.7,et:9000;'] # no MU track for MS candidate 'eta:-1.7,phi:-0.2,pt:9500;'
-        
-        data['mucomb'] = [';',
-                          'eta:-1.2,phi:0.7,pt:6600; eta:-1.1,phi:0.6,pt:8600;',
-                          ';']
-        
-        data['electrons'] = ['eta:1,phi:1,pt:120000; eta:1,phi:-1.2,et:32000;',
-                             ';',
-                             ';']
-        data['photons'] = ['eta:1,phi:1,pt:130000;',
-                           ';',
-                           ';']    
-        from TrigUpgradeTest.TestUtils import writeEmulationFiles
-        writeEmulationFiles(data)
-        
+    def getChainsFromMenu(self):
+        """
+        == returns the list of chain names that are in the menu 
+        """
+        log.debug('Setting TriggerConfigHLT to get the right menu')
+        self.setTriggerConfigHLT()
 
-    def Lvl1Decoder(self):
-        #_L1UnpackingSeq = parOR("L1UnpackingSeq")
-        from L1Decoder.L1DecoderConf import CTPUnpackingEmulationTool, RoIsUnpackingEmulationTool, L1Decoder
-        l1Decoder = L1Decoder( OutputLevel=DEBUG, RoIBResult="" )
-        l1Decoder.prescaler.EventInfo=""
-        
-        ctpUnpacker = CTPUnpackingEmulationTool( OutputLevel =  DEBUG, ForceEnableAllChains=False , InputFilename="ctp.dat" )
-        #ctpUnpacker.CTPToChainMapping = [ "0:HLT_g100",  "1:HLT_e20", "2:HLT_mu20", "3:HLT_2mu8", "3:HLT_mu8", "33:HLT_2mu8", "15:HLT_mu8_e8" ]
-        l1Decoder.ctpUnpacker = ctpUnpacker
-        
-        emUnpacker = RoIsUnpackingEmulationTool("EMRoIsUnpackingTool", OutputLevel=DEBUG, InputFilename="l1emroi.dat", OutputTrigRoIs="L1EMRoIs", Decisions="L1EM" )
-        emUnpacker.ThresholdToChainMapping = ["EM7 : HLT_mu8_e8", "EM20 : HLT_e20", "EM50 : HLT_2g50",   "EM100 : HLT_g100" ]
-        
-        muUnpacker = RoIsUnpackingEmulationTool("MURoIsUnpackingTool", OutputLevel=DEBUG, InputFilename="l1muroi.dat",  OutputTrigRoIs="L1MURoIs", Decisions="L1MU" )
-        muUnpacker.ThresholdToChainMapping = ["MU6 : HLT_mu6", "MU8 : HLT_mu8", "MU8 : HLT_2mu8",  "MU8 : HLT_mu8_e8",  "MU10 : HLT_mu20",   "EM100 : HLT_g100" ]
+        log.debug('Creating one big list of of enabled signatures and chains')
+        chains = []
         
-        l1Decoder.roiUnpackers = [emUnpacker, muUnpacker]
-
-        #print l1Decoder
-        #_L1UnpackingSeq += l1Decoder
-        print l1Decoder
-
-        return l1Decoder
-
-
-    def allChains(self):
-        # muon chains
-        muStep1 = muStep1Sequence()
-        muStep2 = muStep2Sequence()
-        MuChains  = [
-            Chain(name='HLT_mu20', Seed="L1_MU10",   ChainSteps=[ChainStep("Step1_mu20", [SequenceHypoTool(muStep1,step1mu20())]),
-                                                                 ChainStep("Step2_mu20", [SequenceHypoTool(muStep2,step2mu20())]) ] ),            
-            Chain(name='HLT_mu8',  Seed="L1_MU6",    ChainSteps=[ChainStep("Step1_mu8",  [SequenceHypoTool(muStep1,step1mu8())] ),
-                                                                 ChainStep("Step2_mu8",  [SequenceHypoTool(muStep2,step2mu8())]) ] )
-            ]
-        #electron chains
-        elStep1 = elStep1Sequence()
-        elStep2 = elStep2Sequence()
-        ElChains  = [
-            Chain(name='HLT_e20' , Seed="L1_EM10", ChainSteps=[ ChainStep("Step1_e20",  [SequenceHypoTool(elStep1,step1e20())]),
-                                                                ChainStep("Step2_e20",  [SequenceHypoTool(elStep2,step2e20())]) ] )
-            ]
-        # combined chain
-        muelStep1 = combStep1Sequence()
-        muelStep2 = combStep2Sequence()
-        CombChains =[
-            Chain(name='HLT_mu8_e8' , Seed="L1_EM6_MU6", ChainSteps=[ ChainStep("Step1_mu8_e8",  [SequenceHypoTool(muelStep1, step1mu8_e8())]),
-                                                                      ChainStep("Step2_mu8_e8",  [SequenceHypoTool(muelStep2, step2mu8_e8())]) ] )
-            ]
-
-        _allChains = MuChains + ElChains + CombChains
-        return _allChains
+        if (TriggerFlags.CombinedSlice.signatures() or TriggerFlags.EgammaSlice.signatures()) and self.doEgammaChains:
+            chains += TriggerFlags.EgammaSlice.signatures() 
+        else:
+            self.doEgammaChains   = False
+
+        if len(chains) == 0:
+            log.warning("There seem to be no chains in the menu - please check")
+        else:
+            log.debug("The following chains were found in the menu %s", chains)
+            
+        return chains 
+                                
+
+
+    def generateL1Topo(self):
+        """
+        == Generates the L1Topo menu
+        """
+        if not TriggerFlags.readL1TopoConfigFromXML() and not TriggerFlags.readMenuFromTriggerDb():
+            log.info('Generating L1 topo configuration for %s' % TriggerFlags.triggerMenuSetup())
+            from TriggerMenuMT.LVL1MenuConfig.TriggerConfigL1Topo import TriggerConfigL1Topo
+            self.trigConfL1Topo = TriggerConfigL1Topo( outputFile = TriggerFlags.outputL1TopoConfigFile() )
+            # build the menu structure
+            self.trigConfL1Topo.generateMenu()        
+            log.info('Topo Menu has %i trigger lines' % len(self.trigConfL1Topo.menu) )
+            # write xml file
+            self.trigConfL1Topo.writeXML()
+        elif TriggerFlags.readLVL1configFromXML():
+            log.info("ReadingL1TopocofnigFromXML currently not implemented")
+        else:
+            log.info("Doing nothing with L1Topo menu configuration...")
+
+    def generateLVL1(self):
+        """
+        == Generates the LVL1 menu
+        """
+        if not TriggerFlags.readLVL1configFromXML() and not TriggerFlags.readMenuFromTriggerDb():
+            log.info('Generating L1 configuration for %s' % TriggerFlags.triggerMenuSetup() )
+            from TriggerMenuMT.LVL1MenuConfig.TriggerConfigLVL1 import TriggerConfigLVL1
+            self.trigConfL1 = TriggerConfigLVL1( outputFile = TriggerFlags.outputLVL1configFile())
+            # build the menu structure
+            self.trigConfL1.generateMenu()        
+            log.info('Menu has %i items' % len(self.trigConfL1.menu.items) )
+            # write xml file
+            self.trigConfL1.writeXML()
+        elif TriggerFlags.readLVL1configFromXML():
+            log.info("ReadingLVL1cofnigFromXML currently not implemented")
+        else:
+            log.info("Doing nothing with L1 menu configuration...")
+                       
+
+
+    def setupMenu(self):
+        # go over the slices and put together big list of signatures requested
+        #(L1Prescales, HLTPrescales, streamConfig) = lumi(self.triggerPythonConfig)
+        (self.L1Prescales, self.HLTPrescales) = lumi(self.triggerConfigHLT)
+        return (self.HLTPrescales)
+
+
 
+    def generateChainConfigs(self):
+
+        # get all chain names from menu 
+        log.debug ("getting chains from Menu")
+        chainsInMenu = self.getChainsFromMenu()
+
+        # decoding of the chain name
+        decodeChainName = DictFromChainName.DictFromChainName()
+        
+        chainCounter = 0
+        for chain in chainsInMenu:
+            log.debug("Currently processing chain: %s ", chain) 
+            chainDict = decodeChainName.getChainDict(chain)
+            chainCounter += 1
+            chainDict['chainCounter'] = chainCounter
+
+            log.debug("Next: getting chain configuration for chain %s ", chain) 
+            chainConfig= self.getChainConfig(chainDict)
+
+            log.debug("Finished with retrieving chain configuration for chain %s", chain) 
+            self.triggerConfigHLT.allChainConfigs.append(chainConfig)
+            
+        return self.triggerConfigHLT.allChainConfigs
 
 
     #----------------------#
     # Menu generation #
     #----------------------#
     def generateMT(self):
+        """
+        == Generates L1, L1Topo and HLT menu
+        """
         log.info('GenerateMenuMT.py:generateMT ')
-
-        topSequence = AlgSequence()
-        TopHLTRootSeq = seqAND("TopHLTRootSeq") 
-        topSequence += TopHLTRootSeq
         
-        #----------------------#
-        # L1 menu generation #
-        #----------------------#
-        self.writeLvl1EmuFiles()
-        Lvl1UnpackingSeq = parOR("L1UnpackingSeq")
-        Lvl1UnpackingSeq += Lvl1Decoder()
-        log.info('Lvl1UnpackingSeq: %s', Lvl1UnpackingSeq  )
-        TopHLTRootSeq += L1UnpackingSeq
-
-        #----------------------#
-        # HLT menu generation #
-        #----------------------#
-        nsetps = 2 
-
-        HLTAllStepsSeq = seqAND("HLTAllStepsSeq")
-        TopHLTRootSeq += HLTAllStepsSeq
-        
-        group_of_chains = allChains()
-        print 'all Chains ', allChains()
-        decisionTree_From_Chains(HLTAllStepsSeq, group_of_chains, NSTEPS=nsteps)
-
- 
+        # --------------------------------------------------------------------
+        # L1 menu generation 
+        # - from the code, from DB and from xmls (if we want to maintain this)
+        # currently implementing the generation from configuration code
+        # --------------------------------------------------------------------
+        #generateL1Topo()
+        #generateLVL1()
 
- 
+        
+        # --------------------------------------------------------------------
+        # HLT menu generation 
+        # --------------------------------------------------------------------
+        finalListOfChainConfigs = self.generateChainConfigs()
+        log.debug("Length of FinalListofChainConfigs %s", len(finalListOfChainConfigs))
+
+        log.debug("finalListOfChainConfig %s", finalListOfChainConfigs)
+        for cc in finalListOfChainConfigs:
+            log.debug('ChainName %s', cc.name)
+            log.debug('  L1Seed %s', cc.seed)
+            log.debug('  ChainSteps %s', cc.steps)
+            for step in cc.steps:
+                print step
+
+        makeHLTTree(finalListOfChainConfigs)
+            
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py
index dbea176363edb0347cc8d4d2185f4a3a79a8cff6..ae2dc35fc7e66a893ea9955419130e6c4a77ae34 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py
@@ -134,7 +134,6 @@ def addChainToHypoAlg(hypoAlg, chain):
 
 def makeHLTTree(HLTChains):
     """ creates the full HLT tree"""
-   
     #    TopHLTRootSeq = seqAND("TopHLTRoot") # Root
     # main HLT top sequence
     hltTop = seqOR("hltTop")
@@ -194,28 +193,32 @@ def decisionTree_From_Chains(HLTNode, chains):
     from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import CFSequence, RoRSequenceFilterNode, ComboMaker
     HLTNodeName= HLTNode.name()
 
+    # find nsteps
     chainWithMaxSteps = max(chains, key=lambda chain: len(chain.steps))
     NSTEPS = len(chainWithMaxSteps.steps)
 
     #loop over chains to configure hypotools
     # must be done after all chains are created, to avoid conflicts 
+    log.debug("Loop over chains to decode hypo tools")
     for chain in chains:
         chain.decodeHypoToolConfs()
 
     finalDecisions = [] # needed for monitor
     allSeq_list = []
+
     for nstep in range(0, NSTEPS):
         finalDecisions.append([]) # list of final deciisons per step
         stepCF_name =  "Step%i"%(nstep+1)
         CFseq_list = []
         step_decisions = []
+
         for chain in chains:
             # skip this step if missing
             if len(chain.steps) <= nstep:               
                 continue
 
             chain_step=chain.steps[nstep]
-            log.debug("\n************* Start step %d %s for chain %s", nstep+1, stepCF_name, chain.name)            
+            log.debug("\n************* Start step %d %s for chain %s", nstep+1, stepCF_name, chain.name)      
             
             # one filter per ChainStep - same name indeed
             # one filter input per previous menusequence output (the L1Seed for first step)
@@ -235,14 +238,10 @@ def decisionTree_From_Chains(HLTNode, chains):
                 previous_seeds=[]
                 for seq in prev:
                     filter_input.extend(seq.outputs)
-                    previous_seeds.append( seq.seed )
-
+                    previous_seeds.append(seq.seed)
                 log.debug("Connect to previous sequence through these filter inputs: %s" %str( filter_input) )
                 if len(filter_input) != len(previous_seeds):
                     log.error("found %d filter inputs and %d seeds", len(filter_input), len(previous_seeds))
-                    sys.exit("ERROR, in size")
-                    
-
             # get the filter:
             filter_name = "Filter_%s" % chain_step.name
 
@@ -253,17 +252,20 @@ def decisionTree_From_Chains(HLTNode, chains):
                 CFseq_list.append(CF_seq)
                 for sequence in chain_step.sequences:                
                     step_decisions.extend(sequence.outputs)
+            else:
+                log.debug("foundFilter %s", filter_name)
 
             sfilter.setChains(chain.name)
             log.debug("Adding chain %s to %s", chain.name,sfilter.Alg.name())
             log.debug(sfilter.getChains())
-            
+
             if len(chain.steps) == nstep+1:  
                 log.debug("Adding finalDecisions for chain %s at step %d:"%(chain.name, nstep+1))
                 for seq in chain_step.sequences:
                     finalDecisions[nstep].extend(seq.outputs)
                     log.debug(seq.outputs)
-            
+            else:
+                log.debug("len(chain.steps) != nstep+1")
             #end of loop over menu sequences
                 
         #end of loop over chains for this step, now implement CF:
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTSignatureConfig.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTSignatureConfig.py
deleted file mode 100644
index 35a9f9c872f9017bfa92361df69dde01e663f686..0000000000000000000000000000000000000000
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTSignatureConfig.py
+++ /dev/null
@@ -1,158 +0,0 @@
-from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestRecoAlg
-from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestHypoAlg
-from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestHypoTool
-from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestComboHypoAlg
-
-def TestHypoTool(name, prop, threshold_value):
-#    threshold_value=''.join(filter(lambda x: x.isdigit(), name))
-    value  =  int(threshold_value)*1000
-    h = HLTTest__TestHypoTool(name, OutputLevel=DEBUG, Threshold=value, Property=prop)
-    return h
-
-from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestInputMaker
-def InputMakerAlg(name):
-    return HLTTest__TestInputMaker(name, OutputLevel = DEBUG, LinkName="initialRoI")
-
-  
-
-# here define the sequences from the signatures
-# signatures do this:
-# - declare all the RecoAlg and the HypoAlg -> create the Sequence
-# - creates the InputMaker, without the inputs
-  
-
-#muon signatures
-
-def muMSRecAlg(name, FileName="noreco.dat"):
-    return HLTTest__TestRecoAlg(name=name, FileName=FileName, OutputLevel = DEBUG)
-
-def MuHypo(name):
-    return HLTTest__TestHypoAlg(name=name, OutputLevel = DEBUG)
-
-def step1mu20():
-    return TestHypoTool("step1mu20", "pt",20)
-
-def step1mu8():
-    return TestHypoTool("step1mu8", "pt",8)
-
-def step2mu20():
-    return TestHypoTool("step2mu20", "pt", 20)
-
-def step2mu8():
-    return TestHypoTool("step2mu8", "pt", 8)
-
-
-muIM= InputMakerAlg(name="Step1MuInputMaker")
-step1_mu_inputMaker = AlgNode(Alg=muIM, inputProp='Inputs', outputProp='Output')
-
-muAlg = muMSRecAlg(name="muMSRecAlg", FileName="msmu.dat")
-step1_mu_recoAlg = AlgNode( Alg=muAlg,inputProp='Input', outputProp='Output')
-
-muHypo = MuHypo(name="Step1MuHypo")
-
-step1_mu_HypoAlg = HypoAlgNode( Alg=muHypo,inputProp='Input', outputProp='Output')
-nodeSequence_mu = NodeSequence("muNodeSeq1",  Algs=[step1_mu_inputMaker, step1_mu_recoAlg], Hypo=step1_mu_HypoAlg, Seed="L1MU")
-
-def muStep1Sequence():
-    return MenuSequence("muStep1Seq", nodeSeqList=[nodeSequence_mu])
-
-# mu step2
-muIM2= InputMakerAlg(name="Step2MuInputMaker")
-step2_mu_inputMaker = AlgNode(Alg=muIM2, inputProp='Inputs', outputProp='Output')
-
-muAlg2 = muMSRecAlg(name="muMSRecAlg2", FileName="msmu.dat")
-step2_mu_recoAlg = AlgNode( Alg=muAlg2,inputProp='Input', outputProp='Output')
-
-muHypo2 = MuHypo(name="Step2MuHypo2")
-step2_mu_HypoAlg = HypoAlgNode( Alg=muHypo2,inputProp='Input', outputProp='Output')
-nodeSequence2_mu = NodeSequence("muNodeSeq2",  Algs=[step2_mu_inputMaker, step2_mu_recoAlg], Hypo=step2_mu_HypoAlg, Seed="")
-
-def muStep2Sequence():
-    return MenuSequence("muStep2Seq", nodeSeqList=[nodeSequence2_mu])
-
-
-
-#electron signatures
-
-def CaloClustering(name,  FileName="noreco.dat"):
-    return HLTTest__TestRecoAlg(name=name, FileName=FileName, OutputLevel = DEBUG)
-
-def ElGamHypo(name):
-    return HLTTest__TestHypoAlg(name=name, OutputLevel = DEBUG)
-
-
-def step1e20():
-    return TestHypoTool("step1e20", "et",20)
-
-def step1e8():
-    return TestHypoTool("step1e8", "et",8)
-
-def step2e20():
-    return TestHypoTool("step2e20", "et",20)
-
-def step2e8():
-    return TestHypoTool("step2e8", "et",8)
-
-elIM= InputMakerAlg(name="Step1ElInputMaker")
-step1_el_inputMaker = AlgNode(Alg=elIM, inputProp='Inputs', outputProp='Output')
-
-elAlg = CaloClustering(name="CaloClustering", FileName="emclusters.dat")
-step1_el_recoAlg = AlgNode( Alg=elAlg,inputProp='Input', outputProp='Output')
-
-elHypo = ElGamHypo(name="Step1ElHypo")
-step1_el_HypoAlg = HypoAlgNode( Alg=elHypo,inputProp='Input', outputProp='Output')
-
-nodeSequence_el = NodeSequence("elNodeSeq1",  Algs=[step1_el_inputMaker, step1_el_recoAlg], Hypo=step1_el_HypoAlg, Seed="L1EM")
-def elStep1Sequence():
-    return MenuSequence("elStep1Seq", nodeSeqList=[nodeSequence_el])
-
-#step2
-elIM2= InputMakerAlg(name="Step2ElInputMaker")
-step2_el_inputMaker = AlgNode(Alg=elIM2, inputProp='Inputs', outputProp='Output')
-
-elAlg2 = CaloClustering(name="CaloClustering2", FileName="emclusters.dat")
-step2_el_recoAlg = AlgNode( Alg=elAlg2,inputProp='Input', outputProp='Output')
-
-elHypo2 = ElGamHypo(name="Step2ElHypo")
-step2_el_HypoAlg = HypoAlgNode( Alg=elHypo2,inputProp='Input', outputProp='Output')
-
-nodeSequence2_el = NodeSequence("elNodeSeq2",  Algs=[step2_el_inputMaker, step2_el_recoAlg], Hypo=step2_el_HypoAlg, Seed="")
-def elStep2Sequence():
-    return MenuSequence("elStep2Seq", nodeSeqList=[nodeSequence2_el])
-
-
-# combined Hypo #
-#################
-
-def ComboMuEHypo(name):
-    return HLTTest__TestComboHypoAlg(name=name, OutputLevel = DEBUG, Property1="pt", Property2="et")
-
-def step1mu8_e8():
-    return TestHypoTool("step1mu8_e8", "pt",8)
-
-def step2mu8_e8():
-    return TestHypoTool("step2mu8_e8", "pt",8)
-
-comboAlg = ComboMuEHypo("Step1ComboMuElHypo")
-step1_comb_HypoAlgMu =  HypoAlgNode( Alg=comboAlg,inputProp='Input1', outputProp='Output1')
-step1_comb_HypoAlgEl =  HypoAlgNode( Alg=comboAlg,inputProp='Input2', outputProp='Output2')
-
-nodeSequence_muComb = NodeSequence("CombmuNodeSeq1",  Algs=[step1_mu_inputMaker, step1_mu_recoAlg], Hypo=step1_comb_HypoAlgMu, Seed="L1MU")
-nodeSequence_elComb = NodeSequence("CombelNodeSeq1",  Algs=[step1_el_inputMaker, step1_el_recoAlg], Hypo=step1_comb_HypoAlgEl, Seed="L1EM")
-
-
-def combStep1Sequence():
-    return MenuSequence("combStep1Seq", nodeSeqList=[nodeSequence_muComb,nodeSequence_elComb])
-
-# step2
-
-comboAlg2 = ComboMuEHypo("Step2ComboMuElHypo")
-step2_comb_HypoAlgMu =  HypoAlgNode( Alg=comboAlg2,inputProp='Input1', outputProp='Output1')
-step2_comb_HypoAlgEl =  HypoAlgNode( Alg=comboAlg2,inputProp='Input2', outputProp='Output2')
-
-nodeSequence2_muComb = NodeSequence("CombmuNodeSeq2",  Algs=[step2_mu_inputMaker, step2_mu_recoAlg], Hypo=step2_comb_HypoAlgMu, Seed="")
-nodeSequence2_elComb = NodeSequence("CombelNodeSeq2",  Algs=[step2_el_inputMaker, step2_el_recoAlg], Hypo=step2_comb_HypoAlgEl, Seed="")
-
-
-def combStep2Sequence():
-    return MenuSequence("combStep2Seq", nodeSeqList=[nodeSequence2_muComb,nodeSequence2_elComb])
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
index 46348f929e201bc7d1fded34a736955508659582..d66aaff44fcb48e652fcf88adb65c53320dec5d9 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/LS2_v1.py
@@ -32,15 +32,19 @@ def setupMenu():
     TriggerFlags.TestSlice.signatures = []
 
     TriggerFlags.MuonSlice.signatures = [
-        ['mu20',      'L1_MU10',   [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1],
-        ['mu8',	      'L1_MU6',	   [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1],
+        #['mu20',      'L1_MU10',   [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1],
+        #['mu8',	      'L1_MU6',	   [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1],
 
      ]
     TriggerFlags.EgammaSlice.signatures = [
-        ['e20',	      'L1_EM10',   [], [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1],        
+        ['e3_etcut1step', 'L1_EM3', [],  [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1],
+        ['e3_etcut', 'L1_EM3',      [],  [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1],
+        ['e5_etcut', 'L1_EM3',      [],  [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1],
+        ['e7_etcut', 'L1_EM3',      [],  [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1],
+        #['e20',	      'L1_EM10',   [], [PhysicsStream], ['RATE:SingleElectron', 'BW:Electron'], -1],        
         ]
     TriggerFlags.CombinedSlice.signatures = [
-        ['e8_mu8',    'L1_EM6_MU6',	   [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1],
+        #['e8_mu8',    'L1_EM6_MU6',	   [], [PhysicsStream], ['RATE:SingleMuon', 'BW:Muon'], -1],
         ]
     TriggerFlags.JetSlice.signatures = [ ]
     TriggerFlags.BjetSlice.signatures = [] 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Lumi.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Lumi.py
index 6359a5f403e0f6d1863ed8a5164bec09e73b0317..b9619579f19c96b0228e9fb93c69f89b2483dfed 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Lumi.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/Lumi.py
@@ -1,171 +1,27 @@
 # Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
 
 from TriggerJobOpts.TriggerFlags import TriggerFlags
-from TriggerMenu.menu.MenuUtil import applyHLTPrescale, resetAllPrescales
+#from TriggerMenu.menu.MenuUtil import applyHLTPrescale, resetAllPrescales
 
 from AthenaCommon.Logging import logging
 log = logging.getLogger( 'TriggerMenu.menu.Lumi' )
 
-def lumi(triggerPythonConfig):
+def lumi(triggerConfigHLT):
 
     L1Prescales = {}
     HLTPrescales = {}
     
     menu_name = TriggerFlags.triggerMenuSetup()
     ## Do some aliasing here
-    if menu_name == 'Physics_default': menu_name = 'Physics_pp_v6'
-    elif menu_name == 'MC_loose_default': menu_name = 'MC_pp_v6_loose_mc_prescale'
-    elif menu_name == 'MC_tight_default': menu_name = 'MC_pp_v6_tight_mc_prescale'
-    elif menu_name == 'default_loose': menu_name = 'MC_pp_v6_loose_mc_prescale'
-    elif menu_name == 'default_tight': menu_name = 'MC_pp_v6_tight_mc_prescale'
+    if menu_name == 'Physics_default': menu_name = 'LS2_v1'
+    elif menu_name == 'MC_loose_default': menu_name = 'LS2_v1'
+    elif menu_name == 'MC_tight_default': menu_name = 'LS2_v1'
 
     log.info( 'Menu name: '+ menu_name)
 
-
-    if menu_name.startswith('Physics_pp_v7') :
-        log.info('In physics pp v7 menu setup')
-        from TriggerMenu.menu.Physics_pp_v7 import setupMenu, Prescales
-        setupMenu()
-        if 'cosmics_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_cosmics
-            HLTPrescales = Prescales.HLTPrescales_cosmics
-        elif 'tight' in menu_name:
-            L1Prescales = Prescales.L1Prescales_tight_physics_prescale
-            HLTPrescales = Prescales.HLTPrescales_tight_physics_prescale
-        else:
-            L1Prescales = Prescales.L1Prescales
-            HLTPrescales = Prescales.HLTPrescales
-
-
-    elif  menu_name.startswith('MC_pp_v7'):
-        from TriggerMenu.menu.MC_pp_v7 import setupMenu, Prescales
-        setupMenu()
-        if 'tight_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_tight_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_tight_mc_prescale
-        elif 'tightperf_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_tightperf_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_tightperf_mc_prescale
-            log.info(" HLTPrescales %s" % HLTPrescales)
-        elif 'loose_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_loose_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_loose_mc_prescale
-            log.info(" HLTPrescales %s" % HLTPrescales)
-        elif 'special_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_special_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_special_mc_prescale
-            log.info(" HLTPrescales %s" % HLTPrescales)
-        elif 'no_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_no_prescale
-            HLTPrescales = Prescales.HLTPrescales_no_prescale
-            log.info(" HLTPrescales %s" % HLTPrescales)
-        elif 'upgrade_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_upgrade_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_upgrade_mc_prescale            
-            log.info(" HLTPrescales %s" %  HLTPrescales)
-        else:
-            L1Prescales = Prescales.L1Prescales
-            HLTPrescales = Prescales.HLTPrescales
-    elif menu_name.startswith('Physics_pp_v6') :
-        log.info('In physics pp v6 menu setup')
-        from TriggerMenu.menu.Physics_pp_v6 import setupMenu, Prescales
-        setupMenu()
-        if 'cosmics_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_cosmics
-            HLTPrescales = Prescales.HLTPrescales_cosmics
-        elif 'tight' in menu_name:
-            L1Prescales = Prescales.L1Prescales_tight_physics_prescale
-            HLTPrescales = Prescales.HLTPrescales_tight_physics_prescale
-        else:
-            L1Prescales = Prescales.L1Prescales
-            HLTPrescales = Prescales.HLTPrescales
-
-
-    elif  menu_name.startswith('MC_pp_v6'):
-        from TriggerMenu.menu.MC_pp_v6 import setupMenu, Prescales
-        setupMenu()
-        if 'tight_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_tight_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_tight_mc_prescale
-        elif 'tightperf_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_tightperf_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_tightperf_mc_prescale
-            log.info(" HLTPrescales %s" % HLTPrescales)
-        elif 'loose_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_loose_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_loose_mc_prescale
-            log.info(" HLTPrescales %s" % HLTPrescales)
-        elif 'special_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_special_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_special_mc_prescale
-            log.info(" HLTPrescales %s" % HLTPrescales)
-        elif 'no_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_no_prescale
-            HLTPrescales = Prescales.HLTPrescales_no_prescale
-            log.info(" HLTPrescales %s" % HLTPrescales)
-        elif 'upgrade_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_upgrade_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_upgrade_mc_prescale            
-            log.info(" HLTPrescales %s" %  HLTPrescales)
-        else:
-            L1Prescales = Prescales.L1Prescales
-            HLTPrescales = Prescales.HLTPrescales
-
-    elif menu_name.startswith('Physics_HI_v3') :
-        log.info('Physics_HI_v3 menu setup')
-        from TriggerMenu.menu.Physics_HI_v3 import setupMenu, Prescales
-        setupMenu()
-        if 'cosmics_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_cosmics
-            HLTPrescales = Prescales.HLTPrescales_cosmics
-        else:
-            L1Prescales = Prescales.L1Prescales
-            HLTPrescales = Prescales.HLTPrescales
-            
-
-    elif menu_name.startswith('MC_HI_v3') :
-        log.info('MC_HI_v3 menu setup')
-        from TriggerMenu.menu.MC_HI_v3 import setupMenu, Prescales
-        setupMenu()
-        if 'cosmics_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_cosmics
-            HLTPrescales = Prescales.HLTPrescales_cosmics
-        elif 'tight_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_tight_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_tight_mc_prescale
-        else:
-            L1Prescales = Prescales.L1Prescales
-            HLTPrescales = Prescales.HLTPrescales
-    
-    elif menu_name.startswith('Physics_HI_v4') :
-        log.info('Physics_HI_v4 menu setup')
-        from TriggerMenu.menu.Physics_HI_v4 import setupMenu, Prescales
-        setupMenu()
-        if 'cosmics_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_cosmics
-            HLTPrescales = Prescales.HLTPrescales_cosmics
-        else:
-            L1Prescales = Prescales.L1Prescales
-            HLTPrescales = Prescales.HLTPrescales
-            
-
-    elif menu_name.startswith('MC_HI_v4') :
-        log.info('MC_HI_v4 menu setup')
-        from TriggerMenu.menu.MC_HI_v4 import setupMenu, Prescales
-        setupMenu()
-        if 'cosmics_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_cosmics
-            HLTPrescales = Prescales.HLTPrescales_cosmics
-        elif 'tight_mc_prescale' in menu_name:
-            L1Prescales = Prescales.L1Prescales_tight_mc_prescale
-            HLTPrescales = Prescales.HLTPrescales_tight_mc_prescale
-        else:
-            L1Prescales = Prescales.L1Prescales
-            HLTPrescales = Prescales.HLTPrescales        
-
-    elif menu_name.startswith('LS2_v1') :
+    if menu_name.startswith('LS2_v1') :
         log.info('LS2_v1 menu setup')
-        from TriggerMenu.menu.MC_HI_v4 import setupMenu, Prescales
+        from TriggerMenuMT.HLTMenuConfig.Menu.LS2_v1 import setupMenu, Prescales
         setupMenu()
         if 'cosmics_prescale' in menu_name:
             L1Prescales = Prescales.L1Prescales_cosmics
@@ -186,38 +42,34 @@ def lumi(triggerPythonConfig):
 
 
 
-def applyPrescales(triggerPythonConfig, HLTPrescales):
-    no_prescale = False
-    if 'no_prescale' in TriggerFlags.triggerMenuSetup() or \
-       TriggerFlags.triggerMenuSetup() == 'default': no_prescale = True
+# def applyPrescales(triggerPythonConfig, HLTPrescales):
+#     no_prescale = False
+#     if 'no_prescale' in TriggerFlags.triggerMenuSetup() or \
+#        TriggerFlags.triggerMenuSetup() == 'default': no_prescale = True
         
-    #if L1Prescales==None and TriggerFlags.L1PrescaleSet()!='':
-    #    log.warning('Cannot find L1 prescale set %s, not explicitly setting them' % \
-    #                TriggerFlags.L1PrescaleSet())
-    #    L1Prescales = {}
-    if HLTPrescales==None and TriggerFlags.HLTPrescaleSet()!='':
-        log.warning('Cannot find HLT prescale set %s, not explicitly setting them' % \
-                    TriggerFlags.HLTPrescaleSet())
-        HLTPrescales = {}
+#     if HLTPrescales==None and TriggerFlags.HLTPrescaleSet()!='':
+#         log.warning('Cannot find HLT prescale set %s, not explicitly setting them' % \
+#                     TriggerFlags.HLTPrescaleSet())
+#         HLTPrescales = {}
         
-    if TriggerFlags.doHLT():
-        applyHLTPrescale(triggerPythonConfig, HLTPrescales)
-
-    if TriggerFlags.L1PrescaleSet() == 'None':
-        for item in triggerPythonConfig.allItems.values():
-            item.prescale = '1' 
-    if TriggerFlags.HLTPrescaleSet() == 'None':
-        for  sig in triggerPythonConfig.allChains.values():
-            for chain in sig:
-                chain.prescale = '1'
-                chain.pass_through = '0'
-                tmp_stag = chain.stream_tag
-                chain.stream_tag = []
-                for s in tmp_stag:
-                    chain.addStreamTag(s[0], s[1], s[2], 1)
-
-    if no_prescale:
-        resetAllPrescales(triggerPythonConfig)
+#     if TriggerFlags.doHLT():
+#         applyHLTPrescale(triggerPythonConfig, HLTPrescales)
+
+#     if TriggerFlags.L1PrescaleSet() == 'None':
+#         for item in triggerPythonConfig.allItems.values():
+#             item.prescale = '1' 
+#     if TriggerFlags.HLTPrescaleSet() == 'None':
+#         for  sig in triggerPythonConfig.allChains.values():
+#             for chain in sig:
+#                 chain.prescale = '1'
+#                 chain.pass_through = '0'
+#                 tmp_stag = chain.stream_tag
+#                 chain.stream_tag = []
+#                 for s in tmp_stag:
+#                     chain.addStreamTag(s[0], s[1], s[2], 1)
+
+#     if no_prescale:
+#         resetAllPrescales(triggerPythonConfig)
 
 
                 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
index e718d619b999d959936b6e0a6ce72808dd218a32..01f5da3ac5d8ba11511ae1573fdf01a8904be8c1 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
@@ -323,13 +323,15 @@ class MenuSequence():
         input_maker_output="%s_from_%s"%(self.maker.Alg.name(),line)
         self.maker.addOutput(input_maker_output) 
         self.hypo.setPreviousDecision(input_maker_output)
-        log.debug("MenuSequence.connectToFilter: connecting InputMaker and HypoAlg, adding: InputMaker::%s.output=%s, \
-        HypoAlg::%s.previousDecision=%s, HypoAlg::%s.output=%s",\
-        self.maker.Alg.name(), input_maker_output, self.hypo.Alg.name(), input_maker_output, self.hypo.Alg.name(),  )
-
+        log.debug("MenuSequence.connectToFilter: connecting InputMaker and HypoAlg, adding: \
+        InputMaker::%s.output=%s, \
+        HypoAlg::%s.previousDecision=%s, \
+        HypoAlg::%s.output=%s",\
+                  self.maker.Alg.name(), input_maker_output, self.hypo.Alg.name(), input_maker_output, self.hypo.Alg.name(), new_output )
         
     def __str__(self):
-        return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence, new_output)
+        #return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence, new_output)
+        return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence)
 
     
 class Chain:
@@ -460,9 +462,6 @@ class CFSequence():
             self.filter, self.step )
           
 
-
-
-
 class ChainStep:
     """Class to describe one step of a chain; if more than one menuSequence, then the step is combo"""
     def __init__(self, name,  Sequences=[]):
@@ -475,8 +474,6 @@ class ChainStep:
         else:
             self.sequences = Sequences
         
-
-
     def replaceSequence(self, old, new):
         # maybe obsolete?
         idx=self.sequences.index(old) # this raise exception
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtil.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtil.py
index 68c966865d93f2aa6b5920593e37c910437889de..f63afb226bc379ae32182455bffbcfb62515ee33 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtil.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtil.py
@@ -55,6 +55,8 @@ def applyHLTPrescale(triggerPythonConfig, HLTPrescale):
        
         log.info('Applied HLTPS to the item '+item+': PS'+ hltchain.prescale+" PT"+hltchain.pass_through+" RerunPS"+hltchain.rerun_prescale)
 
+
+
 def checkGroups(triggerPythonConfig):
     """ Make sure the groups used in Physics and MC menu exists
     """
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtils.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtils.py
index 41c6d631ae91c07f55444b07c36a980000ad58ea..12112c2bd9d139f4b75f06ce5122fa01e629f1e1 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtils.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuUtils.py
@@ -96,305 +96,6 @@ def splitChainDict(chainDict):
     return listOfChainDicts
 
 
-def _addSequence(chainDef,sequenceToAdd):
-    """
-    Check if sequence is already in chainDef, if not add it
-    """
-    for chainDefSequence in chainDef.sequenceList:
-        if chainDefSequence['output'] == sequenceToAdd['output']:
-            return chainDef
-    chainDef.sequenceList += [sequenceToAdd]
-    return chainDef        
-
-
-def _getSigList(chainDef,sigType="HLT"):
-    """
-    Little helper function to get the list of signatures associated to a trigger level (L2/EF/HLT)
-    """
-    sigList = []
-    for signature in chainDef.signatureList:
-        if signature['listOfTriggerElements'][0][0:len(sigType)] == sigType:
-            sigList += [signature]
-    return sigList
-
-
-def _replicateMissingSignatures(listOfChainDefs,unevenSigs,level):
-    """
-    Loops over the listOfChainDefs, and fills up those ChainDefs that have a shorter signature list at a given level than the largest one with dummy signatures
-    """
-
-    for chainDef in listOfChainDefs:
-
-        # if this is already the chainDef with the longest signatureList nothing has to be done
-        if len(_getSigList(chainDef,level)) == max(unevenSigs):
-            continue
-        else:
-            maxSignatureCounter = -1
-            numberOfSignatures = 0      
-            maxSignatureIndex = -1
-            for signatureIndex,signature in enumerate(chainDef.signatureList):
-                if signature['listOfTriggerElements'][0][0:len(level)] == level:
-                    maxSignatureCounter = max(maxSignatureCounter,signature['signature_counter'])
-                    numberOfSignatures += 1
-                    maxSignatureIndex = signatureIndex
-                    
-            if maxSignatureIndex == -1:
-                log.error('maxSignatureIndex has not been set. Maybe there is no sequence at this level? CHECK IN CODE - fix in work. ')
-                
-            listOfLastTEs = chainDef.signatureList[maxSignatureIndex]['listOfTriggerElements']   
-
-            for i in range(maxSignatureCounter+1, maxSignatureCounter+1+max(unevenSigs)-numberOfSignatures):  
-                if level in ["EF","HLT"]:
-                    chainDef.signatureList += deepcopy([{'signature_counter': i, 'listOfTriggerElements': listOfLastTEs}])
-                elif level == "L2":
-                    chainDef.addSignatureL2(deepcopy(listOfLastTEs))
-                log.info("Added %s signature with TEs %s to ChainDef of chain %s in preparation for parallel merging." % (level,str(listOfLastTEs),chainDef.chain_name))
-                log.debug("ChainDef with replicated signatures at %s: %s", level, chainDef)
-                
-
-
-
-def mergeChainDefs(listOfChainDefs, strategy="parallel", offset=-1,
-                   preserveL2EFOrder=True, removeDuplicateTEs=False, doTopo=True,
-                   chainDicts='', noTEreplication=False, noMergeBJet=False):
-
-    log.debug("Combine using %s  merging", strategy)
-
-    if strategy=="parallel":
-        return _mergeChainDefsParallel(listOfChainDefs,offset,removeDuplicateTEs,noMergeBJet=noMergeBJet)
-    elif strategy=="serial":
-        return _mergeChainDefsSerial(chainDicts,listOfChainDefs,offset,preserveL2EFOrder=preserveL2EFOrder,doTopo=doTopo,noTEreplication=noTEreplication)
-    else:
-        log.error("Merging failed for %s. Merging strategy '%s' not known.", (listOfChainDefs, strategy))
-        return -1
-
-
-
-def _mergeChainDefsSerial(ChainDicts,listOfChainDefs,offset,preserveL2EFOrder=True,doTopo=True,noTEreplication=False):
-
-    """
-    serial merging of chain def objects for combined chains
-    """
-
-    
-    #noTEreplication=False
-    #Add few exception to the replication of the TE
-    jet_count=0
-    met_count=0
-    ht_count=0
-    other_count=0
-    try:
-        if 'upc' in ChainDicts[0]['chainName'] :
-            noTEreplication=True  
-
-        if 'hi' in ChainDicts[0]['chainName'] and 'v2' in  ChainDicts[1]['chainName'] :
-            noTEreplication=True  
-        
-        for chainDict in ChainDicts:
-            if (chainDict["signature"] == "Jet"):
-                jet_count+=1
-            elif (chainDict["signature"] == "HT"):
-                ht_count+=1
-            elif (chainDict["signature"] == "MET"):
-                for chainpart in chainDict["chainParts"]:
-                    if 'xe' in chainpart['trigType'] and 'cell' not in chainpart['EFrecoAlg']:
-                        met_count+=1
-            else:
-                other_count+=1
-
-        #print "BETTA Total count: jet-", jet_count, " HT-", ht_count, " xe-", met_count, "other:-", other_count, " in: ",ChainDicts[0]['chainName']          
-        
-    except:
-        pass
-
-
-    if jet_count > 0 and met_count > 0:
-        noTEreplication=True        
-    if jet_count > 1:
-        noTEreplication=True        
-    if met_count > 1:
-        noTEreplication=True        
-    if jet_count > 0 and ht_count > 0:
-        noTEreplication=True        
-
-
-    listOfChainDefs = deepcopy(listOfChainDefs) 
-
-    # copy the chaindef into which we want to merge the other chaindefs
-    mergedChainDef = deepcopy(listOfChainDefs[0])
-
-    #remove the first chaindef from the list
-    listOfChainDefs.pop(0)
-    
-    # Loop remaining chain defs to be merged
-    #doTopo=False
-    #preserveL2EFOrder=False
-
-    
-    for chainDef in listOfChainDefs:
-        currentLastTEs = mergedChainDef.signatureList[-1]['listOfTriggerElements']
-        
-        for sequence in chainDef.sequenceList:
-            mergedChainDef = _addSequence(mergedChainDef,sequence)
-
-        for signatureIdx,signature in enumerate(chainDef.signatureList):
-            # if a topo is appended after the chain merging, or in same special cases, the replication of the last TEs is not necessary
-            if noTEreplication:
-                log.info("Removing replication of the TE for chain: %s", chainDef.chain_name)
-                signatureToAdd = signature['listOfTriggerElements'] 
-            else:
-                signatureToAdd = signature['listOfTriggerElements'] if doTopo else signature['listOfTriggerElements'] + currentLastTEs 
-            #signatureToAdd = signature['listOfTriggerElements'] 
-            if preserveL2EFOrder:
-                if not offset == -1:
-                    log.error("L2/EF preserving serial merging with offset not yet implemented.")
-                else:
-                    if signature['listOfTriggerElements'][0].startswith("L2"):
-                        mergedChainDef.addSignatureL2(signatureToAdd)
-                    elif signature['listOfTriggerElements'][0].startswith("EF") or signature['listOfTriggerElements'][0].startswith("HLT"):
-                        mergedChainDef.appendSignature(signatureToAdd)
-
-                    else:
-                        log.error("Unknown TE naming :",str(signature['listOfTriggerElements'][0]))
-            else:
-                if offset ==-1:
-                    mergedChainDef.appendSignature(signatureToAdd)
-                else:
-                    if offset+signatureIdx > len(mergedChainDef.signatureList):
-                        mergedChainDef.signatureList[offset+signatureIdx]['listOfTriggerElements'] += signatureToAdd
-                    else:
-                        mergedChainDef.appendSignature(signatureToAdd)
-                    
-    return mergedChainDef
-        
-
-
-def _mergeChainDefsParallel(listOfChainDefs,offset=-1,removeDuplicateTEs=False, noMergeBJet=False):
-
-    """
-    merge chain def objects for combined chains
-    the order of signatures corresponds to the signature counters in the constituent chainDefs
-    """
-
-    listOfChainDefs = deepcopy(listOfChainDefs) 
-
-    for chainDef in listOfChainDefs:
-        log.debug("List of ChainDefs to be merged %s ", chainDef)
-        
-    if offset!=-1:
-        log.warning("Parallel merging with offset has been tested only for EF-only chains. If you're doing something different, check it works ok!!")
-    
-    # check length of signature list in each chain def
-    # if not even, take measures as the sig of the short chain
-    # needs to be propagated to the end
-
-    nL2sigs = []
-    nEFsigs = []
-    nHLTsigs = []
-
-    for cD in listOfChainDefs:
-        
-        nL2sigs += [len(_getSigList(cD,"L2"))]
-        nEFsigs += [len(_getSigList(cD,"EF"))]
-        nHLTsigs += [len(_getSigList(cD,"HLT"))]
-
-        ##Hardocode that the offset is only applied to the second chain in the list
-        if cD==listOfChainDefs[1] and offset!=-1:
-            nL2sigs[-1] = nL2sigs[-1]+offset if nL2sigs[-1]!=0 else nL2sigs[-1]
-            nEFsigs[-1] = nEFsigs[-1]+offset if nEFsigs[-1]!=0 else nEFsigs[-1]
-            nHLTsigs[-1]= nHLTsigs[-1]+offset if nHLTsigs[-1]!=0 else nHLTsigs[-1]
-
-    countsL2 = Counter(nL2sigs)
-    unevenL2Sigs = [val for val, count in countsL2.items() if count <= 1]
-    countsEF = Counter(nEFsigs)
-    unevenEFSigs = [val for val, count in countsEF.items() if count <= 1]
-    countsHLT = Counter(nHLTsigs)
-    unevenHLTSigs = [val for val, count in countsHLT.items() if count <= 1]
-
-    log.debug("nL2sigs %s", nL2sigs)
-    log.debug("countsL2 %s", countsL2)
-    log.debug("unevenL1Sigs %s", unevenL2Sigs)
-    log.debug("nEFsigs %s", nEFsigs)
-    log.debug("countsEF %s", countsEF)
-    log.debug("unevenEFSigs %s", unevenEFSigs)
-    log.debug("nHLTsigs %s", nHLTsigs)
-    log.debug("countsHLT %s", countsHLT)
-    log.debug("unevenHLTSigs %s", unevenHLTSigs)
-
-    nL2sigs = []
-    nEFsigs = []
-    nHLTsigs = []
-
-    if unevenL2Sigs:
-        _replicateMissingSignatures(listOfChainDefs,unevenL2Sigs,"L2")
-    if unevenEFSigs:
-        _replicateMissingSignatures(listOfChainDefs,unevenEFSigs,"EF")
-    if unevenHLTSigs:
-        _replicateMissingSignatures(listOfChainDefs,unevenHLTSigs,"HLT")
-
-    # Now check if the replication of missing signatures worked and all chains have same length signature list
-
-    for cD in listOfChainDefs:
-        nL2sigs += [len(_getSigList(cD,"L2"))]
-        nEFsigs += [len(_getSigList(cD,"EF"))]
-        nHLTsigs += [len(_getSigList(cD,"HLT"))]
-
-        if cD==listOfChainDefs[1] and offset!=-1:
-            #print "Second Chain ",cD.chain_name, _getSigList(cD,"EF")
-            nL2sigs[-1] = nL2sigs[-1]+offset if nL2sigs[-1]!=0 else nL2sigs[-1]
-            nEFsigs[-1] = nEFsigs[-1]+offset if nEFsigs[-1]!=0 else nEFsigs[-1]
-            nHLTsigs[-1]= nHLTsigs[-1]+offset if nHLTsigs[-1]!=0 else nHLTsigs[-1]
-
-    countsL2 = Counter(nL2sigs)
-    unevenL2Sigs = [val for val, count in countsL2.items() if count <= 1]
-    countsEF = Counter(nEFsigs)
-    unevenEFSigs = [val for val, count in countsEF.items() if count <= 1]
-    countsHLT = Counter(nHLTsigs)
-    unevenHLTSigs = [val for val, count in countsHLT.items() if count <= 1]
-    
-
-    if unevenL2Sigs or unevenEFSigs or unevenHLTSigs:
-        log.error("Replication of trigger elements failed. There is still an uneven number of signatures in the ChainDefs of this combined chain.")
-
-
-    # Loop over all chain defs to be merged
-
-
-    
-    mergedChainDef = listOfChainDefs[0]
-    listOfChainDefs.pop(0)
-
-    log.debug("mergedChainDef prior to merging: %s", mergedChainDef)
-
-
-    for chainDef in listOfChainDefs:
-        for sequence in chainDef.sequenceList:
-            mergedChainDef = _addSequence(mergedChainDef,sequence)
-
-        for chainDefSignature in chainDef.signatureList:
-            for mergedChainDefSignature in mergedChainDef.signatureList: 
-                if int(chainDefSignature['signature_counter']) == int(mergedChainDefSignature['signature_counter']):
-                    log.debug("mergedChainDef signatureList before a step: %s", mergedChainDef.signatureList)
-                    mergedChainDefSignature['listOfTriggerElements'] += chainDefSignature['listOfTriggerElements']
-                    log.debug("mergedChainDef signatureList after a step: %s", mergedChainDef.signatureList)
-
-
-
-    if removeDuplicateTEs:
-        for signature in mergedChainDef.signatureList:
-
-            if noMergeBJet: 
-                hasBJetTE = False
-                for TE in set(signature['listOfTriggerElements']):
-                    if not (TE.find("bjet") == -1): hasBJetTE = True
-
-                if not hasBJetTE:
-                    signature['listOfTriggerElements'] = list(set(signature['listOfTriggerElements']))
-            else:
-                signature['listOfTriggerElements'] = list(set(signature['listOfTriggerElements']))
-
-    return mergedChainDef
-        
 
 
 def setupTopoStartFrom(topoThresholds, theChainDef):
@@ -426,19 +127,3 @@ def setupTopoStartFrom(topoThresholds, theChainDef):
     return te0
 
 
-    # if ntopoTes ==1:
-    #     topoStartFrom = str(chainDict['topoThreshold'][0])
-    # elif ntoppoTes == 2:
-
-
-    #     te1= str(topoThresholds[0])
-    #     te2=str(topoThresholds[1])
-    #     from TrigGenericAlgs import MergeTopoStarts
-    #     theMergeTopoStarts = MergeTopoStarts("MergeTopoStarts_"+te1+"_"+te2)
-    #     theChainDef.addSequence([te1,te2], theMergeTopoStarts, "merged_"+te1+"_"+te2)
-    #     topoStartFrom = "merged_"+te1+"_"+te2
-    # else:
-    #     log.error('3 topo Tes to merge not implemented (can be done though!')                    
-
-
-
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
index fac6245ac727e4c667bb0b2043549dc3814c16ac..1b40a67b3f13225ed6842fc9cc9623850bdb7972 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
@@ -29,6 +29,8 @@ SliceIDDict = {
     'Test'          : 'TestChain',
 }
 
+AllowedSignatures = ["jet","egamma","muon", "electron", "photon","met","tau", "minbias", "heavyion", "cosmic", "calibration", "streaming", "monitoring", "ht", 'bjet','eb']        
+
 #==========================================================
 # ---- Generic Template for all chains          ----
 # ---- chainParts specific information given in ----
@@ -358,7 +360,7 @@ ElectronChainParts = {
     'signature'      : ['Electron'],
     'chainPartName'  : '',
     'L1item'         : '',
-    'extra'          : 'ion',
+    'extra'          : '',
     'multiplicity'   : '',    
     'trigType'       : ['e'],
     'threshold'      : '',
@@ -370,7 +372,7 @@ ElectronChainParts = {
     'lhInfo'         : ['cutd0dphideta','nod0','nodphires','nodeta','smooth'],
     'L2IDAlg'        : ['L2StarA','L2StarB','L2StarC','FTK','TRT','SiTrack','IdScan'],
     'addInfo'        : ['etcut','ringer','conv','etisem','gsf','trkcut',
-                        'L2Star','perf','IdTest'],
+                        'L2Star','perf','IdTest', 'etcut1step'],
     }
 # ---- Egamma Dictinary of default Values ----
 ElectronChainParts_Default = {
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerConfigHLT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerConfigHLT.py
new file mode 100644
index 0000000000000000000000000000000000000000..5d44149900cb95038dd9b1670009695b5cd45154
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerConfigHLT.py
@@ -0,0 +1,57 @@
+#########################################################################################
+#
+# TriggerConfigHLT class, providing basic functionality for assembling the menu
+#
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+#
+#########################################################################################
+
+from AthenaCommon.Logging import logging
+log = logging.getLogger( 'TriggerConfigHLT' )
+
+class TriggerConfigHLT:
+    sCurrentTriggerConfig = None
+    def currentTriggerConfig():
+        return TriggerConfigHLT.sCurrentTriggerConfig
+    currentTriggerConfig = staticmethod(currentTriggerConfig)
+
+
+    def __init__(self, hltfile=None):
+        self.menuName = 'TestMenu'
+        self.__HLTFile = hltfile
+        
+        self.allChainConfigs   = []
+ 
+        self.allThresholds     = {}
+        self.allItems          = {}
+        self.allChains         = {}
+        self.allChainSteps     = {}
+
+        self.theHLTChains      = []
+        self.theSeqLists       = []
+        self.theSeqDict        = {} # dict by Seq output TE
+
+        TriggerConfigHLT.sCurrentTriggerConfig = self
+
+
+    def registerHLTChain(self, chainName, chainConfig):
+        """ Adds chain to the set of self.allChains which are registered for further use """
+        if logical_name in self.allChains:
+            self.allChains[chainName].append( chainConfig )
+        else:
+            self.allChains[chainName] = [ chainConfig ]
+
+
+    def getHLTConfigFile(self):
+        return self.__HLTFile
+
+
+    def writeHLTConfigFile(self,smkPskName):
+        """ Writes HLT config file"""
+        if self.__HLTFile is None:
+            return
+
+        log.info("Writing of config files needs to be implemented")
+
+
+
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerMTConfig.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerMTConfig.py
deleted file mode 100755
index 4d7ed0d12e2f9428bc8bb9f0c481e56ae8e6acbd..0000000000000000000000000000000000000000
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/TriggerMTConfig.py
+++ /dev/null
@@ -1,628 +0,0 @@
-# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
-
-#########################################################################################
-# User interface for the configuration, nothing beneath this class need to be studied
-#
-import re
-import string
-from collections import defaultdict
-import xml.dom.minidom as minidom
-import xml.etree.cElementTree as etree
-
-from AthenaCommon.CFElements import parOR, seqAND, stepSeq
-
-
-from AthenaCommon.Logging import logging
-log = logging.getLogger( 'TriggerMTConfig' )
-
-
-
-class TriggerMTConfig:
-    sCurrentTriggerConfig = None
-    def currentTriggerConfig():
-        return TriggerMTConfig.sCurrentTriggerConfig
-    currentTriggerConfig = staticmethod(currentTriggerConfig)
-
-    def __init__(self, hltfile=None, signaturesOverwritten=False):
-        self.menuName = 'TestMenu'
-        self.__HLTFile = hltfile
-        self.allThresholds     = {}
-        self.allItems          = {}
-        self.allChains         = {}
-
-        self.theHLTChains      = []
-        self.theSeqLists       = []
-        self.theSeqDict        = {} 
-        self.theTopoStartFrom    = []
-
-        # Sanity check since the second argument in __init__ used to be the l1 xml file name
-        if type(signaturesOverwritten)!=bool:
-            log.error('Wrong type for signaturesOverwritten. Received %s but expected bool', signaturesOverwritten)
-
-        self.signaturesOverwritten = signaturesOverwritten
-        TriggerMTConfig.sCurrentTriggerConfig = self
-
-    def printIt(self):
-        log.debug("self.theSeqLists: %s",  self.theSeqLists)
-        log.debug("self.theSeqDict: %s", self.theSeqDict) 
-        log.debug("self.theTopoStartFrom: %s", self.theTopoStartFrom) 
-        
-
-
-#########################################################################################
-#########################################################################################
-##### From HLTCFConfig.py
-#########################################################################################
-#########################################################################################
-
-
-# Classes to configure the CF graph, via Nodes
-from AthenaCommon.CFElements import parOR, seqAND, stepSeq
-
-
-allAlgs={}
-def useExisting(name):
-    global allAlgs
-    return allAlgs[name]
-
-def AlgExisting(name):
-    global allAlgs
-    return name in allAlgs
-
-
-def remember(name, instance):
-    global allAlgs
-    allAlgs[name] = instance
-    return instance
-
-
-class AlgNode():
-    def __init__(self, Alg, inputProp, outputProp):
-        self.name = ("%s_%s_%s")%( Alg.name(), inputProp, outputProp)
-        self.algname = Alg.name()
-        self.outputProp=outputProp
-        self.inputProp=inputProp
-        self.configureAlg(Alg)
-                
-    def configureAlg(self, Alg):
-        alg_name = Alg.getName()
-        if AlgExisting(alg_name):
-            print "AlgNode::%s: found already Alg %s"%(self.name,alg_name)
-            self.Alg = useExisting(alg_name)
-        else:
-            print "AlgNode::%s: new Alg %s"%(self.name,alg_name)
-            self.Alg=Alg
-            remember(alg_name, self.Alg)
-            
-        if self.Alg is  None:
-            return
-
-        self.addDefaultOutput()
-
-    def addDefaultOutput(self):
-        print "This is main addDefaultOutput"
-        self.setOutput(("%s_%s_out"%(self.algname,self.outputProp)))
-        #self.setOutput(("%s_out"%(self.name)))
-        
-
-    def setPar(self, prop, name):
-        cval = self.Alg.getProperties()[prop]
-        try:
-            if type(cval) == type(list()):                
-                cval.append(name)
-                setattr(self.Alg, prop, cval)
-            else:
-                setattr(self.Alg, prop, name)
-        except:
-            pass
-
-    def setParArray(self, prop, name):
-        cval = self.Alg.getProperties()[prop]
-        try:
-            cval.append(name)
-            setattr(self.Alg, prop, cval)
-        except:
-            pass
- 
-    def getPar(self, prop):
-        try:
-            return getattr(self.Alg, prop)
-        except:
-            return self.Alg.getDefaultProperty(prop)
-        raise "Error in reading property " + prop + " from " + self.Alg
-
-
-    def setOutput(self, name):
-        return self.setPar(self.outputProp,name)
-
-    def getOutput(self):
-        return self.getPar(self.outputProp)
-
-    def getOutputList(self):
-        outputs = []
-        cval = self.getOutput()
-        if type(cval) == type(list()):  
-            outputs.extend(cval)
-        else:
-            outputs.append(cval)
-        return outputs
-    
-    def setInput(self, name):
-        return self.setPar(self.inputProp,name)
-
-    def addInput(self, name):
-        return self.setParArray(self.inputProp,name)
-    
-    def getInput(self):
-        return self.getPar(self.inputProp)
-
-    def getInputList(self):
-        inputs = []
-        cval = self.getInput()
-        if type(cval) == type(list()):  
-            inputs.extend(cval)
-        else:
-            inputs.append(cval)
-        return inputs
-
-    def __str__(self):
-        return "Alg::%s  [%s] -> [%s]"%(self.name,' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList())))
-
-
- 
-class HypoAlgNode(AlgNode):
-    def __init__(self, Alg, inputProp, outputProp):
-        AlgNode.__init__(self, Alg, inputProp, outputProp)
-        self.tools = []
-        self.previous=[]
-       
-
-    def addHypoTool(self, hypotool):
-        if "Comb" in self.name: ###TMP combo, only one threshold
-            import re
-            thresholds = map(int, re.findall(r'\d+', hypotool.getName()))
-            self.setPar('Threshold1', thresholds[0])
-            self.setPar('Threshold2', thresholds[1])
-            status=self.setPar('DecisionLabel', hypotool.getName())
-        else:
-            self.tools.append(hypotool.getName())
-            status= self.setParArray('HypoTools',hypotool)        
-        return status
-
-    def addPreviousDecision(self,prev):
-        self.previous.append(prev)
-        status= self.setParArray('previousDecisions',prev)
-        return status
-
-    def setPreviousDecision(self,prev):
-        if "Comb" in self.name: ###TMP combo: how handle previous decisions in combo?            
-            self.previous.append(prev)
-            if  "from_L1MU" in prev:
-                if "pt" in self.getPar("Property1"):
-                    status= self.setPar('previousDecisions1',prev)
-                if "pt" in self.getPar("Property2"):
-                    status= self.setPar('previousDecisions2',prev)
-
-            if  "from_L1EM" in prev:
-                if "et" in self.getPar("Property1"):
-                    status= self.setPar('previousDecisions1',prev)
-                if "et" in self.getPar("Property2"):
-                    status= self.setPar('previousDecisions2',prev)
-
-            if  "Output1" in prev:
-                status= self.setPar('previousDecisions1',prev)
-            if  "Output2" in prev:
-                status= self.setPar('previousDecisions2',prev)
-
-        else:
-            self.previous.append(prev)
-            status= self.setPar('previousDecisions',prev)
-        return status
-    
-    def __str__(self):
-        return "HypoAlg::%s  [%s] -> [%s], previous = [%s], HypoTools=[%s] --> Alg %s"%(self.name,' '.join(map(str, self.getInputList())),
-                                                                                 ' '.join(map(str, self.getOutputList())),
-                                                                                 ' '.join(map(str, self.previous)),
-                                                                                 ' '.join(map(str, self.tools)), self.Alg)
-
-
-
-class SequenceFilterNode(AlgNode):
-    def __init__(self, Alg, inputProp, outputProp):
-        AlgNode.__init__(self,  Alg, inputProp, outputProp)
-        
-    def addDefaultOutput(self):
-        print "This is SequenceFilter addDefaultOutput"
-        return #do nothing    
-       
-    def setChains(self, name):
-        return self.setPar("Chains", name)
-    
-    def getChains(self):
-        return self.getPar("Chains")
-
-
-from TrigUpgradeTest.TrigUpgradeTestConf import HLTTest__TestRoRSeqFilter
-class TestRoRSequenceFilterNode(SequenceFilterNode):       
-    def __init__(self, name):
-        Alg= HLTTest__TestRoRSeqFilter(name, OutputLevel = 2)
-        inputProp='Inputs'
-        outputProp='Outputs'
-        SequenceFilterNode.__init__(self,  Alg, inputProp, outputProp)
-        if "Step1" in self.name: # so that we see events running through, will be gone once L1 emulation is included
-            self.Alg.AlwaysPass = True   
-  
-   
-
-from DecisionHandling.DecisionHandlingConf import RoRSeqFilter, DumpDecisions
-class RoRSequenceFilterNode(SequenceFilterNode):
-    def __init__(self, name):
-        Alg= RoRSeqFilter(name, OutputLevel = 2)
-        inputProp='Input'
-        outputProp='Output'
-        SequenceFilterNode.__init__(self,  Alg, inputProp, outputProp)
-        
-
-
-
-#### Here functions to create the CF tree from CF configuration objects
-
-
-from AthenaCommon.AlgSequence import dumpSequence
-def create_step_reco_node(name, seq_list, dump=0):
-    print "Create reco step %s with %d sequences"%(name, len(seq_list))
-    stepCF = parOR(name+"_reco")
-    for seq in seq_list:        
-        step_seq = create_CFSequence(seq)             
-        stepCF += step_seq
-    
-    if dump: dumpSequence (stepCF, indent=0)        
-    return stepCF
-
-
-def create_step_filter_node(name, seq_list, dump=0):
-    print "Create filter step %s with %d filters"%(name, len(seq_list))
-    stepCF = parOR(name+"_filter")
-    for seq in seq_list:
-        filterAlg=seq.filter.Alg                    
-        print "Add  %s to filter node %s"%(filterAlg.name(),name)
-        stepCF += filterAlg
-    
-    if dump: dumpSequence (stepCF, indent=0)        
-    return stepCF
-
-
-def create_CFSequence(CFseq):   
-    print "\n * Create CFSequence %s"%(CFseq.name)
-    filterAlg=CFseq.filter.Alg
-   
-    nodes = CFseq.getAllNodes()
-    algos = []
-    for node in nodes:
-        algos.append(node.Alg)
-
-    algos=list(set(algos))
-
-    step_seq = create_step_sequence( CFseq.name, filterAlg=filterAlg, rest=algos)       
-    return step_seq
-
-def create_step_sequence(name, filterAlg, rest):
-    """ elementary HLT step sequencer, filterAlg is gating, rest is anything that needs to happe within the step """
-    stepReco = parOR(name+"_reco", rest)
-    stepAnd = seqAND(name, [ filterAlg, stepReco ])
-    return stepAnd
-  
-
-def find_stepCF_algs(step_list):
-    algos = []
-    for step in step_list:
-        #print "Finding algos of step %s"%step
-        step_algs = []
-        step_algs.append(step.filter)
-        for seq in step.menuSeq.nodeSeqList:
-            step_algs.extend(seq.algs )
-            step_algs.append(seq.hypo)
-        algos.extend(step_algs)
-    return algos        
-            
-
-
-def addChainToHypoTool(hypotool, chain):
-    prop="Chains"
-    cval = hypotool.getProperties()[prop]
-    try:
-        cval.append(chain)
-        setattr(hypotool, prop, cval)
-    except:
-        pass
-
-
-def addChainToHypoAlg(hypoAlg, chain):
-    if "Comb" in hypoAlg.algname:
-        prop="Chains"
-        cval = hypoAlg.Alg.getProperties()[prop]
-        try:
-            cval.append(chain)
-            setattr(hypoAlg.Alg, prop, cval)
-        except:
-            pass
-
-
-#######################################
-def decisionTree_From_Chains(HLTAllStepsSeq, chains, NSTEPS=1):
-
-    testRoR=False
-    from TrigUpgradeTest.MenuComponents import CFSequence
-    #loop over chains to configure
-    count_steps=0
-    for nstep in range(0, NSTEPS):
-        stepCF_name =  "Step%i"%(nstep+1)
-        CFseq_list = []
-
-        for chain in chains:
-            chain_step_name= "%s:%s"%(stepCF_name, chain.name)
-            print "\n*******Filling step %s for chain  %s"%(stepCF_name, chain.name)
-      
-            chain_step=chain.steps[count_steps]
-            sequenceHypoTools=chain_step.sequenceHypoTools
-            countseq=0
-            for st in sequenceHypoTools:
-                sequence=st.sequence
-                hypotool=st.hypotool
-                addChainToHypoTool(hypotool, chain.name)
-                cfseq_name= sequence.name
-
-                print "Going through sequence %s with threshold %s"%(sequence.name, hypotool.getName())
-                #define sequence input
-                if count_steps == 0: # seeding
-                    sequence_input= [nodeSeq.seed for nodeSeq in sequence.nodeSeqList]
-                    print "Seeds from this chain: %s"%(sequence_input)
-                    previous_sequence="".join(chain.group_seed)
-                else:
-                    # from previous step, map the seuqence in the same order?
-                    previous_sequence=chain.steps[count_steps-1].sequences[countseq].name #menu sequence
-                    sequence_input=chain.steps[count_steps-1].sequences[countseq].outputs
-                    print "Connect to previous sequence:"
-                    print sequence_input
-                # add hypotools
-                for nodeSeq in sequence.nodeSeqList:
-                    hypoAlg= nodeSeq.hypo                
-                    print "Adding %s to %s"%(hypotool.getName(),hypoAlg.algname)
-                    hypoAlg.addHypoTool(hypotool)
-                    addChainToHypoAlg(hypoAlg, chain.name) # only for TMP Combo
-                    
-
-
-                #### FILTER
-                # one filter per previous sequence at the start of the sequence: check if it exists or create a new one        
-                # if the previous hypo has more than one output, try to get all of them
-                # one filter per previous sequence: 1 input/previous seq, 1 output/next seq 
-                filter_name="Filter%s_on_%s"%(stepCF_name,previous_sequence)
-                filter_out=["%s_from_%s_out"%(filter_name,i) for i in sequence_input]
-                filter_already_exists=False
-                findFilter= [cfseq.filter for cfseq in CFseq_list if filter_name in cfseq.filter.algname]        
-                if len(findFilter):
-                    print "Filter %s already exists"%(filter_name)
-                    filter_already_exists=True
-                    sfilter=findFilter[0]
-                    print "Adding chain %s to %s"%(chain.name,sfilter.algname)
-                    sfilter.setChains(chain.name)
-                    continue
-                else:
-                    if (testRoR):
-                        sfilter = TestRoRSequenceFilterNode(name=filter_name)
-                    else:
-                        sfilter = RoRSequenceFilterNode(name=filter_name)
-                    for o in filter_out: sfilter.setOutput(o)            
-                    for i in sequence_input: sfilter.addInput(i)
-                    sfilter.setChains(chain.name)
-                    print "Filter Done: %s"%(sfilter)
-                    
-                #loop over NodeSequences of this sequence to add inputs to InputMaker and send decisions to HypoAlg
-                for nodeSeq in sequence.nodeSeqList:
-                    seed=nodeSeq.seed                    
-                    input_maker_input= [inp for inp in sfilter.getOutputList() if ("from_"+seed) in inp]
-                    print "Adding %d inputs to sequence::%s from Filter::%s (from seed %s)"%(len(input_maker_input), nodeSeq.name, sfilter.algname, seed)
-                    for i in input_maker_input: print i
-                    if len(input_maker_input) == 0:
-#                        print "ERROR, no inputs to sequence are set!"
-                        sys.exit("ERROR, no inputs to sequence are set!") 
-#                        return                    
-                    for i in input_maker_input: nodeSeq.addInput(i)
-
-                    hypoAlg= nodeSeq.hypo
-                    #node = AlgNode(Alg=hypoAlg.Alg,inputProp='', outputProp='Output1')
-                    for i in input_maker_input: hypoAlg.setPreviousDecision(i) # works for one
-                    #for i in input_maker_input: hypoAlg.addPreviousDecision(i)
-
-                    print hypoAlg
-
-                                    
-                CF_seq = CFSequence( cfseq_name, FilterAlg=sfilter, MenuSequence=sequence)    
-                #for node in otherNodes: CF_seq.addNode(node)
-                print CF_seq
-                CFseq_list.append(CF_seq)
-                countseq+=1
-           
-            #end of sequence/threshold
-                
-        #end of loop over chains for this step, now implement CF:
-        print "\n******** Create CF Tree %s with AthSequencers",stepCF_name
-        #first make the filter step
-        stepFilter = create_step_filter_node(stepCF_name, CFseq_list, dump=0)
-        HLTAllStepsSeq += stepFilter
-        
-        stepCF = create_step_reco_node(stepCF_name, CFseq_list, dump=0)
-        HLTAllStepsSeq += stepCF
-        
-        print "Now Draw..."
-        stepCF_DataFlow_to_dot(stepCF_name, CFseq_list)
-        stepCF_ControlFlow_to_dot(stepCF)
-
-       
-        print "Added stepCF %s to the root"%stepCF_name     
-        count_steps+=1
-        print "************* End of step %s"%stepCF_name
-        # end of steps
-
-    #stepCF_ControlFlow_to_dot(HLTAllStepsSeq)
-    dumpSequence (HLTAllStepsSeq, indent=0)
-    return
-#####
-
-
-
-
-###### Here some graphical methods
-
-
-from ViewAlgsTest.connectAlgorithmsIO import connectAlgorithmsIO, graph_generator
-from AthenaCommon.AlgSequence import AthSequencer
-
-
-def algColor(alg):
-    if "Hypo" in alg: return "darkorchid1"
-    if "Filter" in alg: return "chartreuse3"
-    if "InputMaker" in alg: return "cyan3"
-    return "cadetblue1"
-    
-def stepCF_ControlFlow_to_dot(stepCF):
-    def _dump (seq, indent):
-        o = list()
-        for c in seq.getChildren():
-            if "AthSequencer" in c.getFullName():
-                o.append( ("%s[color=%s, shape=circle, width=.5, fixedsize=true ,style=filled]\n"%(c.name(),_seqColor(c)), indent) )
-            else:
-                o.append( ("%s[fillcolor=%s,style=filled]\n"%(c.name(),algColor(c.name())), indent) )
-            o.append( ("%s -> %s\n"%(seq.name(), c.name()), indent))
-            o.extend( _dump (c, indent+1) )
-        return o
-
-    def _parOR (seq):
-        if seq.ModeOR is True:
-            if seq.Sequential is False:
-                if seq.StopOverride is True:
-                    return True
-        return False
-
-    def _seqAND(seq):
-        if seq.ModeOR is False:
-            if seq.Sequential is True:
-                if seq.StopOverride is False:
-                    return True
-        return False
-
-    def _seqColor(seq):
-        if _parOR(seq): return "red"
-        if _seqAND(seq): return "blue"
-        return "black"
-
-   
-
-    # to visualize: dot -T pdf Step1.dot > Step1.pdf
-    file = open( '%s.CF.dot'%stepCF.name(), mode="wt" )
-    #strict
-    file.write( 'digraph step  {\n'\
-                +'\n'\
-                +'  node [ shape=polygon, fontname=Helvetica ]\n'\
-                +'  edge [ fontname=Helvetica ]\n'
-                +'  %s   [shape=Mdiamond]\n'%stepCF.name())
-
-    indent=0
-    out = [("%s[color=%s shape=circle]\n"%(stepCF.name(),_seqColor(stepCF)), indent)]
-  
-    out.extend( _dump( stepCF, indent=indent+1 ) )
-    for n,i in out:
-        line= "  "*i+ n
-        file.write(line)
-
-    file.write( '}\n')
-
-
-
-    
-
-def stepCF_DataFlow_to_dot(name, cfseq_list):
-    # to visualize: dot -T pdf Step1.dot > Step1.pdf
-    file = open( '%s.DF.dot'%name, mode="wt" )
-    #strict
-    file.write( 'digraph step  {\n'\
-                +'\n'\
-                +'  node [ shape=polygon, fontname=Helvetica ]\n'\
-                +'  edge [ fontname=Helvetica ]\n'
-                +'  %s   [shape=Mdiamond]\n'%name)
-
-
-    for cfseq in cfseq_list:
-        print cfseq.name
-        file.write("  %s[fillcolor=%s style=filled]\n"%(cfseq.filter.algname,algColor(cfseq.filter.algname)))
-        for inp in cfseq.filter.getInputList():
-            file.write(addConnection(name, cfseq.filter.algname, inp))
-           
-        file.write(  '\n  subgraph cluster_%s {\n'%(cfseq.name)\
-                    +'     node [color=white style=filled]\n'\
-                    +'     style=filled\n'\
-                    +'     color=lightgrey\n'\
-                    +'     fontname=Helvetica\n'\
-                    +'     label = %s\n'%(cfseq.name))
-
-        cfseq_algs = []
-        cfseq_algs.append(cfseq.filter)       
-
-        for seq in cfseq.menuSeq.nodeSeqList:
-            #            cfseq_algs.append(seq.inputMaker)
-            cfseq_algs.extend(seq.algs )
-            if seq.reuse==False:
-                #                file.write("    %s[fillcolor=%s]\n"%(seq.inputMaker.algname, algColor(seq.inputMaker.algname)))
-                for alg in seq.algs: file.write("    %s[fillcolor=%s]\n"%(alg.algname, algColor(alg.algname)))
-                seq.reuse=True
-            cfseq_algs.append(seq.hypo)
- 
-            file.write("    %s[color=%s]\n"%(seq.hypo.algname, algColor(seq.hypo.algname)))
-        file.write('  }\n')              
-        file.write(findConnections(cfseq_algs))
-        file.write('\n')    
-  
-    file.write( '}')
-    file.close()
-
-
-def findConnections(alg_list):
-    lineconnect=''
-    for nodeA in alg_list:
-        for nodeB in alg_list:
-            if nodeA is nodeB:
-                continue
-            dataIntersection = list(set(nodeA.getOutputList()) & set(nodeB.getInputList()))
-            if len(dataIntersection) > 0:
-                for line in dataIntersection:
-                    lineconnect+=addConnection(nodeA.algname,nodeB.algname, line)
-                    print 'Data connections between %s and %s: %s'%(nodeA.algname, nodeB.algname, line)
-    return lineconnect
-
-def addConnection(nodeA, nodeB, label):
-    line = "    %s -> %s [label=%s]\n"%(nodeA,nodeB,label)
-    # print line
-    return line
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Photon/__init__.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Photon/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d0cb751d0f336e3ac36673d3352ecaed8478e92f
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Photon/__init__.py
@@ -0,0 +1 @@
+#Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/scripts/generateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/scripts/generateMenuMT.py
index f8f6a7dd08cb76985cdb25c368024bf20967c6c3..0c3ffce84b7b42a900403d32138f2c59c8787d08 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/scripts/generateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/scripts/generateMenuMT.py
@@ -1,20 +1,65 @@
 #!/bin/env python
 
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 
-def generateMenu(menu):
 
-    from TriggerMenu import setUseNewTriggerMenu
-    setUseNewTriggerMenu()
 
-    from TriggerMenu.menu import GenerateMenu
-    from TriggerJobOpts.TriggerFlags import TriggerFlags
+# import flags
+include("TrigUpgradeTest/testHLT_MT.py")
+
+#################################
+# Configure L1Decoder
+#################################
+
+# provide a minimal menu information
+if globalflags.InputFormat.is_bytestream():
+   topSequence.L1DecoderTest.ctpUnpacker.OutputLevel=DEBUG
+   topSequence.L1DecoderTest.roiUnpackers[0].OutputLevel=DEBUG
+
+# map L1 decisions for menu
+for unpack in topSequence.L1DecoderTest.roiUnpackers:
+    if unpack.name() is "EMRoIsUnpackingTool":
+        unpack.Decisions="L1EM"
+        emUnpacker=unpack
+    if unpack.name() is "MURoIsUnpackingTool":
+        unpack.Decisions="L1MU"
+        
+for unpack in topSequence.L1DecoderTest.rerunRoiUnpackers:
+    if unpack.name() is "EMRerunRoIsUnpackingTool":
+        unpack.Decisions="RerunL1EM"
+        unpack.SourceDecisions="L1EM"
+
+for unpack in topSequence.L1DecoderTest.rerunRoiUnpackers:
+    if unpack.name() is "EMRerunRoIsUnpackingTool":
+        unpack.SourceDecisions="L1EM"
+    if unpack.name() is "MURerunRoIsUnpackingTool":
+        unpack.SourceDecisions="L1MU"
+
+
+
+# this is a temporary hack to include new test chains
+# very hacky indeed, the L1 part should be in in the GenerateMenuMT part
+
+from TriggerJobOpts.TriggerFlags import TriggerFlags
+TriggerFlags.triggerMenuSetup = "LS2_v1"
+
+from TriggerMenuMT.HLTMenuConfig.Menu.GenerateMenuMT import GenerateMenuMT
+g = GenerateMenuMT()
+#allChainConfigs = g.generateChainConfigs()
+allChainConfigs = g.getChainsFromMenu()
+
+EnabledChainNamesToCTP = dict([ (c[0], c[1])  for c in allChainConfigs])
+topSequence.L1DecoderTest.ChainToCTPMapping = EnabledChainNamesToCTP
+
+
+
+##########################################
+# Menu and CF construction
+##########################################
+g.generateMT()
+
+
 
-    # what menu to build
-    TriggerFlags.triggerMenuSetup = menu
 
-    GenerateMenu.generateMenu()
 
 
-if __name__=="__main__":
-    generateMenu(menu="Physics_pp_v6")
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/scripts/testMenuMT.sh b/Trigger/TriggerCommon/TriggerMenuMT/scripts/testMenuMT.sh
index 8a937e1b3b54b80fc462cd62af44d2fa461a1516..a1701f22b7bed224529e4ab19a9c0384dce497b8 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/scripts/testMenuMT.sh
+++ b/Trigger/TriggerCommon/TriggerMenuMT/scripts/testMenuMT.sh
@@ -1,2 +1,82 @@
 #!/usr/bin/env sh
-athena.py -c "TriggerMenuSetup='MC_pp_v7'" TriggerMenuXML/runHLT_forXMLgeneration.py
+
+help() {
+    echo "Syntax: testMenuMT.sh [-r VERSION] MENU [DEST]"
+}
+
+if [ $# -lt 1 ]; then
+    help
+    exit 0
+fi
+
+while true; do
+    case "$1" in
+        -r)
+            release=$2
+            shift 2
+            ;;
+        -h)
+            help
+            exit 0
+            ;;
+        -*)
+            echo "Invalid parameter"
+            exit 1
+            ;;
+        *)
+            break
+    esac
+done
+
+menu=$1
+dest=$2
+if [ -z "$dest" ]; then
+    dest=$PWD
+fi
+
+# Get absolute path name
+dest=`cd $dest; pwd`
+
+if [ -z "$release" ]; then
+    release=${AtlasVersion}    # for interactive use
+fi
+
+# Temporary run directroy and cleanup traps in case of termination
+rundir=`mktemp -t -d tmxml.${menu}.XXXXXXXXXX`
+TRAPINT() {
+    rm -rf $rundir
+    return 130 # 128+SIGINT
+}
+TRAPTERM() {
+    rm -rf $rundir
+    return 143 # 128+SIGTERM
+}
+
+
+## menu generation starts here
+echo "generateHLTMenuMT: Building menu: ${menu} for ${release}"
+logfiletopo=topo${menu}.log
+logfilelvl1=lvl1${menu}.log
+logfilehlt=hlt${menu}.log
+cd $rundir
+
+generateLVL1MenuMT.py $menu >&! logfiletopo 
+generateL1TopoMenuMT.py $menu >&! logfilelvl1 
+generateMenuMT.py $menu >&! logfilehlt
+
+cp L1Topoconfig_*.xml ${dest}
+cp LVL1config_*.xml ${dest}
+#cp $logfilelvl1 $logfiletopo ${dest}
+
+if [[ -e outputLVL1config.xml ]]; then
+    cp outputLVL1config.xml ${dest}/LVL1config_${menu}_${release}.xml
+fi
+
+#this gives some more sensitivity to hidden problems
+grep --colour ERROR ${dest}/$logfile
+grep --colour -A 100 "Shortened traceback" ${dest}/$logfile
+
+rm -rf $rundir
+
+# Do not return real athena exit code as we want to pretend everything was fine
+#unset PYTHONDONTWRITEBYTECODE
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/scripts/test_HLTmenu.sh b/Trigger/TriggerCommon/TriggerMenuMT/scripts/test_HLTmenu.sh
new file mode 100644
index 0000000000000000000000000000000000000000..53f5e39704237e68106cd72259ebff280268f04b
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/scripts/test_HLTmenu.sh
@@ -0,0 +1,3 @@
+#!bin/sh
+
+athena -l DEBUG --threads=1 --skipEvents=10 --evtMax=20 --filesInput="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1" TriggerMenuMT/generateMenuMT.py
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/share/generateMT.py b/Trigger/TriggerCommon/TriggerMenuMT/share/generateMT.py
index 642777fb25ae7953f86d72e5822e39c5f1cb1f05..e2af3b1baa4c8b0094a4eab27a94a9ea91a99c6d 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/share/generateMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/share/generateMT.py
@@ -1,16 +1,46 @@
-#!/bin/env python
+# import flags
+include("TrigUpgradeTest/testHLT_MT.py")
 
-from AthenaCommon.AthenaCommonFlags import jobproperties 
-from AthenaCommon.GlobalFlags import jobproperties
+#################################
+# Configure L1Decoder
+#################################
 
-jobproperties.print_JobProperties('tree&value')
+# provide a minimal menu information
+if globalflags.InputFormat.is_bytestream():
+   topSequence.L1DecoderTest.ctpUnpacker.OutputLevel=DEBUG
+   topSequence.L1DecoderTest.roiUnpackers[0].OutputLevel=DEBUG
 
+# map L1 decisions for menu
+for unpack in topSequence.L1DecoderTest.roiUnpackers:
+    if unpack.name() is "EMRoIsUnpackingTool":
+        unpack.Decisions="L1EM"
+        emUnpacker=unpack
+    if unpack.name() is "MURoIsUnpackingTool":
+        unpack.Decisions="L1MU"
+        
+for unpack in topSequence.L1DecoderTest.rerunRoiUnpackers:
+    if unpack.name() is "EMRerunRoIsUnpackingTool":
+        unpack.Decisions="RerunL1EM"
+        unpack.SourceDecisions="L1EM"
 
-from TriggerMenuMT.HLTMenuConfig.Menu.GenerateMenu import GenerateMenuMT
+for unpack in topSequence.L1DecoderTest.rerunRoiUnpackers:
+    if unpack.name() is "EMRerunRoIsUnpackingTool":
+        unpack.SourceDecisions="L1EM"
+    if unpack.name() is "MURerunRoIsUnpackingTool":
+        unpack.SourceDecisions="L1MU"
 
+
+
+
+##########################################
+# Menu and CF construction
+##########################################
+
+from TriggerMenuMT.HLTMenuConfig.Menu.GenerateMenuMT import GenerateMenuMT
 g = GenerateMenuMT()
 g.generateMT()
 
-jobproperties.AthenaCommonFlags.EvtMax=0
 
-jobproperties.print_JobProperties('tree&value')
+
+
+