diff --git a/Trigger/TrigSteer/L1Decoder/src/RoIsUnpackingEmulationTool.cxx b/Trigger/TrigSteer/L1Decoder/src/RoIsUnpackingEmulationTool.cxx
index 67fade26f66d10ef352d69c34596652666af1bc9..3755b1dac47ae927a6a222fd5cfa8e9aa1895edc 100644
--- a/Trigger/TrigSteer/L1Decoder/src/RoIsUnpackingEmulationTool.cxx
+++ b/Trigger/TrigSteer/L1Decoder/src/RoIsUnpackingEmulationTool.cxx
@@ -62,7 +62,10 @@ StatusCode RoIsUnpackingEmulationTool::decodeThresholdToChainMapping() {
     ATH_MSG_WARNING( "No chains configured in ThresholdToChainMapping: " << m_thresholdToChainProperty );
   }
   for ( auto el: m_thresholdToChainMapping ) {
-    ATH_MSG_DEBUG( "Threshold " << el.first << " mapped to chains " << el.second );
+    ATH_MSG_DEBUG( "Threshold " << el.first << " mapped to chains ");
+    for (auto id: el.second){
+      ATH_MSG_DEBUG(" "<<id.name());
+    }
   }
 
 
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureConfig.py b/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureConfig.py
index 120ea01fe8060ed8c5b4cce723f92404bb8040f0..4504157e24ff17e72abbc20b484f2fe4052eda0c 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureConfig.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureConfig.py
@@ -103,6 +103,14 @@ elstep1_sequence = seqAND("elSeqStep1", [elIM, elAlg])
 def elStep1Sequence():
     return MenuSequence( Maker=elIM, Sequence=elstep1_sequence,  Hypo=elHypo, HypoToolGen=ElTestHypoTool)
 
+
+gammHypo = ElGamHypo(name="Step1GamHypo")
+gammHypo.Input = elAlg.Output
+
+def gammStep1Sequence():
+    return MenuSequence( Maker=elIM, Sequence=elstep1_sequence,  Hypo=gammHypo, HypoToolGen=GammTestHypoTool)
+
+
 #step2
 elIM2= InputMakerAlg(name="Step2ElInputMaker")
 elIM2.Output='elIM2_out'
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureHypoTools.py b/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureHypoTools.py
index 0ff7a7c308c18ad77bde8f3bb3814b12d7195a04..a402198f5aa0a7e0cc5d225216902f67d2822a77 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureHypoTools.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/python/HLTSignatureHypoTools.py
@@ -18,6 +18,10 @@ def ElTestHypoTool(name,conf):
     threshold = conf.replace("HLT_e","")
     return TestHypoTool(name,prop="et", threshold_value=threshold)
 
+def GammTestHypoTool(name,conf):
+    threshold = conf.replace("HLT_g","")
+    return TestHypoTool(name,prop="et", threshold_value=threshold)
+
 
 def MuTest2HypoTool(name, conf):
     threshold = conf.replace("HLT_mu","")
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessing.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessing.ref
index 2896b5ec9dff6793b77851d565f58e507d7153d5..c98107b15439532bfbcad474e673d252ba77be1a 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessing.ref
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessing.ref
@@ -1,5 +1,8 @@
 TrigSignatureMoniMT                                INFO HLT_e20                       2         2         2         2         2         
-TrigSignatureMoniMT                                INFO HLT_e8                        2         2         2         2         2         
+TrigSignatureMoniMT                                INFO HLT_e5                        1         1         1         1         1         
+TrigSignatureMoniMT                                INFO HLT_e5_e8                     1         1         1         0         1         
+TrigSignatureMoniMT                                INFO HLT_e8                        3         3         3         3         3         
+TrigSignatureMoniMT                                INFO HLT_g5                        1         1         1         0         1         
 TrigSignatureMoniMT                                INFO HLT_mu20                      1         1         0         0         0         
 TrigSignatureMoniMT                                INFO HLT_mu8                       2         2         2         2         2         
 TrigSignatureMoniMT                                INFO HLT_mu81step                  2         2         2         0         2         
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py
index 92a543bc2fa14952d072742c2ad606112f0db64e..3e90c9a187209c941ee7ff24bff0e2a23e45813a 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/EmuStepProcessingTest.py
@@ -28,15 +28,12 @@ data['msmu']  = [';',
                  'eta:-1.2,phi:0.7,pt:6500,pt2:8500; eta:-1.1,phi:0.6,pt:8500,pt2:8500;',
                  'eta:-1.7,phi:-0.2,pt:9500,pt2:8500;']
 
