diff --git a/algo/detectors/trd2d/Trd2dReadoutConfig.cxx b/algo/detectors/trd2d/Trd2dReadoutConfig.cxx
index e6ca18b123c367078412b83e886421db7b4aa2be..3a7d04e7feca0203fa8e193f13faa25e217d5523 100644
--- a/algo/detectors/trd2d/Trd2dReadoutConfig.cxx
+++ b/algo/detectors/trd2d/Trd2dReadoutConfig.cxx
@@ -62,21 +62,6 @@ namespace cbm::algo
   }
   // ------------------------------------------------------------------------------------
 
-
-  // ---  Initialise the component mapping structure   ----------------------------------
-  void Trd2dReadoutConfig::InitComponentMap(const std::map<uint32_t, uint16_t[NCROBMOD]>& map)
-  {
-    // Receive map (moduleId, crobId) -> (equipId)
-    // Invert to obtain component map (equipId) -> (module iq, crob id)
-    for (auto& entry : map) {
-      uint16_t mod_id = entry.first;
-      for (uint8_t crob_id = 0; crob_id < NCROBMOD; crob_id++) {
-        uint16_t eq_id     = entry.second[crob_id];
-        fReadoutMap[eq_id] = std::make_pair(mod_id, crob_id);
-      }
-    }
-  }
-
   // ---  Initialise the mapping structure   --------------------------------------------
   void Trd2dReadoutConfig::InitChannelMap(
     const std::map<size_t, std::map<size_t, std::map<size_t, std::tuple<int32_t, bool, uint64_t>>>>& channelMap)
diff --git a/algo/detectors/trd2d/Trd2dReadoutConfig.h b/algo/detectors/trd2d/Trd2dReadoutConfig.h
index 7de76995318938c359ee61e0525536303034bc35..e449fabb5816edbb8f8e9631bef454a7a05ac223 100644
--- a/algo/detectors/trd2d/Trd2dReadoutConfig.h
+++ b/algo/detectors/trd2d/Trd2dReadoutConfig.h
@@ -80,9 +80,6 @@ namespace cbm::algo
     /** @brief Debug output of readout map **/
     std::string PrintReadoutMap();
 
-    /** @brief Initialisation of readout map **/
-    void InitComponentMap(const std::map<uint32_t, uint16_t[NCROBMOD]>& crob_map);
-
     /** @brief Initialisation of channel map **/
     void InitChannelMap(
       const std::map<size_t, std::map<size_t, std::map<size_t, std::tuple<int32_t, bool, uint64_t>>>>& channelMap);
