diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt
index b19cee24e9260527698b0040339c7560a97feb49..1450b0a07133ff3ea8a5517244cbdb9a54b0262a 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt
@@ -19,6 +19,8 @@ atlas_add_component ( FaserSCT_ConditionsTools
 
 
 atlas_add_library( FaserSCT_ConditionsToolsLib
+                  FaserSCT_ConditionsTools/*.h
+                  src/*.h
                   src/*.cxx
                   PUBLIC_HEADERS FaserSCT_ConditionsTools
                   INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..9fcf6b9a54f891e52edcedb729a3ff8510af319a
--- /dev/null
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h
@@ -0,0 +1,23 @@
+/*
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS and FAsER collaborations
+*/
+
+#ifndef ISCT_NOISY_STRIP_TOOL
+#define ISCT_NOISY_STRIP_TOOL
+
+#include "GaudiKernel/IAlgTool.h"
+#include "GaudiKernel/EventContext.h"
+#include <vector>
+
+
+class ISCT_NoisyStripTool: virtual public IAlgTool {
+public:
+  virtual ~ISCT_NoisyStripTool() = default;
+
+  DeclareInterfaceID(ISCT_NoisyStripTool, 1, 0);
+
+  virtual std::map<std::pair<int,int>, double> getNoisyStrips(const EventContext& ctx) const = 0;
+  virtual std::map<std::pair<int,int>, double> getNoisyStrips(void) const = 0;
+};
+
+#endif  // ISCT_NOISY_STRIP_TOOL
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.cxx b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..459e6ccdbf7e9b0be4922b4c0d56261ff28bcb6c
--- /dev/null
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.cxx
@@ -0,0 +1,104 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS and FASER collaborations
+*/
+
+#include "FaserSCT_NoisyStripTool.h"
+
+
+FaserSCT_NoisyStripTool::FaserSCT_NoisyStripTool (const std::string& type,
+                                                  const std::string& name, const IInterface* parent) :
+    base_class(type, name, parent) {}
+
+
+StatusCode FaserSCT_NoisyStripTool::initialize() {
+  return StatusCode::SUCCESS;
+}
+
+
+StatusCode FaserSCT_NoisyStripTool::finalize() {
+  return StatusCode::SUCCESS;
+}
+
+
+std::map<std::pair<int, int>, double>
+FaserSCT_NoisyStripTool::getNoisyStrips(const EventContext& ctx) const {
+  // TODO fix hard-coded definition of noisy strip and read from NoisyPixels.xml database
+  std::map<std::pair<int, int>, double> noisyStrips {};
+  noisyStrips.insert({std::make_pair(0, 643), 0.576470588235});
+  noisyStrips.insert({std::make_pair(1, 69), 1.0});
+  noisyStrips.insert({std::make_pair(1, 660), 1.0});
+  noisyStrips.insert({std::make_pair(13, 350), 0.279069767442});
+  noisyStrips.insert({std::make_pair(13, 351), 0.255813953488});
+  noisyStrips.insert({std::make_pair(35, 114), 0.988235294118});
+  noisyStrips.insert({std::make_pair(38, 544), 0.438845997562});
+  noisyStrips.insert({std::make_pair(48, 79), 1.0});
+  noisyStrips.insert({std::make_pair(48, 183), 1.0});
+  noisyStrips.insert({std::make_pair(49, 550), 1.0});
+  noisyStrips.insert({std::make_pair(52, 215), 1.0});
+  noisyStrips.insert({std::make_pair(52, 610), 1.0});
+  noisyStrips.insert({std::make_pair(82, 722), 1.0});
+  noisyStrips.insert({std::make_pair(84, 297), 0.837209302326});
+  noisyStrips.insert({std::make_pair(96, 597), 1.0});
+  noisyStrips.insert({std::make_pair(96, 665), 1.0});
+  noisyStrips.insert({std::make_pair(97, 9), 1.0});
+  noisyStrips.insert({std::make_pair(97, 492), 1.0});
+  noisyStrips.insert({std::make_pair(97, 566), 1.0});
+  noisyStrips.insert({std::make_pair(98, 267), 1.0});
+  noisyStrips.insert({std::make_pair(99, 393), 0.447058823529});
+  noisyStrips.insert({std::make_pair(99, 394), 0.480270574972});
+  noisyStrips.insert({std::make_pair(99, 395), 0.484304932735});
+  noisyStrips.insert({std::make_pair(99, 396), 0.501702259362});
+  noisyStrips.insert({std::make_pair(99, 397), 0.418604651163});
+  noisyStrips.insert({std::make_pair(99, 398), 0.493949736271});
+  noisyStrips.insert({std::make_pair(99, 399), 0.325581395349});
+  noisyStrips.insert({std::make_pair(99, 600), 1.0});
+  noisyStrips.insert({std::make_pair(103, 417), 0.620384047267});
+  noisyStrips.insert({std::make_pair(104, 698), 0.247058823529});
+  noisyStrips.insert({std::make_pair(104, 699), 0.288910042837});
+  noisyStrips.insert({std::make_pair(105, 396), 0.348837209302});
+  noisyStrips.insert({std::make_pair(105, 397), 0.412532637076});
+  noisyStrips.insert({std::make_pair(106, 620), 0.3867114595});
+  noisyStrips.insert({std::make_pair(106, 621), 0.463041933191});
+  noisyStrips.insert({std::make_pair(107, 146), 0.418604651163});
+  noisyStrips.insert({std::make_pair(107, 147), 0.47397094431});
+  noisyStrips.insert({std::make_pair(110, 737), 0.52737482452});
+  noisyStrips.insert({std::make_pair(110, 738), 0.511627906977});
+  noisyStrips.insert({std::make_pair(110, 739), 0.542948717949});
+  noisyStrips.insert({std::make_pair(112, 7), 1.0});
+  noisyStrips.insert({std::make_pair(113, 763), 1.0});
+  noisyStrips.insert({std::make_pair(116, 613), 0.999635966509});
+  noisyStrips.insert({std::make_pair(119, 175), 1.0});
+  noisyStrips.insert({std::make_pair(122, 90), 0.457503320053});
+  noisyStrips.insert({std::make_pair(122, 91), 0.325581395349});
+  noisyStrips.insert({std::make_pair(125, 18), 1.0});
+  noisyStrips.insert({std::make_pair(125, 484), 1.0});
+  noisyStrips.insert({std::make_pair(126, 230), 1.0});
+  noisyStrips.insert({std::make_pair(126, 530), 1.0});
+  noisyStrips.insert({std::make_pair(127, 683), 1.0});
+  noisyStrips.insert({std::make_pair(128, 418), 1.0});
+  noisyStrips.insert({std::make_pair(129, 149), 1.0});
+  noisyStrips.insert({std::make_pair(129, 345), 1.0});
+  noisyStrips.insert({std::make_pair(130, 214), 1.0});
+  noisyStrips.insert({std::make_pair(130, 508), 0.497357039885});
+  noisyStrips.insert({std::make_pair(130, 673), 0.586547972305});
+  noisyStrips.insert({std::make_pair(131, 651), 0.999676480104});
+  noisyStrips.insert({std::make_pair(134, 525), 0.395348837209});
+  noisyStrips.insert({std::make_pair(134, 526), 0.486304661221});
+  noisyStrips.insert({std::make_pair(137, 493), 0.372093023256});
+  noisyStrips.insert({std::make_pair(137, 494), 0.372093023256});
+  noisyStrips.insert({std::make_pair(139, 427), 0.902074990899});
+  noisyStrips.insert({std::make_pair(140, 696), 0.602847324497});
+  noisyStrips.insert({std::make_pair(140, 752), 1.0});
+  noisyStrips.insert({std::make_pair(141, 249), 0.107441471572});
+  noisyStrips.insert({std::make_pair(141, 338), 0.238879736409});
+  noisyStrips.insert({std::make_pair(143, 170), 1.0});
+  noisyStrips.insert({std::make_pair(143, 406), 1.0});
+  return noisyStrips;
+}
+
+
+std::map<std::pair<int, int>, double>
+FaserSCT_NoisyStripTool::getNoisyStrips() const {
+  const EventContext& ctx{Gaudi::Hive::currentContext()};
+  return getNoisyStrips(ctx);
+}
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.h b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..c554620885b0cf28beb5c3d93c6d6fa31377e3a4
--- /dev/null
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.h
@@ -0,0 +1,25 @@
+/*
+  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS and CERN collaborations
+*/
+
+#ifndef FASERSCT_NOISY_STRIP_TOOL
+#define FASERSCT_NOISY_STRIP_TOOL
+
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h"
+#include "GaudiKernel/ICondSvc.h"
+#include "GaudiKernel/EventContext.h"
+
+
+class FaserSCT_NoisyStripTool: public extends<AthAlgTool, ISCT_NoisyStripTool> {
+public:
+  FaserSCT_NoisyStripTool(const std::string& type, const std::string& name, const IInterface* parent);
+  virtual ~FaserSCT_NoisyStripTool() = default;
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+
+  virtual std::map<std::pair<int, int>, double> getNoisyStrips(const EventContext& ctx) const override;
+  virtual std::map<std::pair<int, int>, double> getNoisyStrips() const override;
+};
+
+#endif  // FASERSCT_NOISY_STRIP_TOOL
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/components/FaserSCT_ConditionsTools_entries.cxx b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/components/FaserSCT_ConditionsTools_entries.cxx
index cae3df3c65e74cecd79c4729d2dc57cc8e7e4cf3..adad7ee37337a3d347bedc9c1f5b28cf731fb837 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/components/FaserSCT_ConditionsTools_entries.cxx
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/components/FaserSCT_ConditionsTools_entries.cxx
@@ -20,6 +20,7 @@
 // #include "../SCT_StripVetoTool.h"
 // #include "../SCT_TdaqEnabledTool.h"
 #include "../FaserSCT_CableMappingTool.h"
+#include "../FaserSCT_NoisyStripTool.h"
 
 // DECLARE_COMPONENT( SCT_ByteStreamErrorsTool )
 // DECLARE_COMPONENT( SCT_ChargeTrappingTool )
@@ -42,4 +43,5 @@ DECLARE_COMPONENT( FaserSCT_ReadCalibChipDataTool )
 DECLARE_COMPONENT( FaserSCT_SiliconConditionsTool )
 // DECLARE_COMPONENT( SCT_StripVetoTool )
 // DECLARE_COMPONENT( SCT_TdaqEnabledTool )
-DECLARE_COMPONENT( FaserSCT_CableMappingTool )
\ No newline at end of file
+DECLARE_COMPONENT( FaserSCT_CableMappingTool )
+DECLARE_COMPONENT( FaserSCT_NoisyStripTool )
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx
index bd6ff38f7fc46fe44c62e5ccb339744e46cad90c..87bb2437c36c0d0c4f2cbe0cbfb4f3a1270c1e1a 100644
--- a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx
@@ -28,6 +28,7 @@ TrackerByteStreamCnv::TrackerByteStreamCnv(ISvcLocator* svcloc)
   , m_tool("TrackerDataDecoderTool")
   , m_mappingTool("FaserSCT_CableMappingTool")
   , m_rdpSvc("FaserROBDataProviderSvc", "TrackerByteStreamCnv")
+  , m_noisyStripTool("FaserSCT_NoisyStripTool")
   , m_detStoreSvc("StoreGateSvc/DetectorStore", "TrackerByteStreamCnv")
 {
 }
@@ -48,6 +49,7 @@ StatusCode TrackerByteStreamCnv::initialize()
   CHECK(m_rdpSvc.retrieve());
   CHECK(m_tool.retrieve());
   CHECK(m_mappingTool.retrieve());
+  CHECK(m_noisyStripTool.retrieve());
 
   ATH_CHECK(m_detStoreSvc.retrieve());
   ATH_CHECK(m_detStoreSvc->retrieve(m_sctID, "FaserSCT_ID"));
@@ -98,10 +100,13 @@ StatusCode TrackerByteStreamCnv::createObj(IOpaqueAddress* pAddr, DataObject*& p
 
   auto mapping = m_mappingTool->getCableMapping();
   ATH_MSG_DEBUG("Cable mapping contains " << mapping.size() << " entries");
-  
+
+  auto noisyStrips = m_noisyStripTool->getNoisyStrips();
+  ATH_MSG_DEBUG(noisyStrips.size() << " noisy strips");
+
   // Convert raw data into this container
 
-  CHECK( m_tool->convert(re, cont, key, mapping) );
+  CHECK( m_tool->convert(re, cont, key, mapping, noisyStrips) );
   
   pObj = SG::asStorable(cont);
 
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h
index de0095b637bc99a9b0e30e2b34fba5842bcdbcf6..77fae1331adba459e99f22bbbca6984388a6c048 100644
--- a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h
@@ -15,6 +15,7 @@
 #include "AthenaBaseComps/AthMessaging.h"
 #include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h"
 #include "FaserSCT_ConditionsTools/ISCT_CableMappingTool.h"
+#include "FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h"
 
 class TrackerDataDecoderTool;
 class IFaserROBDataProviderSvc;
@@ -42,6 +43,7 @@ public:
 private:
   ToolHandle<TrackerDataDecoderTool>      m_tool;
   ToolHandle<ISCT_CableMappingTool>       m_mappingTool;
+  ToolHandle<ISCT_NoisyStripTool>         m_noisyStripTool;
   ServiceHandle<IFaserROBDataProviderSvc> m_rdpSvc;
   ServiceHandle<StoreGateSvc>             m_detStoreSvc;
   const FaserSCT_ID*                      m_sctID{nullptr};
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx
index 9971d0292356a1e8437f5734c2703a0bac10ee2a..520bb5dbbc46e07001af6939edd9ff39f0a4afaa 100644
--- a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx
@@ -81,7 +81,9 @@ StatusCode
 TrackerDataDecoderTool::convert(const DAQFormats::EventFull* re, 
     FaserSCT_RDO_Container* container,
     std::string key,
-    const std::map<int, std::pair<int, int> >& cableMapping)
+    const std::map<int, std::pair<int, int> >& cableMapping,
+    const std::map<std::pair<int, int>, double>& noisyStrips)
+
 {
   ATH_MSG_DEBUG("TrackerDataDecoderTool::convert()");
 
@@ -231,6 +233,12 @@ TrackerDataDecoderTool::convert(const DAQFormats::EventFull* re,
                   ATH_MSG_ERROR("Invalid strip number on side: " << stripOnSide);
                   continue;
                 }
+                // check if strip is noisy
+                auto it = noisyStrips.find(std::make_pair(waferHash, stripOnSide));
+                if (it != noisyStrips.end() && it->second >= m_occupancyCut) {
+                  ATH_MSG_VERBOSE("Mask wafer " << waferHash << ", strip " << stripOnSide << " with an occupancy of " << it->second);
+                  continue;
+                }
                 Identifier digitID {m_sctID->strip_id(id, stripOnSide)};
                 int errors{0};
                 int groupSize{1};
diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h
index 32b42ced60b494d93661aa4f3ea8dbcbdc6ce63b..3bc337276a3f8eaba28fa51d90f7eb4f903592c7 100644
--- a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h
+++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h
@@ -31,7 +31,9 @@ class TrackerDataDecoderTool : public AthAlgTool {
   virtual StatusCode initialize();
   virtual StatusCode finalize();
 
-  StatusCode convert(const DAQFormats::EventFull* re, FaserSCT_RDO_Container* cont, std::string key, const std::map<int, std::pair<int, int> >& cableMapping);
+  StatusCode convert(const DAQFormats::EventFull* re, FaserSCT_RDO_Container* cont, std::string key,
+                     const std::map<int, std::pair<int, int> >& cableMapping,
+                     const std::map<std::pair<int, int>, double>& noisyStrips);
 
 private:
   const FaserSCT_ID*                      m_sctID{nullptr};
@@ -41,7 +43,8 @@ private:
                                                         "ModuleMap", 
                                                         {7, 2, 5, 0, 3, 6, 1, 4}, 
                                                         "Mapping from online to offline module numbers" };
-  
+  Gaudi::Property<double> m_occupancyCut {this, "OccupancyCut", 0.1, "Mask strips with an occupancy larger than the OccupancyCut"};
+
   // Gaudi::Property<uint32_t>               m_trb0Station { this, "Trb0StationNumber", 1, "Station number for TRB #0" };
 };
 
diff --git a/Tracker/TrackerRecAlgs/NoisyStripFinder/test/NoisyStripFinderDbg.py b/Tracker/TrackerRecAlgs/NoisyStripFinder/test/NoisyStripFinderDbg.py
new file mode 100644
index 0000000000000000000000000000000000000000..b3c0697cfcef6539190aeeebf26e16b4e0d3b100
--- /dev/null
+++ b/Tracker/TrackerRecAlgs/NoisyStripFinder/test/NoisyStripFinderDbg.py
@@ -0,0 +1,52 @@
+#!/usr/bin/env python
+"""
+    Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+"""
+
+import sys
+from AthenaCommon.Logging import log, logging
+from AthenaCommon.Constants import DEBUG, VERBOSE, INFO
+from AthenaCommon.Configurable import Configurable
+from CalypsoConfiguration.AllConfigFlags import ConfigFlags
+from CalypsoConfiguration.MainServicesConfig import MainServicesCfg
+from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg
+from FaserByteStreamCnvSvc.FaserByteStreamCnvSvcConfig import FaserByteStreamCnvSvcCfg
+from TrackerPrepRawDataFormation.TrackerPrepRawDataFormationConfig import FaserSCT_ClusterizationCfg
+from NoisyStripFinder.NoisyStripFinderConfig import NoisyStripFinderCfg
+
+log.setLevel(DEBUG)
+Configurable.configurableRun3Behavior = True
+
+run = 1792
+ConfigFlags.Input.Files = [f"/home/tboeckh/Documents/data/TI12/Faser-Physics-00{run}-00000.raw"]
+ConfigFlags.Output.ESDFileName = f"run00{run}-00000.ESD.pool.root"
+ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-01"
+ConfigFlags.IOVDb.DatabaseInstance = "OFLP200"
+ConfigFlags.Input.ProjectName = "data21"
+ConfigFlags.Input.isMC = False
+ConfigFlags.GeoModel.FaserVersion = "FASER-01"
+ConfigFlags.Common.isOnline = False
+ConfigFlags.GeoModel.Align.Dynamic = False
+ConfigFlags.Beam.NumberOfCollisions = 0.
+ConfigFlags.Detector.GeometryFaserSCT = True
+ConfigFlags.lock()
+
+acc = MainServicesCfg(ConfigFlags)
+acc.merge(PoolWriteCfg(ConfigFlags))
+acc.merge(FaserByteStreamCnvSvcCfg(ConfigFlags))
+acc.merge(FaserSCT_ClusterizationCfg(
+    ConfigFlags,
+    name="LevelClustering",
+    DataObjectName="SCT_LEVELMODE_RDOs",
+    ClusterToolTimingPattern="X1X"))
+acc.merge(NoisyStripFinderCfg(ConfigFlags))
+
+# Hack to avoid problem with our use of MC databases when isMC = False
+replicaSvc = acc.getService("DBReplicaSvc")
+replicaSvc.COOLSQLiteVetoPattern = ""
+replicaSvc.UseCOOLSQLite = True
+replicaSvc.UseCOOLFrontier = False
+replicaSvc.UseGeomSQLite = True
+
+sc = acc.run(maxEvents=-1)
+sys.exit(not sc.isSuccess())