diff --git a/Trigger/TrigMonitoring/TrigSteerMonitor/CMakeLists.txt b/Trigger/TrigMonitoring/TrigSteerMonitor/CMakeLists.txt
index 02e2b05053097a205ba34344f836448113d25164..ad57e859a3bd696c8e1dfa349819c1d1a95ad8e1 100644
--- a/Trigger/TrigMonitoring/TrigSteerMonitor/CMakeLists.txt
+++ b/Trigger/TrigMonitoring/TrigSteerMonitor/CMakeLists.txt
@@ -17,6 +17,7 @@ atlas_depends_on_subdirs(
    Trigger/TrigDataAccess/TrigDataAccessMonitoring
    Trigger/TrigMonitoring/TrigMonitorBase
    Trigger/TrigSteer/TrigSteering
+   Trigger/TrigSteer/DecisionHandling
    Control/StoreGate
    Event/xAOD/xAODEventInfo
    MagneticField/MagFieldInterfaces
@@ -44,7 +45,7 @@ atlas_add_component( TrigSteerMonitor
    GaudiKernel TrigDataAccessMonitoringLib TrigMonitorBaseLib TrigSteeringLib
    StoreGateLib MagFieldInterfaces LumiBlockCompsLib TrigConfHLTData
    TrigConfL1Data TrigNavigationLib TrigSteeringEvent TrigInterfacesLib
-   TrigT1Interfaces TrigT1Result )
+   TrigT1Interfaces TrigT1Result DecisionHandlingLib )
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
diff --git a/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.cxx b/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..08d40bafa0480bbffca703de06835a0071048290
--- /dev/null
+++ b/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.cxx
@@ -0,0 +1,184 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "GaudiKernel/Property.h"
+#include "DecisionHandling/HLTIdentifier.h"
+#include "TrigSignatureMoniMT.h"
+
+
+
+TrigSignatureMoniMT::TrigSignatureMoniMT( const std::string& name, 
+			  ISvcLocator* pSvcLocator ) : 
+  ::AthAlgorithm( name, pSvcLocator ) 
+{}
+
+StatusCode TrigSignatureMoniMT::initialize() {
+
+  ATH_MSG_INFO ("Initializing " << name() << "...");
+  CHECK( m_l1DecisionsKey.initialize() );
+  CHECK( m_finalDecisionsKey.initialize() );
+  renounceArray( m_finalDecisionsKey );
+
+  CHECK( m_histSvc.retrieve() );
+
+  
+  {
+    const int x = nBinsX();
+    const int y = nBinsY();
+    ATH_MSG_DEBUG( "Histogram " << x << " x " << y << " bins");
+    // this type to be replaced by LBN tagged hist available for MT
+    // the new way, (does not work)
+    /*
+    auto hist = std::make_unique<TH2I>( "SignatureAcceptance", "Raw acceptance of signatures in;chain;step",
+					x, -0.5, x -0.5,
+					y, -0.5, y - 0.5 );
+
+    std::string fullName = m_bookingPath + "/SignatureAcceptance";
+
+    m_histSvc->regHist( fullName, std::move( hist ) );
+    m_outputHistogram = m_histSvc.getHist( fullName );
+    */
+    m_outputHistogram = new TH2I( "SignatureAcceptance", "Raw acceptance of signatures in;chain;step",
+				  x, 1, x + 1,
+				  y, 1, y + 1 ); // Fill and GetBinContent use the same indexing then
+    m_histSvc->regHist( m_bookingPath + "/SignatureAcceptance", m_outputHistogram );
+    
+  }
+  CHECK( initHist() );
+  
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrigSignatureMoniMT::finalize() {
+  
+  auto collToString = [&]( int xbin){ 
+    std::string v;
+    for ( int ybin = 1; ybin <= m_outputHistogram->GetYaxis()->GetNbins(); ++ybin ) {
+      v += std::to_string( int(m_outputHistogram->GetBinContent( xbin, ybin )) );
+      v += std::string( 10*ybin - v.size(),  ' ' ); // fill with spaces
+    }
+    
+    return v;
+  };
+
+  ATH_MSG_INFO("Chain name                   L1,      AfterPS, [... steps ...], Output"  );
+  for ( int bin = 1; bin <= m_outputHistogram->GetXaxis()->GetNbins(); ++bin ) {
+    const std::string chainName = m_outputHistogram->GetXaxis()->GetBinLabel(bin);
+    ATH_MSG_DEBUG( chainName << std::string( 30 - chainName.size(), ' ' ) << collToString( bin ) );
+  }
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrigSignatureMoniMT::fillChains(const TrigCompositeUtils::DecisionIDContainer& dc, int row) {
+  for ( auto id : dc )  {
+    auto id2bin = m_chainIDToBinMap.find( id );
+    if ( id2bin == m_chainIDToBinMap.end() ) {
+      ATH_MSG_WARNING( "HLT chain " << HLT::Identifier(id) << " not configured to be monitred" );
+    } else {
+      m_outputHistogram->Fill( id2bin->second, double(row) );
+    }
+  }
+  return StatusCode::SUCCESS;
+}
+
+
+StatusCode TrigSignatureMoniMT::execute()  {  
+
+  auto l1Decisions = SG::makeHandle( m_l1DecisionsKey );
+  CHECK( l1Decisions->at( 0 )->name() == "l1seeded" ); 
+  CHECK( l1Decisions->at( 1 )->name() == "unprescaled" ); // see L1Decoder implementation
+
+  auto fillL1 = [&]( int index ) -> StatusCode {    
+    TrigCompositeUtils::DecisionIDContainer ids;    
+    TrigCompositeUtils::decisionIDs( l1Decisions->at( index ), ids );
+    ATH_MSG_DEBUG( "L1 " << index << " N positive decisions " << ids.size()  );
+    CHECK( fillChains( ids, index + 1 ) );
+    if ( not ids.empty() )
+      m_outputHistogram->Fill( 1, double(index + 1) );
+    return StatusCode::SUCCESS;
+  };
+
+  CHECK( fillL1(0) );
+  CHECK( fillL1(1) );
+  
+ 
+  const int row = m_outputHistogram->GetYaxis()->GetNbins();
+  bool anyPassed = false;
+  for ( auto d: m_finalDecisionsKey ) {
+    auto decisions = SG::makeHandle( d );
+    if ( decisions.isValid() )  { // may be invalid and that is perfectly correct (early rejection
+      ATH_MSG_DEBUG( "Decision for " << decisions->size() << " objects available in " << d.key() );
+      // we need one entry per chain only and the "sum" is used for that
+      TrigCompositeUtils::DecisionIDContainer sum;
+      
+      for ( auto decisionObj : *decisions.get() ) {
+	TrigCompositeUtils::DecisionIDContainer ids;
+	TrigCompositeUtils::decisionIDs( decisionObj, ids );	  
+	sum.insert( ids.begin(), ids.end() ); // merge with so far passing chains
+      }
+      CHECK( fillChains( sum, row ) );
+      anyPassed = anyPassed or ( not sum.empty() );
+    } else {
+      ATH_MSG_DEBUG( "Final decision " << d.key() << " absent, possibly early rejected" );
+    }      
+  } 
+  if ( anyPassed ) {
+    ATH_MSG_DEBUG( "Event passsed, filling " << row );
+    m_outputHistogram->Fill( 1, double( row ) );
+  }
+  // missing intermediate steps monitoring
+
+    
+  return StatusCode::SUCCESS;
+}
+
+
+
+
+int TrigSignatureMoniMT::nBinsY() const { 
+  typedef StringToStringVectorMap::value_type v;
+  if ( m_steps.empty() ) {
+    ATH_MSG_INFO( "Step decisions are not specified, output histogram will only contain input, HLT PS, and output" );
+    return 3; // in, PS, out
+  }
+
+  
+  const int maxSteps = std::max_element( m_steps.begin(), m_steps.end(), 
+					 [](const v& el1, const v& el2){ return el1.second.size() < el2.second.size(); }
+					 ) ->second.size();
+  if ( maxSteps == 0 )
+    ATH_MSG_INFO( "Step of depth 0  specified, output histogram will only contain input, HLT PS, and output" );
+  else
+    ATH_MSG_DEBUG( "Longest step of " << maxSteps );
+  
+  
+  return 3+maxSteps;
+}
+
+StatusCode TrigSignatureMoniMT::initHist() {
+
+  TAxis* x = m_outputHistogram->GetXaxis();
+  x->SetBinLabel(1, "All");
+  int bin = 2;
+  for ( auto chainName:  m_allChains ) {
+    x->SetBinLabel( bin, chainName.c_str() );
+    m_chainIDToBinMap[ HLT::Identifier( chainName ).numeric() ] = bin;
+    bin++;
+  }
+
+
+  TAxis* y = m_outputHistogram->GetYaxis();
+  y->SetBinLabel(1, "L1");
+  y->SetBinLabel(2, "AfterPS");
+  y->SetBinLabel( y->GetNbins(), "Output" ); // last bin
+
+  // loop until the last bin and assign labels Step #
+  for ( int bin = 3; std::string( y->GetBinLabel( bin ) ) != "Output" ; ++bin ) {
+    y->SetBinLabel(bin, ( "Step " + std::to_string( bin - 2 ) ).c_str() );
+  }
+ 
+  return StatusCode::SUCCESS;
+}
diff --git a/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.h b/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.h
new file mode 100644
index 0000000000000000000000000000000000000000..8fb9341f48d1e800707b731b0c55f4fad585fc22
--- /dev/null
+++ b/Trigger/TrigMonitoring/TrigSteerMonitor/src/TrigSignatureMoniMT.h
@@ -0,0 +1,58 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGSTEERMONITOR_TRIGSIGNATUREMONIMT_H
+#define TRIGSTEERMONITOR_TRIGSIGNATUREMONIMT_H 1
+
+#include <string>
+#include <mutex>
+#include <TH2.h>
+
+#include "AthenaBaseComps/AthAlgorithm.h"
+#include "GaudiKernel/ITHistSvc.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+#include "xAODEventInfo/EventInfo.h"
+
+
+/**
+ * @class Algorithm implementing monitoring of the HLT decision in the MT framework
+ * @brief 
+ **/
+
+
+class TrigSignatureMoniMT : public ::AthAlgorithm
+{ 
+ public: 
+
+  TrigSignatureMoniMT( const std::string& name, ISvcLocator* pSvcLocator );
+
+
+  virtual StatusCode  initialize() override;
+  virtual StatusCode  execute() override;
+  virtual StatusCode  finalize() override;
+ 
+ private: 
+  TrigSignatureMoniMT();
+  SG::ReadHandleKey<TrigCompositeUtils::DecisionContainer> m_l1DecisionsKey{ this, "L1Decisions", "HLTChainsResult", "Chains activated after the L1" };
+
+  SG::ReadHandleKeyArray<TrigCompositeUtils::DecisionContainer> m_finalDecisionsKey{ this, "FinalDecisions", {}, "Final stage of all decisions" };
+  typedef std::map<std::string, std::vector<std::string> > StringToStringVectorMap;
+  Gaudi::Property< StringToStringVectorMap > m_steps{ this, "FinalDecisionToStepsMap", {}, "Mapping from each final decision object in FinalDecisions to the decisions at earlier steps" };
+  Gaudi::Property<std::vector<std::string> > m_allChains{ this, "ChainsList", {}, "List of all configured chains" };
+  
+  std::map<unsigned int, int> m_chainIDToBinMap;
+  
+  ServiceHandle<ITHistSvc> m_histSvc{ this, "THistSvc", "THistSvc/THistSvc", "Histogramming svc" };
+  Gaudi::Property<std::string> m_bookingPath{ this, "HistParh", "EXPERT/TrigSteer_HLT", "Booking path for the histogram"};
+
+  TH2* m_outputHistogram;
+  
+  
+  int nBinsX() const { return m_allChains.size() +1; }
+  int nBinsY() const;
+  StatusCode initHist();
+  StatusCode fillChains(const TrigCompositeUtils::DecisionIDContainer& dc, int row);
+}; 
+
+
+#endif //> !TRIGSTEERMONITOR_TRIGSIGNATUREMONIMT_H
diff --git a/Trigger/TrigMonitoring/TrigSteerMonitor/src/components/TrigSteerMonitor_entries.cxx b/Trigger/TrigMonitoring/TrigSteerMonitor/src/components/TrigSteerMonitor_entries.cxx
index d142c34be770da631790badf5449e7d491b98cc3..a8d10ac2eefcc5eec5dfa1f21be52aa671d18fdc 100644
--- a/Trigger/TrigMonitoring/TrigSteerMonitor/src/components/TrigSteerMonitor_entries.cxx
+++ b/Trigger/TrigMonitoring/TrigSteerMonitor/src/components/TrigSteerMonitor_entries.cxx
@@ -10,6 +10,7 @@
 #include "../TrigOpMoni.h"
 #include "../TrigCorMoni.h"
 #include "../TrigMemAuditor.h"
+#include "../TrigSignatureMoniMT.h"
 
 DECLARE_COMPONENT( TrigSteerMoni )
 DECLARE_COMPONENT( TrigChainMoni )
@@ -23,4 +24,4 @@ DECLARE_COMPONENT( TrigOpMoni )
 DECLARE_COMPONENT( TrigMemMoni )
 DECLARE_COMPONENT( TrigCorMoni )
 DECLARE_COMPONENT( TrigMemAuditor )
-
+DECLARE_COMPONENT( TrigSignatureMoniMT )
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py b/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py
index 54f579daf72870e4621f9d4c0538b69c909b3a68..fe73b07b1cd8fc730dd87504782c54d806c5f3f2 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/egamma.withViews.py
@@ -210,10 +210,11 @@ summary.OutputLevel = DEBUG
 
 steps = seqAND("HLTSteps", [ step0, step1, summary ]  )
 
-mon = TriggerSummaryAlg( "TriggerMonitoringAlg" )
-mon.InputDecision = "HLTChains"
+from TrigSteerMonitor.TrigSteerMonitorConf import TrigSignatureMoniMT
+mon = TrigSignatureMoniMT()
 mon.FinalDecisions = [ "ElectronL2Decisions", "MuonL2Decisions", "WhateverElse" ]
-mon.HLTSummary = "MonitoringSummary"
+from TrigUpgradeTest.TestUtils import MenuTest
+mon.ChainsList = [ x.split(":")[1] for x in  MenuTest.CTPToChainMapping ]
 mon.OutputLevel = DEBUG
 
 hltTop = seqOR( "hltTop", [ steps, mon] )