diff --git a/core/detectors/trd/CbmTrdParSet.cxx b/core/detectors/trd/CbmTrdParSet.cxx
index 98165360d5e704c812680bc84cabb126079b6edf..469c8a123c58e7483e27c677db443348eade823e 100644
--- a/core/detectors/trd/CbmTrdParSet.cxx
+++ b/core/detectors/trd/CbmTrdParSet.cxx
@@ -29,7 +29,7 @@ CbmTrdParSet::CbmTrdParSet(const char* name, const char* title, const char* cont
 CbmTrdParSet::~CbmTrdParSet()
 {
   for (map<Int_t, CbmTrdParMod*>::iterator imod = fModuleMap.begin(); imod != fModuleMap.end(); imod++)
-    delete imod->second;
+    if (imod->second) delete imod->second;
   fModuleMap.clear();
 }
 
diff --git a/reco/tasks/CbmTaskUnpack.cxx b/reco/tasks/CbmTaskUnpack.cxx
index 9441187a3724762af1bb32429c7aee28b7344154..74560df88cd6cca7f8ee6ec956526c6b36e6f751 100644
--- a/reco/tasks/CbmTaskUnpack.cxx
+++ b/reco/tasks/CbmTaskUnpack.cxx
@@ -12,6 +12,7 @@
 #include "CbmDigiTimeslice.h"
 #include "CbmSourceTs.h"
 #include "CbmTrdParFasp.h"
+#include "CbmTrdParModAsic.h"
 #include "CbmTrdParModDigi.h"
 #include "CbmTrdParSetAsic.h"
 #include "CbmTrdParSetDigi.h"
@@ -166,83 +167,52 @@ cbm::algo::Trd2dReadoutConfig CbmTaskUnpack::InitTrd2dReadoutConfig()
   if (asciiInput.open(asicparfile.data())) { asicparset.init(&asciiInput); }
   asciiInput.close();
 
-  // Initialize map (moduleId, crobId) -> (equipId) explicitly
-  std::map<uint32_t, uint16_t[NCROBMOD]> crob_map;
-  uint16_t cmap[] = {0xffc2, 0xffc5, 0xffc1, 0, 0};        // "crob map 22" for run Id >= 2335
-  memcpy(crob_map[5], cmap, NCROBMOD * sizeof(uint16_t));  // only module Id 5 is used!
-
-  // Then pass to Trd2dReadoutConfig, will invert to obain map (equipId) -> (module iq, crob id)
-  Trd2dConfig.InitComponentMap(crob_map);
-
-  // FASP mapping update wrt the default setting (optional)
-  std::map<uint32_t, uint8_t[NFASPMOD]> fasp_map;
-
-  {  // Initialize the "fasp remapping"
-    // Hard coded for run Id >= 2335 (only module Id 5).
-    uint8_t map[NFASPMOD];
-    for (uint32_t i(0); i < NFASPMOD; i++) {
-      map[i] = i;
-    }
-    const size_t nfasp0 = 72;
-    const size_t nfasps = 36;
-    uint8_t map22[]     = {
-      84,  85,  86,  87,  88,  89,   // FEB14/0xffc1
-      90,  91,  92,  93,  94,  95,   // FEB17/0xffc1
-      96,  97,  98,  99,  100, 101,  // FEB18/0xffc1
-      102, 103, 104, 105, 106, 107,  // FEB16/0xffc1
-      72,  73,  74,  75,  76,  77,   // FEB9/0xffc1
-      78,  79,  80,  81,  82,  83    // FEB8/0xffc1
-    };
-    for (uint32_t i(0); i < nfasps; i++) {
-      map[i + nfasp0] = map22[i];
-    }
-    memcpy(fasp_map[5], map, NFASPMOD * sizeof(uint8_t));
-  }
-
-  // Map (equipId, asicId, chanId) -> (pad address, R pairing flag, daq offset)
+  // Map (moduleId) -> (array of crobId)
+  std::map<uint32_t, uint16_t[NCROBMOD]> crobMap;
+  // Map (equipId, asicId, chanId) -> (pad address, mask flag, daq offset [FASP clk])
   std::map<size_t, std::map<size_t, std::map<size_t, std::tuple<int32_t, bool, uint64_t>>>> channelMap;
 
   // Loop through a list of module IDs from the .digi file (can in principle contradict crob_map).
   for (auto entry : digiparset.GetModuleMap()) {
 
     const auto moduleId = entry.first;
-    if (crob_map.find(moduleId) == crob_map.end()) { continue; }  //skip if no entry in crob_map
 
     // Get ASIC parameters for this module
-    const CbmTrdParSetAsic* setDet = static_cast<const CbmTrdParSetAsic*>(asicparset.GetModuleSet(moduleId));
+    CbmTrdParModAsic* setDet = static_cast<CbmTrdParModAsic*>(asicparset.GetModulePar(moduleId));
     if (!setDet) continue;
-    if (setDet->GetAsicType() != int32_t(CbmTrdDigi::eCbmTrdAsicType::kFASP)) continue;
+    if (setDet->GetAsicType() != CbmTrdDigi::eCbmTrdAsicType::kFASP) continue;
+    auto digipar = entry.second;
+
+    const int* crobs = setDet->GetCrobAddresses();
+    for (int icrob(0); icrob < NCROBMOD; icrob++)
+      crobMap[moduleId][icrob] = crobs[icrob];
 
     // Loop through ASICs for this module
     std::vector<int32_t> addresses;
     setDet->GetAsicAddresses(&addresses);
     for (auto add : addresses) {
-
       //Get local IDs for this component / equipment.
       const int32_t fasp_in_mod = add - 1000 * moduleId;
       const int32_t fasp_in_eq  = fasp_in_mod % (NFASPCROB);
       const int32_t crob_in_mod = fasp_in_mod / (NFASPCROB);
-      const uint16_t eq_id      = crob_map[moduleId][crob_in_mod];
-
-      // Apply FASP remapping (optional)
-      const int32_t add_remap = fasp_map[moduleId][fasp_in_mod];
-      add                     = add_remap + 1000 * moduleId;
+      const uint16_t eq_id      = crobMap[moduleId][crob_in_mod];
 
       // ASIC parameter set
-      CbmTrdParFasp* fasppar = (CbmTrdParFasp*) setDet->GetModulePar(add);
+      CbmTrdParFasp* fasppar = (CbmTrdParFasp*) setDet->GetAsicPar(add);
 
       // Loop through channels for this ASIC and fill map
-      for (size_t chan = 0; chan < fasppar->GetNchannels(); chan++) {
-        const int32_t pad              = fasppar->GetPadAddress(chan);
-        const bool hasPairingR         = fasppar->GetChannel(chan)->HasPairingR();
-        const CbmTrdParModDigi* modpar = (CbmTrdParModDigi*) digiparset.GetModulePar(moduleId);
-        uint64_t daq_offset            = 0;
-        if (modpar->GetPadRow(pad) % 2 == 0) daq_offset = 3;
-        channelMap[eq_id][fasp_in_eq][chan] = std::make_tuple(pad, hasPairingR, daq_offset);
+      for (int chan = 0; chan < fasppar->GetNchannels(); chan++) {
+        const CbmTrdParFaspChannel* faspch = fasppar->GetChannel(chan);
+        const int32_t pad                  = fasppar->GetPadAddress(chan) * (faspch->HasPairingR() ? 1 : -1);
+        const bool isMasked                = faspch->IsMasked();
+        uint64_t daq_offset                = 0;
+        if (((CbmTrdParModDigi*) digipar)->GetPadRow(pad) % 2 == 0) daq_offset = 3;
+        channelMap[eq_id][fasp_in_eq][chan] = std::make_tuple(pad, isMasked, daq_offset);
       }
     }
   }
 
+  Trd2dConfig.InitComponentMap(crobMap);
   Trd2dConfig.InitChannelMap(channelMap);
   return Trd2dConfig;
 }
@@ -308,5 +278,4 @@ cbm::algo::TrdReadoutConfig CbmTaskUnpack::InitTrdReadoutConfig()
   return TrdConfig;
 }
 
-
 ClassImp(CbmTaskUnpack)