diff --git a/graf2d/graf/src/TPie.cxx b/graf2d/graf/src/TPie.cxx
index 61986b0c4aea5b79f5ffa78be4e2aada39520c8c..a263feccd87f78419f8770bba9d5042fbeb169a6 100644
--- a/graf2d/graf/src/TPie.cxx
+++ b/graf2d/graf/src/TPie.cxx
@@ -125,7 +125,7 @@ TPie::TPie(const TH1 *h) : TNamed(h->GetName(),h->GetTitle())
 
    Int_t i;
 
-   TAxis *axis = h->GetXaxis();
+   const TAxis *axis = h->GetXaxis();
    Int_t first = axis->GetFirst();
    Int_t last  = axis->GetLast();
    Int_t np    = last-first+1;
diff --git a/graf3d/gl/inc/TGLAxisPainter.h b/graf3d/gl/inc/TGLAxisPainter.h
index 820187278e8cc2d2991b6271c4b45159af67e110..d9facf675dcfb61c4b16d56279454503549cd3b3 100644
--- a/graf3d/gl/inc/TGLAxisPainter.h
+++ b/graf3d/gl/inc/TGLAxisPainter.h
@@ -139,7 +139,7 @@ class TGLAxisPainterBox : public TGLAxisPainter
 {
 protected:
    TGLVector3          fAxisTitlePos[3];
-   TAxis*              fAxis[3];
+   TAxis*                      fAxis[3];
 
 public:
    TGLAxisPainterBox();
@@ -148,7 +148,7 @@ public:
    void SetAxis3DTitlePos(TGLRnrCtx &rnrCtx);
    void DrawAxis3D(TGLRnrCtx &rnrCtx);
 
-   void PlotStandard(TGLRnrCtx &rnrCtx, const TH1* histo, const TGLBoundingBox& bbox);
+   void PlotStandard(TGLRnrCtx &rnrCtx, TH1* histo, const TGLBoundingBox& bbox);
 
    ClassDef(TGLAxisPainterBox, 0); // Painter of GL axes for a 3D box.
 };
diff --git a/graf3d/gl/inc/TGLPlotPainter.h b/graf3d/gl/inc/TGLPlotPainter.h
index 8d995efc1427d62223b6777cb3d7c546084c8967..ec7b5a74ed504e187657c60853ae2af42e3ece9c 100644
--- a/graf3d/gl/inc/TGLPlotPainter.h
+++ b/graf3d/gl/inc/TGLPlotPainter.h
@@ -112,7 +112,7 @@ public:
 
 private:
    ESliceAxis                fAxisType;
-   TAxis                    *fAxis;
+   const TAxis                    *fAxis;
    mutable TGLLevelPalette   fPalette;
 
    const TGLPlotCoordinates *fCoord;
