diff --git a/Calorimeter/CaloTools/CaloTools/CaloNoiseTool.h b/Calorimeter/CaloTools/CaloTools/CaloNoiseTool.h
index 87e82fa2455301acd03c1663523ba6d60990a2de..eec04509dc735d60c0056be4085b5d6eabf52858 100644
--- a/Calorimeter/CaloTools/CaloTools/CaloNoiseTool.h
+++ b/Calorimeter/CaloTools/CaloTools/CaloNoiseTool.h
@@ -39,6 +39,10 @@ class StoreGateSvc;
 #include "LArElecCalib/ILArADC2MeVTool.h" 
 
 #include "TileConditions/TileInfo.h"
+#include "TileConditions/ITileCellNoiseTool.h"
+#include "TileConditions/TileCondToolNoiseSample.h"
+#include "TileConditions/TileCondToolEmscale.h"
+#include "TileConditions/TileCondIdTransforms.h"
 
 #include "CaloEvent/CaloCell.h"
 #include "LArRecEvent/LArCell.h"
@@ -136,6 +140,19 @@ private:
   std::string     m_tileInfoName;
   const TileInfo* m_tileInfo;
 
+  ToolHandle<ITileCellNoiseTool> m_tileCellNoise{this,
+      "TileCellNoiseTool", "TileCellNoiseTool", "Tile Cell noise tool"};
+
+  ToolHandle<TileCondToolEmscale> m_tileToolEmscale{this,
+      "TileCondToolEmscale", "TileCondToolEmscale", "Tile EM scale calibration tool"};
+
+  ToolHandle<TileCondToolNoiseSample> m_tileToolNoiseSample{this,
+      "TileCondToolNoiseSample", "TileCondToolNoiseSample", "Tile sample noise tool"};
+
+  ToolHandle<TileCondIdTransforms> m_tileIdTransforms{this,
+      "TileCondIdTransforms", "TileCondIdTransforms",
+      "Tile tool to tranlate hardware identifiers to the drawerIdx, channel, and adc"};
+
 //Database  
 
   bool m_retrieve[15];
diff --git a/Calorimeter/CaloTools/src/CaloNoiseTool.cxx b/Calorimeter/CaloTools/src/CaloNoiseTool.cxx
index 936428fc5cbc96ddd87106687da0edbab932f2b3..a8836332d70145b82454491303f2439695f04063 100644
--- a/Calorimeter/CaloTools/src/CaloNoiseTool.cxx
+++ b/Calorimeter/CaloTools/src/CaloNoiseTool.cxx
@@ -356,9 +356,17 @@ CaloNoiseTool::initialize()
 
   }//UseLAr
 
