diff --git a/graf3d/eve/inc/TEveCalo.h b/graf3d/eve/inc/TEveCalo.h
index f7006601b5ea1930bdb7d5d4e1d27e33cc9d2020..b7a1749a09ac803a771c574b177e8577f178e468 100644
--- a/graf3d/eve/inc/TEveCalo.h
+++ b/graf3d/eve/inc/TEveCalo.h
@@ -74,6 +74,7 @@ public:
 
    TEveCaloData* GetData() const { return fData; }
    virtual void  SetData(TEveCaloData* d);
+   virtual void  DataChanged();
 
    Float_t GetDataSliceThreshold(Int_t slice) const;
    void    SetDataSliceThreshold(Int_t slice, Float_t val);
diff --git a/graf3d/eve/inc/TEveCaloData.h b/graf3d/eve/inc/TEveCaloData.h
index a76b9d73812c757657d81dca43eaf56b930caada..02992a393bd0b20f9ab79a7681bc8f2d15cc31b7 100644
--- a/graf3d/eve/inc/TEveCaloData.h
+++ b/graf3d/eve/inc/TEveCaloData.h
@@ -122,7 +122,12 @@ public:
    virtual void GetCellData(const CellId_t &id, CellData_t& data) const = 0;
    virtual void GetCellData(const CellId_t &id, Float_t  phiMin, Float_t phiRng, CellData_t& data) const = 0;
 
-   virtual void  InvalidateUsersCellIdCache() = 0;
+  
+   virtual void SetSliceThreshold(Int_t slice, Float_t threshold);
+   virtual void SetSliceColor(Int_t slice, Color_t col);
+
+   virtual void  InvalidateUsersCellIdCache();
+   virtual void  DataChanged();
 
    virtual Bool_t SupportsEtaBinning(){ return kFALSE; }
    virtual Bool_t SupportsPhiBinning(){ return kFALSE; }
@@ -160,25 +165,27 @@ public:
    TEveCaloDataHist();
    virtual ~TEveCaloDataHist();
 
+   THStack* GetStack() { return fHStack; }  
+   virtual void  DataChanged();
+
    virtual void GetCellList( Float_t etaMin, Float_t etaMax,
                              Float_t phi, Float_t phiRng, vCellId_t &out) const;
 
    virtual void GetCellData(const TEveCaloData::CellId_t &id, TEveCaloData::CellData_t& data) const;
    virtual void GetCellData(const CellId_t &id, Float_t  phiMin, Float_t phiRng, CellData_t& data) const;
 
-   virtual void  InvalidateUsersCellIdCache();
-
    virtual Bool_t SupportsEtaBinning(){ return kTRUE; }
    virtual Bool_t SupportsPhiBinning(){ return kTRUE; }
 
    virtual void    GetEtaLimits(Double_t &min, Double_t &max) const;
    virtual void    GetPhiLimits(Double_t &min, Double_t &max) const;
 
-   Int_t    AddHistogram(TH2F* hist);
+   Int_t   AddHistogram(TH2F* hist);
    virtual Float_t GetMaxVal(Bool_t et) const {return (et)? fMaxValEt:fMaxValE;}
 
    virtual Int_t   GetNSlices() const;
 
+
    ClassDef(TEveCaloDataHist, 0); // Manages calorimeter TH2F event data.
 };
 
diff --git a/graf3d/eve/src/TEveCalo.cxx b/graf3d/eve/src/TEveCalo.cxx
index 04073952ebc41b23ee026f22321911048eb07f41..1a39f90571a947c2993278c687811423b85d98c5 100644
--- a/graf3d/eve/src/TEveCalo.cxx
+++ b/graf3d/eve/src/TEveCalo.cxx
@@ -47,8 +47,8 @@ TEveCaloViz::TEveCaloViz(const Text_t* n, const Text_t* t) :
 
    fData(0),
 
-   fEtaMin(-1),
-   fEtaMax(1),
+   fEtaMin(-10),
+   fEtaMax(10),
 
    fPhi(0.),
    fPhiOffset(TMath::Pi()),