-data['ctp'] = [ 'HLT_e20',
-                'HLT_mu8 HLT_mu81step HLT_e20 HLT_e8 HLT_mu8_e8',
+data['ctp'] = [ 'HLT_e20 HLT_e5_e8 HLT_e5 HLT_e8 HLT_g5',
+                'HLT_mu8 HLT_mu81step HLT_e20 HLT_e8 HLT_mu8_e8 HLT_e3_e5',
                 'HLT_mu20 HLT_mu8 HLT_mu81step HLT_2mu8 HLT_e8' ]
 
-## 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',
+data['l1emroi'] = ['1,1,0,EM3,EM7,EM15,EM20,EM50,EM100,2EM3; 1,-1.2,0,EM3,EM7,2EM3',
                    '-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']
 
@@ -105,12 +102,17 @@ if doMuon:
 
 ## #electron chains
 if doElectron:
-    from TrigUpgradeTest.HLTSignatureConfig import elStep1Sequence, elStep2Sequence
+    from TrigUpgradeTest.HLTSignatureConfig import elStep1Sequence, elStep2Sequence, gammStep1Sequence
     elStep1 = elStep1Sequence()
     elStep2 = elStep2Sequence()
+
+    gammStep1 = gammStep1Sequence()
+    
     ElChains  = [
+        Chain(name='HLT_e5'  , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_em",  [elStep1]), ChainStep("Step2_em",  [elStep2]) ] ),
         Chain(name='HLT_e20' , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_em",  [elStep1]), ChainStep("Step2_em",  [elStep2]) ] ),
-        Chain(name='HLT_e8'  , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_em",  [elStep1]), ChainStep("Step2_em",  [elStep2]) ] )
+        Chain(name='HLT_e8'  , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_em",  [elStep1]), ChainStep("Step2_em",  [elStep2]) ] ),
+        Chain(name='HLT_g5'  , Seed="L1_EM7", ChainSteps=[ ChainStep("Step1_gam", [gammStep1]) ] )
         ]
 
     HLTChains += ElChains
@@ -124,9 +126,11 @@ if doCombo:
     muStep1 = muStep1Sequence()
     elStep2 = elStep2Sequence()
     muStep2 = muStep2Sequence()
- 
+
+    
     CombChains =[
-        Chain(name='HLT_mu8_e8' , Seed="L1_MU6_EM7", ChainSteps=[ ChainStep("Step1_mu_em",  [muStep1, elStep1]), ChainStep("Step2_mu_em",  [muStep2, elStep2])] )         
+        Chain(name='HLT_mu8_e8',  Seed="L1_MU6_EM7", ChainSteps=[ ChainStep("Step1_mu_em",  [muStep1, elStep1]), ChainStep("Step2_mu_em",  [muStep2, elStep2])] ),
+        Chain(name='HLT_e5_e8',   Seed="L1_2EM3",    ChainSteps=[ ChainStep("Step1_2em",[elStep1, elStep1]) ])
         ]
 
     HLTChains += CombChains
@@ -139,10 +143,10 @@ if doCombo:
 
     print "enabled Combo chains: ", EnabledMuComboChains,EnabledElComboChains
 
-EnabledChainNamesToCTP = [str(n)+":"+c.name for n,c in enumerate(HLTChains)]
 
+# this is a temporary hack to include new test chains
+EnabledChainNamesToCTP = dict([ (c.name, c.seed)  for c in HLTChains])
 
-print "EnabledChainNamesToCTP: ",EnabledChainNamesToCTP
 
 
 
@@ -152,12 +156,7 @@ L1UnpackingSeq = parOR("L1UnpackingSeq")
 from L1Decoder.L1DecoderConf import CTPUnpackingEmulationTool, RoIsUnpackingEmulationTool, L1Decoder
 l1Decoder = L1Decoder( OutputLevel=DEBUG, RoIBResult="" )
 l1Decoder.prescaler.EventInfo=""
-l1Decoder.ChainToCTPMapping = {'HLT_mu20'     : 'L1_MU8', 
-                               'HLT_mu81step' : 'L1_MU8', 
-                               'HLT_mu8'      : 'L1_MU8', 
-                               'HLT_e20'      : 'L1_EM12', 
-                               'HLT_e8'       : 'L1_EM7', 
-                               'HLT_mu8_e8'   : 'L1_EM3_MU6'}
+l1Decoder.ChainToCTPMapping = EnabledChainNamesToCTP
 l1Decoder.Chains="HLTChainsResult"
 
 ctpUnpacker = CTPUnpackingEmulationTool( OutputLevel =  DEBUG, ForceEnableAllChains=False , InputFilename="ctp.dat" )
@@ -165,11 +164,13 @@ l1Decoder.ctpUnpacker = ctpUnpacker
 
 emUnpacker = RoIsUnpackingEmulationTool("EMRoIsUnpackingTool", OutputLevel=DEBUG, InputFilename="l1emroi.dat", OutputTrigRoIs="L1EMRoIs", Decisions="L1EM" )
 emUnpacker.ThresholdToChainMapping = EnabledElChains + EnabledElComboChains
+emUnpacker.Decisions="L1EM"
 print "EMRoIsUnpackingTool enables chians:"
 print emUnpacker.ThresholdToChainMapping
 
 muUnpacker = RoIsUnpackingEmulationTool("MURoIsUnpackingTool", OutputLevel=DEBUG, InputFilename="l1muroi.dat",  OutputTrigRoIs="L1MURoIs", Decisions="L1MU" )
 muUnpacker.ThresholdToChainMapping = EnabledMuChains + EnabledMuComboChains
+muUnpacker.Decisions="L1MU"
 print "MURoIsUnpackingTool enables chians:"
 print muUnpacker.ThresholdToChainMapping
 
@@ -195,14 +196,6 @@ print L1UnpackingSeq
 # filters: one SeqFilter per step, per chain
 # inputMakers: one per each first RecoAlg in a step (so one per step), one input per chain that needs that step
 
-# map L1 decisions for menu
-for unpack in l1Decoder.roiUnpackers:
-    if unpack.name() is "EMRoIsUnpackingTool":
-        unpack.Decisions="L1EM"
-    if unpack.name() is "MURoIsUnpackingTool":
-        unpack.Decisions="L1MU"
-
-        
 
 from AthenaCommon.AlgSequence import AlgSequence, AthSequencer, dumpSequence
 topSequence = AlgSequence()
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py
index cd96edbd05ae4a2e0c5b392cfd69e9cd496a0a96..ebcd21c42175472960d1c0aaaed23c7b53da6113 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py
@@ -16,6 +16,7 @@ include("TrigUpgradeTest/testHLT_MT.py")
 ##########################################
 
 doElectron = True
+doPhoton = False
 doMuon   = True
 doJet    = False
 doCombo  = True
@@ -29,7 +30,12 @@ EnabledElComboChains = []
 
 testChains = []
 
+#common parts:
+fastCaloStep=None
+
+##################################################################
 # egamma chains
+##################################################################
 if (doElectron):
     from TrigUpgradeTest.electronMenuDefs import fastCaloSequence, electronSequence
     fastCaloStep=fastCaloSequence()
@@ -46,8 +52,25 @@ if (doElectron):
         ]
     testChains += egammaChains
 
+##################################################################
+# photon chains
+##################################################################
+if (doPhoton):
+    from TrigUpgradeTest.photonMenuDefs import fastCaloSequence, photonSequence
+
+    photonstep= photonSequence()
+    if  fastCaloStep is None:
+        fastCaloStep=fastCaloSequence()
+
+    photonChains = [
+        Chain(name='HLT_g5_etcut', Seed="L1_EM3",  ChainSteps=[ ChainStep("Step1_g5_etcut", [fastCaloStep]),  ChainStep("Step2_g5_etcut", [photonstep])]  )
+        ]
+
+    testChains += photonChains
 
+##################################################################
 # muon chains
+##################################################################
 if (doMuon):
     from TrigUpgradeTest.muMenuDefs import muFastStep, muCombStep, doL2SA, doL2CB, doEFSA
     MuonChains  = []
@@ -64,7 +87,9 @@ if (doMuon):
     testChains += MuonChains
 
 
+##################################################################
 # jet chains
+##################################################################
 if (doJet):
     from TrigUpgradeTest.jetMenuDefs import jetSequence
 
@@ -77,7 +102,9 @@ if (doJet):
         ]
     testChains += jetChains
 
-
+##################################################################
+# combined chains
+##################################################################
 if (doCombo):
     # combo chains
     comboChains= []
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref
index 44536af41bdd905be8095a648bbcff12f1621aab..34ebbe260050bf993ee5995036f4f07c2c142cf0 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref
@@ -39,6 +39,7 @@ TriggerSummaryStep1                     5   0     DEBUG  +++ HLT_e3_etcut1step I
 TriggerSummaryStep1                     5   0     DEBUG  +++ HLT_mu6 ID#1672162766
 TriggerSummaryStep1                     5   0     DEBUG  +++ HLT_e7_etcut ID#2430733989
 TriggerSummaryStep1                     5   0     DEBUG  +++ HLT_e3_etcut ID#2711808158
+TriggerSummaryStep1                     5   0     DEBUG  +++ HLT_e3_etcut_mu6 ID#3189262314
 TriggerSummaryStep2                     5   0     DEBUG  +++ HLT_mu6Comb ID#393364983
 TriggerSummaryStep2                     5   0     DEBUG  +++ HLT_e5_etcut ID#607406625
 TriggerSummaryStep2                     5   0     DEBUG  +++ HLT_e7_etcut ID#2430733989
@@ -125,7 +126,7 @@ TrigSignatureMoniMT                                INFO HLT_2mu6
 TrigSignatureMoniMT                                INFO HLT_2mu6Comb                  20        20        0         0         0         
 TrigSignatureMoniMT                                INFO HLT_e3_etcut                  20        20        18        17        17        
 TrigSignatureMoniMT                                INFO HLT_e3_etcut1step             20        20        18        0         18        
-TrigSignatureMoniMT                                INFO HLT_e3_etcut_mu6              20        20        3         0         0         
+TrigSignatureMoniMT                                INFO HLT_e3_etcut_mu6              20        20        10        0         1         
 TrigSignatureMoniMT                                INFO HLT_e5_etcut                  20        20        17        16        16        
 TrigSignatureMoniMT                                INFO HLT_e7_etcut                  20        20        15        14        14        
 TrigSignatureMoniMT                                INFO HLT_mu6                       20        20        3         0         3         
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
index eb786fad010c7fcf8ae7fd7a9ff7eb3a1aa296e5..911521d6367b8c3c2f2f0c3c22b8bca1403b4180 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
+++ b/Trigger/TriggerCommon/TriggerMenuMT/CMakeLists.txt
@@ -110,10 +110,10 @@ atlas_install_scripts( scripts/generateL1TopoMenuMT.py )
 
 atlas_install_xmls( data/*.dtd data/*.xml )
 
-atlas_add_test( generateMenuMT SCRIPT scripts/testMenuMT.sh 
-                PROPERTIES TIMEOUT 500 
-                POST_EXEC_SCRIPT "check_log.pl --config checklogTriggerTest.conf generateMenuMT.log"
-              )
+#atlas_add_test( generateMenuMT SCRIPT scripts/testMenuMT.sh 
+#                PROPERTIES TIMEOUT 500 
+#                POST_EXEC_SCRIPT "check_log.pl --config checklogTriggerTest.conf generateMenuMT.log"
+#              )
 
 
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py
index 5f7ceaa7721e3a3066239f868e9e2ba198974837..2bacd19e84e9fd24bc24a36b8e8dfcaf811fe696 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFConfig.py
@@ -39,29 +39,28 @@ def makeStreamESD(name, flatDecisions):
         addTC( tc )
 
     addTC("HLTSummary")
-    if log.isEnabledFor(logging.DEBUG):
-        log.debug("ESD file content: ")
-        log.debug( StreamESD.ItemList  )
+    log.debug("ESD file content: ")
+    log.debug( StreamESD.ItemList  )
     return StreamESD
 
 
-def create_step_reco_node(name, seq_list, dump=False):
+def createStepRecoNode(name, seq_list, dump=False):
     """ elementary HLT reco step, contianing all sequences of the step """
-    if log.isEnabledFor(logging.DEBUG):
-        log.debug("Create reco step %s with %d sequences", name, len(seq_list))
+
+    log.debug("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)             
+        step_seq = createCFTree(seq)             
         stepCF += step_seq
     
     if dump: dumpSequence (stepCF, indent=0)        
     return stepCF
 
 
-def create_step_filter_node(name, seq_list, dump=False):
+def createStepFilterNode(name, seq_list, dump=False):
     """ elementary HLT filter step: OR node containing all Filters of the sequences. The node gates execution of next reco step """
-    if log.isEnabledFor(logging.DEBUG):
-        log.debug("Create filter step %s with %d filters", name, len(seq_list))
+
+    log.debug("Create filter step %s with %d filters", name, len(seq_list))
     stepCF = parOR(name+"_filter")
     for seq in seq_list:
         filterAlg=seq.filter.Alg                    
@@ -73,45 +72,48 @@ def create_step_filter_node(name, seq_list, dump=False):
 
 
 
-def create_step_sequence(name, filterAlg, rest,sublist):
+def createStepSequence(name, filterAlg, rest,sublist):
     """ elementary HLT step sequencer, filterAlg is gating, rest is anything that needs to happe within the step """
+    
     toadd=rest
     for k, v in sublist.iteritems():
         seq= seqAND(k, v)
-        toadd.append(seq)
-        
+        toadd.append(seq)        
     stepReco = parOR(name+"_reco", toadd)    
     stepAnd = seqAND(name, [ filterAlg, stepReco ])
     return stepAnd
 
 
-def create_CFSequence(CFseq):
+def createCFTree(CFseq):
     """ Creates AthSequencer nodes with sequences attached """
-    if log.isEnabledFor(logging.DEBUG):
-        log.debug(" *** Create CFSequence %s with FilterAlg %s *", CFseq.name, CFseq.filter.Alg.name())
-    filterAlg=CFseq.filter.Alg
-
 
+    log.debug(" *** Create CF Tree for CFSequence %s", CFseq.name)
+        
+    filterAlg=CFseq.filter.Alg
     stepReco = parOR(CFseq.name+"_reco") # all reco algoritms from al lthe sequences in a parallel sequence
     seqAndView = seqAND(CFseq.name+"_view", [stepReco]) #include in seq:And to run in views: add here the Hypo
     seqAndWithFilter = seqAND(CFseq.name, [filterAlg, seqAndView]) # add to the main step+filter
-    
+
+    already_connected = []
     for menuseq in CFseq.step.sequences:
-        ath_sequence=menuseq.sequence.Alg
-        subs = ath_sequence
-        stepReco += subs
+        ath_sequence = menuseq.sequence.Alg
+        name = ath_sequence.name()
+        if name in already_connected:
+            log.debug("AthSequencer %s already in the Tree, not added again",name)
+        else:
+            already_connected.append(name)
+            stepReco += ath_sequence
         seqAndView += menuseq.hypo.Alg 
 
     if CFseq.step.isCombo:
         seqAndView += CFseq.step.combo.Alg
-        print CFseq.step.combo.Alg
         
     return seqAndWithFilter
 
 
 def addChainToHypoAlg(hypoAlg, chain):
     """ Tmp functions for Combo Hypo """
-    if "Comb" in hypoAlg.algname:
+    if "Comb" in hypoAlg.Alg.name():
         prop="Chains"
         cval = hypoAlg.Alg.getProperties()[prop]
         try:
@@ -183,8 +185,8 @@ def makeHLTTree(HLTChains):
 
 def decisionTree_From_Chains(HLTNode, chains):
     """ creates the decision tree, given the starting node and the chains containing the sequences  """
-    if log.isEnabledFor(logging.DEBUG):
-        log.debug("Run decisionTree_From_Chains on %s", HLTNode.name())
+
+    log.debug("Run decisionTree_From_Chains on %s", HLTNode.name())
 
     from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import CFSequence, RoRSequenceFilterNode, ComboMaker
     HLTNodeName= HLTNode.name()
@@ -193,12 +195,12 @@ def decisionTree_From_Chains(HLTNode, chains):
     NSTEPS=0
     for chain in chains:
         steps =len(chain.steps)
-        if log.isEnabledFor(logging.DEBUG):
-            log.debug("Adding chain %s with %d steps"%(chain.name,steps))
+
+        log.debug("Adding chain %s with %d steps"%(chain.name,steps))
         if NSTEPS < steps:
             NSTEPS = steps
             
-    if log.isEnabledFor(logging.DEBUG):
+
         log.debug("Run on %d steps", NSTEPS)
     
 
@@ -222,23 +224,20 @@ def decisionTree_From_Chains(HLTNode, chains):
             chain_step=chain.steps[nstep]
             log.debug("\n************* Start step %d %s for chain %s", nstep+1, stepCF_name, chain.name)            
             
-            # one filter per step_chain
+            # one filter per ChainStep - same name indeed
             # one filter input per previous menusequence output (the L1Seed for first step)
             # one filter output per menuSeq
             
             filter_input =[]
             if nstep == 0: # L1 seeding
-                previous_sequence="".join(chain.group_seed)              
                 seeds=chain.group_seed
                 filter_input.extend( seeds )
 
-                log.debug("Found these seeds from the sequence: %s", seeds)
-                log.debug("Seeds from this chain: %s", filter_input)
+                log.debug("Found these seeds from the chain: %s", seeds)
+                log.debug("Seeds added; having in the filter now: %s", filter_input)
                 previous_seeds=seeds  
                                       
             else:
-                # from previous step, map the seuqence in the same order?
-                previous_sequence = chain_step.name
                 prev=chain.steps[nstep-1].sequences
                 previous_seeds=[]
                 for seq in prev:
@@ -250,23 +249,27 @@ def decisionTree_From_Chains(HLTNode, chains):
                     log.error("found %d filter inputs and %d seeds", len(filter_input), len(previous_seeds))
                     sys.exit("ERROR, in size")
                     
-          
-            (sfilter, alreadyFoundFilter) = buildFilter(chain_step.name, previous_sequence, CFseq_list, chain, filter_input, previous_seeds)
-            #(sfilter, alreadyFoundFilter) = buildFilter(stepCF_name, previous_sequence, CFseq_list, chain, filter_input, previous_seeds)
-             
-            if not alreadyFoundFilter:
+
+            # get the filter:
+            filter_name="Filter_%s" % chain_step.name
+
+            (foundFilter, sfilter) = findFilter(filter_name, CFseq_list)
+            if not foundFilter:           
+                sfilter = buildFilter(filter_name, chain, filter_input, previous_seeds)
                 CF_seq = CFSequence( ChainStep=chain_step, FilterAlg=sfilter)
                 CFseq_list.append(CF_seq)
                 for sequence in chain_step.sequences:                
-                    step_decisions.extend(sequence.outputs)                
+                    step_decisions.extend(sequence.outputs)
+
+            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:  
-                if log.isEnabledFor(logging.DEBUG):
-                    log.debug("Adding finalDecisions for chain %s at step %d:"%(chain.name, 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)
-                    if log.isEnabledFor(logging.DEBUG):
-                        log.debug(seq.outputs)
+                    log.debug(seq.outputs)
             
             #end of loop over menu sequences
                 
@@ -274,12 +277,12 @@ def decisionTree_From_Chains(HLTNode, chains):
     
         log.debug("\n******** Create CF Tree %s with AthSequencers", stepCF_name)        
         #first make the filter step
-        stepFilter = create_step_filter_node(stepCF_name, CFseq_list, dump=False)
+        stepFilter = createStepFilterNode(stepCF_name, CFseq_list, dump=False)
         HLTNode += stepFilter
         allSeq_list.append(CFseq_list)
 
         # then the reco step
-        stepCF = create_step_reco_node("%s_%s"%(HLTNodeName,stepCF_name), CFseq_list, dump=False)
+        stepCF = createStepRecoNode("%s_%s"%(HLTNodeName,stepCF_name), CFseq_list, dump=False)
         HLTNode += stepCF
 
 
@@ -299,48 +302,51 @@ def decisionTree_From_Chains(HLTNode, chains):
 
     log.debug("finalDecisions: %s" %str( finalDecisions) )
     all_DataFlow_to_dot(HLTNodeName, allSeq_list)
+    
     return finalDecisions
 
 
 
-## This can be simplified!
-def buildFilter(stepCF_name, previous_sequence, CFseq_list, chain, filter_input, previous_seeds):
+def findFilter(filter_name, cfseqList):
+      """
+      searches for a filter, with given name, in the CF sequence list of this step
+      """
+      log.debug( "findFilter: filter name %s" % filter_name )
+      foundFilters = [cfseq.filter for cfseq in cfseqList if filter_name in cfseq.filter.Alg.name()]
+      if len(foundFilters) > 1:
+          log.error("found %d filters  with name %s", len( foundFilters ), filter_name)
+          sys.exit("ERROR, in filter configuration")
+
+      found = bool(foundFilters)
+      if found:          
+          log.debug("Filter %s already exists", filter_name)        
+          return (found, foundFilters[0])
+      return (found, None)
+
+
+
+def buildFilter(filter_name, chain, filter_input, previous_seeds):
     """
      Build the 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 
     """
-    from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import  RoRSequenceFilterNode
-    #filter_name="Filter%s_on_%s"%( stepCF_name, previous_sequence )
-    filter_name="Filter_%s" % stepCF_name
-    log.debug( "Trying to create filter of name %s" % filter_name )
-    foundFilters = [cfseq.filter for cfseq in CFseq_list if filter_name in cfseq.filter.algname]
-
-    if len(foundFilters) > 1:
-        log.error("found %d filters  with name %s", len( foundFilters ), filter_name)
-        sys.exit("ERROR, in filter configuration")
-
-    if foundFilters:
-        sfilter=foundFilters[0]
-        sfilter.setChains(chain.name)
-        log.debug("Filter %s already exists", filter_name)
-        log.debug("Adding chain %s to %s", chain.name,sfilter.algname)
-        log.debug(sfilter.getChains())
-
-    else:
-        sfilter = RoRSequenceFilterNode(name=filter_name)
-        for i in previous_seeds: sfilter.addSeed(i)
-        for i in filter_input: sfilter.addInput(i)                        
-        filter_out=["%s_from_%s"%(filter_name,i) for i in filter_input]
-        for o in filter_out: sfilter.addOutput(o)            
-        sfilter.setChains(chain.name)    
-        log.debug("Adding these seeds to filter: %s", previous_seeds)
-        log.debug("Filter Done: %s", sfilter.name)
-
-
-    return (sfilter, bool(foundFilters) )
+    from TriggerMenuMT.HLTMenuConfig.Menu.MenuComponents import  RoRSequenceFilterNode       
+    sfilter = RoRSequenceFilterNode(name=filter_name)
+    for i in previous_seeds: sfilter.addSeed(i)
+    for i in filter_input: sfilter.addInput(i)
+        
+    filter_out=["%s_from_%s"%(filter_name,i) for i in filter_input]
+    for o in filter_out: sfilter.addOutput(o)            
+#    sfilter.setChains(chain.name)    
+    log.debug("Added inputs to filter: %s", sfilter.getInputList())
+    log.debug("Added outputs to filter: %s", sfilter.getOutputList())
+    log.debug("Added seeds to filter: %s", sfilter.seeds)
+    log.debug("Filter Done: %s", sfilter.Alg.name())
+
+
+    return (sfilter)
 
 
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py
index 4ac66ce7c3f46c14e2a80316003efc594e62101a..7ec27941cb7f2c2966c4367baf240561fec9725c 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/HLTCFDot.py
@@ -84,7 +84,7 @@ def all_DataFlow_to_dot(name, step_list):
             last_step_hypoNodes =[]
             for cfseq in cfseq_list:
 #                print cfseq.name
-                file.write("  %s[fillcolor=%s style=filled]\n"%(cfseq.filter.algname,algColor(cfseq.filter.Alg)))            
+                file.write("  %s[fillcolor=%s style=filled]\n"%(cfseq.filter.Alg.name(),algColor(cfseq.filter.Alg)))            
                 step_connections.append(cfseq.filter)                      
                 file.write(  '\n  subgraph cluster_%s {\n'%(cfseq.name)\
                             +'     node [color=white style=filled]\n'\
@@ -106,17 +106,17 @@ def all_DataFlow_to_dot(name, step_list):
                     cfseq_algs.append(menuseq.maker)
                     cfseq_algs.append(menuseq.sequence )
                     if menuseq.reuse==False:
-                        file.write("    %s[fillcolor=%s]\n"%(menuseq.maker.algname, algColor(menuseq.maker.Alg)))
-                        file.write("    %s[fillcolor=%s]\n"%(menuseq.sequence.algname, algColor(menuseq.sequence.Alg)))
+                        file.write("    %s[fillcolor=%s]\n"%(menuseq.maker.Alg.name(), algColor(menuseq.maker.Alg)))
+                        file.write("    %s[fillcolor=%s]\n"%(menuseq.sequence.Alg.name(), algColor(menuseq.sequence.Alg)))
                         menuseq.reuse=True
                     cfseq_algs.append(menuseq.hypo)
                     if not cfseq.step.isCombo:
                         last_step_hypoNodes.append(menuseq.hypo)
-                    file.write("    %s[color=%s]\n"%(menuseq.hypo.algname, algColor(menuseq.hypo.Alg)))
+                    file.write("    %s[color=%s]\n"%(menuseq.hypo.Alg.name(), algColor(menuseq.hypo.Alg)))
 
                     #combo
                 if cfseq.step.isCombo:
-                    file.write("    %s[color=%s]\n"%(cfseq.step.combo.algname, algColor(cfseq.step.combo.Alg)))
+                    file.write("    %s[color=%s]\n"%(cfseq.step.combo.Alg.name(), algColor(cfseq.step.combo.Alg)))
                     cfseq_algs.append(cfseq.step.combo)
                     last_step_hypoNodes.append(cfseq.step.combo)
                 file.write('  }\n')              
@@ -143,9 +143,9 @@ def stepCF_DataFlow_to_dot(name, cfseq_list):
 
         for cfseq in cfseq_list:
 #            print cfseq.name
-            file.write("  %s[fillcolor=%s style=filled]\n"%(cfseq.filter.algname,algColor(cfseq.filter.Alg)))
+            file.write("  %s[fillcolor=%s style=filled]\n"%(cfseq.filter.Alg.name(),algColor(cfseq.filter.Alg)))
             for inp in cfseq.filter.getInputList():
-                file.write(addConnection(name, cfseq.filter.algname, inp))
+                file.write(addConnection(name, cfseq.filter.Alg.name(), inp))
 
             file.write(  '\n  subgraph cluster_%s {\n'%(cfseq.name)\
                         +'     node [color=white style=filled]\n'\
@@ -167,16 +167,16 @@ def stepCF_DataFlow_to_dot(name, cfseq_list):
                 cfseq_algs.append(menuseq.maker)
                 cfseq_algs.append(menuseq.sequence )
                 if menuseq.reuse==False:
-                    file.write("    %s[fillcolor=%s]\n"%(menuseq.maker.algname, algColor(menuseq.maker.Alg)))
-                    file.write("    %s[fillcolor=%s]\n"%(menuseq.sequence.algname, algColor(menuseq.sequence.Alg)))
+                    file.write("    %s[fillcolor=%s]\n"%(menuseq.maker.Alg.name(), algColor(menuseq.maker.Alg)))
+                    file.write("    %s[fillcolor=%s]\n"%(menuseq.sequence.Alg.name(), algColor(menuseq.sequence.Alg)))
                     menuseq.reuse=True
                 cfseq_algs.append(menuseq.hypo)
-                file.write("    %s[color=%s]\n"%(menuseq.hypo.algname, algColor(menuseq.hypo.Alg)))
+                file.write("    %s[color=%s]\n"%(menuseq.hypo.Alg.name(), algColor(menuseq.hypo.Alg)))
 
 
                 #combo
             if cfseq.step.isCombo:
-                file.write("    %s[color=%s]\n"%(cfseq.step.combo.algname, algColor(cfseq.step.combo.Alg)))
+                file.write("    %s[color=%s]\n"%(cfseq.step.combo.Alg.name(), algColor(cfseq.step.combo.Alg)))
                 cfseq_algs.append(cfseq.step.combo)
             file.write('  }\n')              
 
@@ -196,8 +196,8 @@ def findConnections(alg_list):
         dataIntersection = list(set(outs) & set(ins))
         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)
+                lineconnect+=addConnection(nodeA.Alg.name(),nodeB.Alg.name(), line)
+#                print 'Data connections between %s and %s: %s'%(nodeA.Alg.name(), nodeB.Alg.name(), line)
     return lineconnect
 
 
@@ -216,8 +216,8 @@ def findDHconnections(nodeA, nodeB):
     dataIntersection = list(set(outs) & set(ins))
     if len(dataIntersection) > 0:
         for line in dataIntersection:
-            lineconnect+=addConnection(nodeA.algname,nodeB.algname, line)
-            print 'Data DH connections between %s and %s: %s'%(nodeA.algname, nodeB.algname, line)
+            lineconnect+=addConnection(nodeA.Alg.name(),nodeB.Alg.name(), line)
+            print 'Data DH connections between %s and %s: %s'%(nodeA.Alg.name(), nodeB.Alg.name(), line)
     return lineconnect
     
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuChains.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuChains.py
index 8fc5968b97977ace09757562f7f149ae050b80f3..5184421bf9c2e4081162416f8690c464962419a9 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuChains.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuChains.py
@@ -4,7 +4,9 @@
 ## chain name, HypoTool confname (for combined chains there is more than one)
 
 ChainDictionary ={  'HLT_e8'           : ['HLT_e8'],
+                    'HLT_e5'           : ['HLT_e5'],
                     'HLT_e20'          : ['HLT_e20'],
+                    'HLT_g5'           : ['HLT_g5'],
                     'HLT_mu6'          : ['HLT_mu6'],
                     'HLT_mu6Comb'      : ['HLT_mu6'],
                     'HLT_mu6fast'      : ['HLT_mu6'],
@@ -13,7 +15,8 @@ ChainDictionary ={  'HLT_e8'           : ['HLT_e8'],
                     'HLT_mu20'         : ['HLT_mu20'],
                     'HLT_2mu6'         : ['HLT_2mu6'], # review double object
                     'HLT_2mu6Comb'     : ['HLT_2mu6'], # review double object
-                    'HLT_mu8_e8'       : ['HLT_mu8','HLT_e8'],                    
+                    'HLT_mu8_e8'       : ['HLT_mu8','HLT_e8'],
+                    'HLT_e5_e8'        : ['HLT_e5', 'HLT_e8'],
                     'HLT_e3_etcut'     : ['HLT_e3_etcut'],
                     'HLT_e3_etcut1step': ['HLT_e3_etcut'],
                     'HLT_e5_etcut'     : ['HLT_e5_etcut'],
@@ -21,6 +24,7 @@ ChainDictionary ={  'HLT_e8'           : ['HLT_e8'],
                     'HLT_mu6_e3_etcut' : ['HLT_mu6', 'HLT_e3_etcut'],
                     'HLT_e3_etcut_mu6' : ['HLT_e3_etcut', 'HLT_mu6'],
                     'HLT_g5_etcut'     : ['HLT_g5_etcut'],
+                    'HLT_e3_g5_etcut'  : ['HLT_e3_etcut', 'HLT_g5_etcut'],
                     'HLT_j85'          : ['HLT_j85'],
                     'HLT_j100'         : ['HLT_j100'],
                     'HLT_j35_gsc45_boffperf_split' : ['HLT_j35_gsc45_boffperf_split'],
@@ -37,7 +41,7 @@ def getConfFromChainName(name):
     else:
         return [name]
     log.error("MenuChains.getConfFromChainName: Wrong chain name given: found %s",name)
-    sys.exit("ERROR, in chain configuration") 
+    sys.exit("ERROR, in getConfFromChainName: Wrong chain configuration") 
 
 
     
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
index 2c61801bbc50ecaed9ee664ff85286ae10bf46cb..e718d619b999d959936b6e0a6ce72808dd218a32 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/MenuComponents.py
@@ -12,7 +12,7 @@ class Node():
     def __init__(self, Alg):
         self.name = ("%sNode")%( Alg.name())
         self.Alg=Alg
-        self.algname = Alg.name()
+#        self.algname = Alg.name()
         self.inputs=[]
         self.outputs=[]
         
@@ -29,7 +29,7 @@ class Node():
         return self.inputs
 
     def __str__(self):
-        return "Node::%s  [%s] -> [%s]"%(self.algname, ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList())))
+        return "Node::%s  [%s] -> [%s]"%(self.Alg.name(), ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList())))
 
 
     
@@ -42,12 +42,12 @@ class AlgNode(Node):
 
     def addDefaultOutput(self):
         if self.outputProp is not '':
-            self.addOutput(("%s_%s"%(self.algname,self.outputProp)))
+            self.addOutput(("%s_%s"%(self.Alg.name(),self.outputProp)))
         
     def setPar(self, prop, name):
         cval = self.Alg.getProperties()[prop]
         try:
-            if type(cval) == type(list()):                
+            if type(cval) == type(list()):
                 cval.append(name)
                 return setattr(self.Alg, prop, cval)
             else:
@@ -63,10 +63,18 @@ class AlgNode(Node):
         raise "Error in reading property " + prop + " from " + self.Alg
 
     def addOutput(self, name):
-        if self.outputProp is not '':
-            return self.setPar(self.outputProp,name) 
-    
-    def getOutputList(self):
+        outputs = self.readOutputList()
+        if name in outputs:
+            log.debug("Warning, %s already set in %s, DH not added",name, self.name)
+        else:
+            if self.outputProp is not '':
+                self.setPar(self.outputProp,name)
+            else:
+                sys.exit("no OutputProp set")
+        Node.addOutput(self, name)
+       
+
+    def readOutputList(self):
         outputs = []
         cval = self.getPar(self.outputProp)
         if cval == '':
@@ -78,10 +86,18 @@ class AlgNode(Node):
         return outputs
   
     def addInput(self, name):
-        if self.inputProp is not '':
-            return self.setPar(self.inputProp,name)
-    
-    def getInputList(self):
+        inputs = self.readInputList()
+        if name in inputs:
+            log.debug("Warning, %s already set in %s, DH not added",name, self.name)
+        else:
+            if self.inputProp is not '':
+                self.setPar(self.inputProp,name)
+            else:
+                sys.exit("no InputProp set")
+        Node.addInput(self, name)
+
+
+    def readInputList(self):
         inputs = []
         cval = self.getPar(self.inputProp)
         if cval =='':
@@ -93,7 +109,7 @@ class AlgNode(Node):
         return inputs
 
     def __str__(self):
-        return "Alg::%s  [%s] -> [%s]"%(self.algname, ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList())))
+        return "Alg::%s  [%s] -> [%s]"%(self.Alg.name(), ' '.join(map(str, self.getInputList())), ' '.join(map(str, self.getOutputList())))
     
 
 class HypoToolConf():
@@ -119,7 +135,7 @@ class HypoAlgNode(AlgNode):
     def __init__(self, Alg):
         assert isHypoBase(Alg), "Error in creating HypoAlgNode from Alg "  + Alg.name()
         AlgNode.__init__(self, Alg, 'HypoInputDecisions', 'HypoOutputDecisions')
-        self.addDefaultOutput()
+       # self.addDefaultOutput()
         self.tools = []
         self.previous=[]
 
@@ -156,8 +172,7 @@ class SequenceFilterNode(AlgNode):
         self.seeds = []
               
     def setChains(self, name):
-        if log.isEnabledFor(logging.DEBUG):
-            log.debug("Adding Chain %s to filter %s"%(name, self.name))
+        log.debug("Adding Chain %s to filter %s"%(name, self.Alg.name()))
         return self.setPar("Chains", name)
     
     def getChains(self):
@@ -166,6 +181,8 @@ class SequenceFilterNode(AlgNode):
     def addSeed(self, seed):
         self.seeds.append(seed)
 
+
+    
     def __str__(self):
         return "SequenceFilter::%s  [%s] -> [%s], seeds=[%s], chains=%s"%(self.Alg.name(),' '.join(map(str, self.getInputList())),' '.join(map(str, self.getOutputList())), ' '.join(map(str, self.seeds)), self.getChains()) 
 
@@ -190,16 +207,14 @@ from DecisionHandling.DecisionHandlingConf import ComboHypo
 class ComboMaker(AlgNode):
     def __init__(self, name):
         Alg = ComboHypo(name)
-        if log.isEnabledFor(logging.DEBUG):
-            log.debug("Making combo Alg %s"%name)
+        log.debug("Making combo Alg %s"%name)
         AlgNode.__init__(self,  Alg, 'HypoInputDecisions', 'HypoOutputDecisions')
         Alg.OutputLevel = logLevel
         self.prop="MultiplicitiesMap"
 
 
     def addChain(self, chain):
-        if log.isEnabledFor(logging.DEBUG):
-            log.debug("ComboMaker %s adding chain %s"%(self.algname,chain))
+        log.debug("ComboMaker %s adding chain %s"%(self.Alg.name(),chain))
         from MenuChains import getConfFromChainName
         confs=getConfFromChainName(chain)
         for conf in confs:
@@ -242,6 +257,34 @@ def isInputMakerBase(alg):
 
 def isFilterAlg(alg):
     return isinstance(alg, RoRSeqFilter)
+
+
+class WrappedList:
+    def __init__(self, lst):
+        self._lst = lst
+    def __getitem__(self, item):
+        return self._lst[item]
+    def __setitem__(self, item):
+        return self._lst.append(item)
+
+    
+#class duplicatedHypos(WrappedList):
+
+## 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
+
         
 ##########################################################
 # NOW sequences and chains
@@ -263,56 +306,54 @@ class MenuSequence():
         self.reuse = False # flag to draw dot diagrmas
 
     def replaceHypoForCombo(self, HypoAlg):
-        if log.isEnabledFor(logging.DEBUG):
-            log.debug("set new Hypo %s for combo sequence %s "%(HypoAlg.name(), self.name))
+        log.debug("set new Hypo %s for combo sequence %s "%(HypoAlg.name(), self.name))
         self.hypo= HypoAlgNode( Alg=HypoAlg)
+    
+    def connectToFilter(self,sfilter, line):
+        new_output = "%s_from_%s"%(self.hypo.Alg.name(), line)
+        self.hypo.addOutput(new_output)
+#        print self.hypo.readOutputList()
+#        print self.hypo.outputs
+        self.outputs.append(new_output)
 
-    def connectToFilter(self,sfilter):
-        filter_output = sfilter.getOutputList()
-        inputs=[filter_output[i] for i,fseed in enumerate (sfilter.seeds) if self.seed in fseed  ]
-        if log.isEnabledFor(logging.DEBUG):
-            log.debug("connectToFilter: found %d inputs to sequence::%s from Filter::%s (from seed %s)",
-                          len(inputs), self.name, sfilter.algname, self.seed)
-            for i in inputs: log.debug("- "+i)
-        if len(inputs) == 0:
-                sys.exit("ERROR, no inputs to sequence are set!")
-        for inp in inputs:
-            new_output = "%s_from_%s"%(self.hypo.algname, inp)
-            self.hypo.addOutput(new_output)
-            self.outputs.append( new_output)
-        
         #### Connect the InputMaker
-        for i in inputs:
-            self.maker.addInput(i)
-            self.inputs.append(i)
-        input_maker_output=["%s_from_%s"%(self.maker.algname,i)  for i in inputs  ]
-        if len(input_maker_output) == 0:
-            sys.exit("ERROR, no outputs to sequence are set!")
-        for out in input_maker_output:
-            self.maker.addOutput(out) 
-            self.hypo.setPreviousDecision(out)
-        if log.isEnabledFor(logging.DEBUG):
-            log.debug("connectToFilter: connecting InputMaker to HypoAlg: adding %d output to InputMaker::%s and sending to HypoAlg::%s",
-                          len(inputs), self.maker.algname, self.hypo.algname)
-        for i in inputs: log.debug(i)
+        self.maker.addInput(line)       
+        self.inputs.append(line)
+        
+        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(),  )
 
+        
     def __str__(self):
-        return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence)
+        return "MenuSequence::%s \n Hypo::%s \n Maker::%s \n Sequence::%s"%(self.name, self.hypo, self.maker, self.sequence, new_output)
 
     
 class Chain:
     """Basic class to define the trigger menu """
     def __init__(self, name, Seed, ChainSteps=[]):
         self.name = name
-        self.seed=Seed
         self.steps=ChainSteps         
-        self.vseeds = Seed.strip().split("_")        
-        self.vseeds.pop(0) #remove first L1 string
+        self.seed=Seed
+        self.vseeds=[]
+        vseeds = Seed.strip().split("_")        
+        vseeds.pop(0) #remove first L1 string
+        # split multi seeds
+        for seed in vseeds:
+            split=re.findall(r"(\d+)?([A-Z]+\d+)", seed)
+            mult,single = split[0]
+            if not mult: mult=1
+            else: mult=int(mult)
+#            print mult,single
+            for m in range(0,mult): self.vseeds.append(single) 
+            
         # group_seed is used to se tthe seed type (EM, MU,JET), removing the actual threshold
         self.group_seed  = ["L1"+filter(lambda x: x.isalpha(), stri) for stri in self.vseeds]
         self.setSeedsToSequences() # save seed of each menuseq
-        if log.isEnabledFor(logging.DEBUG):
-            log.debug("Chain " + name + " with seeds: %s "%str( self.vseeds))
+        log.debug("Chain " + name + " with seeds: %s "%str( self.vseeds))
 
         for step in self.steps:
             if step.isCombo:
@@ -330,8 +371,7 @@ class Chain:
                 for step in self.steps:
                     seq=step.sequences[nseq]
                     seq.seed ="L1"+filter(lambda x: x.isalpha(), seed)
-                    if log.isEnabledFor(logging.DEBUG):
-                        log.debug( "Chain %s adding seed %s to sequence %d in step %s"%(self.name, seq.seed, nseq, step.name))
+                    log.debug( "Chain %s adding seed %s to sequence %d in step %s"%(self.name, seq.seed, nseq, step.name))
                 nseq+=1
            
         else:
@@ -355,17 +395,46 @@ class Chain:
                 
 
 class CFSequence():
-    """Class to describe the ChainStep + filter"""
+    """Class to describe the ChainStep + filter
+   
+    """
     def __init__(self, ChainStep, FilterAlg):
         self.name = ChainStep.name   # not needed?     
         self.filter = FilterAlg
-        self.step=ChainStep
+        self.step = ChainStep
         self.connect()
 
     def connect(self):
-        """Connect filter to ChainStep (all its sequences)"""
+        """Connect filter to ChainStep (all its sequences)
+        if a ChainStep contains the same sequence multiple times (for multi-object chains), 
+        the filter is connected only once (to avoid multiple DH links)
+        """
+
+        log.debug("CFSequence: Connect Filter %s with menuSequences of step %s"%(self.filter.Alg.name(), self.step.name))
+        filter_output = self.filter.getOutputList()
+        if len(filter_output) == 0:
+            sys.exit("ERROR, no filter outputs are set!")
+
+        # check whether the number of filter outputs are the same as the number of sequences in the step
+        if len(filter_output) != len(self.step.sequences):
+            sys.exit("ERROR: Found %d filter outputs differnt from %d MenuSequences in Step %s"%( len(self.filter.getOutputList()), len(self.step.sequences), self.step.name))
+                        
+        
+        nseq=0
         for seq in self.step.sequences:
-            seq.connectToFilter(self.filter)
+            #check that they have the same SEED
+            if seq.seed != self.filter.seeds[nseq]:
+                sys.exit("ERROR: sequence and filteroutput have different seeds:  %s  %s"%(seq.seed, self.filter.seeds[nseq]))
+            
+            if seq.seed not in self.filter.seeds:
+                sys.exit("ERROR: not seed %s found in Filter %s"%(seq.seed, self.filter.name))
+
+            line = filter_output[nseq]
+            log.debug("Found input %s to sequence::%s from Filter::%s (from seed %s)", line, seq.name, self.filter.Alg.name(), seq.seed)
+
+            seq.connectToFilter(self.filter, line )
+            nseq+=1
+            
 
         if self.step.isCombo: self.connectCombo()
 
@@ -377,13 +446,13 @@ class CFSequence():
         for seq in self.step.sequences:
             combo_input=seq.hypo.getOutputList()[0]
             self.step.combo.addInput(combo_input)
-            log.debug("Adding inputs %s to combo %s"%(combo_input, self.step.combo.algname))
+            log.debug("Adding inputs %s to combo %s"%(combo_input, self.step.combo.Alg.name()))
             # inputs are the output decisions of the hypos of the sequences
             # outputs are the modified name of input deciions that need to be connected to the next filter
             combo_output="combo_%s"%combo_input
             self.step.combo.addOutput(combo_output)
             seq.outputs.append(combo_output)
-            log.debug("Adding outputs %s to combo %s"%(combo_output, self.step.combo.algname))
+            log.debug("Adding outputs %s to combo %s"%(combo_output, self.step.combo.Alg.name()))
         
     
     def __str__(self):
@@ -405,6 +474,7 @@ class ChainStep:
             self.makeCombo(Sequences)
         else:
             self.sequences = Sequences
+        
 
 
     def replaceSequence(self, old, new):
@@ -414,15 +484,21 @@ class ChainStep:
         self.sequences.insert(idx, new)
 
     def makeCombo(self, Sequences):        
-        # For combo sequences, duplicate the Hypo with a Combo_name and create the comboHypoAlg
+        # For combo sequences, duplicate the sequence, the Hypo with differnt names and create the ComboHypoAlg
         self.combo = ComboMaker("ComboHypo_%s"%self.name)
-        for sequence in Sequences:
-            new_sequence=copy.deepcopy(sequence)
-            new_sequence.name=("%s_Combo"%sequence.name)
+        duplicatedHypos = []
+        for sequence in Sequences:         
             oldhypo=sequence.hypo.Alg
-            new_hypoAlg=oldhypo.clone("%s_Combo"%oldhypo.name())
+            duplicatedHypos.append(oldhypo.name())
+            ncopy=duplicatedHypos.count(oldhypo.name())
+               
+            new_sequence=copy.deepcopy(sequence)
+            new_sequence.name="%s%d_for_%s"%(sequence.name,ncopy, self.name)            
+            
+            newHypoAlgName = "%s%d_for_%s"%(oldhypo.name(),ncopy, self.name)            
+            new_hypoAlg=oldhypo.clone(newHypoAlgName)
             new_sequence.replaceHypoForCombo(new_hypoAlg)
-            self.sequences.append(new_sequence)
+            self.sequences.append(new_sequence)            
 
     def __str__(self):
         return "--- ChainStep %s ---\n + isCombo: %d \n +  %s \n "%(self.name, self.isCombo, ' '.join(map(str, self.sequences) ))