diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py
index 2162fa0f2f638fcef1d5f34454c1065c6cb53cce..826711e15a14967a38072d5aedb28d238f99dc05 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionsToolSetterFastReduction.py
@@ -73,51 +73,7 @@ class ConditionsToolSetterFastReduction(object):
             self._set_conditions(cn)
 
 
-    def _remove_combgen(self, node):                       
-        """Combination nodes represent parent children relationships.
-        The child may be a subtree. For now, the parent will be in the 
-        child list at position 0, and the child subtree in position 1."""
-
-        parent_children = {}
-        ipos  = 0
-
-        # identify the combgen nodes, and rotate them
-        for cn in node.children:
-            if cn.scenario == 'combgen':
-                assert (len(cn.children) == 2)
-                parent_children[ipos] = cn.children
-            ipos += 1
-
-        # rotate the first combgen child (parent) into the position of the
-        # combgen node, and set its child node.
-        for pos, p_c in parent_children.items():
-            node.children[pos] = p_c[0]
-            node.children[pos].children = [p_c[1]]
-
-        for cn in node.children:
-            self._remove_combgen(cn)
-
-    def _remove_scenario(self, node, scenario):                       
-        """Remove Partgen nodes by adding their children to their 
-        parent's children."""
-
-        def remove_scenario(node, scenario):
-            for cn in node.children:
-                if cn.scenario == scenario:
-                    node.children.remove(cn)
-                    node.children.extend(cn.children)
-                    return True
-
-            return False
-
-        more = True
-        while(more):
-            more = remove_scenario(node, scenario)
-
-        for cn in node.children:
-            self._remove_scenario(cn, scenario)
-
-  
+ 
     def _get_tool_instance(self, key, extra=''):
    
         klass = self.tool_factories[key][0]
@@ -138,7 +94,15 @@ class ConditionsToolSetterFastReduction(object):
 
         # loop  over elements of node.conf_attrs. The elements are (dict, int)
         # int is multiplicity, dict holds Condition parameters.
-        for c, mult in node.conf_attrs:
+        imax = len(node.conf_attrs)
+        for i in range(len(node.conf_attrs)):
+            c, mult = node.conf_attrs[i]
+            cpi = ''
+            if node.chainpartinds:
+                cpi = node.chainpartinds[i][0]
+                assert mult == node.chainpartinds[i][1]
+                    
+                
             condition_tools = [] # elemental conditions for this compounnd ct.
             for k, v in c.items(): # loop over elemental conditions
                 condition_tool = self._get_tool_instance(k)
@@ -159,12 +123,12 @@ class ConditionsToolSetterFastReduction(object):
 
             # create capacitychecked condition from elemental condition
             condition_tool =self._get_tool_instance('capacitychecked')
+            condition_tool.chainLegLabel = cpi
             condition_tool.conditionMakers = condition_tools
             condition_tool.multiplicity = mult
-
             # add capacitychecked condition to list
             outer_condition_tools.append(condition_tool)
-
+            
         return outer_condition_tools
 
     def _mod_leaf(self, node):
@@ -186,40 +150,6 @@ class ConditionsToolSetterFastReduction(object):
         node.compound_condition_tools = self._make_compound_condition_tools(
             node)
 