@@ -79,8 +79,8 @@ TEveCaloViz::TEveCaloViz(TEveCaloData* data, const Text_t* n, const Text_t* t) :
 
    fData(0),
 
-   fEtaMin(-1),
-   fEtaMax(1),
+   fEtaMin(-10),
+   fEtaMax(10),
 
    fPhi(0.),
    fPhiOffset(TMath::Pi()),
@@ -127,8 +127,7 @@ void TEveCaloViz::SetDataSliceThreshold(Int_t slice, Float_t val)
 {
    // Set threshold for given slice.
 
-   fData->RefSliceInfo(slice).fThreshold = val;
-   fData->InvalidateUsersCellIdCache();
+   fData->SetSliceThreshold(slice, val);
 }
 
 //______________________________________________________________________________
@@ -144,8 +143,7 @@ void TEveCaloViz::SetDataSliceColor(Int_t slice, Color_t col)
 {
    // Set slice color in data.
   
-   fData->RefSliceInfo(slice).fColor = col;
-   fData->StampBackPtrElements(kCBObjProps);
+   fData->SetSliceColor(slice, col);
 }
 
 //______________________________________________________________________________
@@ -214,30 +212,38 @@ void TEveCaloViz::SetData(TEveCaloData* data)
    fData = data;
    if (fData) fData->IncRefCount(this);
 
-   fData->GetEtaLimits(fEtaMin, fEtaMax);
-   Double_t min, max;
+   DataChanged();
+}
+
+//______________________________________________________________________________
+void TEveCaloViz::DataChanged()
+{
+   // Update setting and cache on data changed.
+   // Called from TEvecaloData::BroadcastDataChange()
+
+   Double_t min, max, delta;
+
+   fData->GetEtaLimits(min, max);
+   if (fEtaMin < min) fEtaMin = min;
+   if (fEtaMax > max) fEtaMax = max;
+
    fData->GetPhiLimits(min, max);
-   fPhi = (max+min)*0.5;
-   fPhiOffset =(max-min)*0.5;
+   delta = 0.5*(max - min);
+   if (fPhi < min || fPhi > max) {
+      fPhi       = 0.5*(max + min);
+      fPhiOffset = delta;
+   } else {
+      if (fPhiOffset > delta) fPhiOffset = delta;
+   }
 
-   Float_t hlimit = fScaleAbs ? fMaxValAbs :data->GetMaxVal(fPlotEt);
-   if (fPalette == 0)
+   if (fPalette)
    {
-      AssertPalette();
-      fPalette->SetLimits(0, TMath::CeilNint(hlimit));
-      fPalette->SetMax(fPalette->GetHighLimit());
-   }
-   else 
-   { 
-      if (!fScaleAbs)
-      {   
-         Float_t ratio = Float_t(fPalette->GetMinVal())/fPalette->GetHighLimit();
-        
-         fPalette->SetLimits(0, TMath::CeilNint(data->GetMaxVal(fPlotEt)));
-         fPalette->SetMin(Int_t(ratio*fPalette->GetHighLimit()));
-         fPalette->SetMax(fPalette->GetHighLimit());
-      }
+      Int_t hlimit = TMath::CeilNint(fScaleAbs ? fMaxValAbs : fData->GetMaxVal(fPlotEt));
+      fPalette->SetLimits(0, hlimit);
+      fPalette->SetMin(0);
+      fPalette->SetMax(hlimit);
    }
+
    InvalidateCellIdCache();
 }
 
@@ -252,18 +258,19 @@ void TEveCaloViz::AssignCaloVizParameters(TEveCaloViz* m)
    fEtaMax    = m->fEtaMax;
 
    fPhi       = m->fPhi;
-   fPhiOffset    = m->fPhiOffset;
+   fPhiOffset = m->fPhiOffset;
+
    fBarrelRadius = m->fBarrelRadius;
    fEndCapPos    = m->fEndCapPos;
 
