diff --git a/MuonSpectrometer/MuonCnv/MuonByteStream/MuonByteStream/TgcRawDataProvider.h b/MuonSpectrometer/MuonCnv/MuonByteStream/MuonByteStream/TgcRawDataProvider.h
index 9a608150e529e63a64b312843caa8c59d9c62928..eada3802cdd54dc03b7c4cd31f41f4dcd5ae3363 100644
--- a/MuonSpectrometer/MuonCnv/MuonByteStream/MuonByteStream/TgcRawDataProvider.h
+++ b/MuonSpectrometer/MuonCnv/MuonByteStream/MuonByteStream/TgcRawDataProvider.h
@@ -10,7 +10,11 @@
 #include "GaudiKernel/ServiceHandle.h"
 #include "GaudiKernel/ToolHandle.h"
 
-class IROBDataProviderSvc;
+// interface to region selector service
+#include "IRegionSelector/IRegSelSvc.h"
+
+// ROI Descriptor classes
+#include "TrigSteeringEvent/TrigRoiDescriptor.h"
 
 namespace Muon
 {
@@ -36,9 +40,18 @@ public:
     ~TgcRawDataProvider();
 
 private:
-    ServiceHandle<IROBDataProviderSvc>          m_robDataProvider;
+
     ToolHandle<Muon::IMuonRawDataProviderTool>  m_rawDataTool;
-    std::vector<uint32_t>                       m_robIds;
+
+    /// Handle for region selector service
+    ServiceHandle<IRegSelSvc> m_regionSelector;
+
+    /// Property to decide whether or not to do RoI based decoding
+    Gaudi::Property< bool > m_seededDecoding { this, "DoSeededDecoding", false, "If true do decoding in RoIs"};
+
+    /// ReadHandle for the input RoIs
+    SG::ReadHandleKey<TrigRoiDescriptorCollection> m_roiCollectionKey{ this, "RoIs", "OutputRoIs",  "Name of RoI collection to read in" };
+
 };
 } // ns end
 
diff --git a/MuonSpectrometer/MuonCnv/MuonByteStream/src/TgcRawDataProvider.cxx b/MuonSpectrometer/MuonCnv/MuonByteStream/src/TgcRawDataProvider.cxx
index 37b9087a3e03d8d8b8683d12955944f5635be907..5fc7ed6569449387bbbb3f9afa959cfc813d2471 100644
--- a/MuonSpectrometer/MuonCnv/MuonByteStream/src/TgcRawDataProvider.cxx
+++ b/MuonSpectrometer/MuonCnv/MuonByteStream/src/TgcRawDataProvider.cxx
@@ -1,9 +1,8 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "MuonByteStream/TgcRawDataProvider.h"
-#include "ByteStreamCnvSvcBase/IROBDataProviderSvc.h"
 #include "MuonCnvToolInterfaces/IMuonRawDataProviderTool.h"
 #include "MuonRDO/TgcRdoIdHash.h"
 #include "eformat/SourceIdentifier.h"
@@ -17,10 +16,11 @@ using eformat::helper::SourceIdentifier;
 Muon::TgcRawDataProvider::TgcRawDataProvider(const std::string& name,
         ISvcLocator* pSvcLocator) :
         AthAlgorithm(name, pSvcLocator),
-        m_robDataProvider ("ROBDataProviderSvc",name),
-        m_rawDataTool     ("Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool", this)
+        m_rawDataTool     ("Muon::TGC_RawDataProviderTool/TgcRawDataProviderTool", this),
+        m_regionSelector  ("RegSelSvc",name)
 {
     declareProperty ("ProviderTool", m_rawDataTool);
+    declareProperty ("RegionSelectionSvc", m_regionSelector, "Region Selector");
 }
 
 // Destructor