-    def _split_leaves(self, node):
-        """Recursively replace leaf nodes with >1 Condition tools by nodes with
-        one Condition tool."""
-
-        def split_leaves(node):   
-            for cn in node.children:
-                if is_leaf(cn):
-                    if len(cn.compound_condition_tools) > 1:
-                        new_children =  []
-                        new_node = copy.deepcopy(cn)
-                        # set scenarrio to other than leaf results in 
-                        # the assignement of  an acceptall condition
-                        new_node.scenario = 'inserted'
-                        new_node.compound_condition_tools = []
-                        for ct in cn.compound_condition_tools:
-                            new_children.append(copy.deepcopy(cn))
-                            new_children[-1].compound_condition_tools = [ct]
-                            new_children[-1].conf_attrs = []
-                        new_node.children.extend(new_children)
-                        node.children.remove(cn)
-                        node.children.append(new_node)
-                        return True # return after first modification
-
-            return False
-
-
-        more = True
-        while(more):
-            more = split_leaves(node)
-
-        for cn in node.children:
-            self._split_leaves(cn)
-
-
     def _find_shared(self, node, shared):
         """Determine which nodes are "shared" - shared nodes
         are nodes that see the input jet collection. There
@@ -258,6 +188,7 @@ class ConditionsToolSetterFastReduction(object):
     def _fill_conditions_map(self, node, cmap):
         if is_leaf(node):
 
+            print(self.__class__.__name__, node)
             assert (len(node.compound_condition_tools) == 1)
             cmap[node.node_id] = node.compound_condition_tools[0]
 
@@ -304,18 +235,8 @@ class ConditionsToolSetterFastReduction(object):
         
         # add Condition builders to leaf nodes.
         self._set_conditions(tree)
-        
-#         # Alg step 2: remove combgen nodes
-#         self._remove_combgen(root)
-
-        # Alg step 3: split leaf nodes with multiple Conditions with a
-        # single Condition
-#         self._split_leaves(root)
-        
-        # Alg step 4: remove partgen nodes
-        # single Condition
-
-        # Alg step 5: identify the leaf nodes that are to shared
+  
+        # identify the leaf nodes that are to shared
         # ie that see the input jet collection. Then remove And nodes
         shared = []
         self.shared = self._find_shared(tree, shared)
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/NodeSplitterVisitor.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/NodeSplitterVisitor.py
index 8a6c8187a022bdce144f3f611a58134a89305e7c..552a1e47ecdfacc5773b8420e6c89ca99677446b 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/NodeSplitterVisitor.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/NodeSplitterVisitor.py
@@ -31,11 +31,18 @@ class NodeSplitterVisitor(object):
         new_children = []
         for c in node.children:
             if c.scenario == 'simple':
-                for c_a in c.conf_attrs:
+                print ('chainparts', c.chainpartinds)
+                print ('conf_attrs', c.conf_attrs)
+                assert (len(c.chainpartinds) ==
+                        len(c.conf_attrs)) or not c.chainpartinds
+                for cpi, c_a in zip(c.chainpartinds, c.conf_attrs):
                     n_c = copy.deepcopy(c)
                     n_c.conf_attrs = [c_a]
+                    n_c.chainpartinds = [cpi]
                     new_children.append(n_c)
+                    print ('node dump', self.__class__.__name__ + '::mod()', n_c)
             else:
+                print ('node dump', self.__class__.__name__ + '::mod()', node)
                 new_children.append(c)
                 
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py
index e5be52b755bf1dd20bce953e4d71c5f63d19bad0..c0da3409ca0bb2a786c2df024af35df7cb1f2c11 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py
@@ -115,6 +115,7 @@ def  trigJetHypoToolFromDict(chain_dict):
 
     # controls whether debug visitor is sent to helper tool
     debug = False  # SET TO False WHEN COMMITTING
+    debug = True  # SET TO False WHEN COMMITTING
     tool.visit_debug = debug
     log.debug('%s', tool)
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py
index c1e28d3aaf21eab59af17ce70fe90327ab454a5c..b400a013d19152110de03c21b4d97303a789cd51 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py
@@ -39,7 +39,8 @@ def _make_simple_label(chain_parts):
               'chain fails substring selection: not "simple" '
 
         raise NotImplementedError(msg)
-    
+
+    chainpartind = 0
     label = 'simple(['
     for cp in chain_parts:
         smcstr =  str(cp['smc'])
@@ -65,9 +66,12 @@ def _make_simple_label(chain_parts):
                         condition_str += ',%s' % cut
                 else:
                     condition_str += ',%s' % momstr
+            condition_str += ', chainpartind{:0>3}'.format(chainpartind)
             if not condition_str.endswith(')'):
                 condition_str += ')'
             label += condition_str
+        chainpartind += 1
+
     label += '])'
     return label
 
@@ -100,6 +104,7 @@ def _make_vbenf_label(chain_parts):
     # scenario requires a dijet of mass > 900, and opening angle in phi > 2.6
 
     assert len(chain_parts) == 1
+
     scenario = chain_parts[0]['hypoScenario']
     assert scenario.startswith('vbenf')
     args = _args_from_scenario(scenario)
@@ -288,7 +293,6 @@ def _make_agg_label(chain_parts):
     print (argvals)
     assert len(argvals) == 2*nargs, 'no of args: %d, expected %d' % (len(argvals), 2*nargs)
 
-    print ('sent 100')
     result =  """
     ht([(%(htlo).0fht)
         (%(etlo).0fet)
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py
index 0b21c68951108579703549316f8444ceb08bbb15..7b75c37525d04072399faa426506afecf2c9919d 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py
@@ -33,6 +33,7 @@ class Node(object):
         # self.compound_condition_tools = []
         # self.tree_top kludge carensure top level tools get chain name
         # as Tool name
+        self.chainpartinds = []
         self.tree_top = False
         self.tool = None
         
@@ -85,6 +86,7 @@ class Node(object):
              indent + 'parent node id: %s' % self.parent_id,
              indent + 'is tree top? %s' % self.tree_top,
              indent + 'parameters: %s' % str(self.parameters),
+             indent + 'chainpartinds %s' % str(self.chainpartinds),
              indent + 'conf_attrs [%d]:' % len(self.conf_attrs)]
         for ca in self.conf_attrs:
             s.append(indent + str(ca))
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py
index a226fec52b7ccdc72db13870755088eb32be2343..3b8de9085f226c957336952665cb33c81cb6004b 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py
@@ -124,7 +124,7 @@ class ConditionsDictMaker(object):
         r'^(?P<lo>\d*)(?P<attr>[%s]+)(?P<hi>\d*)' % lchars)
 
 