-   TEveRGBAPalette& mp = * m->fPalette;
-   TEveRGBAPalette* p = new TEveRGBAPalette(mp.GetMinVal(), mp.GetMaxVal(),
-                                          mp.GetInterpolate());
-   p->SetDefaultColor(mp.GetDefaultColor());
-   SetPalette(p);
+   if (m->fPalette)
+   {
+      TEveRGBAPalette& mp = * m->fPalette;
+      TEveRGBAPalette* p = new TEveRGBAPalette(mp.GetMinVal(), mp.GetMaxVal(), mp.GetInterpolate());
+      p->SetDefaultColor(mp.GetDefaultColor());
+   }
 }
 
-
 //______________________________________________________________________________
 void TEveCaloViz::SetPalette(TEveRGBAPalette* p)
 {
@@ -299,7 +306,13 @@ TEveRGBAPalette* TEveCaloViz::AssertPalette()
 
    if (fPalette == 0) {
       fPalette = new TEveRGBAPalette;
-      fPalette->SetDefaultColor((Color_t)4);
+      fPalette->SetDefaultColor((Color_t)4); 
+
+      Int_t hlimit = TMath::CeilNint(fScaleAbs ? fMaxValAbs : fData->GetMaxVal(fPlotEt));
+      fPalette->SetLimits(0, hlimit);
+      fPalette->SetMin(0);
+      fPalette->SetMax(hlimit);
+
    }
    return fPalette;
 }
diff --git a/graf3d/eve/src/TEveCalo2DGL.cxx b/graf3d/eve/src/TEveCalo2DGL.cxx
index 24daaece0874076db8f09015488d61e19773aa1a..b8a707a304840ebba1fca3eeb0d4bf6b0d7dbc34 100644
--- a/graf3d/eve/src/TEveCalo2DGL.cxx
+++ b/graf3d/eve/src/TEveCalo2DGL.cxx
@@ -275,6 +275,8 @@ void TEveCalo2DGL::DirectDraw(TGLRnrCtx & rnrCtx) const
    if (fM->fCellIdCacheOK == kFALSE)
       fM->BuildCellIdCache();
 
+   fM->AssertPalette();
+
    TEveProjection::EPType_e pt = fM->fManager->GetProjection()->GetType();
    if (pt == TEveProjection::kPT_RhoZ)
       DrawRhoZ(rnrCtx);
diff --git a/graf3d/eve/src/TEveCalo3DGL.cxx b/graf3d/eve/src/TEveCalo3DGL.cxx
index 3ee61b04ac94f5a3e8576c09faf1c2e468fa2e2b..a2e9d697a66ea7ec373ac2a6e286545c23c4451d 100644
--- a/graf3d/eve/src/TEveCalo3DGL.cxx
+++ b/graf3d/eve/src/TEveCalo3DGL.cxx
@@ -296,6 +296,8 @@ void TEveCalo3DGL::DirectDraw(TGLRnrCtx &rnrCtx) const
    glEnable(GL_NORMALIZE);
    glEnable(GL_LIGHTING);
 
+   fM->AssertPalette();
+
    TEveCaloData::CellData_t cellData;
    Float_t transEta = fM->GetTransitionEta();
    Float_t towerH;
diff --git a/graf3d/eve/src/TEveCaloData.cxx b/graf3d/eve/src/TEveCaloData.cxx
index a6e86d600529548578259f0e279cbbef9ab0e4a5..8a1a901ad3f3bc01b921a405516da0ce57e3f1af 100644
--- a/graf3d/eve/src/TEveCaloData.cxx
+++ b/graf3d/eve/src/TEveCaloData.cxx
@@ -31,6 +31,7 @@
 
 ClassImp(TEveCaloData);
 
+//______________________________________________________________________________
 TEveCaloData::TEveCaloData():
    TEveRefBackPtr(),
 
@@ -40,6 +41,60 @@ TEveCaloData::TEveCaloData():
    // Constructor.
 }
 
