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 69a2ffaffeb977debf461f1397ec14370b34d926..fa3887566df810e44c3a93b66f03dd9ec99a07f6 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"
@@ -498,39 +499,6 @@ void 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)
-  fTrd2dConfig.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)
   std::map<size_t, std::map<size_t, std::map<size_t, std::tuple<int32_t, bool, uint64_t>>>> channelMap;
 
@@ -538,13 +506,15 @@ void CbmTaskUnpack::InitTrd2dReadoutConfig()
   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;
 
+    int crob_map[NCROBMOD];
+    memcpy(crob_map, setDet->GetCrobAddresses(), NCROBMOD * sizeof(int));
     // Loop through ASICs for this module
     std::vector<int32_t> addresses;
     setDet->GetAsicAddresses(&addresses);
@@ -554,22 +524,17 @@ void CbmTaskUnpack::InitTrd2dReadoutConfig()
       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      = crob_map[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++) {
+      for (int 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;
+        if (((CbmTrdParModDigi*) digipar)->GetPadRow(pad) % 2 == 0) daq_offset = 3;
         channelMap[eq_id][fasp_in_eq][chan] = std::make_tuple(pad, hasPairingR, daq_offset);
       }
     }