diff --git a/algo/detectors/much/MuchReadoutConfig.cxx b/algo/detectors/much/MuchReadoutConfig.cxx
index 08336576d88166e472b0709efc56eb8104c7701f..3bbf3f42b5a51790699d5257f98fd628f404f5d2 100644
--- a/algo/detectors/much/MuchReadoutConfig.cxx
+++ b/algo/detectors/much/MuchReadoutConfig.cxx
@@ -105,10 +105,15 @@ void MuchReadoutConfig::putParams(FairParamList* l)
       for (uint16_t crob = 0; crob < numCrobPerComp; crob++) {
         for (uint16_t elink = 0; elink < numElinksPerCrob; elink++) {
           fReadoutMap[equipment][elink].resize(numChanPerAsic);
-          for (uint16_t channel = 0; channel < numChanPerAsic; channel++) {
 
+          uint16_t elinkId   = numElinksPerCrob * crob + elink;      // elink within component
+          uint32_t febInCrob = elink2Feb[elinkId];                   // FEB within CROB
+          uint32_t feb       = comp * GetFebsPerComp() + febInCrob;  // global FEB index
+          int32_t febId      = GetFebId(feb);                        // FEB Id in MUCH addressing scheme
 
-            fReadoutMap[equipment][elink][channel] = 0;
+          for (uint16_t chanInAsic = 0; chanInAsic < numChanPerAsic; chanInAsic++) {
+            uint32_t channel                       = chanInAsic + numChanPerAsic * (feb % kuNbAsicsPerFeb);
+            fReadoutMap[equipment][elink][channel] = CreateMuchAddress(comp, febId, channel);
           }  //# channel
         }    //# elink
       }      //# CROB
@@ -230,20 +235,6 @@ void MuchReadoutConfig::putParams(FairParamList* l)
     return address;
   }
 
-
-  // -------------------------------------------------------------------------
-  /*
-  int16_t MuchReadoutConfig::ElinkIdxToFebIdx(uint16_t uElink)
-  {
-    if (uElink < numElinksPerCrob) return kiCrobMapElinkFebIdx[uElink];
-    else {
-      LOG(warning) << "MuchReadoutConfig::ElinkIdxToFebIdx => Index out of bound, "
-                   << "Elink is " << uElink << " returning crazy value!";
-      return -1;
-    }
-  }
-  */
-
   bool MuchReadoutConfig::IsCrobActive(uint16_t uDpbIdx, uint16_t uCrobIdx)
   {
     if (uDpbIdx < numComp) {
diff --git a/algo/detectors/much/MuchReadoutConfig.h b/algo/detectors/much/MuchReadoutConfig.h
index 50f309fd6b0c97c10a91306da4f99f22547c45a2..72dd97f9904ce83465d323e1e4565f868f4114b4 100644
--- a/algo/detectors/much/MuchReadoutConfig.h
+++ b/algo/detectors/much/MuchReadoutConfig.h
@@ -44,6 +44,7 @@ namespace cbm::algo
      */
     std::vector<uint32_t> Map(uint16_t equipId, uint16_t elink);
 
+    uint16_t GetFebsPerComp() { return numCrobPerComp * kuNbFebsPerCrob; }
     uint16_t GetNrOfCrobs() { return numComp * numCrobPerComp; }
     uint16_t GetNrOfFebs() { return GetNrOfCrobs() * kuNbFebsPerCrob; }
     uint16_t GetNrOfFebsInGemA() { return fuFebsInGemA; }
diff --git a/algo/detectors/much/UnpackMuch.cxx b/algo/detectors/much/UnpackMuch.cxx
index 9f0937facc365059b63e8da4ff0bfe8e3809fe51..6fe439a9f6513fd010cd96a7ea32bdcfe45ababb 100644
--- a/algo/detectors/much/UnpackMuch.cxx
+++ b/algo/detectors/much/UnpackMuch.cxx
@@ -95,7 +95,6 @@ namespace cbm::algo
   inline void UnpackMuch::ProcessHitMessage(const stsxyter::Message& message, vector<CbmMuchDigi>& digiVec,
                                             UnpackMuchMonitorData& monitor) const
   {
-    /* STS version
     // --- Check eLink and get parameters
     uint16_t elink = message.GetLinkIndexHitBinning();
     if (elink >= fParams.fElinkParams.size()) {
@@ -103,18 +102,9 @@ namespace cbm::algo
       return;
     }
     const UnpackMuchElinkPar& elinkPar = fParams.fElinkParams.at(elink);
-    uint32_t asicNr                    = elinkPar.fAsicNr;
-
-    // --- Hardware-to-software address
-    uint32_t numChansPerModule = fParams.fNumAsicsPerModule * fParams.fNumChansPerAsic;
-    uint32_t address           = elinkPar.fAddress;
-    uint32_t channel           = 0;
-    if (asicNr < fParams.fNumAsicsPerModule / 2) {  // front side (n side)
-      channel = message.GetHitChannel() + fParams.fNumChansPerAsic * asicNr;
-    }
-    else {  // back side (p side)
-      channel = numChansPerModule - message.GetHitChannel() + 1;
-    }
+
+    uint16_t channel = message.GetHitChannel();
+    uint32_t address = (elinkPar.fAddress)[channel];
 
     // --- Expand time stamp to time within timeslice (in clock cycle)
     uint64_t messageTime = message.GetHitTimeBinning() + fCurrentEpochTime;
@@ -124,14 +114,12 @@ namespace cbm::algo
 
     // --- Correct ASIC-wise offsets
     messageTime -= elinkPar.fTimeOffset;
-    // --- TODO: Add walk correction (depends on ADC)
 
     // --- Charge
-    double charge = elinkPar.fAdcOffset + (message.GetHitAdc() - 1) * elinkPar.fAdcGain;
+    double charge = message.GetHitAdc();
 
     // --- Create output digi
-    digiVec.emplace_back(address, channel, messageTime, charge);
-*/
+    digiVec.emplace_back(address, charge, messageTime);
   }
   // --------------------------------------------------------------------------