diff --git a/LArCalorimeter/LArCnv/LArByteStream/src/LArRawDataReadingAlg.cxx b/LArCalorimeter/LArCnv/LArByteStream/src/LArRawDataReadingAlg.cxx
index 82107418183b5b7d93a4c27dd29bc853987ab07a..95c54b9545aa880c071243889b6e8de44ba429b7 100644
--- a/LArCalorimeter/LArCnv/LArByteStream/src/LArRawDataReadingAlg.cxx
+++ b/LArCalorimeter/LArCnv/LArByteStream/src/LArRawDataReadingAlg.cxx
@@ -7,18 +7,14 @@
 #include "eformat/Version.h"
 #include "eformat/index.h"
 
-
 #include "LArByteStream/LArRodBlockStructure.h"
 #include "LArByteStream/LArRodBlockPhysicsV5.h"
 #include "LArByteStream/LArRodBlockPhysicsV6.h"
 
-
 LArRawDataReadingAlg::LArRawDataReadingAlg(const std::string& name, ISvcLocator* pSvcLocator) :  
   AthReentrantAlgorithm(name, pSvcLocator) {}
 
-  
-
-StatusCode LArRawDataReadingAlg::initialize() {
+  StatusCode LArRawDataReadingAlg::initialize() {
   if (m_rawChannelKey.key().size()>0) {
     ATH_CHECK(m_rawChannelKey.initialize());
   }
@@ -51,27 +47,29 @@ StatusCode LArRawDataReadingAlg::finalize() {
 } 
 
 StatusCode LArRawDataReadingAlg::execute(const EventContext& ctx) const {
-
-  //Write output via write handle
   LArRawChannelContainer* rawChannels=nullptr;
   LArDigitContainer* digits=nullptr;
   LArFebHeaderContainer* febHeaders=nullptr;
 
-
   if (m_doRawChannels) {
     SG::WriteHandle<LArRawChannelContainer> rawChannelsHdl(m_rawChannelKey,ctx);
     ATH_CHECK(rawChannelsHdl.record(std::make_unique<LArRawChannelContainer>()));
     rawChannels=rawChannelsHdl.ptr();
   }
 
-
-
   if (m_doDigits) {
     SG::WriteHandle<LArDigitContainer> digitsHdl(m_digitKey,ctx);
     ATH_CHECK(digitsHdl.record(std::make_unique<LArDigitContainer>()));
     digits=digitsHdl.ptr();
   }
 
+  if (m_doFebHeaders) {
+    SG::WriteHandle<LArFebHeaderContainer> febHeadersHdl(m_febHeaderKey,ctx);
+    ATH_CHECK(febHeadersHdl.record(std::make_unique<LArFebHeaderContainer>()));
+    febHeaders=febHeadersHdl.ptr();
+  }
+
+  //Get full events and filter out LAr ROBs
   const RawEvent* fullEvent=m_robDataProviderSvc->getEvent(ctx);
   std::map<eformat::SubDetectorGroup, std::vector<const uint32_t*> > rawEventTOC;
   eformat::helper::build_toc(*fullEvent, rawEventTOC);
@@ -179,13 +177,11 @@ StatusCode LArRawDataReadingAlg::execute(const EventContext& ctx) const {
 	}//end getNextEnergyLoop
       }//end if m_doRawChannels 
 
-
+      //Decode LArDigits (if requested)
       if (m_doDigits) {
-	CaloGain::CaloGain calogain;
 	uint32_t gain;
 	int fcNb;
 	std::vector<short> samples;
-
 	while (rodBlock->getNextRawData(fcNb,samples,gain)) {
 	  if (fcNb>=NthisFebChannel)
 	    continue;
@@ -196,6 +192,51 @@ StatusCode LArRawDataReadingAlg::execute(const EventContext& ctx) const {
 	}//end getNextRawData loop
       }//end if m_doDigits
 
+      //Decode FebHeaders (if requested)
+      if (m_doFebHeaders) {
+	std::unique_ptr<LArFebHeader> larFebHeader(new LArFebHeader(fId));
+	larFebHeader->SetFormatVersion(rob.rod_version());
+	larFebHeader->SetSourceId(rob.rod_source_id());
+	larFebHeader->SetRunNumber(rob.rod_run_no());
+	larFebHeader->SetELVL1Id(rob.rod_lvl1_id());
+	larFebHeader->SetBCId(rob.rod_bc_id());
+	larFebHeader->SetLVL1TigType(rob.rod_lvl1_trigger_type());
+	larFebHeader->SetDetEventType(rob.rod_detev_type());
+  
+	//set DSP data
+	const unsigned nsample=rodBlock->getNumberOfSamples();
+	larFebHeader->SetRodStatus(rodBlock->getStatus());
+	larFebHeader->SetDspCodeVersion(rodBlock->getDspCodeVersion()); 
+	larFebHeader->SetDspEventCounter(rodBlock->getDspEventCounter()); 
+	larFebHeader->SetRodResults1Size(rodBlock->getResults1Size()); 
+	larFebHeader->SetRodResults2Size(rodBlock->getResults2Size()); 
+	larFebHeader->SetRodRawDataSize(rodBlock->getRawDataSize()); 
+	larFebHeader->SetNbSweetCells1(rodBlock->getNbSweetCells1()); 
+	larFebHeader->SetNbSweetCells2(rodBlock->getNbSweetCells2()); 
+	larFebHeader->SetNbSamples(nsample); 
+	larFebHeader->SetOnlineChecksum(rodBlock->onlineCheckSum());
+	larFebHeader->SetOfflineChecksum(rodBlock->offlineCheckSum());
+
+	if(!rodBlock->hasControlWords()) {
+	  larFebHeader->SetFebELVL1Id(rob.rod_lvl1_id());
+	  larFebHeader->SetFebBCId(rob.rod_bc_id());
+	} else {
+	  const uint16_t evtid = rodBlock->getCtrl1(0) & 0x1f;
+	  const uint16_t bcid  = rodBlock->getCtrl2(0) & 0x1fff;
+	  larFebHeader->SetFebELVL1Id(evtid);
+	  larFebHeader->SetFebBCId(bcid);
+	  for(int iadc=0;iadc<16;iadc++) {
+	    larFebHeader->SetFebCtrl1(rodBlock->getCtrl1(iadc));
+	    larFebHeader->SetFebCtrl2(rodBlock->getCtrl2(iadc));
+	    larFebHeader->SetFebCtrl3(rodBlock->getCtrl3(iadc));
+	  }
+	  for(unsigned int i = 0; i<nsample; i++ ) {
+	    larFebHeader->SetFebSCA(rodBlock->getRadd(0,i) & 0xff);
+	  }
+	}//end else no control words
+	febHeaders->push_back(std::move(larFebHeader));
+      }//end if m_doFebHeaders
+
     }while (rodBlock->nextFEB()); //Get NextFeb
   } //end loop over ROBs
   return StatusCode::SUCCESS;