diff --git a/TileCalorimeter/TileConditions/src/TileCondToolOfc.cxx b/TileCalorimeter/TileConditions/src/TileCondToolOfc.cxx
index 1afa5d3b5a8062003ba248060e0c8330578168cd..92afaa77b8dd3a3f55803a9485728b71f77ae0b6 100644
--- a/TileCalorimeter/TileConditions/src/TileCondToolOfc.cxx
+++ b/TileCalorimeter/TileConditions/src/TileCondToolOfc.cxx
@@ -7,6 +7,8 @@
 
 // Tile includes
 #include "TileConditions/TileCondToolOfc.h"
+#include "TileConditions/TileCablingService.h"
+#include "TileConditions/TileCablingSvc.h"
 
 
 //
@@ -24,6 +26,9 @@ TileCondToolOfc::TileCondToolOfc(const std::string& type, const std::string& nam
     , m_tileToolAutoCr("TileCondToolAutoCr")
 //  , m_tileToolNoiseSample("TileCondToolNoiseSample")
     , m_tileInfo(0)
+    , m_maxChannels(0)
+    , m_maxGains(0)
+    , m_drawerCacheSize(0)
 {
   declareInterface<ITileCondToolOfc>(this);
   declareProperty("nSamples", m_nSamples = 7, "number of samples used in the run");
@@ -80,6 +85,20 @@ StatusCode TileCondToolOfc::initialize() {
   //=== Prepare for calculation of OFCs
   m_weights.n_samples = m_nSamples;
 
+  //=== Initialize max values
+  ServiceHandle<TileCablingSvc> cablingSvc("TileCablingSvc", name());
+  CHECK( cablingSvc.retrieve());
+
+  const TileCablingService* cabling = cablingSvc->cablingService();
+  if (!cabling) {
+    ATH_MSG_ERROR( "Unable to retrieve TileCablingService" );
+    return StatusCode::FAILURE;
+  }
+
+  m_maxChannels = cabling->getMaxChannels();
+  m_maxGains = cabling->getMaxGains();
+  m_drawerCacheSize = m_maxChannels * m_maxGains;
+
   // Prepare cache table for all channels (array of pointers to "MAP"s)
   if (m_cache) {
 
diff --git a/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h b/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h
index 1428499061d4bd8c4ed1ad4729e3f71bdaa64b4b..4683f62d7ce02db5a1bc96163c30d369eb122c43 100755
--- a/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h
+++ b/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h
@@ -82,7 +82,8 @@ public:
    * Get BCID
    * @return BCID
    */
-  inline uint32_t getFragBCID() const { return m_FragBCID; }
+  inline uint32_t getFragBCID() const { return (m_FragBCID & 0xFFFF); }
+  inline uint32_t getFragStatus() const { return (m_FragBCID >> 16); }
 
   /**
    * Set chip header words for this collection
diff --git a/TileCalorimeter/TileMonitoring/TileMonitoring/TileDQFragMonTool.h b/TileCalorimeter/TileMonitoring/TileMonitoring/TileDQFragMonTool.h
index c24504d5e2a6b3daf23c9ad524ad8358a0f5d91e..2c0f3ad927c1a410eecb2196668285f46bdfe0db 100644
--- a/TileCalorimeter/TileMonitoring/TileMonitoring/TileDQFragMonTool.h
+++ b/TileCalorimeter/TileMonitoring/TileMonitoring/TileDQFragMonTool.h
@@ -114,7 +114,10 @@ class TileDQFragMonTool: public TileFatherMonTool {
     TProfile* m_hist_error_lb[4][64];
 
 
-    static const int NERROR = 15;
+    static const int NERROR = 17;
+    static const int MASKEDERROR = NERROR - 3;
+    static const int DCSERROR = NERROR - 2;
+    static const int HVERROR = NERROR - 1;
     static const int NCORRUPTED = 13;
     static const int NDMU = 16;
 
diff --git a/TileCalorimeter/TileMonitoring/TileMonitoring/TilePaterMonTool.h b/TileCalorimeter/TileMonitoring/TileMonitoring/TilePaterMonTool.h
index 46603880d0382a4899d7c3a3e2e36f06658c7cdf..7af685d0905ee3422c033cf3276d1e078ef4ab33 100644
--- a/TileCalorimeter/TileMonitoring/TileMonitoring/TilePaterMonTool.h
+++ b/TileCalorimeter/TileMonitoring/TileMonitoring/TilePaterMonTool.h
@@ -60,7 +60,8 @@ class TilePaterMonTool: public ManagedMonitorToolBase
   ~TilePaterMonTool();
 
   StatusCode initialize();
-    
+
+  enum TileFragStatus {ALL_OK=0, CRC_ERR=1, ALL_FF=0x10, ALL_00=0x20, NO_FRAG=0x40, NO_ROB=0x80};
 
 protected:
 /// Implicit version of book1D 
diff --git a/TileCalorimeter/TileMonitoring/share/TileRec_FlagOptions.py b/TileCalorimeter/TileMonitoring/share/TileRec_FlagOptions.py
index 57828948e03831c2540cdc318ba6d2dfdbe59ff1..b3826816275f0ebd6f6596ea0883020aa7bf3f51 100644
--- a/TileCalorimeter/TileMonitoring/share/TileRec_FlagOptions.py
+++ b/TileCalorimeter/TileMonitoring/share/TileRec_FlagOptions.py
@@ -108,10 +108,10 @@ if not 'TileUseCOOL' in dir():
    
 if TileUseCOOL and not 'tileCOOLtag' in dir():
     if doOnline:
-        tileCOOLtag = "CONDBR2-HLTP-2016-01"
+        tileCOOLtag = "CONDBR2-HLTP-2017-03"
     else:
         if RunNumber > 232498:
-            tileCOOLtag = "CONDBR2-BLKPA-2016-11"
+            tileCOOLtag = "CONDBR2-BLKPA-2017-10"
         else:
             tileCOOLtag = "COMCOND-BLKPA-RUN1-06"
 
diff --git a/TileCalorimeter/TileMonitoring/share/TileRec_topOptions.py b/TileCalorimeter/TileMonitoring/share/TileRec_topOptions.py
index e9f34459c2bf0d21c61985e6e227daa260d1d27c..3b10ce2595ec3ddd1f7aaad8963d62813e228258 100644
--- a/TileCalorimeter/TileMonitoring/share/TileRec_topOptions.py
+++ b/TileCalorimeter/TileMonitoring/share/TileRec_topOptions.py
@@ -8,7 +8,7 @@
 
 from os import system, popen
 
-def FindFile(path, runinput):
+def FindFile(path, runinput, filter):
 
     run = str(runinput)
 
@@ -19,15 +19,15 @@ def FindFile(path, runinput):
     fullname = []
 
     if path.startswith('/castor') :
-        for f in popen('ls %(path)s | grep %(run)s' % {'path': path, 'run':run }):
+        for f in popen('ls %(path)s | grep %(run)s | grep %(filt)s' % {'path': path, 'run':run, 'filt':filter }):
             files.append(f)
 
     elif path.startswith('/eos') :
-        for f in popen('eos ls %(path)s | grep %(run)s' % {'path': path, 'run':run }):
+        for f in popen('eos ls %(path)s | grep %(run)s | grep %(filt)s' % {'path': path, 'run':run, 'filt':filter }):
             files.append(f)
 
     else:
-        for f in popen('nsls  %(path)s | grep %(run)s' % {'path': path, 'run':run }):
+        for f in popen('nsls  %(path)s | grep %(run)s | grep %(filt)s' % {'path': path, 'run':run, 'filt':filter }):
             files.append(f)
             
 
@@ -114,10 +114,12 @@ if not athenaCommonFlags.isOnline():
        else:
            RunFromLocal = False
    
-    if not 'FileNameVec' in dir():
-        if not 'FileName' in dir():
+    if not 'FileNameVec' in dir() or len(FileNameVec) == 0 or len(FileNameVec[0]) == 0:
+        if not 'FileName' in dir() or len(FileName)==0:
 
-            tmp = FindFile(InputDirectory, RunNumber)
+            if not 'FileFilter' in dir():
+                FileFilter = "data"
+            tmp = FindFile(InputDirectory, RunNumber, FileFilter)
             FileNameVec = tmp[0]
             FormattedRunNumber = tmp[1]
             
diff --git a/TileCalorimeter/TileMonitoring/src/TileDQFragMonTool.cxx b/TileCalorimeter/TileMonitoring/src/TileDQFragMonTool.cxx
index 655946b969064a74cac9dd39ba857a3ed106b634..577cd556705a3da965ef26ee9dad1e15c2bb65b7 100644
--- a/TileCalorimeter/TileMonitoring/src/TileDQFragMonTool.cxx
+++ b/TileCalorimeter/TileMonitoring/src/TileDQFragMonTool.cxx
@@ -90,9 +90,12 @@ TileDQFragMonTool::TileDQFragMonTool(const std::string & type, const std::string
   m_ErrorsLabels.push_back("DOUBLE_STB");         // Error: 9
   m_ErrorsLabels.push_back("SINGLE_STB");         // Error: 10
   m_ErrorsLabels.push_back("GLOBAL_CRC");         // Error: 11
-  m_ErrorsLabels.push_back("MASKED");             // Error: 12
-  m_ErrorsLabels.push_back("ALL_M_BAD_DCS");      // Error: 13
-  m_ErrorsLabels.push_back("ANY_CH_BAD_HV");      // Error: 14
+  m_ErrorsLabels.push_back("DUMMY_FRAG");         // Error: 12
+  m_ErrorsLabels.push_back("NO_RECO_FFAG");       // Error: 13
+  m_ErrorsLabels.push_back("MASKED");             // Error: 14
+  m_ErrorsLabels.push_back("ALL_M_BAD_DCS");      // Error: 15
+  m_ErrorsLabels.push_back("ANY_CH_BAD_HV");      // Error: 16
+  assert( m_ErrorsLabels.size() != NERROR );
   // corrupted data
   m_ErrorsLabels.push_back("0 -> 1023");          // Error: NERROR - 1 + 1
   m_ErrorsLabels.push_back("Zeros");              // Error: NERROR - 1 + 2
@@ -107,6 +110,7 @@ TileDQFragMonTool::TileDQFragMonTool(const std::string & type, const std::string
   m_ErrorsLabels.push_back("Single Dn LG_s6");    // Error: NERROR - 1 + 11
   m_ErrorsLabels.push_back("Up LG_s0_s6 or Gap"); // Error: NERROR - 1 + 12
   m_ErrorsLabels.push_back("Dn LG_s0_s6 or Gap"); // Error: NERROR - 1 + 13
+  assert( m_ErrorsLabels.size() != (NERROR+NCORRUPTED) );
   
   m_PartitionsLabels.push_back("LBA");
   m_PartitionsLabels.push_back("LBC");
@@ -620,7 +624,10 @@ void TileDQFragMonTool::fillBadDrawer() {
           int channel = m_tileHWID->channel(adcId);
           int gain = m_tileHWID->adc(adcId);
 
-          if ((error = TileRawChannelBuilder::CorruptedData(ROS, drawer, channel, gain, pDigits->samples(), dmin, dmax)) > 0) {
+          error = TileRawChannelBuilder::CorruptedData(ROS, drawer, channel, gain, pDigits->samples(), dmin, dmax);
+
+          if ((error > 0) && !(isDisconnected(ROS, drawer, channel)
+                               || m_tileBadChanTool->getAdcStatus(adcId).isBad())) {
             ++nBadCh;
             if (msgLvl(MSG::DEBUG)) {
               msg(MSG::DEBUG) << "LB " << getLumiBlock()
@@ -689,7 +696,7 @@ void TileDQFragMonTool::fillErrHist(int ros, int drawer) {
 /*---------------------------------------------------------*/
 
 
-  bool hasErr = false;
+  //bool hasErr = false;
   int n_error_nonmask_DMU = 0;
   unsigned int cur_lb = getLumiBlock();
 
@@ -707,9 +714,17 @@ void TileDQFragMonTool::fillErrHist(int ros, int drawer) {
     if (m_doOnline) m_hist_error_lb[ros][drawer]->Fill(0., -1.);
     else m_hist_error_lb[ros][drawer]->Fill(cur_lb, -1.);
 
-    for (int idmu = 0; idmu < NDMU; ++idmu) fillOneErrHist(ros, drawer, idmu, 13);
+    for (int idmu = 0; idmu < NDMU; ++idmu) fillOneErrHist(ros, drawer, idmu, DCSERROR);
 
   } else {
+    int status = m_dqStatus->checkGlobalErr(ros + 1, drawer, 0);
+    int err = 0;
+    if (status & (TileFragStatus::ALL_FF | TileFragStatus::ALL_00)) {
+      err = 12;
+    } else if (status & (TileFragStatus::NO_FRAG | TileFragStatus::NO_ROB)) {
+      err = 13;
+    }
+
     for (int idmu = 0; idmu < NDMU; idmu++) { // loop over dmus
       int ichn = 3 * idmu;
 
@@ -725,15 +740,18 @@ void TileDQFragMonTool::fillErrHist(int ros, int drawer) {
                   && !m_tileBadChanTool->getChannelStatus(drawerIdx, ichn + 2).contains(TileBchPrbs::NoHV)
                   && !m_tileBadChanTool->getChannelStatus(drawerIdx, ichn + 2).contains(TileBchPrbs::WrongHV)))) {
 
-        fillOneErrHist(ros, drawer, idmu, 14);      
+        fillOneErrHist(ros, drawer, idmu, HVERROR);      
       }
 
       if (m_dqStatus->isChanDQgood(ros + 1, drawer, ichn)) {
         fillOneErrHist(ros, drawer, idmu, 0);
       } else {
-        hasErr |= CheckhasErr(ros, drawer, idmu);
+        //hasErr |= CheckhasErr(ros, drawer, idmu);
         if (CheckhasErr(ros, drawer, idmu)) n_error_nonmask_DMU++;
-        if (m_dqStatus->checkHeaderFormatErr(ros + 1, drawer, idmu, 0) != 0) { // in case of format errors, we only fill this one
+        
+        if (err) {
+          fillOneErrHist(ros, drawer, idmu, err);
+        } else if (m_dqStatus->checkHeaderFormatErr(ros + 1, drawer, idmu, 0) != 0) { // in case of format errors, we only fill this one
           fillOneErrHist(ros, drawer, idmu, 1);
         } else {
           if (m_dqStatus->checkHeaderParityErr(ros + 1, drawer, idmu, 0) != 0) {
@@ -816,7 +834,7 @@ void TileDQFragMonTool::updateHistograms() {
   for (int ros = 0; ros < 4; ros++) {  //loop over ros...
     for (int drawer = 0; drawer < 64; ++drawer) {
       for (int dmu = 0; dmu < NDMU; dmu++) {
-        Int_t bin = m_hist_error[ros][drawer]->FindBin(dmu, NERROR - 3);
+        Int_t bin = m_hist_error[ros][drawer]->FindBin(dmu, MASKEDERROR);
         if (m_hist_error[ros][drawer]->GetBinContent(bin) > 0)
           m_hist_error[ros][drawer]->SetBinContent(bin, m_UpdateTotal);
         m_hist_error[ros][drawer]->SetEntries(m_UpdateTotal);
@@ -964,19 +982,19 @@ void TileDQFragMonTool::fillMasking()
           sp_EB = false;
 
         if (status0.isBad() && status1.isBad() && status2.isBad()) {
-          m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1);
+          m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1);
         } else if ((ros > 1) && ((ch == 18 && !sp_EB) || ch == 33)) { //disconnected channels for EBs
-          if (status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1);
+          if (status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1);
         } else if ((ros < 2) && (ch == 30)) { //disconnected channels for LBs
-          if (status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1);
+          if (status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1);
         } else if ((ros < 2) && (ch == 42)) { //disconnected channels for LBs
-          if (status0.isBad() && status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1);
+          if (status0.isBad() && status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1);
         } else if ((ros > 1) && (ch == 24 || ch == 27 || ch == 42 || ch == 45)) { // void DMUs for EBs
-          m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1);
+          m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1);
         } else if (sp_EB && (ch == 0)) { // void DMU 0 for EBA15, EBC18
-          m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1);
+          m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1);
         } else if (sp_EB && (ch == 3)) { // disconnected PMT of DMU 1 for EBA15, EBC18
-          if (status1.isBad() && status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1);
+          if (status1.isBad() && status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1);
         }
       } //chan loop
     } // drawer loop
@@ -989,10 +1007,10 @@ bool TileDQFragMonTool::CheckhasErr(int ros, int drawer, int dmu) {
 /*---------------------------------------------------------*/
 
   if (ros < 2) {
-    if (m_hist_error[ros][drawer]->GetBinContent(dmu + 1, 13) > 0) return false;
+    if (m_hist_error[ros][drawer]->GetBinContent(dmu + 1, MASKEDERROR + 1) > 0) return false;
   } else {
     if ((dmu == 8) || (dmu == 9) || (dmu == 14) || (dmu == 15)
-        || (m_hist_error[ros][drawer]->GetBinContent(dmu + 1, 13) > 0))
+        || (m_hist_error[ros][drawer]->GetBinContent(dmu + 1, MASKEDERROR + 1) > 0))
       return false;
     else if (((drawer == 14) && (ros == 2)) || ((drawer == 17) && (ros == 3))) {
       if (dmu == 0) return false;
diff --git a/TileCalorimeter/TileMonitoring/src/TileDigitsMonTool.cxx b/TileCalorimeter/TileMonitoring/src/TileDigitsMonTool.cxx
index f6082c71410e4229b2caac1f4cf635e21e9daeac..cc6b1a94dc1d05ea837488d9fec00efde9635e84 100644
--- a/TileCalorimeter/TileMonitoring/src/TileDigitsMonTool.cxx
+++ b/TileCalorimeter/TileMonitoring/src/TileDigitsMonTool.cxx
@@ -189,7 +189,7 @@ void TileDigitsMonTool::bookHists(int ros, int drawer)
     sStr << moduleName << " DMU Header " << gain[3 + gn] << " errors";
     histTitle = sStr.str();
 
-    m_hist2[ros][drawer][adc].push_back(book2F(subDir, histName, histTitle, 16, 0., 16., 6, -0.5, 5.5));
+    m_hist2[ros][drawer][adc].push_back(book2F(subDir, histName, histTitle, 16, 0., 16., 8, -0.5, 7.5));
   }
 
   for (int ch = 0; ch < 48; ++ch) {
@@ -353,6 +353,23 @@ StatusCode TileDigitsMonTool::fillHists()
       if (!m_bookAll) bookHists(ros, drawer);
     }
     
+    uint32_t status = digitsCollection->getFragStatus();
+    if (status != TileFragStatus::ALL_OK) {
+      float bin = 99.;
+      if (status & (TileFragStatus::ALL_FF || TileFragStatus::ALL_00)) {
+        bin = 6.;
+      } else if (status & (TileFragStatus::NO_FRAG || TileFragStatus::NO_ROB)) {
+        bin = 7.;
+      }
+      for (int dmu = 0; dmu < 16; dmu++) {
+        m_corrup[ros][drawer][0][dmu] = true;
+        m_corrup[ros][drawer][1][dmu] = true;
+        m_hist2[ros][drawer][0][0]->Fill(dmu + 0.5, bin, 1.);
+        m_hist2[ros][drawer][1][0]->Fill(dmu + 0.5, bin, 1.);
+      }
+      continue;
+    }
+
     std::vector<uint32_t> headerVec = digitsCollection->getFragChipHeaderWords();
 
     int headsize = headerVec.size();
@@ -1121,6 +1138,8 @@ void TileDigitsMonTool::drawHists(int ros, int drawer, std::string moduleName)
     m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(4, "Memory");
     m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(5, "SingleStr");
     m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(6, "DbleStr");
+    m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(7, "DummyFrag");
+    m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(8, "NoDataFrag");
     m_hist2[ros][drawer][gain][0]->GetYaxis()->SetTickLength(0.01);
     m_hist2[ros][drawer][gain][0]->GetYaxis()->SetLabelOffset(0.001);
     if (do_plots) {
@@ -1661,12 +1680,12 @@ bool TileDigitsMonTool::DMUheaderCheck(std::vector<uint32_t>* headerVec, int ros
   }
   if (((*headerVec)[dmu] >> 24) & 0x1) {
     //Single Strobe Error
-    m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 5., 1.);
+    m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 4., 1.);
     err = true;
   }
   if (((*headerVec)[dmu] >> 23) & 0x1) {
     //Double Strobe Error
-    m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 0., 1.);
+    m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 5., 1.);
     err = true;
   }
   if (!err) m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 0., 1.);
diff --git a/TileCalorimeter/TileRecUtils/TileRecUtils/TileBeamInfoProvider.h b/TileCalorimeter/TileRecUtils/TileRecUtils/TileBeamInfoProvider.h
index 566ea05d8fe6562078e62acb12b1bcac4b7f41fc..98a269c161bc3328f48ff8ab43ace99281243c60 100644
--- a/TileCalorimeter/TileRecUtils/TileRecUtils/TileBeamInfoProvider.h
+++ b/TileCalorimeter/TileRecUtils/TileRecUtils/TileBeamInfoProvider.h
@@ -101,6 +101,10 @@ class TileDQstatus {
 	return (m_EmptyEventArray[partition][drawer][dmu][0]+((m_EmptyEventArray[partition][drawer][dmu][1]) << 1));
   }
   
+  /** @brief returns 1 if adc channel has any global error */
+  inline int checkGlobalErr(int partition, int drawer, int gain) const {
+    return m_GlobalCRCErrArray[partition][drawer][gain];
+  }
   /** @brief returns 1 if adc channel has global CRC error */
   inline int checkGlobalCRCErr(int partition, int drawer, int gain) const {
     return m_GlobalCRCErrArray[partition][drawer][gain] & 1;
diff --git a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h
index 74688c4198fa9a7a1e1d88588a3eb0a10829dd11..9bda9aaf76cc05e16a8cae8e92d4e863bae0ed33 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h
+++ b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h
@@ -142,6 +142,9 @@ class TileROD_Decoder: public AthAlgTool {
     void printErrorCounter(bool printIfNoError);
     int getErrorCounter();
 
+    void printWarningCounter(bool printIfNoWarning);
+    int getWarningCounter();
+
     const TileHid2RESrcID * getHid2reHLT() {
       if (!m_hid2reHLT) initHid2reHLT();
       return m_hid2reHLT;
@@ -178,6 +181,8 @@ class TileROD_Decoder: public AthAlgTool {
     void setUseFrag5Raw (bool f) { m_useFrag5Raw = f; }
     void setUseFrag5Reco (bool f) { m_useFrag5Reco = f; }
 
+  enum TileFragStatus {ALL_OK=0, CRC_ERR=1, ALL_FF=0x10, ALL_00=0x20, NO_FRAG=0x40, NO_ROB=0x80};
+
   private:
     friend class TileHid2RESrcID;
 
@@ -495,12 +500,14 @@ class TileROD_Decoder: public AthAlgTool {
     // Error reporting (needs to be mutable)
     mutable uint32_t m_error;
 
+    int m_maxWarningPrint;
     int m_maxErrorPrint;
 
     // Pointer to TileL2Builder
     TileL2Builder* m_L2Builder;
     std::string m_TileDefaultL2Builder;
 
+    int m_WarningCounter;
     int m_ErrorCounter;
     bool m_correctAmplitude;
 
@@ -536,19 +543,43 @@ class TileROD_Decoder: public AthAlgTool {
         max_allowed_size = 0;
       if (size < 3 && size > 0) {
         if (rob->rod_source_id() > 0x50ffff) m_error |= 0x10000; // indicate error in frag size, but ignore error in laser ROD
-        if (m_ErrorCounter < (m_maxErrorPrint--)) {
-          ATH_MSG_ERROR("ROB " << std::hex << rob->source_id()
-              << " ROD " << std::hex << rob->rod_source_id() << std::dec
+        if (m_WarningCounter < (m_maxWarningPrint--)) {
+          ATH_MSG_WARNING("ROB " << MSG::hex << rob->source_id()
+              << " ROD " << rob->rod_source_id() << MSG::dec
               << " has unexpected data size: " << size << " - assuming zero size " );
         }
         return 0;
       } else if (size > max_allowed_size) {
         if (rob->rod_source_id() > 0x50ffff) m_error |= 0x10000; // indicate error in frag size, but ignore error in laser ROD
-        if ((m_ErrorCounter++) < m_maxErrorPrint) {
-          ATH_MSG_ERROR("ROB " << std::hex << rob->source_id()
-                        << " ROD " << std::hex << rob->rod_source_id() << std::dec
-                        << " has unexpected data size: " << size
-                        << " - assuming size = " << max_allowed_size << " words " );
+
+        if (size - rob->rod_trailer_size_word() < max_allowed_size) {
+          if ((m_WarningCounter++) < m_maxWarningPrint) {
+            ATH_MSG_WARNING("ROB " << MSG::hex << rob->source_id()
+                            << " ROD " << rob->rod_source_id() << MSG::dec
+                            << " data size " << size << " is longer than allowed size " << max_allowed_size
+                            << " - assuming that ROD trailer is shorter: "
+                            << rob->rod_trailer_size_word()-(size-max_allowed_size)
+                            << " words instead of " << rob->rod_trailer_size_word());
+          }
+          max_allowed_size = size;
+        } else if (size - rob->rod_trailer_size_word() == max_allowed_size) {
+          if ((m_WarningCounter++) < m_maxWarningPrint) {
+            ATH_MSG_WARNING("ROB " << MSG::hex << rob->source_id()
+                            << " ROD " << rob->rod_source_id() << MSG::dec
+                            << " data size " << size << " is longer than allowed size " << max_allowed_size
+                            << " - assuming that ROD trailer ("
+                            << rob->rod_trailer_size_word()
+                            << " words) is absent");
+          }
+          max_allowed_size = size;
+        } else {
+          max_allowed_size += rob->rod_trailer_size_word();
+          if ((m_WarningCounter++) < m_maxWarningPrint) {
+            ATH_MSG_WARNING("ROB " << MSG::hex << rob->source_id()
+                            << " ROD " << rob->rod_source_id() << MSG::dec
+                            << " has unexpected data size: " << size
+                            << " - assuming data size = " << max_allowed_size << " words and no ROD trailer at all" );
+          }
         }
         return max_allowed_size;
       } else {
@@ -590,10 +621,15 @@ void TileROD_Decoder::make_copy(const ROBData * rob, pDigiVec & pDigits, pRwChVe
   v.setDetEvType(rob->rod_detev_type());
   v.setRODBCID(rob->rod_bc_id());
 
+  uint32_t status = TileFragStatus::ALL_OK;
+  for (size_t j=0; j<m_digitsMetaData[6]->size(); ++j) {
+    status |= (*(m_digitsMetaData[6]))[j];
+  }
+
   if (v.size() > 0) {
     // Set meta data
     v.setFragSize((*(m_digitsMetaData[0]))[0]);
-    v.setFragBCID((*(m_digitsMetaData[0]))[2]);
+    v.setFragBCID((*(m_digitsMetaData[0]))[2] | (status<<16));
 
     v.setFragExtraWords(*(m_digitsMetaData[1]));
 
@@ -606,8 +642,14 @@ void TileROD_Decoder::make_copy(const ROBData * rob, pDigiVec & pDigits, pRwChVe
     }
     if (m_verbose) v.printExtra();
   } else if ( m_digitsMetaData[0]->size() == 0 ) {
-    v.setFragBCID(0xDEAD);
+    // no useful digi fragment or no data inside fragment
+    status |= TileFragStatus::NO_FRAG;
+    v.setFragBCID(0xDEAD | (status<<16));
+    v.setFragSize(0);
   }
+
+  if (status!=TileFragStatus::ALL_OK)
+    ATH_MSG_DEBUG( "Status for drawer 0x" << MSG::hex << v.identify() << " in Digi frag is 0x" << status << MSG::dec);
 }
 
 inline
@@ -637,7 +679,17 @@ void TileROD_Decoder::make_copy(const ROBData * rob, pDigiVec & pDigits, pRwChVe
       //m_RCBuilder->build(pDigits.begin(),pDigits.end(),(&v));
 
       delete_vec(pDigits); // Digits deleted
+
+    } else {
+      ATH_MSG_DEBUG( "data for drawer 0x" << MSG::hex << v.identify() << MSG::dec << " not found in BS" );
+    }
+    m_rawchannelMetaData[6]->push_back(TileFragStatus::NO_FRAG);
+    HWIdentifier drawerID = m_tileHWID->drawer_id(v.identify());
+    for (unsigned int ch = 0; ch < m_maxChannels; ++ch) {
+      HWIdentifier adcID = m_tileHWID->adc_id(drawerID, ch, 0);
+      v.push_back(new TileRawChannel(adcID, 0.0, -100.0, 31));
     }
+
   }
 
   v.setLvl1Id(rob->rod_lvl1_id());
@@ -658,7 +710,14 @@ void TileROD_Decoder::make_copy(const ROBData * rob, pDigiVec & pDigits, pRwChVe
     }
   }
 
-  v.setFragGlobalCRC((*(m_rawchannelMetaData[0]))[0]);
+  uint32_t status = ((*(m_rawchannelMetaData[0]))[0] & 0x1) ? TileFragStatus::CRC_ERR : TileFragStatus::ALL_OK ;
+  for (size_t j=0; j<m_rawchannelMetaData[6]->size(); ++j) {
+    status |= (*(m_rawchannelMetaData[6]))[j];
+  }
+  if (status>TileFragStatus::CRC_ERR)
+    ATH_MSG_DEBUG( "Status for drawer 0x" << MSG::hex << v.identify() << " is 0x" << status << MSG::dec);
+
+  v.setFragGlobalCRC(status);
   v.setFragDSPBCID((*(m_rawchannelMetaData[0]))[1]);
   v.setFragBCID((*(m_rawchannelMetaData[1]))[0]);
   v.setFragMemoryPar((*(m_rawchannelMetaData[1]))[1]);
@@ -726,8 +785,8 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) {
   //
   //  if (msgLvl(MSG::VERBOSE)) {
   //    msg(MSG::VERBOSE) << "ROD header info: " << endmsg
-  //    msg(MSG::VERBOSE) << " Format Vers.  " << std::hex << "0x" << rob->rod_version() << std::dec << endmsg;
-  //    msg(MSG::VERBOSE) << " Source ID     " << std::hex << "0x" << rob->rod_source_id() << std::dec << endmsg;
+  //    msg(MSG::VERBOSE) << " Format Vers.  " << MSG::hex << "0x" << rob->rod_version() << MSG::dec << endmsg;
+  //    msg(MSG::VERBOSE) << " Source ID     " << MSG::hex << "0x" << rob->rod_source_id() << MSG::dec << endmsg;
   //    msg(MSG::VERBOSE) << " Source ID str " << eformat::helper::SourceIdentifier(rob->source_id()).human().c_str() << endmsg;
   //    msg(MSG::VERBOSE) << " Run number    " << (int) rob->rod_run_no() << endmsg;
   //    msg(MSG::VERBOSE) << " Level1 ID     " << rob->rod_lvl1_id() << endmsg;
@@ -742,7 +801,7 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) {
   //    msg(MSG::VERBOSE) << " Status pos    " << rob->rod_status_position() << endmsg;
   //  }
 
-  uint32_t version = rob->rod_version() & 0xFF;
+  uint32_t version = rob->rod_version() & 0xFFFF;
 
   bool isBeamROD = false;
   // figure out which fragment we want to unpack
@@ -770,6 +829,11 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) {
   if (size) {
     bool V3format = (*(p) == 0xff1234ff); // additional frag marker since Sep 2005
     V3format |= (*(p) == 0x00123400); // additional frag marker since Sep 2005 (can appear in buggy ROD frags)
+    if (!V3format && version>0xff) {
+      V3format = true;
+      if ((m_WarningCounter++) < m_maxWarningPrint)
+        ATH_MSG_WARNING("fillCollection: corrupted frag separator 0x" << MSG::hex << (*p) << " instead of 0xff1234ff in ROB 0x" << rob->rod_source_id() << MSG::dec );
+    }
     if (V3format) {
       ++p; // skip frag marker
       m_sizeOverhead = 3;
@@ -804,7 +868,7 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) {
         }
       }
       if ((m_ErrorCounter++) < m_maxErrorPrint) {
-        msg(MSG::ERROR) << "Frag 0x" << std::hex << frag << std::dec
+        msg(MSG::ERROR) << "Frag 0x" << MSG::hex << frag << MSG::dec
                         << " has unexpected size: " << count;
         if (wc < size) {
           msg(MSG::ERROR) << "  skipping " << cnt << " words to the next frag" << endmsg;
@@ -864,7 +928,7 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) {
     pChannel.reserve(48);
 
     // initialize meta data storage
-    for (unsigned int i = 0; i < 6; ++i) {
+    for (unsigned int i = 0; i < 7; ++i) {
       m_digitsMetaData[i]->clear();
       m_rawchannelMetaData[i]->clear();
     }
@@ -884,8 +948,8 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) {
       uint32_t idAndType = *(p + 1);
       int type = (idAndType & 0x00FF0000) >> 16;
 
-      ATH_MSG_VERBOSE( "Unpacking frag: 0x" << std::hex << (idAndType & 0xFFFF)
-                      << " type " << type << std::dec );
+      ATH_MSG_VERBOSE( "Unpacking frag: 0x" << MSG::hex << (idAndType & 0xFFFF)
+                      << " type " << type << MSG::dec );
 
       createdFrom |= (1 << type);
 
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileCellCont.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileCellCont.cxx
index 842e2ae1808bbaa42baf1c37a00a06d831632b61..d9bb726933afb36269fdc32280af55d47d33c9a1 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileCellCont.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileCellCont.cxx
@@ -95,7 +95,7 @@ StatusCode TileCellCont::initialize() {
 
   // Get pointer to TileCablingService
   TileCablingService* cabling = TileCablingService::getInstance();
-  int maxChannels = TileCalibUtils::MAX_CHAN; // cabling->getMaxChannels();
+  int maxChannels = cabling->getMaxChannels();
 
   //m_hash.initialize(0);
   m_mbts_rods.clear();
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamCnv.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamCnv.cxx
index 5ea593bd6985c236ec1ccd7843213210da13408a..563b68b3c8552843d9e3063d040befb228ab9364 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamCnv.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamCnv.cxx
@@ -146,7 +146,9 @@ StatusCode TileDigitsContByteStreamCnv::createObj(IOpaqueAddress* pAddr, DataObj
         } else {
           m_decoder->fillCollection(robf[0], *digitsCollection);
         }
-      }  
+      } else {
+        digitsCollection->setFragBCID((TileROD_Decoder::NO_ROB)<<16);
+      }
     }
 
     ATH_MSG_DEBUG( "Creating digits container " << *(pRE_Addr->par()) );
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileHid2RESrcID.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileHid2RESrcID.cxx
index fdb3d712dc009e9541c1be561574ba6af964fcca..9399952d32f695f884e865892ff6a11abbf719f7 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileHid2RESrcID.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileHid2RESrcID.cxx
@@ -273,11 +273,11 @@ void TileHid2RESrcID::setROD2ROBmap (const eformat::FullEventFragment<const uint
                   if ( (*it).second != ROBid ) {
                     log << MSG::INFO << "Frag 0x" << MSG::hex << fragid 
                         <<" remapping from ROB 0x" << (*it).second
-                        << " to 0x" << ROBid << endmsg;
+                        << " to 0x" << ROBid << MSG::dec << endmsg;
                   } else {
                     log << MSG::DEBUG << "Frag 0x" << MSG::hex << fragid 
                         <<" found in ROB 0x" << (*it).second
-                        << " as expected" << endmsg;
+                        << " as expected" << MSG::dec << endmsg;
                   }
                 }
 
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx
index 97c79006c94b40465e306d89eb91353f5e021934..6b8be9e62dfcc3245d316da5cf25bbdcaccbdb8b 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx
@@ -70,6 +70,7 @@ TileROD_Decoder::TileROD_Decoder(const std::string& type, const std::string& nam
   declareProperty("calibrateEnergy", m_calibrateEnergy = true); // convert ADC counts to pCb for RawChannels
   declareProperty("suppressDummyFragments", m_suppressDummyFragments = false);
   declareProperty("maskBadDigits", m_maskBadDigits = false); // put -1 in digits vector for channels with bad BCID or CRC in unpack_frag0
+  declareProperty("MaxWarningPrint", m_maxWarningPrint = 1000);
   declareProperty("MaxErrorPrint", m_maxErrorPrint = 100);
 
   declareProperty("AllowedTimeMin", m_allowedTimeMin = -50.); // set amp to zero if time is below allowed time min
@@ -81,7 +82,7 @@ TileROD_Decoder::TileROD_Decoder(const std::string& type, const std::string& nam
   m_timeMinThresh = -25;
   m_timeMaxThresh = 25;
   
-  for (unsigned int i = 0; i < 6; ++i) {
+  for (unsigned int i = 0; i < 7; ++i) {
     m_digitsMetaData.push_back(new std::vector<uint32_t>);
     m_digitsMetaData[i]->reserve(16);
     m_rawchannelMetaData.push_back(new std::vector<uint32_t>);
@@ -99,6 +100,7 @@ TileROD_Decoder::TileROD_Decoder(const std::string& type, const std::string& nam
   m_container = 0;
   m_MBTS = NULL;
   m_cell2Double.reserve(23); // Maximum number of cells in a drawer
+  m_WarningCounter = 0;
   m_ErrorCounter = 0;
   
   m_OFWeights.resize(4 * TileCalibUtils::MAX_DRAWERIDX, NULL);
@@ -113,7 +115,7 @@ void TileROD_Decoder::updateAmpThreshold(float ampMinThresh) {
 /** destructor
  */
 TileROD_Decoder::~TileROD_Decoder() {
-  for (unsigned int i = 0; i < 6; ++i) {
+  for (unsigned int i = 0; i < 7; ++i) {
     delete m_digitsMetaData[i];
     delete m_rawchannelMetaData[i];
   }
@@ -128,12 +130,22 @@ const InterfaceID& TileROD_Decoder::interfaceID() {
   return IID_ITileROD_Decoder;
 }
 
+void TileROD_Decoder::printWarningCounter(bool printIfNoWarning) {
+  if (printIfNoWarning || m_WarningCounter > 0) {
+    ATH_MSG_WARNING( "Found " << m_WarningCounter << " warnings in decoding words");
+  }
+}
+
 void TileROD_Decoder::printErrorCounter(bool printIfNoError) {
   if (printIfNoError || m_ErrorCounter > 0) {
     ATH_MSG_ERROR( "Found " << m_ErrorCounter << " errors in decoding words");
   }
 }
 
+int TileROD_Decoder::getWarningCounter() {
+  return m_WarningCounter;
+}
+
 int TileROD_Decoder::getErrorCounter() {
   return m_ErrorCounter;
 }
@@ -216,6 +228,7 @@ StatusCode TileROD_Decoder::finalize() {
     m_Rw2Pmt[i].clear();
   }
   m_list_of_masked_drawers.clear();
+  if (m_WarningCounter != 0) printWarningCounter(1);
   if (m_ErrorCounter != 0) printErrorCounter(1);
   return StatusCode::SUCCESS;
 }
@@ -254,12 +267,27 @@ void TileROD_Decoder::unpack_frag0(uint32_t version, const uint32_t* p, pDigiVec
   // Position of first data word, ignore 2 frag header words
   data = p + 2;
   
-  // check that fragment is not dummy
-  if (m_suppressDummyFragments) {
-    for (n = 0; n < size; ++n) {
-      if (data[n] != 0 && data[n] != 0xffffffff) break;
+  uint32_t all00 = TileFragStatus::ALL_00;
+  uint32_t allFF = TileFragStatus::ALL_FF;
+
+  for (int i = 0; i < size; ++i) {
+    uint32_t w = data[i];
+    if (allFF && w!=0xFFFFFFFF) {
+      allFF = TileFragStatus::ALL_OK;
+      if (all00 == TileFragStatus::ALL_OK) break;
+    }
+    if (all00 && w != 0) {
+      all00 = TileFragStatus::ALL_OK;
+      if (allFF == TileFragStatus::ALL_OK) break;
     }
-    if (n == size) return; // nothing reasonable found
+  }
+
+  uint32_t status = (all00 | allFF);
+  m_digitsMetaData[6]->push_back( status );
+
+  // check that fragment is not dummy
+  if (m_suppressDummyFragments && status != TileFragStatus::ALL_OK) {
+    return; // nothing reasonable found
   }
   
   // if (msgLvl(MSG::VERBOSE))
@@ -874,14 +902,18 @@ void TileROD_Decoder::unpack_frag4(uint32_t /* version */, const uint32_t* p,
   
   HWIdentifier drawerID = m_tileHWID->drawer_id(frag);
   TileRawChannel* rc;
-  
+  uint32_t all00 = TileFragStatus::ALL_00;
+  uint32_t allFF = TileFragStatus::ALL_FF;
+
   for (unsigned int ch = 0; ch < m_maxChannels; ++ch) {
     unsigned int w = (*p);
     
     int gain = m_rc2bytes4.gain(w);
     HWIdentifier adcID = m_tileHWID->adc_id(drawerID, ch, gain);
     
+    if (allFF && w!=0xFFFFFFFF) allFF = TileFragStatus::ALL_OK;
     if (w != 0) { // skip invalid channels
+      if (all00) all00 = TileFragStatus::ALL_OK;
       rc = new TileRawChannel(adcID
                               , m_rc2bytes4.amplitude(w)
                               , m_rc2bytes4.time(w)
@@ -904,6 +936,8 @@ void TileROD_Decoder::unpack_frag4(uint32_t /* version */, const uint32_t* p,
     ++p;
   }
   
+  m_rawchannelMetaData[6]->push_back( all00 | allFF );
+
   if (wc > count) {
     // check word count
     ATH_MSG_ERROR( "unpack_frag4 => Incorrect word count: "
@@ -1000,18 +1034,30 @@ void TileROD_Decoder::unpack_frag6(uint32_t /*version*/, const uint32_t* p, pDig
   // pointer to current data word
   const uint32_t* data = p + 2;     // Position of first data word, 
 
-  // check that fragment is not dummy
-  if (m_suppressDummyFragments) {
-    int n = 0;
-    for (; n < size; ++n) {
-      if (data[n] != 0 && data[n] != 0xffffffff) break;
+  uint32_t all00 = TileFragStatus::ALL_00;
+  uint32_t allFF = TileFragStatus::ALL_FF;
+
+  for (int i = 0; i < size; ++i) {
+    uint32_t w = data[i];
+    if (allFF && w!=0xFFFFFFFF) {
+      allFF = TileFragStatus::ALL_OK;
+      if (all00 == TileFragStatus::ALL_OK) break;
     }
-    if (n == size) {// nothing reasonable found
-      ATH_MSG_WARNING("FRAG6: Suppress dummy fragment!!!");
-      return; 
+    if (all00 && w != 0) {
+      all00 = TileFragStatus::ALL_OK;
+      if (allFF == TileFragStatus::ALL_OK) break;
     }
   }
 
+  uint32_t status = (all00 | allFF);
+  m_digitsMetaData[6]->push_back( status );
+
+  // check that fragment is not dummy
+  if (m_suppressDummyFragments && status != TileFragStatus::ALL_OK) {
+    ATH_MSG_WARNING("FRAG6: Suppress dummy fragment!!!");
+    return; // nothing reasonable found
+  }
+
   unsigned int moduleID[4] = {0};
   unsigned int runType[4] = {0};
 
@@ -2342,7 +2388,7 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p,
   if (true) {
     int maxn=size+2-m_sizeOverhead;
     for(int n=0; n<maxn; ++n){
-      ATH_MSG_DEBUG("WORD " << n << " (" << n+11 << ") : (DEC) " << p[n] << "  (HEX) 0x" << std::hex << p[n] << std::dec );
+      ATH_MSG_DEBUG("WORD " << n << " (" << n+11 << ") : (DEC) " << p[n] << "  (HEX) 0x" << MSG::hex << p[n] << MSG::dec );
     }
   }
   
@@ -2356,7 +2402,7 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p,
   laserObject.setPLC(-99,-99,-99,-99,-99,-99);
   laserObject.setDaqType(int(p[2]));
   
-  ATH_MSG_DEBUG("SETTING DAQ TYPE IN DECODER = " << std::hex << "0x" << int(p[2]) << "  " << std::dec << int(p[2]));
+  ATH_MSG_DEBUG("SETTING DAQ TYPE IN DECODER = " << MSG::hex << "0x" << int(p[2]) << "  " << MSG::dec << int(p[2]));
   
   int countr = p[3];
   int idiode = (p[4]>>16);
@@ -2367,7 +2413,7 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p,
   if(laserObject.isLASERII()) ATH_MSG_DEBUG("LASERII VERSION IS " << laserObject.getVersion());
   else                        ATH_MSG_DEBUG("LASERI VERSION IS "  << laserObject.getVersion());
   
-  ATH_MSG_DEBUG("laserObject.setLaser: " << std::dec << "COUNTER=" << countr << " | "
+  ATH_MSG_DEBUG("laserObject.setLaser: " << MSG::dec << "COUNTER=" << countr << " | "
                 << "I_DIODE=" << idiode << " | "
                 << "FILTERN=" << filter << " | "
                 << "TIMINGD=" << timing << " | "
@@ -2467,8 +2513,8 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p,
           ATH_MSG_DEBUG("ALP CHAN=" << channel << " GAIN=LG" << " TYPE=" << laserObject.getType(channel,TileID::LOWGAIN,3) << " MEAN=" << laserObject.getMean(channel,TileID::LOWGAIN,3) << " SIGMA=" << laserObject.getSigma(channel,TileID::LOWGAIN,3) << " N=" << laserObject.getN(channel,TileID::LOWGAIN,3) << " isSet?=" << laserObject.isSet(channel,TileID::LOWGAIN,3) );
           ATH_MSG_DEBUG("ALP CHAN=" << channel << " GAIN=HG" << " TYPE=" << laserObject.getType(channel,TileID::HIGHGAIN,3) << " MEAN=" << laserObject.getMean(channel,TileID::HIGHGAIN,3) << " SIGMA=" << laserObject.getSigma(channel,TileID::HIGHGAIN,3) << " N=" << laserObject.getN(channel,TileID::HIGHGAIN,3) << " isSet?=" << laserObject.isSet(channel,TileID::HIGHGAIN,3) );
           
-          ATH_MSG_DEBUG(std::hex << msb0 << " + " << lsb0 << " => " << SSQ0 <<
-                        std::dec << "  >>>  D" << channel << "(HG)"
+          ATH_MSG_DEBUG(MSG::hex << msb0 << " + " << lsb0 << " => " << SSQ0 <<
+                        MSG::dec << "  >>>  D" << channel << "(HG)"
                         << " SUMX/N="
                         << sum[channel*2+HG]
                         << " / " << nevt
@@ -2479,8 +2525,8 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p,
                         << " / " << nevt
                         << " => STD="
                         << std[channel*2+0]);
-          ATH_MSG_DEBUG(std::hex << msb1 << " + " << lsb1 << " => " << SSQ1 <<
-                        std::dec << "  >>>  D" << channel << "(LG)"
+          ATH_MSG_DEBUG(MSG::hex << msb1 << " + " << lsb1 << " => " << SSQ1 <<
+                        MSG::dec << "  >>>  D" << channel << "(LG)"
                         << " SUMX/N="
                         << sum[channel*2+LG]
                         << " / " << nevt
@@ -2511,7 +2557,7 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p,
     }
     
   } else { // short fragment
-    ATH_MSG_DEBUG("SHORT FRAGMENT, size=" << p[0] << " type=0x" << std::hex << p[1] << std::dec);
+    ATH_MSG_DEBUG("SHORT FRAGMENT, size=" << p[0] << " type=0x" << MSG::hex << p[1] << MSG::dec);
     memset(ped,0,sizeof(ped));
     memset(std,0,sizeof(std));
   }
@@ -2813,7 +2859,7 @@ StatusCode TileROD_Decoder::convert(const RawEvent* re, TileL2Container* L2Cnt)
 }
 
 void TileROD_Decoder::fillCollectionL2(const ROBData * rob, TileL2Container & v) {
-  uint32_t version = rob->rod_version() & 0xFF;
+  uint32_t version = rob->rod_version() & 0xFFFF;
   
   uint32_t wc = 0;
   uint32_t size = data_size(rob);
@@ -2824,6 +2870,11 @@ void TileROD_Decoder::fillCollectionL2(const ROBData * rob, TileL2Container & v)
   
   if (size) {
     bool V3format = (*(p) == 0xff1234ff); // additional frag marker since Sep 2005
+    if (!V3format && version>0xff) {
+      V3format = true;
+      if ((m_WarningCounter++) < m_maxWarningPrint)
+        ATH_MSG_WARNING("fillCollectionL2( corrupted frag separator 0x" << MSG::hex << (*p) << " instead of 0xff1234ff in ROB 0x" << rob->rod_source_id() << MSG::dec );
+    }
     if (V3format) ++p; // skip frag marker
   }
   
@@ -3008,7 +3059,7 @@ StatusCode TileROD_Decoder::convertLaser(const RawEvent* re, TileLaserObject* la
 void TileROD_Decoder::fillTileLaserObj(const ROBData * rob, TileLaserObject & v) {
   // v.setBCID(-999);  // TileLaserObject default tag -> Laser only if BCID != -999
   
-  uint32_t version = rob->rod_version() & 0xFF;
+  uint32_t version = rob->rod_version() & 0xFFFF;
   
   uint32_t wc = 0;
   uint32_t size = data_size(rob);
@@ -3025,6 +3076,11 @@ void TileROD_Decoder::fillTileLaserObj(const ROBData * rob, TileLaserObject & v)
   }
   
   bool V3format = (*(p) == 0xff1234ff); // additional frag marker since Sep 2005
+  if (!V3format && version>0) {
+    V3format = true;
+    if ((m_WarningCounter++) < m_maxWarningPrint)
+      ATH_MSG_WARNING("fillTileLaserObj: corrupted frag separator 0x" << MSG::hex << (*p) << " instead of 0xff1234ff in ROB 0x" << rob->rod_source_id() << MSG::dec );
+  }
   if (V3format) {
     ++p; // skip frag marker
     m_sizeOverhead = 3;
@@ -3042,13 +3098,13 @@ void TileROD_Decoder::fillTileLaserObj(const ROBData * rob, TileLaserObject & v)
     int frag = *(p + 1) & 0xFFFF;
     int type = *(p + 1) >> 16;
     
-    msg(MSG::DEBUG) << wc << " / " << size << " HEX = 0x" << std::hex << count << " DEC = " << std::dec << count << " ( FRAG , TYPE ) = " << frag << " , " << type << endmsg;
+    msg(MSG::DEBUG) << wc << " / " << size << " HEX = 0x" << MSG::hex << count << " DEC = " << MSG::dec << count << " ( FRAG , TYPE ) = " << frag << " , " << type << endmsg;
     
     if (count < m_sizeOverhead || count > size - wc) {
       int cnt = 0;
       for (; wc < size; ++wc, ++cnt, ++p) {
         if ((*p) == 0xff1234ff) {
-          msg(MSG::DEBUG) << "DATA POINTER: HEX = " << std::hex << (*p) << " DEC = " << std::dec << (*p) << endmsg;
+          msg(MSG::DEBUG) << "DATA POINTER: HEX = " << MSG::hex << (*p) << " DEC = " << MSG::dec << (*p) << endmsg;
           ++cnt;
           ++wc;
           ++p;
@@ -3107,7 +3163,7 @@ void TileROD_Decoder::fillTileLaserObj(const ROBData * rob, TileLaserObject & v)
 } //end of FillLaserObj
 
 void TileROD_Decoder::fillCollectionHLT(const ROBData * rob, TileCellCollection & v) {
-  uint32_t version = rob->rod_version() & 0xFF;
+  uint32_t version = rob->rod_version() & 0xFFFF;
   // Resets error flag
   m_error = 0x0;
   
@@ -3129,6 +3185,11 @@ void TileROD_Decoder::fillCollectionHLT(const ROBData * rob, TileCellCollection
   
   if (size) {
     bool V3format = (*(p) == 0xff1234ff); // additional frag marker since Sep 2005
+    if (!V3format && version>0xff) {
+      V3format = true;
+      if ((m_WarningCounter++) < m_maxWarningPrint)
+        ATH_MSG_WARNING("fillCollectionHLT: corrupted frag separator 0x" << MSG::hex << (*p) << " instead of 0xff1234ff in ROB 0x" << rob->rod_source_id() << MSG::dec );
+    }
     if (V3format) {
       ++p; // skip frag marker
       m_sizeOverhead = 3;
@@ -3978,7 +4039,7 @@ void TileROD_Decoder::fillCollection_TileMuRcv_Digi(const ROBData* rob , TileDig
   bool b_sof      = false;
   bool b_digiTmdb = false;
 
-  uint32_t version  = rob->rod_version() & 0xFF;
+  uint32_t version  = rob->rod_version() & 0xFFFF;
   uint32_t sourceid = rob->rod_source_id();
   int size          = rob->rod_ndata();
 
@@ -4038,7 +4099,7 @@ void TileROD_Decoder::fillCollection_TileMuRcv_RawChannel(const ROBData* rob , T
   bool b_sof    = false;
   bool b_rcTmdb = false;
 
-  uint32_t version  = rob->rod_version() & 0xFF;
+  uint32_t version  = rob->rod_version() & 0xFFFF;
   uint32_t sourceid = rob->rod_source_id();
   int size          = rob->rod_ndata();
   int offset = 0;
@@ -4137,7 +4198,7 @@ void TileROD_Decoder::fillContainer_TileMuRcv_Decision(const ROBData* rob ,TileM
   bool b_sof      = false;
   bool b_deciTmdb = false;
 
-  uint32_t version  = rob->rod_version() & 0xFF;
+  uint32_t version  = rob->rod_version() & 0xFFFF;
   uint32_t sourceid = rob->rod_source_id();
   int size          = rob->rod_ndata();
   int offset        = 0;
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamCnv.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamCnv.cxx
index 7d83d089b3c2b9562f4a86df919ae8b469d17d9e..48b32f62990b905c13a59a31da94b54f483d2673 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamCnv.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamCnv.cxx
@@ -150,6 +150,8 @@ StatusCode TileRawChannelContByteStreamCnv::createObj(IOpaqueAddress* pAddr, Dat
         } else {
           m_decoder->fillCollection(robf[0], *rawChannelCollection);
         }
+      } else {
+        rawChannelCollection->setFragGlobalCRC(TileROD_Decoder::NO_ROB);
       }
     }
 
diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamTool.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamTool.cxx
index 65cb4962d25294935dbb79c6f1658268f883d4f1..53b1f130b1925f6ecc54dea57ef18441db3c4169 100644
--- a/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamTool.cxx
+++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamTool.cxx
@@ -69,7 +69,7 @@ StatusCode TileRawChannelContByteStreamTool::initialize() {
   // get TileBadChanTool
   CHECK( m_tileBadChanTool.retrieve() );
 
-  m_maxChannels = TileCalibUtils::MAX_CHAN; // TileCablingService::getInstance()->getMaxChannels();
+  m_maxChannels = TileCablingService::getInstance()->getMaxChannels();
 
   m_channels = new TileFastRawChannel[m_tileHWID->channel_hash_max()];
 
diff --git a/TileCalorimeter/TileTBRec/src/TileTBDump.cxx b/TileCalorimeter/TileTBRec/src/TileTBDump.cxx
index ac265bd508a8a380e449560a62484de7faca7f59..74e00c2db55fb907e26248d7a46891216b8b94df 100755
--- a/TileCalorimeter/TileTBRec/src/TileTBDump.cxx
+++ b/TileCalorimeter/TileTBRec/src/TileTBDump.cxx
@@ -327,7 +327,7 @@ StatusCode TileTBDump::execute() {
           
     unsigned int max_allowed_size = robf.rod_fragment_size_word();
     unsigned int delta = robf.rod_header_size_word() + robf.rod_trailer_size_word();
-    if (max_allowed_size > delta) {
+    if (max_allowed_size >= delta) {
       max_allowed_size -= delta;
     } else {
       std::cout << " Problem with ROD data: total length " << max_allowed_size
@@ -363,8 +363,24 @@ StatusCode TileTBDump::execute() {
 
       unsigned int size = robf.rod_ndata();
       if (size > max_allowed_size) {
-        size = max_allowed_size;
-        std::cout<<" Problem with data size - assuming " << size << " words"<<std::endl;
+        if (size - robf.rod_trailer_size_word() < max_allowed_size) {
+          std::cout<<" Problem with data size - assuming that trailer size is " << robf.rod_trailer_size_word()-(size-max_allowed_size)
+                   <<" words instead of " << robf.rod_trailer_size_word() << " and data size is " << size << " words " << std::endl;
+          max_allowed_size = size;
+        } else if (size - robf.rod_trailer_size_word() == max_allowed_size) {
+          std::cout<<" Problem with data size - assuming that trailer is absent "
+                   << " ROD size " << robf.rod_fragment_size_word()
+                   << " header size " << robf.rod_header_size_word()
+                   << " data size " << size << std::endl;
+          max_allowed_size = size;
+        } else {
+          max_allowed_size += robf.rod_trailer_size_word();
+          size = max_allowed_size;
+          std::cout<<" Problem with data size - assuming " << size << " words and no trailer at all"<<std::endl;
+        }
+        std::cout << std::endl << "Dump of whole ROB fragment 0x" << std::hex << robf.rod_source_id() << std::dec
+                  << " (" << robf.rod_fragment_size_word()+robf.header_size_word() << " words)" << std::endl;
+        dump_data(fprob, robf.rod_fragment_size_word()+robf.header_size_word(), version, verbosity);
       }
 
       if ( size > 0 ) {
@@ -389,9 +405,10 @@ StatusCode TileTBDump::execute() {
             dump_digi(subdet_id,data, size, version, verbosity, source_id);
           }
         }
-        
-        std::cout << std::endl;
+      } else {
+        std::cout << std::endl <<  std::hex << "NO DATA in ROB fragment 0x" << robf.rod_source_id() << std::dec << std::endl << std::endl;
       }
+      std::cout << std::endl;
     }
   }
 
@@ -443,14 +460,14 @@ std::ostream &setupPr4 (std::ostream &stream){
 void TileTBDump::dump_data(const uint32_t * data, unsigned int size, unsigned int /* version */, int /* verbosity */) {
 
   boost::io::ios_base_all_saver coutsave(std::cout);
-  std::cout << std::endl << " Fragment data as 4 byte words:" << std::hex << std::setw(8) << std::setprecision(8);
+  std::cout << std::endl << " Fragment data as 4 byte words:" << std::hex << std::setfill('0') ;
 
   for (unsigned int cnter = 0; cnter < size; ++cnter) {
     if (!(cnter % 8)) std::cout << std::endl;
-    std::cout << (*data++) << " ";
+    std::cout << std::setw(8) << (*data++) << " ";
   }
 
-  std::cout << std::dec << std::endl << std::endl;
+  std::cout <<std::setfill(' ') << std::dec << std::endl << std::endl;
 
 }
 
@@ -486,7 +503,7 @@ void TileTBDump::dump_digi(unsigned int subdet_id, const uint32_t* roddata, unsi
     version = 0; // reset version in COMMON BEAM ROD
                  // don't expect different versions there
   } else {
-    version &= 0xFF; // keep just minor version number
+    version &= 0xFFFF; // keep just minor version number
   }
 
   find_frag(roddata, rodsize, version, verbosity, frag, &nfrag);
@@ -1806,16 +1823,22 @@ void dump_it(unsigned int nw, unsigned int * data) {
 /* ------------------------------------------------------------------------ */
 
 void TileTBDump::find_frag(const uint32_t* data, unsigned int size, unsigned int version
-                           , int /* verbosity */, T_RodDataFrag** frag, int* nfrag) {
+                           , int verbosity, T_RodDataFrag** frag, int* nfrag) {
   unsigned int offset = 0;
   *nfrag = 0;
   m_v3Format = (*(data) == 0xff1234ff); // additional frag marker since Sep 2005
   m_v3Format |= (*(data) == 0x00123400); // another possible frag marker (can appear in buggy ROD frags)
-  if (m_v3Format) {
+  if (m_v3Format || (version > 0xff)) {
     m_sizeOverhead = 3;
     ++offset; // skip frag marker
-    std::cout << " *(p) = 0x" << std::hex << (*(data)) << std::dec << std::endl;
+    std::cout << " *(p) = 0x" << std::hex << (*(data)) << std::dec << ((m_v3Format)?"":" => ERROR Corrupted frag separator") << std::endl;
     std::cout << " v3Format = true" << std::endl;
+    if (!m_v3Format) {
+      m_v3Format = true;
+      std::cout << std::endl << "Dump of whole data fragment ("
+                << size << " words)" << std::endl;
+      dump_data(data, size, version, verbosity);
+    }
   } else {
     m_sizeOverhead = 2;
   }
diff --git a/TileCalorimeter/TileTBRec/src/TileTBStat.cxx b/TileCalorimeter/TileTBRec/src/TileTBStat.cxx
index 3bfa0a1d10be4320bb0a84d324f15b852bfb1a66..db56fae088e4ea4498ed43d5e890c121a7d2680c 100755
--- a/TileCalorimeter/TileTBRec/src/TileTBStat.cxx
+++ b/TileCalorimeter/TileTBRec/src/TileTBStat.cxx
@@ -255,8 +255,22 @@ StatusCode TileTBStat::execute() {
             
         unsigned int size = robf.rod_ndata();
         if (size > max_allowed_size) {
+
+          if (size - robf.rod_trailer_size_word() < max_allowed_size) {
+            ATH_MSG_ERROR( "Problem with data size - assuming that trailer size is " << robf.rod_trailer_size_word()-(size-max_allowed_size)
+                           <<" words instead of " << robf.rod_trailer_size_word() << " and data size is " << size << " words " );
+            max_allowed_size = size;
+          } else if (size - robf.rod_trailer_size_word() == max_allowed_size) {
+            ATH_MSG_ERROR( "Problem with data size - assuming that trailer is absent "
+                           << " ROD size " << robf.rod_fragment_size_word()
+                           << " header size " << robf.rod_header_size_word()
+                           << " data size " << size );
+            max_allowed_size = size;
+          } else {
+            max_allowed_size += robf.rod_trailer_size_word();
             size = max_allowed_size;
-            ATH_MSG_ERROR( "Problem with data size - assuming " << size << " words " );
+            ATH_MSG_ERROR( "Problem with data size - assuming " << size << " words and no trailer at all" );
+          }
         }
 
         if ( size > 0 ) {