+//______________________________________________________________________________
+void TEveCaloData::SetSliceThreshold(Int_t slice, Float_t val)
+{
+   // Set threshold for given slice.
+
+   fSliceInfos[slice].fThreshold = val;
+   InvalidateUsersCellIdCache();
+}
+
+//______________________________________________________________________________
+void TEveCaloData::SetSliceColor(Int_t slice, Color_t col)
+{
+   // Set color for given slice.
+   
+   fSliceInfos[slice].fColor = col;
+   StampBackPtrElements(TEveElement::kCBObjProps);
+}
+
+//______________________________________________________________________________
+void TEveCaloData::InvalidateUsersCellIdCache()
+{
+   // Invalidate cell ids cache on back ptr references.
+
+   TEveCaloViz* calo;
+   std::list<TEveElement*>::iterator i = fBackRefs.begin();
+   while (i != fBackRefs.end())
+   {
+      calo = dynamic_cast<TEveCaloViz*>(*i);
+      calo->InvalidateCellIdCache();
+      calo->StampObjProps();
+      ++i;
+   }
+}
+
+//______________________________________________________________________________
+void TEveCaloData::DataChanged()
+{
+   // Tell users (TEveCaloViz instances using this data) that data
+   // has changed and they should update the limits/scales etc.
+   // This is done by calling TEveCaloViz::DataChanged().
+
+   TEveCaloViz* calo;
+   std::list<TEveElement*>::iterator i = fBackRefs.begin();
+   while (i != fBackRefs.end())
+   {
+      calo = dynamic_cast<TEveCaloViz*>(*i);
+      calo->DataChanged();
+      calo->StampObjProps();
+      ++i;
+   }
+}
+
+/**************************************************************************/
+
 //______________________________________________________________________________
 Float_t TEveCaloData::CellData_t::Value(Bool_t isEt) const
 {
@@ -120,7 +175,48 @@ TEveCaloDataHist::TEveCaloDataHist():
 TEveCaloDataHist::~TEveCaloDataHist()
 {
    // Destructor.
+
+   delete fHStack;
 }
+//______________________________________________________________________________
+void TEveCaloDataHist::DataChanged()
+{ 
+   // Update limits and notify data users. 
+
+   using namespace TMath;
+
+   // update max E/Et values
+   fMaxValE = 0;
+   fMaxValEt = 0;
+
+   if (fHStack->GetHists()->First())
+   {  
+      TH2 *ah = (TH2*)fHStack->GetHists()->First();
+      fEtaAxis = ah->GetXaxis();
+      fPhiAxis = ah->GetYaxis();
+
+      Int_t bin;
+      Double_t value, cos, eta;
+      TH2 *stack =  (TH2*)fHStack->GetStack()->Last();
+      for (Int_t ieta=1; ieta<=fEtaAxis->GetNbins(); ieta++) 
+      {
+         eta = fEtaAxis->GetBinCenter(ieta); // conversion E/Et
+         for (Int_t iphi=1; iphi<=fPhiAxis->GetNbins(); iphi++)  
+         {
+            bin = stack->GetBin(ieta, iphi);
+            value = stack->GetBinContent(bin);
+
+            if (value > fMaxValEt ) fMaxValEt = value;
+
+            cos = Cos(2*ATan(Exp( -Abs(eta))));
+            value /= Abs(cos);
+            if (value > fMaxValE) fMaxValE = value;
+         }
+      }
+   }
+
+   TEveCaloData::DataChanged();
+} 
 
 //______________________________________________________________________________
 void TEveCaloDataHist::GetCellList(Float_t eta, Float_t etaD,
@@ -139,7 +235,7 @@ void TEveCaloDataHist::GetCellList(Float_t eta, Float_t etaD,
 
    Int_t nEta = fEtaAxis->GetNbins();
    Int_t nPhi = fPhiAxis->GetNbins();
-   Int_t nSlices = fSliceInfos.size();
+   Int_t nSlices = GetNSlices();
 
    TH2* h0 = fSliceInfos[0].fHist;
    Int_t bin = 0;
@@ -221,22 +317,6 @@ void TEveCaloDataHist::GetCellData(const TEveCaloData::CellId_t &id,
                       phi1, phi2);
 }
 
-//______________________________________________________________________________
-void TEveCaloDataHist::InvalidateUsersCellIdCache()
-{
-   // Invalidate cell ids cache on back ptr references.
-
-   TEveCaloViz* calo;
-   std::list<TEveElement*>::iterator i = fBackRefs.begin();
-   while (i != fBackRefs.end())
-   {
-      calo = dynamic_cast<TEveCaloViz*>(*i);
-      calo->InvalidateCellIdCache();
-      calo->StampObjProps();
-      ++i;
-   }
-}
-
 //______________________________________________________________________________
 Int_t TEveCaloDataHist::AddHistogram(TH2F* hist)
 {
@@ -244,46 +324,16 @@ Int_t TEveCaloDataHist::AddHistogram(TH2F* hist)
    // and fMaxValEt
    // Return last index in the vector of slice infos.
 
-   using namespace TMath;
-
    fHStack->Add(hist);
 
-   if (fEtaAxis == 0 || fPhiAxis == 0)
-   {
-      fEtaAxis = hist->GetXaxis();
-      fPhiAxis = hist->GetYaxis();
-   }
-
-   // update max E/Et values
-   fMaxValE = 0;
-   fMaxValEt = 0;
-   TH2 *stack =  (TH2*)fHStack->GetStack()->Last();
-
-   Int_t bin;
-   Double_t value, cos, eta;
-   for (Int_t ieta=1; ieta<=fEtaAxis->GetNbins(); ieta++) 
-   {
-      eta = fEtaAxis->GetBinCenter(ieta); // conversion E/Et
-      for (Int_t iphi=1; iphi<=fPhiAxis->GetNbins(); iphi++)  
-      {
-         bin = stack->GetBin(ieta, iphi);
-         value = stack->GetBinContent(bin);
-
-         if (value > fMaxValEt ) fMaxValEt = value;
-
-         cos = Cos(2*ATan(Exp( -Abs(eta))));
-         value /= Abs(cos);
-         if (value > fMaxValE) fMaxValE = value;
-      }
-   }
-
    Int_t id = fSliceInfos.size();
-
    fSliceInfos.push_back(SliceInfo_t(hist));
    fSliceInfos[id].fName = hist->GetName();
    fSliceInfos[id].fColor = hist->GetLineColor();
    fSliceInfos[id].fID = id;
 
+   DataChanged();
+ 
    return id;
 }
 
@@ -292,7 +342,7 @@ Int_t TEveCaloDataHist::GetNSlices() const
 {
    // Get number of tower slices.
 
-   return fSliceInfos.size();
+   return fHStack->GetHists()->GetSize();
 }
 
 //______________________________________________________________________________
diff --git a/graf3d/eve/src/TEveCaloVizEditor.cxx b/graf3d/eve/src/TEveCaloVizEditor.cxx
index 12c3f481fcb5d852645d5ce1447a567e385200a7..3630442a3c296e192867e2fff769e33bfc50b735 100644
--- a/graf3d/eve/src/TEveCaloVizEditor.cxx
+++ b/graf3d/eve/src/TEveCaloVizEditor.cxx
@@ -241,7 +241,13 @@ void TEveCaloVizEditor::SetModel(TObject* obj)
    fEtaRng->SetLimits((Float_t)min, (Float_t)max);
    fEtaRng->SetValues(fM->fEtaMin, fM->fEtaMax);
 
+   fM->GetData()->GetPhiLimits(min, max);
+   min = TMath::Ceil (min*TMath::RadToDeg());
+   max = TMath::Floor(max*TMath::RadToDeg());
+   fPhi->SetLimits((Int_t)min, (Int_t)max, (Int_t)(max - min + 1));
    fPhi->SetValue(fM->fPhi*TMath::RadToDeg());
+   Int_t delta = ((Int_t)(max - min + 1))/2;
+   fPhiOffset->SetLimits(0, delta, delta + 1);
    fPhiOffset->SetValue(fM->fPhiOffset*TMath::RadToDeg());
 
    MakeSliceInfo();