diff --git a/core/base/inc/TNamed.h b/core/base/inc/TNamed.h
index bdbb6c96ddfda59f2354d3d0e5c9d2475f663c3b..c695a4e728d2edd9e4dd653ec353b6b336ea5e07 100644
--- a/core/base/inc/TNamed.h
+++ b/core/base/inc/TNamed.h
@@ -38,7 +38,7 @@ public:
    TNamed(const TString &name, const TString &title) : fName(name), fTitle(title) { }
    TNamed(const TNamed &named);
    TNamed& operator=(const TNamed& rhs);
-   virtual ~TNamed() { }
+   virtual ~TNamed();
    virtual void     Clear(Option_t *option ="");
    virtual TObject *Clone(const char *newname="") const;
    virtual Int_t    Compare(const TObject *obj) const;
diff --git a/core/base/src/TNamed.cxx b/core/base/src/TNamed.cxx
index 24c227bd5e2a76dc3bfae1f089e5c81e6aab7fd4..41b3cc6e5d9ec5b92cf762fb99831255b9ece503 100644
--- a/core/base/src/TNamed.cxx
+++ b/core/base/src/TNamed.cxx
@@ -36,6 +36,15 @@ TNamed::TNamed(const TNamed &named) : TObject(named),fName(named.fName),fTitle(n
 {
 }
 
+////////////////////////////////////////////////////////////////////////////////
+/// TNamed destructor.
+
+TNamed::~TNamed()
+{
+   // Required since we overload TObject::Hash.
+   ROOT::CallRecursiveRemoveIfNeeded(*this);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 /// TNamed assignment operator.