-    # key: substring from chain label. value: asttribute of python
+    # key: substring from chain label. value: attribute of python
     # component proxy
     
     def get_conditions(self, params):
@@ -155,6 +155,7 @@ class ConditionsDictMaker(object):
 
 
     def makeDict(self, params):
+
         # conditions example: ['10et,0eta320', '20et']
         conditions = self.get_conditions(params)
 
@@ -164,14 +165,21 @@ class ConditionsDictMaker(object):
         for c in conditions: mult_conditions[c] += 1
         
         result = []
+        chainpartinds = []
         msgs = []
 
 
         # process each parameter string once.
         for c, mult in mult_conditions.items(): # c is condition string
             cdict = defaultdict(dict)
+            
             toks = c.split(',')  # parameters in par string are separated by ','
             toks = [t.strip() for t in toks]
+            cpis = [t for t in toks if t.startswith('chainpartind')]
+            assert len(cpis) < 2
+            if cpis:
+                chainpartinds.append((cpis[0], mult))
+                toks.remove(chainpartinds[-1][0])
 
             for t in toks:
                 m = self.window_re.match(t)
@@ -248,7 +256,7 @@ class ConditionsDictMaker(object):
 
         msgs = ['ConditionsDict OK']
         error = False
-        return result, error, msgs
+        return result, chainpartinds, error, msgs
 
 
 class TreeParameterExpander_simple(object):
@@ -267,10 +275,11 @@ class TreeParameterExpander_simple(object):
     def mod(self, node):
 
         cdm = ConditionsDictMaker()
-        d, error, msgs = cdm.makeDict(node.parameters)
+        d, chainpartinds, error, msgs = cdm.makeDict(node.parameters)
         self.msgs.extend(msgs)
         node.conf_attrs = d