diff --git a/graf3d/gl/src/TGLAxisPainter.cxx b/graf3d/gl/src/TGLAxisPainter.cxx
index b4857b127f90859a50f9b77fcdb72005f8afc973..d2125d822458d188cf2b5146ce52ba992e8c69e4 100644
--- a/graf3d/gl/src/TGLAxisPainter.cxx
+++ b/graf3d/gl/src/TGLAxisPainter.cxx
@@ -626,7 +626,7 @@ void TGLAxisPainterBox::DrawAxis3D(TGLRnrCtx &rnrCtx)
 
 //______________________________________________________________________________
 void TGLAxisPainterBox::PlotStandard(      TGLRnrCtx      &rnrCtx,
-                                     const TH1            *histo,
+                                     TH1                  *histo,
                                      const TGLBoundingBox &bbox)
 {
    //
diff --git a/hist/hist/inc/TH1.h b/hist/hist/inc/TH1.h
index bf53e0257bdf719474299c1da489475fa90f2e22..d2b76f0cb1ce9e1a036c44b5ff4ce670f1cf4887 100644
--- a/hist/hist/inc/TH1.h
+++ b/hist/hist/inc/TH1.h
@@ -311,9 +311,12 @@ public:
    virtual Double_t GetRMS(Int_t axis=1) const;
    virtual Double_t GetRMSError(Int_t axis=1) const;
    virtual Double_t GetSkewness(Int_t axis=1) const;
-           TAxis*   GetXaxis() const { return &((TH1*)this)->fXaxis; }
-           TAxis*   GetYaxis() const { return &((TH1*)this)->fYaxis; }
-           TAxis*   GetZaxis() const { return &((TH1*)this)->fZaxis; }
+           TAxis*   GetXaxis()  { return &fXaxis; }
+           TAxis*   GetYaxis()  { return &fYaxis; }
+           TAxis*   GetZaxis()  { return &fZaxis; }
+     const TAxis*   GetXaxis() const { return &fXaxis; }
+     const TAxis*   GetYaxis() const { return &fYaxis; }
+     const TAxis*   GetZaxis() const { return &fZaxis; }
    virtual Double_t Integral(Option_t *option="") const;
    virtual Double_t Integral(Int_t binx1, Int_t binx2, Option_t *option="") const;
    virtual Double_t IntegralAndError(Int_t binx1, Int_t binx2, Double_t & err, Option_t *option="") const;
diff --git a/hist/hist/inc/TH3.h b/hist/hist/inc/TH3.h
index 4e32bdd57c8d1d80baaa9b338e780ff8dcab79ff..34219af75b9b5d43e71913cd9af499ae08299b51 100644
--- a/hist/hist/inc/TH3.h
+++ b/hist/hist/inc/TH3.h
@@ -135,21 +135,22 @@ public:
 
 protected:
 
-   virtual TH1D        *DoProject1D(const char* name, const char * title, TAxis* projX,
-                         bool computeErrors, bool originalRange,
-                         bool useUF, bool useOF) const;
-   virtual TH2D        *DoProject2D(const char* name, const char * title, TAxis* projX, TAxis* projY,
+   virtual TH1D        *DoProject1D(const char* name, const char * title, int imin1, int imax1, int imin2, int imax2, 
+                                    const TAxis* projAxis, const TAxis * axis1, const TAxis * axis2, Option_t * option) const;
+   virtual TH1D        *DoProject1D(const char* name, const char * title, const TAxis* projAxis,  
+                         bool computeErrors, bool originalRange, bool useUF, bool useOF) const;
+   virtual TH2D        *DoProject2D(const char* name, const char * title, const TAxis* projX, const TAxis* projY,
                         bool computeErrors, bool originalRange,
                          bool useUF, bool useOF) const;
-   virtual TProfile2D  *DoProjectProfile2D(const char* name, const char * title, TAxis* projX, TAxis* projY,
+   virtual TProfile2D  *DoProjectProfile2D(const char* name, const char * title, const TAxis* projX, const TAxis* projY,
                                           bool originalRange, bool useUF, bool useOF) const;
 
    // these functions are need to be used inside TProfile3D::DoProjectProfile2D
-   static TH1D         *DoProject1D(const TH3 & h, const char* name, const char * title, TAxis* projX,
+   static TH1D         *DoProject1D(const TH3 & h, const char* name, const char * title, const TAxis* projX,
                                     bool computeErrors, bool originalRange, bool useUF, bool useOF)  {
       return h.DoProject1D(name, title, projX, computeErrors, originalRange, useUF, useOF);
    }
-   static TH2D         *DoProject2D(const TH3 & h, const char* name, const char * title, TAxis* projX, TAxis* projY,
+   static TH2D         *DoProject2D(const TH3 & h, const char* name, const char * title, const TAxis* projX, const TAxis* projY,
                                     bool computeErrors, bool originalRange, bool useUF, bool useOF)  {
       return h.DoProject2D(name, title, projX,projY, computeErrors, originalRange, useUF, useOF);
    }
diff --git a/hist/hist/inc/THStack.h b/hist/hist/inc/THStack.h
index fb8a703b208dc440218c07b0e837b16c7ff9c7af..98ad77cbf5daaa44b8495872155fcc0bf56b8c04 100644
--- a/hist/hist/inc/THStack.h
+++ b/hist/hist/inc/THStack.h
@@ -49,7 +49,7 @@ public:
 
    THStack();
    THStack(const char *name, const char *title);
-   THStack(const TH1* hist, Option_t *axis="x",
+   THStack(TH1* hist, Option_t *axis="x",
            const char *name=0, const char *title=0,
            Int_t firstbin=1, Int_t lastbin=-1,
            Int_t firstbin2=1, Int_t lastbin2=-1,
diff --git a/hist/hist/inc/TProfile3D.h b/hist/hist/inc/TProfile3D.h
index bd033c29042be71557e69600ae3fe716b7c0da56..8818fae734adccf421f7194a9db95d2dfc561503 100644
--- a/hist/hist/inc/TProfile3D.h
+++ b/hist/hist/inc/TProfile3D.h
@@ -69,7 +69,7 @@ protected:
    //virtual void     UpdateBinContent(Int_t bin, Double_t content);
    virtual Double_t GetBinErrorSqUnchecked(Int_t bin) const { Double_t err = GetBinError(bin); return err*err; }
 
-   virtual TProfile2D *DoProjectProfile2D(const char* name, const char * title, TAxis* projX, TAxis* projY,
+   virtual TProfile2D *DoProjectProfile2D(const char* name, const char * title, const TAxis* projX, const TAxis* projY,
                                           bool originalRange, bool useUF, bool useOF) const;
 
 private:
diff --git a/hist/hist/src/HFitInterface.cxx b/hist/hist/src/HFitInterface.cxx
index 7e8a50dba4f91e559a53ae711bf8b932ed03b97e..1b6fe1bb5789a8bd3b5ff6b1730bbb16796a6dbb 100644
--- a/hist/hist/src/HFitInterface.cxx
+++ b/hist/hist/src/HFitInterface.cxx
@@ -76,7 +76,7 @@ bool AdjustError(const DataOptions & option, double & error, double value = 1) {
    return true;
 }
 
-void ExamineRange(TAxis * axis, std::pair<double,double> range,int &hxfirst,int &hxlast) {
+void ExamineRange(const TAxis * axis, std::pair<double,double> range,int &hxfirst,int &hxlast) {
    // examine the range given with the pair on the given histogram axis
    // correct in case the bin values hxfirst hxlast
    double xlow   = range.first;
@@ -85,10 +85,10 @@ void ExamineRange(TAxis * axis, std::pair<double,double> range,int &hxfirst,int
    std::cout << "xlow " << xlow << " xhigh = " << xhigh << std::endl;
 #endif
    // ignore ranges specified outside histogram range
-   int ilow = axis->FindBin(xlow);
-   int ihigh = axis->FindBin(xhigh);
-   if (ilow > hxlast || ihigh < hxfirst) {
-      Warning("ROOT::Fit::FillData","fit range is outside histogram range, no fit data for %s",axis->GetName());
+   int ilow = axis->FindFixBin(xlow);
+   int ihigh = axis->FindFixBin(xhigh);
+   if (ilow > hxlast || ihigh < hxfirst) { 
+      Warning("ROOT::Fit::FillData","fit range is outside histogram range, no fit data for %s",axis->GetName()); 
    }
    // consider only range defined with-in histogram not oustide. Always exclude underflow/overflow
    hxfirst =  std::min( std::max( ilow, hxfirst), hxlast+1) ;
@@ -103,6 +103,7 @@ void ExamineRange(TAxis * axis, std::pair<double,double> range,int &hxfirst,int
 
 } // end namespace HFitInterface
 
+
 void FillData(BinData & dv, const TH1 * hfit, TF1 * func)
 {
    // Function to fill the binned Fit data structure from a TH1
@@ -185,9 +186,9 @@ void FillData(BinData & dv, const TH1 * hfit, TF1 * func)
    int biny = 0;
    int binz = 0;
 
-   TAxis *xaxis  = hfit->GetXaxis();
-   TAxis *yaxis  = hfit->GetYaxis();
-   TAxis *zaxis  = hfit->GetZaxis();
+   const TAxis *xaxis  = hfit->GetXaxis();
+   const TAxis *yaxis  = hfit->GetYaxis();
+   const TAxis *zaxis  = hfit->GetZaxis();
 
    for ( binx = hxfirst; binx <= hxlast; ++binx) {
       if (useBinEdges) {
diff --git a/hist/hist/src/TEfficiency.cxx b/hist/hist/src/TEfficiency.cxx
index b773b3d6a1bf3e2b2b92dc573a49bdd14ef6faf2..24bb079b76a12d27e66ce051ad524e72c39fcb82 100644
--- a/hist/hist/src/TEfficiency.cxx
+++ b/hist/hist/src/TEfficiency.cxx
@@ -1430,9 +1430,10 @@ Bool_t TEfficiency::CheckBinning(const TH1& pass,const TH1& total)
    //
    //It is assumed that the passed histograms have the same dimension.
 
-   TAxis* ax1 = 0;
-   TAxis* ax2 = 0;
-
+   
+   const TAxis* ax1 = 0;
+   const TAxis* ax2 = 0;
+   
    //check binning along axis
    for(Int_t j = 0; j < pass.GetDimension(); ++j) {
       switch(j) {
diff --git a/hist/hist/src/TH1.cxx b/hist/hist/src/TH1.cxx
index ab25095e409dd2231b31d47fb9340a83a3c8c53d..709352f54e1215accd00ce42375e49d7353e3d34 100644
--- a/hist/hist/src/TH1.cxx
+++ b/hist/hist/src/TH1.cxx
@@ -1858,12 +1858,12 @@ Double_t TH1::Chi2TestX(const TH1* h2,  Double_t &chi2, Int_t &ndf, Int_t &igood
    TString opt = option;
    opt.ToUpper();
 
-   TAxis *xaxis1 = GetXaxis();
-   TAxis *xaxis2 = h2->GetXaxis();
-   TAxis *yaxis1 = GetYaxis();
-   TAxis *yaxis2 = h2->GetYaxis();
-   TAxis *zaxis1 = GetZaxis();
-   TAxis *zaxis2 = h2->GetZaxis();
+   const TAxis *xaxis1 = GetXaxis();
+   const TAxis *xaxis2 = h2->GetXaxis();
+   const TAxis *yaxis1 = GetYaxis();
+   const TAxis *yaxis2 = h2->GetYaxis();
+   const TAxis *zaxis1 = GetZaxis();
+   const TAxis *zaxis2 = h2->GetZaxis();
 
    Int_t nbinx1 = xaxis1->GetNbins();
    Int_t nbinx2 = xaxis2->GetNbins();
@@ -7396,8 +7396,8 @@ Double_t TH1::KolmogorovTest(const TH1 *h2, Option_t *option) const
    Double_t prob = 0;
    TH1 *h1 = (TH1*)this;
    if (h2 == 0) return 0;
-   TAxis *axis1 = h1->GetXaxis();
-   TAxis *axis2 = h2->GetXaxis();
+   const TAxis *axis1 = h1->GetXaxis();
+   const TAxis *axis2 = h2->GetXaxis();
    Int_t ncx1   = axis1->GetNbins();
    Int_t ncx2   = axis2->GetNbins();
 
diff --git a/hist/hist/src/TH2.cxx b/hist/hist/src/TH2.cxx
index 9eb5f9527c13b89c8933192ef81d70ba052536eb..0fad11d59968013340d13c024f21ff78477132c5 100644
--- a/hist/hist/src/TH2.cxx
+++ b/hist/hist/src/TH2.cxx
@@ -1305,10 +1305,10 @@ Double_t TH2::KolmogorovTest(const TH1 *h2, Option_t *option) const
    Double_t prb = 0;
    TH1 *h1 = (TH1*)this;
    if (h2 == 0) return 0;
-   TAxis *xaxis1 = h1->GetXaxis();
-   TAxis *xaxis2 = h2->GetXaxis();
-   TAxis *yaxis1 = h1->GetYaxis();
-   TAxis *yaxis2 = h2->GetYaxis();
+   const TAxis *xaxis1 = h1->GetXaxis();
+   const TAxis *xaxis2 = h2->GetXaxis();
+   const TAxis *yaxis1 = h1->GetYaxis();
+   const TAxis *yaxis2 = h2->GetYaxis();
    Int_t ncx1   = xaxis1->GetNbins();
    Int_t ncx2   = xaxis2->GetNbins();
    Int_t ncy1   = yaxis1->GetNbins();
@@ -2207,8 +2207,8 @@ TH1D *TH2::DoProjection(bool onX, const char *name, Int_t firstbin, Int_t lastbi
    const char *expectedName = 0;
    Int_t inNbin;
    Int_t firstOutBin, lastOutBin;
-   TAxis* outAxis;
-   TAxis* inAxis;
+   const TAxis* outAxis;
+   const TAxis* inAxis;
 
 
    TString opt = option;
@@ -2555,8 +2555,8 @@ TH1D* TH2::DoQuantiles(bool onX, const char * name, Double_t prob) const
 {
    // Implementation of quantiles for x or y
 
-   TAxis *outAxis = 0;
-   TAxis *inAxis = 0;
+   const TAxis *outAxis = 0;
+   const TAxis *inAxis = 0;
    if ( onX )   {
       outAxis = GetXaxis();
       inAxis = GetYaxis();
diff --git a/hist/hist/src/TH3.cxx b/hist/hist/src/TH3.cxx
index 8224722ed8959b1a52d76696fbc789ae61bb0561..d4c44beb8643748d034e0219cd55a50f70313078 100644
--- a/hist/hist/src/TH3.cxx
+++ b/hist/hist/src/TH3.cxx
@@ -1344,12 +1344,12 @@ Double_t TH3::KolmogorovTest(const TH1 *h2, Option_t *option) const
    Double_t prb = 0;
    TH1 *h1 = (TH1*)this;
    if (h2 == 0) return 0;
-   TAxis *xaxis1 = h1->GetXaxis();
-   TAxis *xaxis2 = h2->GetXaxis();
-   TAxis *yaxis1 = h1->GetYaxis();
-   TAxis *yaxis2 = h2->GetYaxis();
-   TAxis *zaxis1 = h1->GetZaxis();
-   TAxis *zaxis2 = h2->GetZaxis();
+   const TAxis *xaxis1 = h1->GetXaxis();
+   const TAxis *xaxis2 = h2->GetXaxis();
+   const TAxis *yaxis1 = h1->GetYaxis();
+   const TAxis *yaxis2 = h2->GetYaxis();
+   const TAxis *zaxis1 = h1->GetZaxis();
+   const TAxis *zaxis2 = h2->GetZaxis();
    Int_t ncx1   = xaxis1->GetNbins();
    Int_t ncx2   = xaxis2->GetNbins();
    Int_t ncy1   = yaxis1->GetNbins();
@@ -1825,54 +1825,12 @@ TH1D *TH3::ProjectionX(const char *name, Int_t iymin, Int_t iymax,
    //
    //  implemented using Project3D
 
-
-   TString opt = option;
-   opt.ToLower();
-
-   Int_t iyminOld = GetYaxis()->GetFirst();
-   Int_t iymaxOld = GetYaxis()->GetLast();
-   Int_t izminOld = GetZaxis()->GetFirst();
-   Int_t izmaxOld = GetZaxis()->GetLast();
-
-   GetYaxis()->SetRange(iymin,iymax);
-   GetZaxis()->SetRange(izmin,izmax);
-
-   Bool_t computeErrors = GetSumw2N();
-   if (opt.Contains("e") ) {
-      computeErrors = kTRUE;
-      opt.Remove(opt.First("e"),1);
-   }
-   Bool_t originalRange = kFALSE;
-   if (opt.Contains('o') ) {
-      originalRange = kTRUE;
-      opt.Remove(opt.First("o"),1);
-   }
-
    // in case of default name append the parent name
    TString hname = name;
    if (hname == "_px") hname = TString::Format("%s%s", GetName(), name);
+   TString title =  TString::Format("%s ( Projection X )",GetTitle());
 
-   TH1D * h1 = DoProject1D(hname, GetTitle(), this->GetXaxis(), computeErrors, originalRange,true,true);
-
-   // restore original range
-   if (GetYaxis()->TestBit(TAxis::kAxisRange)) GetYaxis()->SetRange(iyminOld,iymaxOld);
-   if (GetZaxis()->TestBit(TAxis::kAxisRange)) GetZaxis()->SetRange(izminOld,izmaxOld);
-
-   // draw in current pad
-   if (h1 && opt.Contains("d")) {
-      opt.Remove(opt.First("d"),1);
-      TVirtualPad *padsav = gPad;
-      TVirtualPad *pad = gROOT->GetSelectedPad();
-      if (pad) pad->cd();
-      if (!gPad || !gPad->FindObject(h1)) {
-         h1->Draw(opt);
-      } else {
-         h1->Paint(opt);
-      }
-      if (padsav) padsav->cd();
-   }
-
-   return h1;
+   return DoProject1D(hname, title, iymin, iymax, izmin, izmax, &fXaxis, &fYaxis, &fZaxis, option);
 }
 
 
@@ -1899,57 +1857,13 @@ TH1D *TH3::ProjectionY(const char *name, Int_t ixmin, Int_t ixmax,
    //
    //  implemented using Project3D
 
-
-   TString opt = option;
-   opt.ToLower();
-
-   Int_t ixminOld = GetXaxis()->GetFirst();
-   Int_t ixmaxOld = GetXaxis()->GetLast();
-   Int_t izminOld = GetZaxis()->GetFirst();
-   Int_t izmaxOld = GetZaxis()->GetLast();
-
-   GetXaxis()->SetRange(ixmin,ixmax);
-   GetZaxis()->SetRange(izmin,izmax);
-
-   Bool_t computeErrors = GetSumw2N();
-   if (opt.Contains("e") ) {
-      computeErrors = kTRUE;
-      opt.Remove(opt.First("e"),1);
-   }
-   Bool_t originalRange = kFALSE;
-   if (opt.Contains('o') ) {
-      originalRange = kTRUE;
-      opt.Remove(opt.First("o"),1);
-   }
-
-   // in case of default name append the parent name
    TString hname = name;
    if (hname == "_py") hname = TString::Format("%s%s", GetName(), name);
+   TString title =  TString::Format("%s ( Projection Y )",GetTitle());
 
-   TH1D * h1 = DoProject1D(hname, GetTitle(), this->GetYaxis(), computeErrors, originalRange, true, true);
-
-   // restore axis range
-   if (GetXaxis()->TestBit(TAxis::kAxisRange)) GetXaxis()->SetRange(ixminOld,ixmaxOld);
-   if (GetZaxis()->TestBit(TAxis::kAxisRange)) GetZaxis()->SetRange(izminOld,izmaxOld);
-
-   // draw in current pad
-   if (h1 && opt.Contains("d")) {
-      opt.Remove(opt.First("d"),1);
-      TVirtualPad *padsav = gPad;
-      TVirtualPad *pad = gROOT->GetSelectedPad();
-      if (pad) pad->cd();
-      if (!gPad || !gPad->FindObject(h1)) {
-         h1->Draw(opt);
-      } else {
-         h1->Paint(opt);
-      }
-      if (padsav) padsav->cd();
-   }
-
-   return h1;
+   return DoProject1D(hname, title, ixmin, ixmax, izmin, izmax, &fYaxis, &fXaxis, &fZaxis, option);
 }
 
-
 //______________________________________________________________________________
 TH1D *TH3::ProjectionZ(const char *name, Int_t ixmin, Int_t ixmax,
                        Int_t iymin, Int_t iymax, Option_t *option) const
@@ -1975,16 +1889,33 @@ TH1D *TH3::ProjectionZ(const char *name, Int_t ixmin, Int_t ixmax,
    //  implemented using Project3D
 
 
+   TString hname = name;
+   if (hname == "_pz") hname = TString::Format("%s%s", GetName(), name);
+   TString title =  TString::Format("%s ( Projection Z )",GetTitle());
+
+   return DoProject1D(hname, title, ixmin, ixmax, iymin, iymax, &fZaxis, &fXaxis, &fYaxis, option);
+}
+
+
+//______________________________________________________________________________
+TH1D *TH3::DoProject1D(const char* name, const char * title, int imin1, int imax1, int imin2, int imax2, 
+                       const TAxis* projAxis, const TAxis * axis1, const TAxis * axis2, Option_t * option) const 
+{
+   // internal methdod performing the projection to 1D histogram
+   // called from TH3::Project3D
+
+
    TString opt = option;
    opt.ToLower();
 
-   Int_t ixminOld = GetXaxis()->GetFirst();
-   Int_t ixmaxOld = GetXaxis()->GetLast();
-   Int_t iyminOld = GetYaxis()->GetFirst();
-   Int_t iymaxOld = GetYaxis()->GetLast();
+   Int_t iminOld1 = axis1->GetFirst();
+   Int_t imaxOld1 = axis1->GetLast();
+   Int_t iminOld2 = axis2->GetFirst();
+   Int_t imaxOld2 = axis2->GetLast();
 
-   GetXaxis()->SetRange(ixmin,ixmax);
-   GetYaxis()->SetRange(iymin,iymax);
+   // need to cast-away constness to set range 
+   const_cast<TAxis*>(axis1)->SetRange(imin1,imax1);
+   const_cast<TAxis*>(axis2)->SetRange(imin2,imax2);
 
    Bool_t computeErrors = GetSumw2N();
    if (opt.Contains("e") ) {
@@ -1997,15 +1928,11 @@ TH1D *TH3::ProjectionZ(const char *name, Int_t ixmin, Int_t ixmax,
       opt.Remove(opt.First("o"),1);
    }
 
-   // in case of default name append the parent name
-   TString hname = name;
-   if (hname == "_pz") hname = TString::Format("%s%s", GetName(), name);
-
-   TH1D * h1 =  DoProject1D(hname, GetTitle(), this->GetZaxis(), computeErrors, originalRange, true, true);
+   TH1D * h1 = DoProject1D(name, title, projAxis, computeErrors, originalRange,true,true);
 
-   // restore the range
-   if (GetXaxis()->TestBit(TAxis::kAxisRange)) GetXaxis()->SetRange(ixminOld,ixmaxOld);
-   if (GetYaxis()->TestBit(TAxis::kAxisRange)) GetYaxis()->SetRange(iyminOld,iymaxOld);
+   // restore original range
+   if (axis1->TestBit(TAxis::kAxisRange)) const_cast<TAxis*>(axis1)->SetRange(iminOld1,imaxOld1);
+   if (axis2->TestBit(TAxis::kAxisRange)) const_cast<TAxis*>(axis2)->SetRange(iminOld2,imaxOld2);
 
    // draw in current pad
    if (h1 && opt.Contains("d")) {
@@ -2024,14 +1951,13 @@ TH1D *TH3::ProjectionZ(const char *name, Int_t ixmin, Int_t ixmax,
    return h1;
 }
 
-
-//______________________________________________________________________________
-TH1D *TH3::DoProject1D(const char* name, const char* title, TAxis* projX,
+TH1D *TH3::DoProject1D(const char* name, const char * title, const TAxis* projX,
                        bool computeErrors, bool originalRange,
                        bool useUF, bool useOF) const
 {
    // internal methdod performing the projection to 1D histogram
-   // called from TH3::Project3D
+   // called from other TH3::DoProject1D 
+
 
    // Create the projection histogram
    TH1D *h1 = 0;
@@ -2108,8 +2034,8 @@ TH1D *TH3::DoProject1D(const char* name, const char* title, TAxis* projX,
    if ( computeErrors ) h1->Sumw2();
 
    // Set references to the axis, so that the bucle has no branches.
-   TAxis* out1 = 0;
-   TAxis* out2 = 0;
+   const TAxis* out1 = 0;
+   const TAxis* out2 = 0;
    if ( projX == GetXaxis() ) {
       out1 = GetYaxis();
       out2 = GetZaxis();
@@ -2221,7 +2147,7 @@ TH1D *TH3::DoProject1D(const char* name, const char* title, TAxis* projX,
 
 
 //______________________________________________________________________________
-TH2D *TH3::DoProject2D(const char* name, const char * title, TAxis* projX, TAxis* projY,
+TH2D *TH3::DoProject2D(const char* name, const char * title, const TAxis* projX, const TAxis* projY,
                     bool computeErrors, bool originalRange,
                     bool useUF, bool useOF) const
 {
@@ -2341,7 +2267,7 @@ TH2D *TH3::DoProject2D(const char* name, const char * title, TAxis* projX, TAxis
    if ( computeErrors) h2->Sumw2();
 
    // Set references to the axis, so that the bucle has no branches.
-   TAxis* out = 0;
+   const TAxis* out = 0;
    if ( projX != GetXaxis() && projY != GetXaxis() ) {
       out = GetXaxis();
    } else if ( projX != GetYaxis() && projY != GetYaxis() ) {
@@ -2681,7 +2607,7 @@ void TH3::DoFillProfileProjection(TProfile2D * p2,
 
 
 //______________________________________________________________________________
-TProfile2D *TH3::DoProjectProfile2D(const char* name, const char * title, TAxis* projX, TAxis* projY,
+TProfile2D *TH3::DoProjectProfile2D(const char* name, const char * title, const TAxis* projX, const TAxis* projY,
                                           bool originalRange, bool useUF, bool useOF) const
 {
    // internal method to project to a 2D Profile
@@ -2764,7 +2690,7 @@ TProfile2D *TH3::DoProjectProfile2D(const char* name, const char * title, TAxis*
    }
 
    // Set references to the axis, so that the loop has no branches.
-   TAxis* outAxis = 0;
+   const TAxis* outAxis = 0;
    if ( projX != GetXaxis() && projY != GetXaxis() ) {
       outAxis = GetXaxis();
    } else if ( projX != GetYaxis() && projY != GetYaxis() ) {
diff --git a/hist/hist/src/THStack.cxx b/hist/hist/src/THStack.cxx
index d376e2712e536fd973f90d874d1bcdce321f3683..a6eb4e75fa39e35fbf03d750a893c97992537ffc 100644
--- a/hist/hist/src/THStack.cxx
+++ b/hist/hist/src/THStack.cxx
@@ -85,7 +85,7 @@ THStack::THStack(const char *name, const char *title)
 
 
 //______________________________________________________________________________
-THStack::THStack(const TH1* hist, Option_t *axis /*="x"*/,
+THStack::THStack(TH1* hist, Option_t *axis /*="x"*/,
                  const char *name /*=0*/, const char *title /*=0*/,
                  Int_t firstbin /*=1*/, Int_t lastbin /*=-1*/,
                  Int_t firstbin2 /*=1*/, Int_t lastbin2 /*=-1*/,
diff --git a/hist/hist/src/THnBase.cxx b/hist/hist/src/THnBase.cxx
index ef6c67c92c756d63fbbf6e6cad8e4d4bc09c2426..ca9230891df64e8f341db74aa9d04c0d97186dac 100644
--- a/hist/hist/src/THnBase.cxx
+++ b/hist/hist/src/THnBase.cxx
@@ -200,7 +200,7 @@ THnBase* THnBase::CreateHnAny(const char* name, const char* title,
    int nbins[3] = {0,0,0};
    double minRange[3] = {0.,0.,0.};
    double maxRange[3] = {0.,0.,0.};
-   TAxis* axis[3] = { h->GetXaxis(), h->GetYaxis(), h->GetZaxis() };
+   const TAxis* axis[3] = { h->GetXaxis(), h->GetYaxis(), h->GetZaxis() };
    for (int i = 0; i < ndim; ++i) {
       nbins[i]    = axis[i]->GetNbins();
       minRange[i] = axis[i]->GetXmin();
diff --git a/hist/hist/src/TProfile3D.cxx b/hist/hist/src/TProfile3D.cxx
index 4c34131b0c69e5fe1aea08a315cb780d1a9025c3..984515005e2dd4a61d8f2d12cadd87adb17fc646 100644
--- a/hist/hist/src/TProfile3D.cxx
+++ b/hist/hist/src/TProfile3D.cxx
@@ -1185,7 +1185,7 @@ TProfile2D *TProfile3D::Project3DProfile(Option_t *option) const
 }
 
 //______________________________________________________________________________
-TProfile2D *TProfile3D::DoProjectProfile2D(const char* name, const char * title, TAxis* projX, TAxis* projY,
+TProfile2D *TProfile3D::DoProjectProfile2D(const char* name, const char * title, const TAxis* projX, const TAxis* projY,
                                            bool originalRange, bool useUF, bool useOF) const
 {
    // internal method to project to a 2D Profile