@@ -34,17 +34,21 @@ Muon::TgcRawDataProvider::~TgcRawDataProvider()
 StatusCode Muon::TgcRawDataProvider::initialize()
 {
     ATH_MSG_INFO( "TgcRawDataProvider::initialize"  );
-    ATH_CHECK( m_robDataProvider.retrieve() );
+    ATH_MSG_INFO( m_seededDecoding );
+
     ATH_CHECK( m_rawDataTool.retrieve() );
 
-    TgcRdoIdHash rdoIdHash;
-    for (int i = 0; i < rdoIdHash.max(); i++)
-    {
-        SourceIdentifier sid((eformat::SubDetector)rdoIdHash.subDetectorId(i), rdoIdHash.rodId(i));
-        m_robIds.push_back(sid.simple_code());
-    }
+    ATH_CHECK( m_roiCollectionKey.initialize(m_seededDecoding) );// pass the seeded decoding flag - this marks the RoI collection flag as not used for the case when we decode the full detector
 
-    return StatusCode::SUCCESS;
+  if(m_seededDecoding) {
+    // We only need the region selector in RoI seeded mode
+    if (m_regionSelector.retrieve().isFailure()) {
+      ATH_MSG_FATAL("Unable to retrieve RegionSelector Svc");
+      return StatusCode::FAILURE;
+    }  
+  }//seededDecoding
+
+  return StatusCode::SUCCESS;
 }
 
 StatusCode Muon::TgcRawDataProvider::finalize()
@@ -58,15 +62,34 @@ StatusCode Muon::TgcRawDataProvider::execute()
 {
     ATH_MSG_VERBOSE( "TgcRawDataProvider::execute"  );
 
-    // ask ROBDataProviderSvc for the vector of ROBFragment for all TGC ROBIDs
-    std::vector<const OFFLINE_FRAGMENTS_NAMESPACE::ROBFragment*> vecOfRobf;
-    m_robDataProvider->getROBData(m_robIds, vecOfRobf);
-
-    ATH_MSG_VERBOSE( "Number of ROB fragments " << vecOfRobf.size()  );
+  if(m_seededDecoding) {
+    
+    // read in the RoIs to process
+    SG::ReadHandle<TrigRoiDescriptorCollection> muonRoI(m_roiCollectionKey);
+    if(!muonRoI.isValid()){
+      ATH_MSG_WARNING("Cannot retrieve muonRoI "<<m_roiCollectionKey.key());
+      return StatusCode::SUCCESS;
+    }
 
-    // ask TgcRawDataProviderTool to decode it and to fill the IDC
-    if (m_rawDataTool->convert(vecOfRobf).isFailure())
+    // loop on RoIs
+    std::vector<IdentifierHash>  tgc_hash_ids;
+    for(auto roi : *muonRoI){
+      ATH_MSG_DEBUG("Get ROBs for RoI " << *roi);
+      // get list of hash IDs from region selection
+      m_regionSelector->DetHashIDList(TGC, *roi, tgc_hash_ids);
+
+      // decode the ROBs
+      if(m_rawDataTool->convert(tgc_hash_ids).isFailure()) {
+        ATH_MSG_ERROR( "RoI seeded BS conversion into RDOs failed"  );
+      }
+      // clear vector of hash IDs ready for next RoI
+      tgc_hash_ids.clear();
+    }
+  } else {
+    // ask TgcRawDataProviderTool to decode full detector and to fill the IDC
+    if (m_rawDataTool->convert().isFailure())
       ATH_MSG_ERROR( "BS conversion into RDOs failed"  );
+  }
 
     return StatusCode::SUCCESS;
 }
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
index 3f331be8159a3dc330c9b6bd1b3dc5dc4cf50edb..58e0938fca662227d3132c92ea35489a1c79e56e 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Muon/MuonSetup.py
@@ -161,8 +161,10 @@ def makeMuonPrepDataAlgs(forFullScan=False):
                                             RoIs             = "MURoIs")
 
   from MuonByteStream.MuonByteStreamConf import Muon__TgcRawDataProvider
-  TgcRawDataProvider = Muon__TgcRawDataProvider(name         = "TgcRawDataProvider",
-                                                ProviderTool = MuonTgcRawDataProviderTool )
+  TgcRawDataProvider = Muon__TgcRawDataProvider(name         = "TgcRawDataProvider" + postFix,                                                
+                                                ProviderTool = MuonTgcRawDataProviderTool,
+                                                DoSeededDecoding = not forFullScan,
+                                                RoIs             = "MURoIs" )
 
   eventAlgs_MuonPRD.append( TgcRawDataProvider )
   eventAlgs_MuonPRD.append( TgcRdoToTgcPrepData )