-  if(m_UseTile)
-  {
-   //currently no database for Tile
+  if(m_UseTile) {
+    //currently no database for Tile
+    ATH_CHECK( m_tileCellNoise.retrieve() );
+    ATH_CHECK( m_tileToolEmscale.retrieve() );
+    ATH_CHECK( m_tileToolNoiseSample.retrieve() );
+    ATH_CHECK( m_tileIdTransforms.retrieve() );
+  } else {
+    m_tileCellNoise.disable();
+    m_tileToolEmscale.disable();
+    m_tileToolNoiseSample.disable();
+    m_tileIdTransforms.disable();
   }
 
   m_CNoise    = 0.456E-3;
@@ -894,7 +902,10 @@ CaloNoiseTool::calculateElecNoiseForTILE(const IdentifierHash & idCaloHash)
   for(int igain=0;igain<CaloGain::LARNGAIN;++igain)
   {
     CaloGain::CaloGain gain = static_cast<CaloGain::CaloGain>(igain);
-    float sigma = m_tileInfo->CellNoiseSigma(id,gain);
+    float sigma = m_tileCellNoise->getCellNoise(id, gain);
+    // Conversion from ADC sigma noise to OF sigma noise
+    sigma *= m_tileInfo->getNoiseScaleFactor();
+
     //the LAr gain is internally (in CellNoiseSigma) converted into Tile gain
     sigmaVector[igain]= sigma;
     //::::::::::::::::::::::::::::::::::::::
@@ -1950,42 +1961,56 @@ CaloNoiseTool::estimatedTileGain(const CaloCell* caloCell,
   //double eneTot = tileCell->energy();
 
     // threshold (1023 counts) is the same for all channels
-  double thr = m_tileInfo->ADCmax(); 
+  double threshold = m_tileInfo->ADCmax();
 
   static const TileHWID * tileHWID = TileCablingService::getInstance()->getTileHWID();
   static const IdContext chContext = tileHWID->channel_context();
-  HWIdentifier hwid;
+  HWIdentifier hwid1;
   
-  tileHWID->get_id(caloDDE->onl1(), hwid, &chContext ); // pmt id
-  hwid = tileHWID->adc_id(hwid,TileHWID::HIGHGAIN); // high gain ADC id
+  tileHWID->get_id(caloDDE->onl1(), hwid1, &chContext ); // pmt id
+  hwid1 = tileHWID->adc_id(hwid1, TileHWID::HIGHGAIN); // high gain ADC id
   
+  unsigned int drawerIdx1(0), channel1(0), adc1(0);
+  m_tileIdTransforms->getIndices(hwid1, drawerIdx1, channel1, adc1);
+
   // first PMT, convert energy to ADC counts
-  double amp = tileCell->ene1();
-  amp /= m_tileInfo->ChannelCalib(hwid,TileRawChannelUnit::ADCcounts,TileRawChannelUnit::MegaElectronVolts);
-  double ped = m_tileInfo->DigitsPedLevel(hwid); 
+  double amplitude1 = tileCell->ene1();
+  amplitude1 /= m_tileToolEmscale->channelCalib(drawerIdx1, channel1, adc1, 1.0,
+                                          TileRawChannelUnit::ADCcounts,
+                                          TileRawChannelUnit::MegaElectronVolts);
+
+  double pedestal1 = m_tileToolNoiseSample->getPed(drawerIdx1, channel1, adc1);
 
   int igain1;
 
-  if (amp + ped < thr )
+  if (amplitude1 + pedestal1 < threshold ) {
     igain1 = TileID::HIGHGAIN;
-  else
+  } else {
     igain1 = TileID::LOWGAIN;
+  }
 
   // second PMT, if it exists
-  if (caloDDE->onl2() !=  TileID::NOT_VALID_HASH ) 
-  {
-    tileHWID->get_id(caloDDE->onl2(), hwid, &chContext ); // pmt id
-    hwid = tileHWID->adc_id(hwid,TileHWID::HIGHGAIN); // high gain ADC id
+  if (caloDDE->onl2() !=  TileID::NOT_VALID_HASH ) {
+
+    HWIdentifier hwid2;
+    tileHWID->get_id(caloDDE->onl2(), hwid2, &chContext ); // pmt id
+    hwid2 = tileHWID->adc_id(hwid2, TileHWID::HIGHGAIN); // high gain ADC id
+
+    unsigned int drawerIdx2(0), channel2(0), adc2(0);
+    m_tileIdTransforms->getIndices(hwid2, drawerIdx2, channel2, adc2);
 
-    amp = tileCell->ene2();
-    amp /= m_tileInfo->ChannelCalib(hwid,TileRawChannelUnit::ADCcounts,TileRawChannelUnit::MegaElectronVolts);
-    ped = m_tileInfo->DigitsPedLevel(hwid); 
+    // first PMT, convert energy to ADC counts
+    double amplitude2 = tileCell->ene2();
+    amplitude2 /= m_tileToolEmscale->channelCalib(drawerIdx2, channel2, adc2, 1.0,
+                                            TileRawChannelUnit::ADCcounts,
+                                            TileRawChannelUnit::MegaElectronVolts);
 
-    if (amp + ped < thr ) {
+    double pedestal2 = m_tileToolNoiseSample->getPed(drawerIdx2, channel2, adc2);
+
+    if (amplitude2 + pedestal2 < threshold) {
       // igain2 high
       return igain1 == TileID::LOWGAIN ? CaloGain::TILEHIGHLOW : CaloGain::TILEHIGHHIGH;
-    }
-    else {
+    } else {
       // igain2 low
       return igain1 == TileID::LOWGAIN ? CaloGain::TILELOWLOW : CaloGain::TILEHIGHLOW;
     }
diff --git a/TileCalorimeter/TileConditions/TileConditions/TileInfo.h b/TileCalorimeter/TileConditions/TileConditions/TileInfo.h
index 099a948f89165462cf7d48f787a4a96a8d356934..122dba935e6f025be195e6a52c65bcf43bca0ffb 100644
--- a/TileCalorimeter/TileConditions/TileConditions/TileInfo.h
+++ b/TileCalorimeter/TileConditions/TileConditions/TileInfo.h
@@ -397,7 +397,11 @@ class TileInfo : public DataObject {
   /** NGO Need description. Do we need this function? */
   double ttl1Phase(const int /* posneg */, const int /* ieta */, const int /* iphi */) const {return 0.;}
 
-
+  /**
+   * @brief Conversion from ADC sigma noise to OF sigma noise
+   * @return Conversion factor from ADC sigma noise to OF sigma noise
+   */
+  float getNoiseScaleFactor(void) const;
 
  private:
 
@@ -525,4 +529,11 @@ class TileInfo : public DataObject {
 
 };
 
+
+// inlines
+inline
+float TileInfo::getNoiseScaleFactor(void) const {
+  return m_noiseScaleFactor[m_noiseScaleIndex];
+}
+
 #endif  //TILECONDITIONS_TILEINFO_H
diff --git a/TileCalorimeter/TileSimAlgs/TileSimAlgs/TileHitToRawChannel.h b/TileCalorimeter/TileSimAlgs/TileSimAlgs/TileHitToRawChannel.h
index 609697f9fee4e55fc543fd25dc69352a588b8102..33d10122a1f06a7064f85fbd3ba942b41a348e76 100644
--- a/TileCalorimeter/TileSimAlgs/TileSimAlgs/TileHitToRawChannel.h
+++ b/TileCalorimeter/TileSimAlgs/TileSimAlgs/TileHitToRawChannel.h
@@ -32,6 +32,7 @@
 #include "TileEvent/TileRawChannelContainer.h"
 #include "TileIdentifier/TileFragHash.h"
 #include "TileIdentifier/TileRawChannelUnit.h"
+#include "TileConditions/TileCondToolNoiseSample.h"
 
 // Atlas includes
 #include "AthenaBaseComps/AthAlgorithm.h"
@@ -114,6 +115,10 @@ class TileHitToRawChannel: public AthAlgorithm {
     CLHEP::HepRandomEngine * m_pHRengine;  //!< Random number service to use
 
     ToolHandle<TileCondToolEmscale> m_tileToolEmscale; //!< main Tile Calibration tool
+
+    ToolHandle<TileCondToolNoiseSample> m_tileToolNoiseSample{this,
+        "TileCondToolNoiseSample", "TileCondToolNoiseSample", "Tile sample noise tool"};
+
 };
 
 #endif // TILESIMALGS_TILEHITTORAWCHANNEL_H
diff --git a/TileCalorimeter/TileSimAlgs/src/TileHitToRawChannel.cxx b/TileCalorimeter/TileSimAlgs/src/TileHitToRawChannel.cxx
index 1e5cdca1fe746853635a135953ae573b173416ac..ed8a673f66687d28d78cf2b72e289c48502a9ffc 100644
--- a/TileCalorimeter/TileSimAlgs/src/TileHitToRawChannel.cxx
+++ b/TileCalorimeter/TileSimAlgs/src/TileHitToRawChannel.cxx
@@ -91,16 +91,18 @@ StatusCode TileHitToRawChannel::initialize() {
 
   // retrieve TileID helper and TileInfo from det store
 
-  CHECK( detStore()->retrieve(m_tileID) );
+  ATH_CHECK( detStore()->retrieve(m_tileID) );
 
-  CHECK( detStore()->retrieve(m_tileTBID) );
+  ATH_CHECK( detStore()->retrieve(m_tileTBID) );
 
-  CHECK( detStore()->retrieve(m_tileHWID) );
+  ATH_CHECK( detStore()->retrieve(m_tileHWID) );
 
-  CHECK( detStore()->retrieve(m_tileInfo, m_infoName) );
+  ATH_CHECK( detStore()->retrieve(m_tileInfo, m_infoName) );
 
   //=== get TileCondToolEmscale
-  CHECK( m_tileToolEmscale.retrieve() );
+  ATH_CHECK( m_tileToolEmscale.retrieve() );
+
+  ATH_CHECK( m_tileToolNoiseSample.retrieve() );
 
   if (m_tileNoise) {
     static const bool CREATEIFNOTTHERE_RNDM(true);
@@ -230,7 +232,9 @@ StatusCode TileHitToRawChannel::execute() {
 
       for (ch = 0; ch < nChMax; ++ch) {
         adc_gain[ch] = TileID::HIGHGAIN;
-        adc_ampl[ch] = random[ch] * m_tileInfo->ChannelNoiseSigma(TileID::HIGHGAIN, ch, idhash);
+        adc_ampl[ch] = random[ch] * m_tileToolNoiseSample->getHfn(drawerIdx, ch, TileID::HIGHGAIN)
+                                  * m_tileInfo->getNoiseScaleFactor();
+
       }
     } else {
       memset(adc_gain, -1, sizeof(adc_gain)); /* TileID::INVALID */
@@ -283,8 +287,8 @@ StatusCode TileHitToRawChannel::execute() {
                                                              , TileRawChannelUnit::MegaElectronVolts);
       double noise;
       // If high saturates, convert adc_id to low-gain value and recalculate.
-      if (adc_ampl[ch] + amp_ch + m_tileInfo->DigitsPedLevel(TileID::HIGHGAIN, ch, idhash)
-          > m_ampMaxHi) {
+      if (adc_ampl[ch] + amp_ch + m_tileToolNoiseSample->getPed(drawerIdx, ch, gain) > m_ampMaxHi) {
+
         gain = TileID::LOWGAIN;
         amp_ch = e_ch / m_tileToolEmscale->channelCalib(drawerIdx, ch, gain, 1., m_rChUnit
                                                         , TileRawChannelUnit::MegaElectronVolts);
@@ -292,7 +296,8 @@ StatusCode TileHitToRawChannel::execute() {
         // If Noise is requested, 
         // recalculate noise using the SAME random number as for high.
         if (m_tileNoise) {
-          adc_ampl[ch] = random[ch] * m_tileInfo->ChannelNoiseSigma(TileID::LOWGAIN, ch, idhash);
+          adc_ampl[ch] = random[ch] * m_tileToolNoiseSample->getHfn(drawerIdx, ch, TileID::LOWGAIN)
+                                    * m_tileInfo->getNoiseScaleFactor();
         }
       }