-
+        node.chainpartinds = chainpartinds
+        
     def report(self):
         return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs) 
 
@@ -295,9 +304,10 @@ class TreeParameterExpander_dijet(object):
     def mod(self, node):
 
         cdm = ConditionsDictMaker()
-        d, error, msgs = cdm.makeDict(node.parameters)
+        d, chainpartinds, error, msgs = cdm.makeDict(node.parameters)
         self.msgs.extend(msgs)
         node.conf_attrs = d
+        node.chainpartinds = chainpartinds
 
     def report(self):
         return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs)
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/CapacityCheckedCondition.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/CapacityCheckedCondition.cxx
index 237fd3c6a674311b70691595588b3a4269a6bc00..87146ac19127369e0906971c465917dc1756c850 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/CapacityCheckedCondition.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/CapacityCheckedCondition.cxx
@@ -37,7 +37,9 @@ std::string CapacityCheckedCondition::toString() const {
   const void* address = static_cast<const void*>(this);
   
   ss << "CapacityCheckedCondition (" << address << ") Multiplicity: "
-     << m_multiplicity << '\n' << m_condition->toString();
+     << m_multiplicity << " label "
+     << m_label << '\n'
+     << m_condition->toString();
 
   return ss.str();
 }
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetCollector.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetCollector.h
index ca24a33de12498caee6f28a4fb6e9776c44f5d49..ee587b66f084feb7d0e9c7c2f0c36557def20e1a 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetCollector.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetCollector.h
@@ -26,7 +26,7 @@ public:
   void addJets(const HypoJetCIter& begin,
 	       const HypoJetCIter& end,
 	       const std::string& label=""){
-    auto& jets = m_jets.at(label);
+    auto& jets = m_jets[label];
     jets.insert(jets.end(), begin, end);
   }
   
@@ -43,7 +43,12 @@ public:
   }
 
   std::vector<const xAOD::Jet*> xAODJets(const std::string& label) const {
-    
+
+    if (m_jets.count(label) == 0){
+      std::vector<const xAOD::Jet*> empty;
+      return empty;
+    }
+
     const auto& jets = m_jets.at(label);
     return xAODJets_(jets.cbegin(), jets.cend());
   }
@@ -66,8 +71,8 @@ public:
     m_jets[label].push_back(jet);
   }
 
-  std::size_t size() const {return m_jets.size();}
-  bool empty() const {return m_jets.empty();}
+  std::size_t size() const {return hypoJets().size();}
+  bool empty() const {return hypoJets().empty();}
  
  private:
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypoUnitTests/CMakeLists.txt b/Trigger/TrigHypothesis/TrigHLTJetHypoUnitTests/CMakeLists.txt
index b04652d5be4fbc4753af892140a9c4790a2f7751..4b33b0daaaf3659e0275769404c7680e105938d1 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypoUnitTests/CMakeLists.txt
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypoUnitTests/CMakeLists.txt
@@ -33,15 +33,9 @@ atlas_add_test( TrigHLTJetHypoUnitTests
    tests/FlowNetworkTest.cxx
    tests/LlpCleanerTest.cxx
    tests/LooseCleanerTest.cxx
-   tests/MaximumBipartiteGroupsMatcherTest.cxx
-   tests/MaximumBipartiteGroupsMatcherMTTest.cxx
-   tests/MaximumBipartiteGroupsMatcherMTTest_Multijet.cxx
-   tests/PartitionsGenTest.cxx
-   tests/PartitionsGroupsMatcherMTTest.cxx
    tests/TLorentzVectorFactoryTest.cxx
    tests/TightCleanerTest.cxx
    tests/xAODJetCollectorTest.cxx
-   tests/PartitionsGrouperTest.cxx
    INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS}
    LINK_LIBRARIES ${ROOT_LIBRARIES} GoogleTestTools ${GMOCK_LIBRARIES} TrigHLTJetHypoLib TrigHLTJetHypoUnitTestsLib )