diff --git a/tree/inc/TBranchElement.h b/tree/inc/TBranchElement.h
index 643c151ffa207a2bdba243d819c265871ca02be8..ff831964558664e0f38640ca52182beea5d6e229 100644
--- a/tree/inc/TBranchElement.h
+++ b/tree/inc/TBranchElement.h
@@ -1,4 +1,4 @@
-// @(#)root/tree:$Name:  $:$Id: TBranchElement.h,v 1.48 2006/05/12 12:24:27 brun Exp $
+// @(#)root/tree:$Name:  $:$Id: TBranchElement.h,v 1.49 2006/05/23 04:47:42 brun Exp $
 // Author: Rene Brun   14/01/2001
 
 /*************************************************************************
@@ -35,110 +35,117 @@ class TVirtualCollectionProxy;
 
 class TBranchElement : public TBranch {
 
-protected:
-   enum { kBranchFolder = BIT(14), kDeleteObject = BIT(16) };
-   
-   TString                  fClassName;     //Class name of referenced object
-   TString                  fParentName;    //Name of parent class
-   TString                  fClonesName;    //Name of class in TClonesArray (if any)
-   TVirtualCollectionProxy* fCollProxy;     //! collection interface (if any)
-   UInt_t                   fCheckSum;      //CheckSum of class
-   Int_t                    fClassVersion;  //Version number of class
-   Int_t                    fID;            //element serial number in fInfo
-   Int_t                    fType;          //branch type
-   Int_t                    fStreamerType;  //branch streamer type
-   Int_t                    fMaximum;       //Maximum entries for a TClonesArray or variable array
-   Int_t                    fSTLtype;       //!STL container type
-   Int_t                    fNdata;         //!Number of data in this branch
-   TBranchElement          *fBranchCount;   //pointer to primary branchcount branch
-   TBranchElement          *fBranchCount2;  //pointer to secondary branchcount branch
-   TStreamerInfo           *fInfo;          //!Pointer to StreamerInfo
-   char                    *fObject;        //!Pointer to object at *fAddress
-   char                    *fBranchPointer; //!Pointer to object for a master branch
-   Bool_t                   fInit;          //!Initialization flag for branch assignment
-   Bool_t                   fInitOffsets;   //!Initialization flag to not endlessly recalculate offsets
-   TClassRef                fCurrentClass;  //!Reference to current (transient) class definition
-   TClassRef                fParentClass;   //!Reference to class definition in fParentName
-   TClassRef                fBranchClass;   //!Reference to class definition in fClassName
-   Int_t                   *fBranchOffset;  //!Sub-Branch offsets with respect to current transient class
-   Bool_t                  *fBranchTypes;   //!Sub-Branch types (TBranchElement or not)
-
+// Friends
    friend class TTreeCloner;
 
+// Types
+protected:
+   enum {
+      kBranchFolder = BIT(14),
+      kDeleteObject = BIT(16)               //  We are the owner of fObject.
+   };
+
+// Data Members
+protected:
+   TString                  fClassName;     //  Class name of referenced object
+   TString                  fParentName;    //  Name of parent class
+   TString                  fClonesName;    //  Name of class in TClonesArray (if any)
+   TVirtualCollectionProxy *fCollProxy;     //! collection interface (if any)
+   UInt_t                   fCheckSum;      //  CheckSum of class
+   Int_t                    fClassVersion;  //  Version number of class
+   Int_t                    fID;            //  element serial number in fInfo
+   Int_t                    fType;          //  branch type
+   Int_t                    fStreamerType;  //  branch streamer type
+   Int_t                    fMaximum;       //  Maximum entries for a TClonesArray or variable array
+   Int_t                    fSTLtype;       //! STL container type
+   Int_t                    fNdata;         //! Number of data in this branch
+   TBranchElement          *fBranchCount;   //  pointer to primary branchcount branch
+   TBranchElement          *fBranchCount2;  //  pointer to secondary branchcount branch
+   TStreamerInfo           *fInfo;          //! Pointer to StreamerInfo
+   char                    *fObject;        //! Pointer to object at *fAddress
+   Bool_t                   fInit;          //! Initialization flag for branch assignment
+   Bool_t                   fInitOffsets;   //! Initialization flag to not endlessly recalculate offsets
+   TClassRef                fCurrentClass;  //! Reference to current (transient) class definition
+   TClassRef                fParentClass;   //! Reference to class definition in fParentName
+   TClassRef                fBranchClass;   //! Reference to class definition in fClassName
+   Int_t                   *fBranchOffset;  //! Sub-Branch offsets with respect to current transient class
+
+// Forbidden functions (implemented but you should not use them!)
+protected:
    TBranchElement(const TBranchElement&);
    TBranchElement& operator=(const TBranchElement&);
 
+// Implementation use only functions.
 private:
-   
+   void                     BuildTitle(const char* name);
    void                     InitializeOffsets();
-   Bool_t                   CheckBranchID();
-   Bool_t                   IsMissingCollection() const; 
-   TClass*                  GetCurrentClass();            // Class referenced by transient description
-   TClass*                  GetParentClass();             // Class referenced by fParentName
+   Bool_t                   IsMissingCollection() const;
+   TClass                  *GetCurrentClass(); // Class referenced by transient description
+   TClass                  *GetParentClass(); // Class referenced by fParentName
    TVirtualCollectionProxy *GetCollectionProxy();
-   Int_t                    GetDataMemberOffset(const TClass *cl, const char *name);
-   Int_t                    GetDataMemberOffsetEx(TClass* par_cl, TString& parentName, Int_t off);
+   void                     ReleaseObject();
+   void                     SetBranchCount(TBranchElement* bre);
+   void                     SetBranchCount2(TBranchElement* bre) { fBranchCount2 = bre; }
+   Int_t                    Unroll(const char* name, TClass* cltop, TClass* cl, char* ptr, Int_t basketsize, Int_t splitlevel, Int_t btype);
+   void                     ValidateAddress() const;
 
+// Public Interface.
 public:
-   TBranchElement();
-   TBranchElement(const char *name, TStreamerInfo *sinfo, Int_t id, char *pointer, Int_t basketsize=32000, Int_t splitlevel = 0, Int_t btype=0);
-   TBranchElement(const char *name, TClonesArray *clones, Int_t basketsize=32000, Int_t splitlevel = 0, Int_t compress=-1);
-   TBranchElement(const char *name, TVirtualCollectionProxy *cont, Int_t basketsize=32000, Int_t splitlevel = 0, Int_t compress=-1);
-   virtual ~TBranchElement();
-   
-   virtual Int_t    Branch(const char *folder, Int_t bufsize=32000, Int_t splitlevel=99);
-   virtual TBranch *Branch(const char *name, void *address, const char *leaflist, Int_t bufsize=32000);
-   virtual TBranch *Branch(const char *name, const char *classname, void *addobj, Int_t bufsize=32000, Int_t splitlevel=99);
-   virtual void     Browse(TBrowser *b);
-           void     BuildTitle(const char *name);
-           Int_t    Fill();
-           void     FillLeaves(TBuffer &b);
-   TBranchElement  *GetBranchCount() const {return fBranchCount;}
-   TBranchElement  *GetBranchCount2() const {return fBranchCount2;}
-   UInt_t           GetCheckSum() {return fCheckSum;}
-   virtual const char  *GetClassName() const {return fClassName.Data();}
-   virtual const char  *GetClonesName() const {return fClonesName.Data();}
-           Int_t    GetEntry(Long64_t entry=0, Int_t getall = 0);
-           const char  *GetIconName() const;
-           Int_t    GetID() const {return fID;}
-   TStreamerInfo   *GetInfo();
-   char    *GetObject() const { return fObject; };
-   virtual const char  *GetParentName() const {return fParentName.Data();}
-   virtual Int_t    GetMaximum() const;
-           Int_t    GetNdata()  const {return fNdata;};
-           Int_t    GetType()   const {return fType;}
-           Int_t    GetStreamerType() const {return fStreamerType;}
-   virtual const char *GetTypeName() const;
-           Double_t GetValue(Int_t i, Int_t len, Bool_t subarr = kFALSE) const;
-   virtual void    *GetValuePointer() const;
-           Bool_t   IsBranchFolder() const {return TestBit(kBranchFolder);}
-           Bool_t   IsFolder() const;
-   virtual Bool_t   Notify() {fAddress = 0; return 1;}
-   virtual void     Print(Option_t *option="") const;
-           void     PrintValue(Int_t i) const;
-   virtual void     ReadLeaves(TBuffer &b);
-   virtual void     Reset(Option_t *option="");
-   virtual void     ResetAddress();
-   virtual void     SetAddress(void *addobj);
-   virtual void     SetAutoDelete(Bool_t autodel=kTRUE);
-   virtual void     SetBasketSize(Int_t buffsize);
-   virtual void     SetBranchCount(TBranchElement *bre);
-   virtual void     SetBranchCount2(TBranchElement *bre) {fBranchCount2 = bre;}
-   virtual void     SetBranchFolder() {SetBit(kBranchFolder);}
-   virtual void     SetClassName(const char *name) {fClassName=name;}
-   void     SetParentClass(TClass *clparent);
-   virtual void     SetParentName(const char *name) {fParentName=name;}
-   virtual void     SetupAddresses(); 
-   virtual void     SetType(Int_t btype) {fType=btype;}
-   virtual Int_t    Unroll(const char *name, TClass *cltop, TClass *cl,Int_t basketsize, Int_t splitlevel, Int_t btype);
-
-   ClassDef(TBranchElement,8)  //Branch in case of an object
+                            TBranchElement();
+                            TBranchElement(const char* name, TStreamerInfo* sinfo, Int_t id, char* pointer, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t btype = 0);
+                            TBranchElement(const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
+                            TBranchElement(const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
+   virtual                  ~TBranchElement();
+
+   virtual void             Browse(TBrowser* b);
+   virtual Int_t            Fill();
+   virtual void             FillLeaves(TBuffer& b);
+   virtual char            *GetAddress() const;
+           TBranchElement  *GetBranchCount() const { return fBranchCount; }
+           TBranchElement  *GetBranchCount2() const { return fBranchCount2; }
+           Int_t           *GetBranchOffset() const { return fBranchOffset; }
+           UInt_t           GetCheckSum() { return fCheckSum; }
+   virtual const char      *GetClassName() const { return fClassName.Data(); }
+   virtual const char      *GetClonesName() const { return fClonesName.Data(); }
+   virtual Int_t            GetEntry(Long64_t entry = 0, Int_t getall = 0);
+           const char      *GetIconName() const;
+           Int_t            GetID() const { return fID; }
+           TStreamerInfo   *GetInfo() const;
+           char            *GetObject() const;
+   virtual const char      *GetParentName() const { return fParentName.Data(); }
+   virtual Int_t            GetMaximum() const;
+           Int_t            GetNdata() const { return fNdata; }
+           Int_t            GetType() const { return fType; }
+           Int_t            GetStreamerType() const { return fStreamerType; }
+   virtual const char      *GetTypeName() const;
+           Double_t         GetValue(Int_t i, Int_t len, Bool_t subarr = kFALSE) const;
+   virtual void            *GetValuePointer() const;
+           Bool_t           IsBranchFolder() const { return TestBit(kBranchFolder); }
+           Bool_t           IsFolder() const;
+   virtual Bool_t           IsObjectOwner() const { return TestBit(kDeleteObject); }
+   virtual Bool_t           Notify() { if (fAddress) { SetAddress(0); } return 1; }
+   virtual void             Print(Option_t* option = "") const;
+           void             PrintValue(Int_t i) const;
+   virtual void             ReadLeaves(TBuffer& b);
+   virtual void             Reset(Option_t* option = "");
+   virtual void             ResetAddress();
+   virtual void             ResetDeleteObject();
+   virtual void             SetAddress(void* addobj);
+   virtual void             SetBasketSize(Int_t buffsize);
+   virtual void             SetBranchFolder() { SetBit(kBranchFolder); }
+   virtual void             SetClassName(const char* name) { fClassName = name; }
+   inline  void             SetParentClass(TClass* clparent);
+   virtual void             SetParentName(const char* name) { fParentName = name; }
+   virtual void             SetupAddresses();
+   virtual void             SetType(Int_t btype) { fType = btype; }
+
+   ClassDef(TBranchElement,8)  // Branch in case of an object
 };
 
-inline void TBranchElement::SetParentClass(TClass *clparent)
-{ 
-   fParentClass = clparent; 
-   SetParentName(clparent?clparent->GetName():""); 
+inline void TBranchElement::SetParentClass(TClass* clparent)
+{
+   fParentClass = clparent;
+   fParentName = clparent ? clparent->GetName() : "";
 }
 
-#endif
+#endif // ROOT_TBranchElement