diff --git a/Trigger/TrigSteer/DecisionHandling/src/IComboHypoTool.h b/Trigger/TrigSteer/DecisionHandling/src/IComboHypoTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..85e4cb30fb0fdeeb9805486556603d9e09bfb23c
--- /dev/null
+++ b/Trigger/TrigSteer/DecisionHandling/src/IComboHypoTool.h
@@ -0,0 +1,40 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef DECISIONHANDLING_ICOMBOHYPOTOOL_H
+#define DECISIONHANDLING_ICOMBOHYPOTOOL_H 1
+
+#include "DecisionHandling/HLTIdentifier.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+#include "GaudiKernel/IAlgTool.h"
+#include "ComboHypoCombination.h"
+
+/**
+ * @class $(klass)s
+ * @brief 
+ **/
+
+typedef std::map<TrigCompositeUtils::DecisionID, ComboHypoCombination> CombinationMap;
+
+class IComboHypoTool: virtual public ::IAlgTool { 
+  
+ public: 
+  DeclareInterfaceID(IComboHypoTool, 1, 0);
+  
+  virtual ~IComboHypoTool() {};
+ IComboHypoTool(const std::string& name)   : m_decisionId(  HLT::Identifier::fromToolName( name ) ) {}
+
+  // vector of decision that satisfy the mult. requirement
+
+  virtual StatusCode decide(std::vector<TrigCompositeUtils::DecisionContainer>& decisions,
+			    const CombinationMap IDCombMap, std::map<TrigCompositeUtils::DecisionID, std::vector< std::pair<uint32_t,uint16_t> >> & passingComb ) const = 0;//TrigCompositeUtils::DecisionIDContainer& passingIds ) const = 0;
+  virtual HLT::Identifier decisionId() const { return m_decisionId; }
+  
+ protected:
+  HLT::Identifier m_decisionId;
+  
+}; 
+
+
+
+#endif //> !DECISIONHANDLING_ICOMBOHYPOTOOL_H
diff --git a/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.cxx b/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..99e86c04c0762360c6a0fd4ee3605350253a97a5
--- /dev/null
+++ b/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.cxx
@@ -0,0 +1,93 @@
+#include "dRMuMuComboHypoTool.h"
+#include "TrigSteeringEvent/TrigRoiDescriptorCollection.h"
+#include <algorithm>
+#include <cmath>
+
+using namespace TrigCompositeUtils;
+
+dRMuMuComboHypoTool::dRMuMuComboHypoTool(const std::string& type,
+					 const std::string& name,
+					 const IInterface* parent)
+  : IComboHypoTool( name ),
+    AthAlgTool( type, name, parent )
+{ }
+
+dRMuMuComboHypoTool::~dRMuMuComboHypoTool(){}
+
+
+StatusCode dRMuMuComboHypoTool::initialize() {
+  ATH_MSG_DEBUG("Initializing dRMuMuComboHypoTool");
+  ATH_MSG_DEBUG("DR threshold set to " << m_DRcut );
+  return StatusCode::SUCCESS;
+}
+
+StatusCode dRMuMuComboHypoTool::finalize() {
+  return StatusCode::SUCCESS;
+}
+
+
+StatusCode dRMuMuComboHypoTool::decide( std::vector<TrigCompositeUtils::DecisionContainer>& decisions, const CombinationMap IDCombMap, std::map<TrigCompositeUtils::DecisionID, std::vector< std::pair<uint32_t,uint16_t> >> & passingCombinations ) const {
+
+
+  std::vector<xAOD::TrigComposite> TCdecisions_to_combine; // can use Decision?
+  TrigCompositeUtils::DecisionContainer decisions_to_combine; //DataVector does not have BidirectionalIterator, so cannot use next_permutation
+  ElementLinkVector<DecisionContainer> ELdecisions_to_combine;
+  ATH_MSG_DEBUG( "Looking for "<< m_decisionId <<" in the map");
+  if (passingCombinations[ m_decisionId].size() >0)
+    ATH_MSG_ERROR("Passing combinations has "<< passingCombinations[ m_decisionId].size()<<" elements: what to do?");
+  
+  std::vector< std::pair<uint32_t,uint16_t> > newcomb; //better a set?
+		  
+  for (auto id: IDCombMap){
+    if ( HLT::Identifier( id.first ) != m_decisionId ) continue;    
+    ComboHypoCombination comb = id.second;
+    auto combinations = comb.getCombinations();
+    ATH_MSG_DEBUG("Getting "<<combinations.size()<<" combinations for ID: "<< m_decisionId);
+    for (auto comb:combinations) ATH_MSG_DEBUG(comb<<"");
+
+    // do permutations: next_permutation + using the selector+selected
+    std::vector<int> selector(combinations.size());
+    fill(selector.begin(), selector.begin() + 2, 1);// use two muons
+    std::vector<int> selected;   
+    do {
+      for (u_int i = 0; i < combinations.size(); i++) {
+	if (selector[i]) {
+	  selected.push_back(i);
+	}
+      }
+      auto comb1=combinations[selected[0]];
+      auto comb2=combinations[selected[1]];
+      auto dec1 = decisions[comb1.first][comb1.second];
+      auto dec2 = decisions[comb2.first][comb2.second];
+      auto muonLink1 = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( dec1, initialRoIString() ).link;
+      // ElementLink<xAOD::TrigComposite> muonLink0 = dec0->objectLink<xAOD::TrigComposite>(featureString());
+      auto muonLink2 = TrigCompositeUtils::findLink<TrigRoiDescriptorCollection>( dec2, initialRoIString() ).link;
+      // ElementLink<xAOD::TrigComposite> muonLink1 = dec1->objectLink<xAOD::TrigComposite>(featureString());
+      float Dr = deltaR((*muonLink1)->eta(), (*muonLink2)->eta(), (*muonLink1)->phi(), (*muonLink2)->phi());
+      ATH_MSG_DEBUG("Found two muons with eta/phi " << (*muonLink1)->eta() <<"/"<<(*muonLink1)->phi() <<" and "<< (*muonLink2)->eta()<<"/"<<(*muonLink2)->phi() <<" with Dr="<<Dr);
+      if (Dr < m_DRcut){
+	ATH_MSG_DEBUG( "Found two muons within DR<"<<m_DRcut<<". Insert combinations: "<< comb1<<" "<<comb2);
+	//if(std::find(newcomb.begin(), newcomb.end(), comb1) == newcomb.end())
+	  newcomb.push_back(comb1);
+	  //if(std::find(newcomb.begin(), newcomb.end(), comb2) == newcomb.end())
+	  newcomb.push_back(comb2);
+      }
+      selected.clear();
+    }  while (std::prev_permutation(selector.begin(), selector.end()));
+  }
+  // remove duplicates:
+  std::sort( newcomb.begin(), newcomb.end() );
+  newcomb.resize(std::distance(newcomb.begin(), std::unique( newcomb.begin(), newcomb.end() ))); 
+  passingCombinations[ m_decisionId]=newcomb;
+  ATH_MSG_DEBUG("End of tool: Passing combinations with "<< passingCombinations[ m_decisionId].size()<<" elements");
+    
+  return StatusCode::SUCCESS;
+}
+  
+
+
+double dRMuMuComboHypoTool::deltaR(double eta1, double eta2, double phi1, double phi2) const {
+  double dPhi=std::remainder( phi1 - phi2, 2*M_PI );
+  double dEta=std::fabs(eta1-eta2);
+  return std::sqrt(dEta*dEta + dPhi*dPhi);
+}
diff --git a/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.h b/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..6eefe81e7ca8e5f31eb3fcb61552899c8a88e6d6
--- /dev/null
+++ b/Trigger/TrigSteer/DecisionHandling/src/dRMuMuComboHypoTool.h
@@ -0,0 +1,39 @@
+/*
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef DECISIONHANDLING_DRMUMUCOMBOHYPOTOOL_H
+#define DECISIONHANDLING_DRMUMUCOMBOHYPOTOOL_H
+
+
+#include "DecisionHandling/HLTIdentifier.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+#include "IComboHypoTool.h"
+
+class dRMuMuComboHypoTool:  virtual public IComboHypoTool, public AthAlgTool {
+
+ public:
+  
+  dRMuMuComboHypoTool(const std::string& type,
+                    const std::string& name,
+                    const IInterface* parent);
+  virtual ~dRMuMuComboHypoTool();
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+  virtual StatusCode decide( std::vector<TrigCompositeUtils::DecisionContainer>& decisions,
+			     const CombinationMap IDCombMap, std::map<TrigCompositeUtils::DecisionID, std::vector< std::pair<uint32_t,uint16_t> >> & passingComb ) const override;///TrigCompositeUtils::DecisionIDContainer& passingIds ) const override;
+
+  double deltaR(double eta1, double eta2, double phi1, double phi2) const;
+
+
+ private:
+  
+  Gaudi::Property<float> m_DRcut{this, "DRcut", 0.1, "DR threshold" };
+ 
+ 
+
+
+}; // DECISIONHANDLING_DRMUMUCOMBOHYPOTOOL_H
+#endif
+